diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index c609ab2b6..33648c595 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -25,15 +25,15 @@ components from it when it is run in a development environment.
Note that in case the current master branch is ahead of the latest release, it might happen that there are some incompatibilities when loading data from your local XPipe installation.
You should therefore always check out the matching version tag for your local repository and local XPipe installation.
You can find the available version tags at https://github.com/xpipe-io/xpipe/tags.
-So for example if you currently have XPipe `10.0` installed, you should run `git reset --hard 10.0` first to properly compile against it.
+So for example if you currently have XPipe `11.3` installed, you should run `git reset --hard 11.3` first to properly compile against it.
You need to have JDK for Java 21 installed to compile the project.
If you are on Linux or macOS, you can easily accomplish that by running
```bash
curl -s "https://get.sdkman.io" | bash
. "$HOME/.sdkman/bin/sdkman-init.sh"
-sdk install java 21.0.1-graalce
-sdk default java 21.0.1-graalce
+sdk install java 22.0.2-graalce
+sdk default java 22.0.2-graalce
```
.
On Windows, you have to manually install a JDK, e.g. from [Adoptium](https://adoptium.net/temurin/releases/?version=21).
@@ -74,7 +74,7 @@ Especially when starting out, it might be a good idea to start with easy tasks f
### Interacting via the HTTP API
-You can create clients they communicate with the XPipe daemon via its HTTP API.
+You can create clients that communicate with the XPipe daemon via its HTTP API.
To get started, see the [OpenAPI spec](/openapi.yaml).
### Implementing support for a new editor
@@ -98,9 +98,13 @@ All actions that you can perform for certain connections in the connection overv
You can add custom script definitions [here](https://github.com/xpipe-io/xpipe/tree/master/ext/base/src/main/java/io/xpipe/ext/base/script/PredefinedScriptStore.java) and [here](https://github.com/xpipe-io/xpipe/tree/master/ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts).
+### Adding more system icons for system autodetection
+
+You can register new system types [here](https://github.com/xpipe-io/xpipe/blob/master/app/src/main/java/io/xpipe/app/resources/SystemIcons.java) and add the respective icons [here](https://github.com/xpipe-io/xpipe/tree/master/app/src/main/resources/io/xpipe/app/resources/img/system).
+
### Adding more file icons for specific types
-You can register file types [here](https://github.com/xpipe-io/xpipe/blob/master/app/src/main/resources/io/xpipe/app/resources/file_list.txt) and add the respective icons [here](https://github.com/xpipe-io/xpipe/tree/master/app/src/main/resources/io/xpipe/app/resources/browser_icons).
+You can register file types [here](https://github.com/xpipe-io/xpipe/blob/master/app/src/main/resources/io/xpipe/app/resources/file_list.txt) and add the respective icons [here](https://github.com/xpipe-io/xpipe/tree/master/app/src/main/resources/io/xpipe/app/resources/img/browser).
The existing file list and icons are taken from the [vscode-icons](https://github.com/vscode-icons/vscode-icons) project. Due to limitations in the file definition list compatibility, some file types might not be listed by their proper extension and are therefore not being applied correctly even though the images and definitions exist already.
@@ -108,6 +112,6 @@ The existing file list and icons are taken from the [vscode-icons](https://githu
if you want to work on something that was not listed here, you can still do so of course. You can reach out on the [Discord server](https://discord.gg/8y89vS8cRb) to discuss any development plans and get you started.
-### Translations
+### Adding translations
See the [translation guide](/lang) for details.
diff --git a/README.md b/README.md
index ade164d71..fe79cd336 100644
--- a/README.md
+++ b/README.md
@@ -17,8 +17,10 @@ It currently supports:
- [Docker](https://www.docker.com/), [Podman](https://podman.io/), and [LXD](https://linuxcontainers.org/lxd/introduction/) container instances located on any host
- [Windows Subsystem for Linux](https://ubuntu.com/wsl), [Cygwin](https://www.cygwin.com/), and [MSYS2](https://www.msys2.org/) instances
- [Proxmox PVE](https://www.proxmox.com/en/proxmox-virtual-environment/overview) virtual machines and containers
+- [Hyper-V](https://learn.microsoft.com/en-us/virtualization/hyper-v-on-windows/about/) and [VMware Player/Workstation/Fusion](https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion) virtual machines
- [Kubernetes](https://kubernetes.io/) clusters, pods, and containers
- [Powershell Remote Sessions](https://learn.microsoft.com/en-us/powershell/scripting/learn/remoting/running-remote-commands?view=powershell-7.3)
+- Built-in VNC connections and RDP launchers
- Any other custom remote connection methods that work through the command-line
## Connection hub
@@ -50,6 +52,8 @@ It currently supports:
- Works with all command shells such as bash, zsh, cmd, PowerShell, and more, locally and remote
- Connects to a system while the terminal is still starting up, allowing for faster connections than otherwise possible
+![Terminal](https://github.com/xpipe-io/.github/raw/main/img/terminal_shadow.png)
+
diff --git a/app/build.gradle b/app/build.gradle
index 0160355de..b7fdfcf1b 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -52,10 +52,10 @@ dependencies {
api files("$rootDir/gradle/gradle_scripts/vernacular-1.16.jar")
api 'org.bouncycastle:bcprov-jdk18on:1.78.1'
api 'info.picocli:picocli:4.7.6'
- api ('org.kohsuke:github-api:1.324') {
+ api ('org.kohsuke:github-api:1.326') {
exclude group: 'org.apache.commons', module: 'commons-lang3'
}
- api 'org.apache.commons:commons-lang3:3.16.0'
+ api 'org.apache.commons:commons-lang3:3.17.0'
api 'io.sentry:sentry:7.14.0'
api 'commons-io:commons-io:2.16.1'
api group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "2.17.2"
diff --git a/app/src/main/java/io/xpipe/app/beacon/AppBeaconServer.java b/app/src/main/java/io/xpipe/app/beacon/AppBeaconServer.java
index 972307a24..aac5156aa 100644
--- a/app/src/main/java/io/xpipe/app/beacon/AppBeaconServer.java
+++ b/app/src/main/java/io/xpipe/app/beacon/AppBeaconServer.java
@@ -1,8 +1,8 @@
package io.xpipe.app.beacon;
-import io.xpipe.app.core.AppResources;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.issue.TrackEvent;
+import io.xpipe.app.resources.AppResources;
import io.xpipe.app.util.MarkdownHelper;
import io.xpipe.beacon.BeaconConfig;
import io.xpipe.beacon.BeaconInterface;
diff --git a/app/src/main/java/io/xpipe/app/beacon/BeaconRequestHandler.java b/app/src/main/java/io/xpipe/app/beacon/BeaconRequestHandler.java
index ab2467d4e..0a391696d 100644
--- a/app/src/main/java/io/xpipe/app/beacon/BeaconRequestHandler.java
+++ b/app/src/main/java/io/xpipe/app/beacon/BeaconRequestHandler.java
@@ -39,7 +39,8 @@ public class BeaconRequestHandler implements HttpHandler {
}
}
- if (beaconInterface.requiresEnabledApi() && !AppPrefs.get().enableHttpApi().get()) {
+ if (beaconInterface.requiresEnabledApi()
+ && !AppPrefs.get().enableHttpApi().get()) {
var ex = new BeaconServerException("HTTP API is not enabled in the settings menu");
writeError(exchange, ex, 403);
return;
diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRefreshExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRefreshExchangeImpl.java
index 5fa336528..3c97868e9 100644
--- a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRefreshExchangeImpl.java
+++ b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionRefreshExchangeImpl.java
@@ -15,9 +15,9 @@ public class ConnectionRefreshExchangeImpl extends ConnectionRefreshExchange {
.getStoreEntryIfPresent(msg.getConnection())
.orElseThrow(() -> new BeaconClientException("Unknown connection: " + msg.getConnection()));
if (e.getStore() instanceof FixedHierarchyStore) {
- DataStorage.get().refreshChildren(e, true);
+ DataStorage.get().refreshChildren(e, null, true);
} else {
- e.validateOrThrow();
+ e.validateOrThrowAndClose(null);
}
return Response.builder().build();
}
diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/FsReadExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/FsReadExchangeImpl.java
index 97f9c7ed1..590a3f229 100644
--- a/app/src/main/java/io/xpipe/app/beacon/impl/FsReadExchangeImpl.java
+++ b/app/src/main/java/io/xpipe/app/beacon/impl/FsReadExchangeImpl.java
@@ -43,7 +43,6 @@ public class FsReadExchangeImpl extends FsReadExchange {
var out = exchange.getResponseBody()) {
fileIn.transferTo(out);
}
- return Response.builder().build();
} else {
byte[] bytes;
try (var in = fs.openInput(msg.getPath().toString())) {
@@ -55,7 +54,7 @@ public class FsReadExchangeImpl extends FsReadExchange {
try (var out = exchange.getResponseBody()) {
out.write(bytes);
}
- return Response.builder().build();
}
+ return Response.builder().build();
}
}
diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/ShellStartExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/ShellStartExchangeImpl.java
index c43be274d..21cefe252 100644
--- a/app/src/main/java/io/xpipe/app/beacon/impl/ShellStartExchangeImpl.java
+++ b/app/src/main/java/io/xpipe/app/beacon/impl/ShellStartExchangeImpl.java
@@ -1,12 +1,13 @@
package io.xpipe.app.beacon.impl;
-import com.sun.net.httpserver.HttpExchange;
import io.xpipe.app.beacon.AppBeaconServer;
import io.xpipe.app.beacon.BeaconShellSession;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.beacon.api.ShellStartExchange;
import io.xpipe.core.store.ShellStore;
+
+import com.sun.net.httpserver.HttpExchange;
import lombok.SneakyThrows;
public class ShellStartExchangeImpl extends ShellStartExchange {
diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/SshLaunchExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/SshLaunchExchangeImpl.java
index e9d4bfeff..2b8c8c410 100644
--- a/app/src/main/java/io/xpipe/app/beacon/impl/SshLaunchExchangeImpl.java
+++ b/app/src/main/java/io/xpipe/app/beacon/impl/SshLaunchExchangeImpl.java
@@ -1,11 +1,12 @@
package io.xpipe.app.beacon.impl;
-import com.sun.net.httpserver.HttpExchange;
+import io.xpipe.app.ext.ProcessControlProvider;
import io.xpipe.app.util.TerminalLauncherManager;
import io.xpipe.beacon.api.SshLaunchExchange;
-import io.xpipe.app.ext.ProcessControlProvider;
import io.xpipe.core.process.ShellDialects;
+import com.sun.net.httpserver.HttpExchange;
+
import java.util.List;
public class SshLaunchExchangeImpl extends SshLaunchExchange {
@@ -27,7 +28,7 @@ public class SshLaunchExchangeImpl extends SshLaunchExchange {
// There are sometimes multiple requests by a terminal client (e.g. Termius)
// This might fail sometimes, but it is expected
- var r = TerminalLauncherManager.waitForNextLaunch();
+ var r = TerminalLauncherManager.sshLaunchExchange();
var c = ProcessControlProvider.get()
.getEffectiveLocalDialect()
.getOpenScriptCommand(r.toString())
diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalLaunchExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/TerminalLaunchExchangeImpl.java
index 1d732bbb9..d1982ca7f 100644
--- a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalLaunchExchangeImpl.java
+++ b/app/src/main/java/io/xpipe/app/beacon/impl/TerminalLaunchExchangeImpl.java
@@ -9,7 +9,7 @@ import com.sun.net.httpserver.HttpExchange;
public class TerminalLaunchExchangeImpl extends TerminalLaunchExchange {
@Override
public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException {
- var r = TerminalLauncherManager.performLaunch(msg.getRequest());
+ var r = TerminalLauncherManager.launchExchange(msg.getRequest());
return Response.builder().targetFile(r).build();
}
diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalWaitExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/TerminalWaitExchangeImpl.java
index 4f6729c5d..7a4cef411 100644
--- a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalWaitExchangeImpl.java
+++ b/app/src/main/java/io/xpipe/app/beacon/impl/TerminalWaitExchangeImpl.java
@@ -1,6 +1,7 @@
package io.xpipe.app.beacon.impl;
import io.xpipe.app.util.TerminalLauncherManager;
+import io.xpipe.app.util.TerminalView;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.beacon.BeaconServerException;
import io.xpipe.beacon.api.TerminalWaitExchange;
@@ -10,7 +11,8 @@ import com.sun.net.httpserver.HttpExchange;
public class TerminalWaitExchangeImpl extends TerminalWaitExchange {
@Override
public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException, BeaconServerException {
- TerminalLauncherManager.waitForCompletion(msg.getRequest());
+ TerminalLauncherManager.waitExchange(msg.getRequest());
+ TerminalView.get().open(msg.getPid());
return Response.builder().build();
}
diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserClipboard.java b/app/src/main/java/io/xpipe/app/browser/BrowserClipboard.java
index 1921d9a3a..c07dfc0e6 100644
--- a/app/src/main/java/io/xpipe/app/browser/BrowserClipboard.java
+++ b/app/src/main/java/io/xpipe/app/browser/BrowserClipboard.java
@@ -3,9 +3,9 @@ package io.xpipe.app.browser;
import io.xpipe.app.browser.file.BrowserEntry;
import io.xpipe.app.browser.file.BrowserFileTransferMode;
import io.xpipe.app.browser.file.LocalFileSystem;
+import io.xpipe.app.ext.ProcessControlProvider;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.util.ThreadHelper;
-import io.xpipe.app.ext.ProcessControlProvider;
import io.xpipe.core.store.FileEntry;
import io.xpipe.core.util.FailableRunnable;
diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserFileOpener.java b/app/src/main/java/io/xpipe/app/browser/BrowserFileOpener.java
index a25524f50..c66cc2ff3 100644
--- a/app/src/main/java/io/xpipe/app/browser/BrowserFileOpener.java
+++ b/app/src/main/java/io/xpipe/app/browser/BrowserFileOpener.java
@@ -1,20 +1,76 @@
package io.xpipe.app.browser;
import io.xpipe.app.browser.fs.OpenFileSystemModel;
+import io.xpipe.app.core.window.AppWindowHelper;
import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.app.util.BooleanScope;
import io.xpipe.app.util.FileBridge;
import io.xpipe.app.util.FileOpener;
+import io.xpipe.core.process.ElevationFunction;
+import io.xpipe.core.process.OsType;
+import io.xpipe.core.store.ConnectionFileSystem;
import io.xpipe.core.store.FileEntry;
+import io.xpipe.core.store.FileInfo;
import io.xpipe.core.store.FileNames;
+import java.io.FilterOutputStream;
+import java.io.IOException;
import java.io.OutputStream;
+import java.util.Objects;
public class BrowserFileOpener {
+ private static OutputStream openFileOutput(OpenFileSystemModel model, FileEntry file, long totalBytes)
+ throws Exception {
+ var fileSystem = model.getFileSystem();
+ if (model.isClosed() || fileSystem.getShell().isEmpty()) {
+ return OutputStream.nullOutputStream();
+ }
+
+ var sc = fileSystem.getShell().get();
+ if (sc.getOsType() == OsType.WINDOWS) {
+ return fileSystem.openOutput(file.getPath(), totalBytes);
+ }
+
+ var info = (FileInfo.Unix) file.getInfo();
+ var zero = Integer.valueOf(0);
+ var otherWrite = info.getPermissions().charAt(7) == 'w';
+ var requiresRoot = zero.equals(info.getUid()) && zero.equals(info.getGid()) && !otherWrite;
+ if (!requiresRoot || model.getCache().isRoot()) {
+ return fileSystem.openOutput(file.getPath(), totalBytes);
+ }
+
+ var elevate = AppWindowHelper.showConfirmationAlert(
+ "app.fileWriteSudoTitle", "app.fileWriteSudoHeader", "app.fileWriteSudoContent");
+ if (!elevate) {
+ return fileSystem.openOutput(file.getPath(), totalBytes);
+ }
+
+ var rootSc = sc.identicalSubShell()
+ .elevated(ElevationFunction.elevated("sudo"))
+ .start();
+ var rootFs = new ConnectionFileSystem(rootSc);
+ try {
+ return new FilterOutputStream(rootFs.openOutput(file.getPath(), totalBytes)) {
+ @Override
+ public void close() throws IOException {
+ super.close();
+ rootFs.close();
+ }
+ };
+ } catch (Exception ex) {
+ rootFs.close();
+ throw ex;
+ }
+ }
+
+ private static int calculateKey(FileEntry entry) {
+ return Objects.hash(entry.getPath(), entry.getFileSystem(), entry.getKind(), entry.getInfo());
+ }
+
public static void openWithAnyApplication(OpenFileSystemModel model, FileEntry entry) {
var file = entry.getPath();
- var key = entry.getPath().hashCode() + entry.getFileSystem().hashCode();
+ var key = calculateKey(entry);
FileBridge.get()
.openIO(
FileNames.getFileName(file),
@@ -35,7 +91,7 @@ public class BrowserFileOpener {
public static void openInDefaultApplication(OpenFileSystemModel model, FileEntry entry) {
var file = entry.getPath();
- var key = entry.getPath().hashCode() + entry.getFileSystem().hashCode();
+ var key = calculateKey(entry);
FileBridge.get()
.openIO(
FileNames.getFileName(file),
@@ -61,7 +117,7 @@ public class BrowserFileOpener {
}
var file = entry.getPath();
- var key = entry.getPath().hashCode() + entry.getFileSystem().hashCode();
+ var key = calculateKey(entry);
FileBridge.get()
.openIO(
FileNames.getFileName(file),
@@ -71,11 +127,7 @@ public class BrowserFileOpener {
return entry.getFileSystem().openInput(file);
},
(size) -> {
- if (model.isClosed()) {
- return OutputStream.nullOutputStream();
- }
-
- return entry.getFileSystem().openOutput(file, size);
+ return openFileOutput(model, entry, size);
},
FileOpener::openInTextEditor);
}
diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserNavBar.java b/app/src/main/java/io/xpipe/app/browser/BrowserNavBar.java
index f4c4f55f6..06fb8cd32 100644
--- a/app/src/main/java/io/xpipe/app/browser/BrowserNavBar.java
+++ b/app/src/main/java/io/xpipe/app/browser/BrowserNavBar.java
@@ -84,7 +84,7 @@ public class BrowserNavBar extends Comp {
var graphic = Bindings.createStringBinding(
() -> {
return model.getCurrentDirectory() != null
- ? FileIconManager.getFileIcon(model.getCurrentDirectory(), false)
+ ? FileIconManager.getFileIcon(model.getCurrentDirectory())
: null;
},
model.getCurrentPath());
diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserStatusBarComp.java b/app/src/main/java/io/xpipe/app/browser/BrowserStatusBarComp.java
index 8d853d5fd..43edfb8e3 100644
--- a/app/src/main/java/io/xpipe/app/browser/BrowserStatusBarComp.java
+++ b/app/src/main/java/io/xpipe/app/browser/BrowserStatusBarComp.java
@@ -55,7 +55,7 @@ public class BrowserStatusBarComp extends SimpleComp {
private Comp> createProgressEstimateStatus() {
var text = BindingsHelper.map(model.getProgress(), p -> {
- if (p == null || p.done()) {
+ if (p == null) {
return null;
} else {
var expected = p.expectedTimeRemaining();
@@ -74,7 +74,7 @@ public class BrowserStatusBarComp extends SimpleComp {
private Comp> createProgressStatus() {
var text = BindingsHelper.map(model.getProgress(), p -> {
- if (p == null || p.done()) {
+ if (p == null) {
return null;
} else {
var transferred = HumanReadableFormat.progressByteCount(p.getTransferred());
@@ -91,7 +91,7 @@ public class BrowserStatusBarComp extends SimpleComp {
private Comp> createProgressNameStatus() {
var text = BindingsHelper.map(model.getProgress(), p -> {
- if (p == null || p.done()) {
+ if (p == null) {
return null;
} else {
return p.getName();
diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserTransferModel.java b/app/src/main/java/io/xpipe/app/browser/BrowserTransferModel.java
index 87e44d064..5f1818bba 100644
--- a/app/src/main/java/io/xpipe/app/browser/BrowserTransferModel.java
+++ b/app/src/main/java/io/xpipe/app/browser/BrowserTransferModel.java
@@ -10,12 +10,14 @@ import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.util.DesktopHelper;
import io.xpipe.app.util.ShellTemp;
import io.xpipe.app.util.ThreadHelper;
+
import javafx.beans.binding.Bindings;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ObservableBooleanValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
+
import lombok.Value;
import org.apache.commons.io.FileUtils;
@@ -133,6 +135,12 @@ public class BrowserTransferModel {
BrowserFileTransferMode.COPY,
false,
progress -> {
+ // Don't update item progress to keep it as finished
+ if (progress == null) {
+ item.getOpenFileSystemModel().getProgress().setValue(null);
+ return;
+ }
+
synchronized (item.getProgress()) {
item.getProgress().setValue(progress);
}
@@ -170,7 +178,7 @@ public class BrowserTransferModel {
if (Files.isDirectory(file)) {
FileUtils.moveDirectory(file.toFile(), target.toFile());
} else {
- FileUtils.moveFile(file.toFile(), target.toFile(), StandardCopyOption.REPLACE_EXISTING);
+ Files.move(file, target, StandardCopyOption.REPLACE_EXISTING);
}
}
DesktopHelper.browseFileInDirectory(downloads.resolve(files.getFirst().getFileName()));
diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserTransferProgress.java b/app/src/main/java/io/xpipe/app/browser/BrowserTransferProgress.java
index bb1e16ec7..7486afdb6 100644
--- a/app/src/main/java/io/xpipe/app/browser/BrowserTransferProgress.java
+++ b/app/src/main/java/io/xpipe/app/browser/BrowserTransferProgress.java
@@ -14,14 +14,6 @@ public class BrowserTransferProgress {
long total;
Instant start;
- public static BrowserTransferProgress empty() {
- return new BrowserTransferProgress(null, 0, 0, Instant.now());
- }
-
- static BrowserTransferProgress empty(String name, long size) {
- return new BrowserTransferProgress(name, 0, size, Instant.now());
- }
-
public static BrowserTransferProgress finished(String name, long size) {
return new BrowserTransferProgress(name, size, size, Instant.now());
}
diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserWelcomeComp.java b/app/src/main/java/io/xpipe/app/browser/BrowserWelcomeComp.java
index 08f4f4d4a..87a1b186f 100644
--- a/app/src/main/java/io/xpipe/app/browser/BrowserWelcomeComp.java
+++ b/app/src/main/java/io/xpipe/app/browser/BrowserWelcomeComp.java
@@ -52,7 +52,7 @@ public class BrowserWelcomeComp extends SimpleComp {
var vbox = new VBox(welcome, new Spacer(4, Orientation.VERTICAL));
vbox.setAlignment(Pos.CENTER_LEFT);
- var img = new PrettySvgComp(new SimpleStringProperty("Hips.svg"), 50, 75)
+ var img = new PrettySvgComp(new SimpleStringProperty("graphics/Hips.svg"), 50, 75)
.padding(new Insets(5, 0, 0, 0))
.createRegion();
@@ -145,8 +145,7 @@ public class BrowserWelcomeComp extends SimpleComp {
private Comp> entryButton(BrowserSavedState.Entry e, BooleanProperty disable) {
var entry = DataStorage.get().getStoreEntryIfPresent(e.getUuid());
- var graphic =
- entry.get().getProvider().getDisplayIconFileName(entry.get().getStore());
+ var graphic = entry.get().getEffectiveIconFile();
var view = PrettyImageHelper.ofFixedSize(graphic, 30, 24);
return new ButtonComp(
new SimpleStringProperty(DataStorage.get().getStoreEntryDisplayName(entry.get())),
diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserAlerts.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserAlerts.java
index 80e71cdff..6f0350188 100644
--- a/app/src/main/java/io/xpipe/app/browser/file/BrowserAlerts.java
+++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserAlerts.java
@@ -2,6 +2,7 @@ package io.xpipe.app.browser.file;
import io.xpipe.app.core.AppI18n;
import io.xpipe.app.core.window.AppWindowHelper;
+import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.core.store.FileEntry;
import io.xpipe.core.store.FileKind;
import io.xpipe.core.store.FilePath;
@@ -62,7 +63,8 @@ public class BrowserAlerts {
}
public static boolean showDeleteAlert(List source) {
- if (source.stream().noneMatch(entry -> entry.getKind() == FileKind.DIRECTORY)) {
+ if (!AppPrefs.get().confirmDeletions().get()
+ && source.stream().noneMatch(entry -> entry.getKind() == FileKind.DIRECTORY)) {
return true;
}
diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserEntry.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserEntry.java
index 616693aab..184cc12a7 100644
--- a/app/src/main/java/io/xpipe/app/browser/file/BrowserEntry.java
+++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserEntry.java
@@ -65,11 +65,11 @@ public class BrowserEntry {
if (fileType != null) {
return fileType.getIcon();
} else if (directoryType != null) {
- return directoryType.getIcon(rawFileEntry, false);
+ return directoryType.getIcon(rawFileEntry);
} else {
return rawFileEntry != null && rawFileEntry.resolved().getKind() == FileKind.DIRECTORY
- ? "default_folder.svg"
- : "default_file.svg";
+ ? "browser/default_folder.svg"
+ : "browser/default_file.svg";
}
}
diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java
index 9eaba89c9..f9cfb23a2 100644
--- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java
+++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java
@@ -194,9 +194,9 @@ public final class BrowserFileListComp extends SimpleComp {
? unix.getGroup()
: m.getCache().getGroups().getOrDefault(unix.getGid(), "?");
var uid = String.valueOf(
- unix.getUid() != null ? unix.getUid() : m.getCache().getUidForUser(user));
+ unix.getUid() != null ? unix.getUid() : m.getCache().getUidForUser(user));
var gid = String.valueOf(
- unix.getGid() != null ? unix.getGid() : m.getCache().getGidForGroup(group));
+ unix.getGid() != null ? unix.getGid() : m.getCache().getGidForGroup(group));
if (uid.equals(gid) && user.equals(group)) {
return user + " [" + uid + "]";
}
@@ -248,7 +248,6 @@ public final class BrowserFileListComp extends SimpleComp {
if (inCooldown) {
lastType.set(Instant.now());
event.consume();
- return;
} else {
lastType.set(null);
typedSelection.set("");
@@ -256,8 +255,8 @@ public final class BrowserFileListComp extends SimpleComp {
if (!recursive) {
updateTypedSelection(table, lastType, event, true);
}
- return;
}
+ return;
}
lastType.set(Instant.now());
@@ -631,6 +630,10 @@ public final class BrowserFileListComp extends SimpleComp {
() -> getTableRow().getItem(), fileList.getFileSystemModel())
.hide(Bindings.createBooleanBinding(
() -> {
+ if (getTableRow() == null) {
+ return true;
+ }
+
var item = getTableRow().getItem();
var notDir = item.getRawFileEntry().resolved().getKind() != FileKind.DIRECTORY;
var isParentLink = item.getRawFileEntry()
diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferOperation.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferOperation.java
index 65af868aa..6e49f8a4a 100644
--- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferOperation.java
+++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferOperation.java
@@ -102,7 +102,7 @@ public class BrowserFileTransferOperation {
public void execute() throws Exception {
if (files.isEmpty()) {
- updateProgress(BrowserTransferProgress.empty());
+ updateProgress(null);
return;
}
@@ -115,18 +115,22 @@ public class BrowserFileTransferOperation {
}
}
- for (var file : files) {
- if (same) {
- handleSingleOnSameFileSystem(file);
- } else {
- handleSingleAcrossFileSystems(file);
- }
- }
-
- if (!same && doesMove) {
+ try {
for (var file : files) {
- deleteSingle(file);
+ if (same) {
+ handleSingleOnSameFileSystem(file);
+ } else {
+ handleSingleAcrossFileSystems(file);
+ }
}
+
+ if (!same && doesMove) {
+ for (var file : files) {
+ deleteSingle(file);
+ }
+ }
+ } finally {
+ updateProgress(null);
}
}
diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessContextMenu.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessContextMenu.java
index 83d3d6a33..6f5735534 100644
--- a/app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessContextMenu.java
+++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessContextMenu.java
@@ -142,8 +142,7 @@ public class BrowserQuickAccessContextMenu extends ContextMenu {
this.menu = new Menu(
// Use original name, not the link target
browserEntry.getRawFileEntry().getName(),
- PrettyImageHelper.ofFixedRasterized(
- FileIconManager.getFileIcon(browserEntry.getRawFileEntry(), false), 24, 24)
+ PrettyImageHelper.ofFixedSize(FileIconManager.getFileIcon(browserEntry.getRawFileEntry()), 24, 24)
.createRegion());
createMenu();
addInputListeners();
diff --git a/app/src/main/java/io/xpipe/app/browser/file/LocalFileSystem.java b/app/src/main/java/io/xpipe/app/browser/file/LocalFileSystem.java
index 6b07cd7c8..48b74d368 100644
--- a/app/src/main/java/io/xpipe/app/browser/file/LocalFileSystem.java
+++ b/app/src/main/java/io/xpipe/app/browser/file/LocalFileSystem.java
@@ -1,9 +1,9 @@
package io.xpipe.app.browser.file;
+import io.xpipe.app.ext.LocalStore;
import io.xpipe.core.store.FileEntry;
import io.xpipe.core.store.FileKind;
import io.xpipe.core.store.FileSystem;
-import io.xpipe.app.ext.LocalStore;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -19,6 +19,13 @@ public class LocalFileSystem {
}
}
+ public static void reset() throws Exception {
+ if (localFileSystem != null) {
+ localFileSystem.close();
+ localFileSystem = null;
+ }
+ }
+
public static FileEntry getLocalFileEntry(Path file) throws Exception {
if (localFileSystem == null) {
throw new IllegalStateException();
diff --git a/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemCache.java b/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemCache.java
index 9a750cdb3..9d9037af9 100644
--- a/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemCache.java
+++ b/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemCache.java
@@ -60,7 +60,8 @@ public class OpenFileSystemCache extends ShellControlCache {
var split = s.split(":");
try {
users.putIfAbsent(Integer.parseInt(split[2]), split[0]);
- } catch (Exception ignored) {}
+ } catch (Exception ignored) {
+ }
});
if (users.isEmpty()) {
@@ -81,7 +82,8 @@ public class OpenFileSystemCache extends ShellControlCache {
var split = s.split(":");
try {
groups.putIfAbsent(Integer.parseInt(split[2]), split[0]);
- } catch (Exception ignored) {}
+ } catch (Exception ignored) {
+ }
});
if (groups.isEmpty()) {
diff --git a/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemModel.java b/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemModel.java
index 3697c98e0..fffc99126 100644
--- a/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemModel.java
+++ b/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemModel.java
@@ -11,6 +11,7 @@ import io.xpipe.app.browser.file.FileSystemHelper;
import io.xpipe.app.browser.session.BrowserAbstractSessionModel;
import io.xpipe.app.browser.session.BrowserSessionTab;
import io.xpipe.app.comp.base.ModalOverlayComp;
+import io.xpipe.app.ext.ProcessControlProvider;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.storage.DataStorage;
@@ -18,7 +19,7 @@ import io.xpipe.app.storage.DataStoreEntryRef;
import io.xpipe.app.util.BooleanScope;
import io.xpipe.app.util.TerminalLauncher;
import io.xpipe.app.util.ThreadHelper;
-import io.xpipe.app.ext.ProcessControlProvider;
+import io.xpipe.core.process.CommandBuilder;
import io.xpipe.core.process.ShellControl;
import io.xpipe.core.process.ShellDialects;
import io.xpipe.core.process.ShellOpenFunction;
@@ -47,8 +48,7 @@ public final class OpenFileSystemModel extends BrowserSessionTab overlay = new SimpleObjectProperty<>();
private final BooleanProperty inOverview = new SimpleBooleanProperty();
- private final Property progress =
- new SimpleObjectProperty<>(BrowserTransferProgress.empty());
+ private final Property progress = new SimpleObjectProperty<>();
private FileSystem fileSystem;
private OpenFileSystemSavedState savedState;
private OpenFileSystemCache cache;
@@ -73,10 +73,13 @@ public final class OpenFileSystemModel extends BrowserSessionTab 4 ? "browser/" + split[4].trim() : closedIcon;
- var lightClosedIcon = split.length > 4 ? split[4].trim() : closedIcon;
- var lightOpenIcon = split.length > 4 ? split[5].trim() : openIcon;
-
- ALL.add(new Simple(
- id,
- new IconVariant(lightClosedIcon, closedIcon),
- new IconVariant(lightOpenIcon, openIcon),
- filter));
+ ALL.add(new Simple(id, new IconVariant(lightClosedIcon, closedIcon), filter));
}
}
});
@@ -84,7 +77,7 @@ public abstract class BrowserIconDirectoryType {
public abstract boolean matches(FileEntry entry);
- public abstract String getIcon(FileEntry entry, boolean open);
+ public abstract String getIcon(FileEntry entry);
public static class Simple extends BrowserIconDirectoryType {
@@ -92,13 +85,11 @@ public abstract class BrowserIconDirectoryType {
private final String id;
private final IconVariant closed;
- private final IconVariant open;
private final Set names;
- public Simple(String id, IconVariant closed, IconVariant open, Set names) {
+ public Simple(String id, IconVariant closed, Set names) {
this.id = id;
this.closed = closed;
- this.open = open;
this.names = names;
}
@@ -113,8 +104,8 @@ public abstract class BrowserIconDirectoryType {
}
@Override
- public String getIcon(FileEntry entry, boolean open) {
- return open ? this.open.getIcon() : this.closed.getIcon();
+ public String getIcon(FileEntry entry) {
+ return this.closed.getIcon();
}
}
}
diff --git a/app/src/main/java/io/xpipe/app/browser/icon/BrowserIconFileType.java b/app/src/main/java/io/xpipe/app/browser/icon/BrowserIconFileType.java
index d955481f8..4293aa2b6 100644
--- a/app/src/main/java/io/xpipe/app/browser/icon/BrowserIconFileType.java
+++ b/app/src/main/java/io/xpipe/app/browser/icon/BrowserIconFileType.java
@@ -1,6 +1,6 @@
package io.xpipe.app.browser.icon;
-import io.xpipe.app.core.AppResources;
+import io.xpipe.app.resources.AppResources;
import io.xpipe.core.store.FileEntry;
import io.xpipe.core.store.FileKind;
import io.xpipe.core.store.FileNames;
@@ -47,8 +47,8 @@ public abstract class BrowserIconFileType {
return "." + r;
})
.collect(Collectors.toSet());
- var darkIcon = split[2].trim();
- var lightIcon = split.length > 3 ? split[3].trim() : darkIcon;
+ var darkIcon = "browser/" + split[2].trim();
+ var lightIcon = (split.length > 3 ? "browser/" + split[3].trim() : darkIcon);
ALL.add(new BrowserIconFileType.Simple(id, lightIcon, darkIcon, filter));
}
}
diff --git a/app/src/main/java/io/xpipe/app/browser/icon/BrowserIcons.java b/app/src/main/java/io/xpipe/app/browser/icon/BrowserIcons.java
index e156867ea..18fc39bde 100644
--- a/app/src/main/java/io/xpipe/app/browser/icon/BrowserIcons.java
+++ b/app/src/main/java/io/xpipe/app/browser/icon/BrowserIcons.java
@@ -7,11 +7,11 @@ import io.xpipe.core.store.FileEntry;
public class BrowserIcons {
public static Comp> createDefaultFileIcon() {
- return PrettyImageHelper.ofFixedSizeSquare("default_file.svg", 24);
+ return PrettyImageHelper.ofFixedSizeSquare("browser/default_file.svg", 24);
}
public static Comp> createDefaultDirectoryIcon() {
- return PrettyImageHelper.ofFixedSizeSquare("default_folder.svg", 24);
+ return PrettyImageHelper.ofFixedSizeSquare("browser/default_folder.svg", 24);
}
public static Comp> createIcon(BrowserIconFileType type) {
@@ -19,6 +19,6 @@ public class BrowserIcons {
}
public static Comp> createIcon(FileEntry entry) {
- return PrettyImageHelper.ofFixedSizeSquare(FileIconManager.getFileIcon(entry, false), 24);
+ return PrettyImageHelper.ofFixedSizeSquare(FileIconManager.getFileIcon(entry), 24);
}
}
diff --git a/app/src/main/java/io/xpipe/app/browser/icon/FileIconManager.java b/app/src/main/java/io/xpipe/app/browser/icon/FileIconManager.java
index 4df214cd7..1b28618df 100644
--- a/app/src/main/java/io/xpipe/app/browser/icon/FileIconManager.java
+++ b/app/src/main/java/io/xpipe/app/browser/icon/FileIconManager.java
@@ -1,7 +1,5 @@
package io.xpipe.app.browser.icon;
-import io.xpipe.app.core.AppImages;
-import io.xpipe.app.core.AppResources;
import io.xpipe.core.store.FileEntry;
import io.xpipe.core.store.FileKind;
@@ -13,12 +11,11 @@ public class FileIconManager {
if (!loaded) {
BrowserIconFileType.loadDefinitions();
BrowserIconDirectoryType.loadDefinitions();
- AppImages.loadDirectory(AppResources.XPIPE_MODULE, "browser_icons", true, false);
loaded = true;
}
}
- public static synchronized String getFileIcon(FileEntry entry, boolean open) {
+ public static synchronized String getFileIcon(FileEntry entry) {
if (entry == null) {
return null;
}
@@ -33,13 +30,11 @@ public class FileIconManager {
} else {
for (var f : BrowserIconDirectoryType.getAll()) {
if (f.matches(r)) {
- return f.getIcon(r, open);
+ return f.getIcon(r);
}
}
}
- return r.getKind() == FileKind.DIRECTORY
- ? (open ? "default_folder_opened.svg" : "default_folder.svg")
- : "default_file.svg";
+ return "browser/" + (r.getKind() == FileKind.DIRECTORY ? "default_folder.svg" : "default_file.svg");
}
}
diff --git a/app/src/main/java/io/xpipe/app/browser/session/BrowserChooserComp.java b/app/src/main/java/io/xpipe/app/browser/session/BrowserChooserComp.java
index 8b38c6bb9..59189e207 100644
--- a/app/src/main/java/io/xpipe/app/browser/session/BrowserChooserComp.java
+++ b/app/src/main/java/io/xpipe/app/browser/session/BrowserChooserComp.java
@@ -9,11 +9,8 @@ import io.xpipe.app.comp.base.DialogComp;
import io.xpipe.app.comp.base.SideSplitPaneComp;
import io.xpipe.app.comp.store.StoreEntryWrapper;
import io.xpipe.app.core.AppFont;
-import io.xpipe.app.core.AppI18n;
import io.xpipe.app.core.AppLayoutModel;
-import io.xpipe.app.core.window.AppWindowHelper;
import io.xpipe.app.fxcomps.Comp;
-import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.fxcomps.impl.StackComp;
import io.xpipe.app.fxcomps.impl.VerticalComp;
import io.xpipe.app.fxcomps.util.BindingsHelper;
@@ -30,7 +27,6 @@ import javafx.geometry.Pos;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
-import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import javafx.scene.shape.Rectangle;
@@ -40,7 +36,7 @@ import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Supplier;
-public class BrowserChooserComp extends SimpleComp {
+public class BrowserChooserComp extends DialogComp {
private final BrowserFileChooserModel model;
@@ -52,24 +48,16 @@ public class BrowserChooserComp extends SimpleComp {
Supplier> store, Consumer file, boolean save) {
PlatformThread.runLaterIfNeeded(() -> {
var model = new BrowserFileChooserModel(OpenFileSystemModel.SelectionMode.SINGLE_FILE);
- var comp = new BrowserChooserComp(model)
- .apply(struc -> struc.get().setPrefSize(1200, 700))
- .apply(struc -> AppFont.normal(struc.get()));
- var window = AppWindowHelper.sideWindow(
- AppI18n.get(save ? "saveFileTitle" : "openFileTitle"),
- stage -> {
- return comp;
- },
- false,
- null);
+ DialogComp.showWindow(save ? "saveFileTitle" : "openFileTitle", stage -> {
+ var comp = new BrowserChooserComp(model);
+ comp.apply(struc -> struc.get().setPrefSize(1200, 700))
+ .apply(struc -> AppFont.normal(struc.get()))
+ .styleClass("browser")
+ .styleClass("chooser");
+ return comp;
+ });
model.setOnFinish(fileStores -> {
file.accept(fileStores.size() > 0 ? fileStores.getFirst() : null);
- window.close();
- });
- window.show();
- window.setOnHidden(event -> {
- model.finishWithoutChoice();
- event.consume();
});
ThreadHelper.runAsync(() -> {
model.openFileSystemAsync(store.get(), null, null);
@@ -78,7 +66,27 @@ public class BrowserChooserComp extends SimpleComp {
}
@Override
- protected Region createSimple() {
+ protected String finishKey() {
+ return "select";
+ }
+
+ @Override
+ protected Comp> pane(Comp> content) {
+ return content;
+ }
+
+ @Override
+ protected void finish() {
+ model.finishChooser();
+ }
+
+ @Override
+ protected void discard() {
+ model.finishWithoutChoice();
+ }
+
+ @Override
+ public Comp> content() {
Predicate applicable = storeEntryWrapper -> {
return (storeEntryWrapper.getEntry().getStore() instanceof ShellStore)
&& storeEntryWrapper.getEntry().getValidity().isUsable();
@@ -96,7 +104,7 @@ public class BrowserChooserComp extends SimpleComp {
return;
}
- if (entry.getStore() instanceof ShellStore fileSystem) {
+ if (entry.getStore() instanceof ShellStore) {
model.openFileSystemAsync(entry.ref(), null, busy);
}
});
@@ -144,60 +152,33 @@ public class BrowserChooserComp extends SimpleComp {
struc.getLeft().setMinWidth(200);
struc.getLeft().setMaxWidth(500);
});
+ return splitPane;
+ }
- var dialogPane = new DialogComp() {
-
- @Override
- protected String finishKey() {
- return "select";
- }
-
- @Override
- protected Comp> pane(Comp> content) {
- return content;
- }
-
- @Override
- protected void finish() {
- model.finishChooser();
- }
-
- @Override
- public Comp> content() {
- return splitPane;
- }
-
- @Override
- public Comp> bottom() {
- return Comp.of(() -> {
- var selected = new HBox();
- selected.setAlignment(Pos.CENTER_LEFT);
- model.getFileSelection().addListener((ListChangeListener super BrowserEntry>) c -> {
- PlatformThread.runLaterIfNeeded(() -> {
- selected.getChildren()
- .setAll(c.getList().stream()
- .map(s -> {
- var field = new TextField(
- s.getRawFileEntry().getPath());
- field.setEditable(false);
- field.getStyleClass().add("chooser-selection");
- HBox.setHgrow(field, Priority.ALWAYS);
- return field;
- })
- .toList());
- });
- });
- var bottomBar = new HBox(selected);
- HBox.setHgrow(selected, Priority.ALWAYS);
- bottomBar.setAlignment(Pos.CENTER);
- return bottomBar;
+ @Override
+ public Comp> bottom() {
+ return Comp.of(() -> {
+ var selected = new HBox();
+ selected.setAlignment(Pos.CENTER_LEFT);
+ model.getFileSelection().addListener((ListChangeListener super BrowserEntry>) c -> {
+ PlatformThread.runLaterIfNeeded(() -> {
+ selected.getChildren()
+ .setAll(c.getList().stream()
+ .map(s -> {
+ var field = new TextField(
+ s.getRawFileEntry().getPath());
+ field.setEditable(false);
+ field.getStyleClass().add("chooser-selection");
+ HBox.setHgrow(field, Priority.ALWAYS);
+ return field;
+ })
+ .toList());
});
- }
- };
-
- var r = dialogPane.createRegion();
- r.getStyleClass().add("browser");
- r.getStyleClass().add("chooser");
- return r;
+ });
+ var bottomBar = new HBox(selected);
+ HBox.setHgrow(selected, Priority.ALWAYS);
+ bottomBar.setAlignment(Pos.CENTER);
+ return bottomBar;
+ });
}
}
diff --git a/app/src/main/java/io/xpipe/app/browser/session/BrowserSessionModel.java b/app/src/main/java/io/xpipe/app/browser/session/BrowserSessionModel.java
index 4063dc75a..3fdc6fa43 100644
--- a/app/src/main/java/io/xpipe/app/browser/session/BrowserSessionModel.java
+++ b/app/src/main/java/io/xpipe/app/browser/session/BrowserSessionModel.java
@@ -51,11 +51,12 @@ public class BrowserSessionModel extends BrowserAbstractSessionModel(sessionEntries)) {
// Don't close busy connections gracefully
// as we otherwise might lock up
- if (o.canImmediatelyClose()) {
+ if (!o.canImmediatelyClose()) {
continue;
}
- closeSync(o);
+ // Prevent blocking of shutdown
+ closeAsync(o);
}
BrowserSavedStateImpl.get().save();
}
diff --git a/app/src/main/java/io/xpipe/app/browser/session/BrowserSessionTabsComp.java b/app/src/main/java/io/xpipe/app/browser/session/BrowserSessionTabsComp.java
index 9a1331273..e4cb2ef1a 100644
--- a/app/src/main/java/io/xpipe/app/browser/session/BrowserSessionTabsComp.java
+++ b/app/src/main/java/io/xpipe/app/browser/session/BrowserSessionTabsComp.java
@@ -9,6 +9,7 @@ import io.xpipe.app.fxcomps.impl.PrettyImageHelper;
import io.xpipe.app.fxcomps.impl.TooltipAugment;
import io.xpipe.app.fxcomps.util.LabelGraphic;
import io.xpipe.app.fxcomps.util.PlatformThread;
+import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.util.BooleanScope;
import io.xpipe.app.util.ContextMenuHelper;
@@ -238,7 +239,6 @@ public class BrowserSessionTabsComp extends SimpleComp {
% tabs.getTabs().size();
tabs.getSelectionModel().select(previous);
keyEvent.consume();
- return;
}
});
@@ -329,12 +329,14 @@ public class BrowserSessionTabsComp extends SimpleComp {
ring.setMaxSize(16, 16);
ring.progressProperty()
.bind(Bindings.createDoubleBinding(
- () -> model.getBusy().get() ? -1d : 0, PlatformThread.sync(model.getBusy())));
+ () -> model.getBusy().get()
+ && !AppPrefs.get().performanceMode().get()
+ ? -1d
+ : 0,
+ PlatformThread.sync(model.getBusy()),
+ AppPrefs.get().performanceMode()));
- var image = model.getEntry()
- .get()
- .getProvider()
- .getDisplayIconFileName(model.getEntry().getStore());
+ var image = model.getEntry().get().getEffectiveIconFile();
var logo = PrettyImageHelper.ofFixedSizeSquare(image, 16).createRegion();
tab.graphicProperty()
diff --git a/app/src/main/java/io/xpipe/app/comp/AppLayoutComp.java b/app/src/main/java/io/xpipe/app/comp/AppLayoutComp.java
index 32c419d36..58eac8921 100644
--- a/app/src/main/java/io/xpipe/app/comp/AppLayoutComp.java
+++ b/app/src/main/java/io/xpipe/app/comp/AppLayoutComp.java
@@ -11,6 +11,7 @@ import io.xpipe.app.fxcomps.SimpleCompStructure;
import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.app.storage.DataStorage;
+import io.xpipe.app.util.TerminalView;
import javafx.beans.binding.Bindings;
import javafx.beans.value.ObservableValue;
import javafx.scene.Parent;
@@ -49,14 +50,16 @@ public class AppLayoutComp extends Comp> {
var sidebarR = sidebar.createRegion();
pane.setRight(sidebarR);
model.getSelected().addListener((c, o, n) -> {
- if (o != null && o.equals(model.getEntries().get(2))) {
+ if (o != null && o.equals(model.getEntries().get(3))) {
AppPrefs.get().save();
DataStorage.get().saveAsync();
}
- if (o != null && o.equals(model.getEntries().get(1))) {
+ if (o != null && o.equals(model.getEntries().get(0))) {
StoreViewState.get().updateDisplay();
}
+
+ TerminalView.get().toggleView(model.getEntries().get(2).equals(n));
});
pane.addEventHandler(KeyEvent.KEY_PRESSED, event -> {
sidebarR.getChildrenUnmodifiable().forEach(node -> {
@@ -64,7 +67,6 @@ public class AppLayoutComp extends Comp> {
if (shortcut != null && shortcut.match(event)) {
((ButtonBase) ((Parent) node).getChildrenUnmodifiable().get(1)).fire();
event.consume();
- return;
}
});
});
diff --git a/app/src/main/java/io/xpipe/app/comp/base/DialogComp.java b/app/src/main/java/io/xpipe/app/comp/base/DialogComp.java
index a5963378f..782bc981b 100644
--- a/app/src/main/java/io/xpipe/app/comp/base/DialogComp.java
+++ b/app/src/main/java/io/xpipe/app/comp/base/DialogComp.java
@@ -20,22 +20,30 @@ import javafx.stage.Stage;
import atlantafx.base.theme.Styles;
import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
public abstract class DialogComp extends Comp> {
public static void showWindow(String titleKey, Function f) {
var loading = new SimpleBooleanProperty();
+ var dialog = new AtomicReference();
Platform.runLater(() -> {
var stage = AppWindowHelper.sideWindow(
AppI18n.get(titleKey),
window -> {
var c = f.apply(window);
+ dialog.set(c);
loading.bind(c.busy());
return c;
},
false,
loading);
+ stage.setOnCloseRequest(event -> {
+ if (dialog.get() != null) {
+ dialog.get().discard();
+ }
+ });
stage.show();
});
}
@@ -60,12 +68,16 @@ public abstract class DialogComp extends Comp> {
.addAll(customButtons().stream()
.map(buttonComp -> buttonComp.createRegion())
.toList());
- var nextButton = new ButtonComp(AppI18n.observable(finishKey()), null, this::finish)
+ var nextButton = finishButton();
+ buttons.getChildren().add(nextButton.createRegion());
+ return buttons;
+ }
+
+ protected Comp> finishButton() {
+ return new ButtonComp(AppI18n.observable(finishKey()), null, this::finish)
.apply(struc -> struc.get().setDefaultButton(true))
.styleClass(Styles.ACCENT)
.styleClass("next");
- buttons.getChildren().add(nextButton.createRegion());
- return buttons;
}
protected String finishKey() {
@@ -93,6 +105,8 @@ public abstract class DialogComp extends Comp> {
protected abstract void finish();
+ protected abstract void discard();
+
public abstract Comp> content();
protected Comp> pane(Comp> content) {
diff --git a/app/src/main/java/io/xpipe/app/comp/base/ListBoxViewComp.java b/app/src/main/java/io/xpipe/app/comp/base/ListBoxViewComp.java
index cc4921cac..f013c329b 100644
--- a/app/src/main/java/io/xpipe/app/comp/base/ListBoxViewComp.java
+++ b/app/src/main/java/io/xpipe/app/comp/base/ListBoxViewComp.java
@@ -26,6 +26,8 @@ public class ListBoxViewComp extends Comp> {
private static final PseudoClass ODD = PseudoClass.getPseudoClass("odd");
private static final PseudoClass EVEN = PseudoClass.getPseudoClass("even");
+ private static final PseudoClass FIRST = PseudoClass.getPseudoClass("first");
+ private static final PseudoClass LAST = PseudoClass.getPseudoClass("last");
private final ObservableList shown;
private final ObservableList all;
@@ -114,9 +116,10 @@ public class ListBoxViewComp extends Comp> {
for (int i = 0; i < newShown.size(); i++) {
var r = newShown.get(i);
- r.pseudoClassStateChanged(ODD, false);
- r.pseudoClassStateChanged(EVEN, false);
- r.pseudoClassStateChanged(i % 2 == 0 ? EVEN : ODD, true);
+ r.pseudoClassStateChanged(ODD, i % 2 != 0);
+ r.pseudoClassStateChanged(EVEN, i % 2 == 0);
+ r.pseudoClassStateChanged(FIRST, i == 0);
+ r.pseudoClassStateChanged(LAST, i == newShown.size() - 1);
}
var d = new DerivedObservableList<>(listView.getChildren(), true);
diff --git a/app/src/main/java/io/xpipe/app/comp/base/MarkdownComp.java b/app/src/main/java/io/xpipe/app/comp/base/MarkdownComp.java
index b977727df..cec482fbe 100644
--- a/app/src/main/java/io/xpipe/app/comp/base/MarkdownComp.java
+++ b/app/src/main/java/io/xpipe/app/comp/base/MarkdownComp.java
@@ -1,13 +1,13 @@
package io.xpipe.app.comp.base;
import io.xpipe.app.core.AppProperties;
-import io.xpipe.app.core.AppResources;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.CompStructure;
import io.xpipe.app.fxcomps.SimpleCompStructure;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.prefs.AppPrefs;
+import io.xpipe.app.resources.AppResources;
import io.xpipe.app.util.Hyperlinks;
import io.xpipe.app.util.MarkdownHelper;
import io.xpipe.app.util.ShellTemp;
diff --git a/app/src/main/java/io/xpipe/app/comp/base/OsLogoComp.java b/app/src/main/java/io/xpipe/app/comp/base/OsLogoComp.java
index 74cf6a2b0..288cb31ff 100644
--- a/app/src/main/java/io/xpipe/app/comp/base/OsLogoComp.java
+++ b/app/src/main/java/io/xpipe/app/comp/base/OsLogoComp.java
@@ -1,11 +1,11 @@
package io.xpipe.app.comp.base;
import io.xpipe.app.comp.store.StoreEntryWrapper;
-import io.xpipe.app.core.AppResources;
import io.xpipe.app.fxcomps.SimpleComp;
-import io.xpipe.app.fxcomps.impl.PrettyImageComp;
+import io.xpipe.app.fxcomps.impl.PrettyImageHelper;
import io.xpipe.app.fxcomps.impl.StackComp;
import io.xpipe.app.fxcomps.util.BindingsHelper;
+import io.xpipe.app.resources.AppResources;
import io.xpipe.core.process.OsNameState;
import io.xpipe.core.store.FileNames;
@@ -22,8 +22,7 @@ import java.util.Map;
public class OsLogoComp extends SimpleComp {
private static final Map ICONS = new HashMap<>();
- private static final String LINUX_DEFAULT = "linux-24.png";
- private static final String LINUX_DEFAULT_SVG = "linux.svg";
+ private static final String LINUX_DEFAULT_24 = "linux-24.png";
private final StoreEntryWrapper wrapper;
private final ObservableValue state;
@@ -54,8 +53,9 @@ public class OsLogoComp extends SimpleComp {
wrapper.getPersistentState(),
state);
var hide = BindingsHelper.map(img, s -> s != null);
- return new StackComp(
- List.of(new SystemStateComp(state).hide(hide), new PrettyImageComp(img, 24, 24).visible(hide)))
+ return new StackComp(List.of(
+ new SystemStateComp(state).hide(hide),
+ PrettyImageHelper.ofFixedSize(img, 24, 24).visible(hide)))
.createRegion();
}
@@ -67,11 +67,12 @@ public class OsLogoComp extends SimpleComp {
if (ICONS.isEmpty()) {
AppResources.with(AppResources.XPIPE_MODULE, "img/os", file -> {
try (var list = Files.list(file)) {
- list.filter(path -> path.toString().endsWith(".svg")
- && !path.toString().endsWith(LINUX_DEFAULT_SVG))
+ list.filter(path -> path.toString().endsWith(".png")
+ && !path.toString().endsWith(LINUX_DEFAULT_24)
+ && !path.toString().endsWith("-40.png"))
.map(path -> FileNames.getFileName(path.toString()))
.forEach(path -> {
- var base = FileNames.getBaseName(path).replace("-dark", "") + "-24.png";
+ var base = path.replace("-dark", "").replace("-24.png", ".svg");
ICONS.put(FileNames.getBaseName(base).split("-")[0], "os/" + base);
});
}
@@ -82,6 +83,6 @@ public class OsLogoComp extends SimpleComp {
.filter(e -> name.toLowerCase().contains(e.getKey()))
.findAny()
.map(e -> e.getValue())
- .orElse("os/" + LINUX_DEFAULT);
+ .orElse("os/linux.svg");
}
}
diff --git a/app/src/main/java/io/xpipe/app/comp/base/TerminalViewDockComp.java b/app/src/main/java/io/xpipe/app/comp/base/TerminalViewDockComp.java
new file mode 100644
index 000000000..5ea657e96
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/comp/base/TerminalViewDockComp.java
@@ -0,0 +1,67 @@
+package io.xpipe.app.comp.base;
+
+import io.xpipe.app.core.AppI18n;
+import io.xpipe.app.core.window.AppMainWindow;
+import io.xpipe.app.fxcomps.SimpleComp;
+import io.xpipe.app.util.TerminalView;
+import javafx.geometry.Pos;
+import javafx.scene.Cursor;
+import javafx.scene.control.Label;
+import javafx.scene.layout.Region;
+import javafx.scene.layout.StackPane;
+import javafx.stage.WindowEvent;
+
+public class TerminalViewDockComp extends SimpleComp {
+
+ @Override
+ protected Region createSimple() {
+ var label = new Label();
+ label.textProperty().bind(AppI18n.observable("clickToDock"));
+ var stack = new StackPane(label);
+ stack.setAlignment(Pos.CENTER);
+ stack.setCursor(Cursor.HAND);
+ stack.boundsInParentProperty().addListener((observable, oldValue, newValue) -> {
+ update(stack);
+ });
+ var s = AppMainWindow.getInstance().getStage();
+ s.xProperty().addListener((observable, oldValue, newValue) -> {
+ update(stack);
+ });
+ s.yProperty().addListener((observable, oldValue, newValue) -> {
+ update(stack);
+ });
+ s.widthProperty().addListener((observable, oldValue, newValue) -> {
+ update(stack);
+ });
+ s.heightProperty().addListener((observable, oldValue, newValue) -> {
+ update(stack);
+ });
+ s.iconifiedProperty().addListener((observable, oldValue, newValue) -> {
+ if (newValue) {
+ TerminalView.get().onMinimize();
+ } else {
+ TerminalView.get().onFocusGain();
+ }
+ });
+ s.focusedProperty().addListener((observable, oldValue, newValue) -> {
+ if (newValue) {
+ TerminalView.get().onFocusGain();
+ } else {
+ TerminalView.get().onFocusLost();
+ }
+ });
+ s.addEventFilter(WindowEvent.WINDOW_HIDDEN,event -> {
+ TerminalView.get().onClose();
+ });
+ stack.setOnMouseClicked(event -> {
+ TerminalView.get().clickView();
+ event.consume();
+ });
+ return stack;
+ }
+
+ private void update(Region region) {
+ var bounds = region.localToScreen(region.getBoundsInLocal());
+ TerminalView.get().resizeView((int) bounds.getMinX(), (int) bounds.getMinY(),(int) bounds.getWidth(), (int) bounds.getHeight());
+ }
+}
diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreCreationComp.java b/app/src/main/java/io/xpipe/app/comp/store/StoreCreationComp.java
index c2c97fbbf..e0dd41b68 100644
--- a/app/src/main/java/io/xpipe/app/comp/store/StoreCreationComp.java
+++ b/app/src/main/java/io/xpipe/app/comp/store/StoreCreationComp.java
@@ -20,6 +20,7 @@ import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStoreEntry;
import io.xpipe.app.util.*;
import io.xpipe.core.store.DataStore;
+import io.xpipe.core.store.ValidationContext;
import io.xpipe.core.util.ValidationException;
import javafx.application.Platform;
@@ -42,14 +43,13 @@ import net.synedra.validatorfx.GraphicDecorationStackPane;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
-import java.util.function.BiConsumer;
import java.util.function.Predicate;
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
public class StoreCreationComp extends DialogComp {
Stage window;
- BiConsumer consumer;
+ CreationConsumer consumer;
Property provider;
ObjectProperty store;
Predicate filter;
@@ -67,7 +67,7 @@ public class StoreCreationComp extends DialogComp {
public StoreCreationComp(
Stage window,
- BiConsumer consumer,
+ CreationConsumer consumer,
Property provider,
ObjectProperty store,
Predicate filter,
@@ -165,8 +165,11 @@ public class StoreCreationComp extends DialogComp {
e.getProvider(),
e.getStore(),
v -> true,
- (newE, validated) -> {
+ (newE, context, validated) -> {
ThreadHelper.runAsync(() -> {
+ if (context != null) {
+ context.close();
+ }
if (!DataStorage.get().getStoreEntries().contains(e)) {
DataStorage.get().addStoreEntryIfNotPresent(newE);
} else {
@@ -193,15 +196,16 @@ public class StoreCreationComp extends DialogComp {
base != null ? DataStoreProviders.byStore(base) : null,
base,
dataStoreProvider -> category.equals(dataStoreProvider.getCreationCategory()),
- (e, validated) -> {
+ (e, context, validated) -> {
try {
DataStorage.get().addStoreEntryIfNotPresent(e);
- if (validated
+ if (context != null
+ && validated
&& e.getProvider().shouldShowScan()
&& AppPrefs.get()
.openConnectionSearchWindowOnConnectionCreation()
.get()) {
- ScanAlert.showAsync(e);
+ ScanAlert.showAsync(e, context);
}
} catch (Exception ex) {
ErrorEvent.fromThrowable(ex).handle();
@@ -211,12 +215,17 @@ public class StoreCreationComp extends DialogComp {
null);
}
+ public interface CreationConsumer {
+
+ void consume(DataStoreEntry entry, ValidationContext> validationContext, boolean validated);
+ }
+
private static void show(
String initialName,
DataStoreProvider provider,
DataStore s,
Predicate filter,
- BiConsumer con,
+ CreationConsumer con,
boolean staticDisplay,
DataStoreEntry existingEntry) {
var prop = new SimpleObjectProperty<>(provider);
@@ -247,7 +256,7 @@ public class StoreCreationComp extends DialogComp {
return List.of(
new ButtonComp(AppI18n.observable("skip"), null, () -> {
if (showInvalidConfirmAlert()) {
- commit(false);
+ commit(null, false);
} else {
finish();
}
@@ -275,6 +284,9 @@ public class StoreCreationComp extends DialogComp {
return busy;
}
+ @Override
+ protected void discard() {}
+
@Override
protected void finish() {
if (finished.get()) {
@@ -287,7 +299,7 @@ public class StoreCreationComp extends DialogComp {
// We didn't change anything
if (existingEntry != null && existingEntry.getStore().equals(store.getValue())) {
- commit(false);
+ commit(null, false);
return;
}
@@ -315,10 +327,10 @@ public class StoreCreationComp extends DialogComp {
return;
}
- try (var b = new BooleanScope(busy).start()) {
+ try (var ignored = new BooleanScope(busy).start()) {
DataStorage.get().addStoreEntryInProgress(entry.getValue());
- entry.getValue().validateOrThrow();
- commit(true);
+ var context = entry.getValue().validateAndKeepOpenOrThrowAndClose(null);
+ commit(context, true);
} catch (Throwable ex) {
if (ex instanceof ValidationException) {
ErrorEvent.expected(ex);
@@ -403,14 +415,14 @@ public class StoreCreationComp extends DialogComp {
.createRegion();
}
- private void commit(boolean validated) {
+ private void commit(ValidationContext> validationContext, boolean validated) {
if (finished.get()) {
return;
}
finished.setValue(true);
if (entry.getValue() != null) {
- consumer.accept(entry.getValue(), validated);
+ consumer.consume(entry.getValue(), validationContext, validated);
}
PlatformThread.runLaterIfNeeded(() -> {
diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreCreationMenu.java b/app/src/main/java/io/xpipe/app/comp/store/StoreCreationMenu.java
index 13ad741f3..df546265f 100644
--- a/app/src/main/java/io/xpipe/app/comp/store/StoreCreationMenu.java
+++ b/app/src/main/java/io/xpipe/app/comp/store/StoreCreationMenu.java
@@ -22,7 +22,7 @@ public class StoreCreationMenu {
automatically.setGraphic(new FontIcon("mdi2e-eye-plus-outline"));
automatically.textProperty().bind(AppI18n.observable("addAutomatically"));
automatically.setOnAction(event -> {
- ScanAlert.showAsync(null);
+ ScanAlert.showAsync(null, null);
event.consume();
});
menu.getItems().add(automatically);
@@ -32,17 +32,21 @@ public class StoreCreationMenu {
menu.getItems().add(category("addDesktop", "mdi2c-camera-plus", DataStoreCreationCategory.DESKTOP, null));
- menu.getItems().add(category("addShell", "mdi2t-text-box-multiple", DataStoreCreationCategory.SHELL, "shellEnvironment"));
+ menu.getItems()
+ .add(category(
+ "addShell", "mdi2t-text-box-multiple", DataStoreCreationCategory.SHELL, "shellEnvironment"));
menu.getItems()
.add(category("addScript", "mdi2s-script-text-outline", DataStoreCreationCategory.SCRIPT, "script"));
menu.getItems()
- .add(category("addTunnel", "mdi2v-vector-polyline-plus", DataStoreCreationCategory.TUNNEL, "customService"));
+ .add(category(
+ "addTunnel", "mdi2v-vector-polyline-plus", DataStoreCreationCategory.TUNNEL, "customService"));
menu.getItems().add(category("addSerial", "mdi2s-serial-port", DataStoreCreationCategory.SERIAL, "serial"));
- // menu.getItems().add(category("addDatabase", "mdi2d-database-plus", DataStoreCreationCategory.DATABASE, null));
+ // menu.getItems().add(category("addDatabase", "mdi2d-database-plus", DataStoreCreationCategory.DATABASE,
+ // null));
}
private static MenuItem category(
@@ -85,8 +89,7 @@ public class StoreCreationMenu {
.sorted(Comparator.comparingInt(dataStoreProvider -> dataStoreProvider.getOrderPriority()))
.toList();
int lastOrder = providers.getFirst().getOrderPriority();
- for (int i = 0; i < providers.size(); i++) {
- var dataStoreProvider = providers.get(i);
+ for (io.xpipe.app.ext.DataStoreProvider dataStoreProvider : providers) {
if (dataStoreProvider.getOrderPriority() != lastOrder) {
menu.getItems().add(new SeparatorMenuItem());
lastOrder = dataStoreProvider.getOrderPriority();
diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryComp.java b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryComp.java
index 94883bd98..7f74eeafe 100644
--- a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryComp.java
+++ b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryComp.java
@@ -10,12 +10,12 @@ import io.xpipe.app.fxcomps.augment.ContextMenuAugment;
import io.xpipe.app.fxcomps.augment.GrowAugment;
import io.xpipe.app.fxcomps.impl.IconButtonComp;
import io.xpipe.app.fxcomps.impl.LabelComp;
-import io.xpipe.app.fxcomps.impl.PrettyImageHelper;
import io.xpipe.app.fxcomps.impl.TooltipAugment;
import io.xpipe.app.fxcomps.util.BindingsHelper;
import io.xpipe.app.fxcomps.util.DerivedObservableList;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.prefs.AppPrefs;
+import io.xpipe.app.resources.AppResources;
import io.xpipe.app.storage.DataColor;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStoreEntry;
@@ -33,7 +33,6 @@ import javafx.scene.control.*;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Region;
-import javafx.scene.layout.StackPane;
import atlantafx.base.layout.InputGroup;
import atlantafx.base.theme.Styles;
@@ -192,26 +191,7 @@ public abstract class StoreEntryComp extends SimpleComp {
}
protected Node createIcon(int w, int h) {
- var img = getWrapper().disabledProperty().get()
- ? "disabled_icon.png"
- : getWrapper()
- .getEntry()
- .getProvider()
- .getDisplayIconFileName(getWrapper().getEntry().getStore());
- var imageComp = PrettyImageHelper.ofFixedSize(img, w, h);
- var storeIcon = imageComp.createRegion();
- if (getWrapper().getValidity().getValue().isUsable()) {
- new TooltipAugment<>(getWrapper().getEntry().getProvider().displayName(), null).augment(storeIcon);
- }
-
- var stack = new StackPane(storeIcon);
- stack.setMinHeight(w + 7);
- stack.setMinWidth(w + 7);
- stack.setMaxHeight(w + 7);
- stack.setMaxWidth(w + 7);
- stack.getStyleClass().add("icon");
- stack.setAlignment(Pos.CENTER);
- return stack;
+ return new StoreIconComp(getWrapper(), w, h).createRegion();
}
protected Region createButtonBar() {
@@ -265,12 +245,14 @@ public abstract class StoreEntryComp extends SimpleComp {
button.apply(new ContextMenuAugment<>(
mouseEvent -> mouseEvent.getButton() == MouseButton.PRIMARY, keyEvent -> false, () -> {
var cm = ContextMenuHelper.create();
- branch.getChildren(getWrapper().getEntry().ref()).forEach(childProvider -> {
- var menu = buildMenuItemForAction(childProvider);
- if (menu != null) {
- cm.getItems().add(menu);
- }
- });
+ branch.getChildren(getWrapper().getEntry().ref()).stream()
+ .filter(actionProvider -> getWrapper().showActionProvider(actionProvider))
+ .forEach(childProvider -> {
+ var menu = buildMenuItemForAction(childProvider);
+ if (menu != null) {
+ cm.getItems().add(menu);
+ }
+ });
return cm;
}));
}
@@ -341,14 +323,16 @@ public abstract class StoreEntryComp extends SimpleComp {
if (DataStorage.get().isRootEntry(getWrapper().getEntry())) {
var color = new Menu(AppI18n.get("color"), new FontIcon("mdi2f-format-color-fill"));
- var none = new MenuItem("None");
+ var none = new MenuItem();
+ none.textProperty().bind(AppI18n.observable("none"));
none.setOnAction(event -> {
getWrapper().getEntry().setColor(null);
event.consume();
});
color.getItems().add(none);
Arrays.stream(DataColor.values()).forEach(dataStoreColor -> {
- MenuItem m = new MenuItem(DataStoreFormatter.capitalize(dataStoreColor.getId()));
+ MenuItem m = new MenuItem();
+ m.textProperty().bind(AppI18n.observable(dataStoreColor.getId()));
m.setOnAction(event -> {
getWrapper().getEntry().setColor(dataStoreColor);
event.consume();
@@ -463,6 +447,7 @@ public abstract class StoreEntryComp extends SimpleComp {
if (branch != null) {
var items = branch.getChildren(getWrapper().getEntry().ref()).stream()
+ .filter(actionProvider -> getWrapper().showActionProvider(actionProvider))
.map(c -> buildMenuItemForAction(c))
.toList();
menu.getItems().addAll(items);
@@ -475,6 +460,7 @@ public abstract class StoreEntryComp extends SimpleComp {
getWrapper()
.runAction(leaf.createAction(getWrapper().getEntry().ref()), leaf.showBusy());
});
+ event.consume();
});
menu.getItems().add(run);
@@ -493,6 +479,7 @@ public abstract class StoreEntryComp extends SimpleComp {
.getName(getWrapper().getEntry().ref())
.getValue() + ")");
});
+ event.consume();
});
menu.getItems().add(sc);
@@ -504,6 +491,7 @@ public abstract class StoreEntryComp extends SimpleComp {
AppActionLinkDetector.setLastDetectedAction(url);
ClipboardHelper.copyUrl(url);
});
+ event.consume();
});
menu.getItems().add(l);
}
@@ -518,10 +506,13 @@ public abstract class StoreEntryComp extends SimpleComp {
return;
}
- event.consume();
ThreadHelper.runFailableAsync(() -> {
getWrapper().runAction(leaf.createAction(getWrapper().getEntry().ref()), leaf.showBusy());
});
+ event.consume();
+ if (event.getTarget() instanceof Menu m) {
+ m.getParentPopup().hide();
+ }
});
return item;
diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryListComp.java b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryListComp.java
index 53b775696..71474e3f7 100644
--- a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryListComp.java
+++ b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryListComp.java
@@ -2,6 +2,7 @@ package io.xpipe.app.comp.store;
import io.xpipe.app.comp.base.ListBoxViewComp;
import io.xpipe.app.comp.base.MultiContentComp;
+import io.xpipe.app.core.AppLayoutModel;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.SimpleComp;
@@ -34,6 +35,12 @@ public class StoreEntryListComp extends SimpleComp {
struc.get().setVvalue(0);
});
});
+ content.apply(struc -> {
+ // Reset scroll
+ AppLayoutModel.get().getSelected().addListener((observable, oldValue, newValue) -> {
+ struc.get().setVvalue(0);
+ });
+ });
return content.styleClass("store-list-comp");
}
@@ -44,7 +51,8 @@ public class StoreEntryListComp extends SimpleComp {
() -> {
var allCat = StoreViewState.get().getAllConnectionsCategory();
var connections = StoreViewState.get().getAllEntries().getList().stream()
- .filter(wrapper -> allCat.equals(wrapper.getCategory().getValue().getRoot()))
+ .filter(wrapper -> allCat.equals(
+ wrapper.getCategory().getValue().getRoot()))
.toList();
return initialCount == connections.size()
&& StoreViewState.get()
diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryListOverviewComp.java b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryListOverviewComp.java
index 62440566c..92a3640b5 100644
--- a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryListOverviewComp.java
+++ b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryListOverviewComp.java
@@ -8,6 +8,7 @@ import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.fxcomps.impl.FilterComp;
import io.xpipe.app.fxcomps.impl.IconButtonComp;
import io.xpipe.app.fxcomps.util.BindingsHelper;
+import io.xpipe.app.fxcomps.util.LabelGraphic;
import io.xpipe.app.util.ThreadHelper;
import io.xpipe.core.process.OsType;
@@ -72,8 +73,13 @@ public class StoreEntryListOverviewComp extends SimpleComp {
// But it is good enough.
var showProvider = true;
try {
- showProvider = storeEntryWrapper.getEntry().getProvider().shouldShow(storeEntryWrapper);
- } catch (Exception ignored) {}
+ showProvider = storeEntryWrapper.getEntry().getProvider() == null
+ || storeEntryWrapper
+ .getEntry()
+ .getProvider()
+ .shouldShow(storeEntryWrapper);
+ } catch (Exception ignored) {
+ }
return inRootCategory && showProvider;
},
StoreViewState.get().getActiveCategory());
@@ -143,15 +149,15 @@ public class StoreEntryListOverviewComp extends SimpleComp {
}
private Comp> createAlphabeticalSortButton() {
- var icon = Bindings.createStringBinding(
+ var icon = Bindings.createObjectBinding(
() -> {
if (sortMode.getValue() == StoreSortMode.ALPHABETICAL_ASC) {
- return "mdi2s-sort-alphabetical-descending";
+ return new LabelGraphic.IconGraphic("mdi2s-sort-alphabetical-descending");
}
if (sortMode.getValue() == StoreSortMode.ALPHABETICAL_DESC) {
- return "mdi2s-sort-alphabetical-ascending";
+ return new LabelGraphic.IconGraphic("mdi2s-sort-alphabetical-ascending");
}
- return "mdi2s-sort-alphabetical-descending";
+ return new LabelGraphic.IconGraphic("mdi2s-sort-alphabetical-descending");
},
sortMode);
var alphabetical = new IconButtonComp(icon, () -> {
@@ -184,15 +190,15 @@ public class StoreEntryListOverviewComp extends SimpleComp {
}
private Comp> createDateSortButton() {
- var icon = Bindings.createStringBinding(
+ var icon = Bindings.createObjectBinding(
() -> {
if (sortMode.getValue() == StoreSortMode.DATE_ASC) {
- return "mdi2s-sort-clock-ascending-outline";
+ return new LabelGraphic.IconGraphic("mdi2s-sort-clock-ascending-outline");
}
if (sortMode.getValue() == StoreSortMode.DATE_DESC) {
- return "mdi2s-sort-clock-descending-outline";
+ return new LabelGraphic.IconGraphic("mdi2s-sort-clock-descending-outline");
}
- return "mdi2s-sort-clock-ascending-outline";
+ return new LabelGraphic.IconGraphic("mdi2s-sort-clock-ascending-outline");
},
sortMode);
var date = new IconButtonComp(icon, () -> {
diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryWrapper.java b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryWrapper.java
index adb9cce0e..4e43f2087 100644
--- a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryWrapper.java
+++ b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryWrapper.java
@@ -17,7 +17,9 @@ import lombok.Getter;
import java.time.Duration;
import java.time.Instant;
-import java.util.*;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
@Getter
public class StoreEntryWrapper {
@@ -40,6 +42,8 @@ public class StoreEntryWrapper {
private final Property category = new SimpleObjectProperty<>();
private final Property summary = new SimpleObjectProperty<>();
private final Property notes;
+ private final Property customIcon = new SimpleObjectProperty<>();
+ private final Property iconFile = new SimpleObjectProperty<>();
public StoreEntryWrapper(DataStoreEntry entry) {
this.entry = entry;
@@ -137,6 +141,8 @@ public class StoreEntryWrapper {
}
color.setValue(entry.getColor());
notes.setValue(new StoreNotes(entry.getNotes(), entry.getNotes()));
+ customIcon.setValue(entry.getIcon());
+ iconFile.setValue(entry.getEffectiveIconFile());
busy.setValue(entry.getBusyCounter().get() != 0);
deletable.setValue(entry.getConfiguration().isDeletable()
@@ -191,7 +197,7 @@ public class StoreEntryWrapper {
}
}
- private boolean showActionProvider(ActionProvider p) {
+ public boolean showActionProvider(ActionProvider p) {
var leaf = p.getLeafDataStoreCallSite();
if (leaf != null) {
return (entry.getValidity().isUsable() || (!leaf.requiresValidStore() && entry.getProvider() != null))
@@ -214,7 +220,7 @@ public class StoreEntryWrapper {
}
public void refreshChildren() {
- var hasChildren = DataStorage.get().refreshChildren(entry);
+ var hasChildren = DataStorage.get().refreshChildren(entry, null);
PlatformThread.runLaterIfNeeded(() -> {
expanded.set(hasChildren);
});
diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreIconChoiceComp.java b/app/src/main/java/io/xpipe/app/comp/store/StoreIconChoiceComp.java
new file mode 100644
index 000000000..d853331b2
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/comp/store/StoreIconChoiceComp.java
@@ -0,0 +1,145 @@
+package io.xpipe.app.comp.store;
+
+import io.xpipe.app.fxcomps.SimpleComp;
+import io.xpipe.app.fxcomps.impl.PrettyImageHelper;
+import io.xpipe.app.resources.SystemIcon;
+
+import javafx.beans.property.Property;
+import javafx.beans.property.SimpleObjectProperty;
+import javafx.beans.property.SimpleStringProperty;
+import javafx.beans.property.StringProperty;
+import javafx.scene.control.*;
+import javafx.scene.input.MouseButton;
+import javafx.scene.layout.Region;
+
+import atlantafx.base.theme.Tweaks;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Locale;
+
+import static atlantafx.base.theme.Styles.TEXT_SMALL;
+
+public class StoreIconChoiceComp extends SimpleComp {
+
+ private final Property selected;
+ private final List icons;
+ private final int columns;
+ private final SimpleStringProperty filter;
+ private final Runnable doubleClick;
+
+ public StoreIconChoiceComp(
+ Property selected,
+ List icons,
+ int columns,
+ SimpleStringProperty filter,
+ Runnable doubleClick) {
+ this.selected = selected;
+ this.icons = icons;
+ this.columns = columns;
+ this.filter = filter;
+ this.doubleClick = doubleClick;
+ }
+
+ @Override
+ protected Region createSimple() {
+ var table = new TableView>();
+ initTable(table);
+ updateData(table, null);
+ filter.addListener((observable, oldValue, newValue) -> updateData(table, newValue));
+ return table;
+ }
+
+ private void initTable(TableView> table) {
+ for (int i = 0; i < columns; i++) {
+ var col = new TableColumn, SystemIcon>("col" + i);
+ final int colIndex = i;
+ col.setCellValueFactory(cb -> {
+ var row = cb.getValue();
+ var item = row.size() > colIndex ? row.get(colIndex) : null;
+ return new SimpleObjectProperty<>(item);
+ });
+ col.setCellFactory(cb -> new IconCell());
+ col.getStyleClass().add(Tweaks.ALIGN_CENTER);
+ table.getColumns().add(col);
+ }
+
+ table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY_ALL_COLUMNS);
+ table.getSelectionModel().setCellSelectionEnabled(true);
+ table.getStyleClass().add("icon-browser");
+ table.setPlaceholder(new Region());
+ }
+
+ private void updateData(TableView> table, String filterString) {
+ var displayedIcons = filterString == null || filterString.isBlank() || filterString.length() < 2
+ ? icons
+ : icons.stream()
+ .filter(icon -> containsString(icon.getDisplayName(), filterString))
+ .toList();
+
+ var data = partitionList(displayedIcons, columns);
+ table.getItems().setAll(data);
+ }
+
+ private Collection> partitionList(List list, int size) {
+ List> partitions = new ArrayList<>();
+ if (list.size() == 0) {
+ return partitions;
+ }
+
+ int length = list.size();
+ int numOfPartitions = length / size + ((length % size == 0) ? 0 : 1);
+
+ for (int i = 0; i < numOfPartitions; i++) {
+ int from = i * size;
+ int to = Math.min((i * size + size), length);
+ partitions.add(list.subList(from, to));
+ }
+ return partitions;
+ }
+
+ private boolean containsString(String s1, String s2) {
+ return s1.toLowerCase(Locale.ROOT).contains(s2.toLowerCase(Locale.ROOT));
+ }
+
+ public class IconCell extends TableCell, SystemIcon> {
+
+ private final Label root = new Label();
+ private final StringProperty image = new SimpleStringProperty();
+
+ public IconCell() {
+ super();
+
+ root.setContentDisplay(ContentDisplay.TOP);
+ Region imageView = PrettyImageHelper.ofFixedSize(image, 40, 40).createRegion();
+ root.setGraphic(imageView);
+ root.setGraphicTextGap(10);
+ root.getStyleClass().addAll("icon-label", TEXT_SMALL);
+
+ setOnMouseClicked(event -> {
+ if (event.getButton() == MouseButton.PRIMARY) {
+ selected.setValue(getItem());
+ }
+
+ if (event.getClickCount() > 1) {
+ doubleClick.run();
+ }
+ });
+ }
+
+ @Override
+ protected void updateItem(SystemIcon icon, boolean empty) {
+ super.updateItem(icon, empty);
+
+ if (icon == null) {
+ setGraphic(null);
+ return;
+ }
+
+ root.setText(icon.getDisplayName());
+ image.set("app:system/" + icon.getIconName() + ".svg");
+ setGraphic(root);
+ }
+ }
+}
diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreIconChoiceDialogComp.java b/app/src/main/java/io/xpipe/app/comp/store/StoreIconChoiceDialogComp.java
new file mode 100644
index 000000000..d66f1bb25
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/comp/store/StoreIconChoiceDialogComp.java
@@ -0,0 +1,99 @@
+package io.xpipe.app.comp.store;
+
+import io.xpipe.app.comp.base.ButtonComp;
+import io.xpipe.app.comp.base.DialogComp;
+import io.xpipe.app.core.AppI18n;
+import io.xpipe.app.core.window.AppWindowHelper;
+import io.xpipe.app.fxcomps.Comp;
+import io.xpipe.app.fxcomps.SimpleComp;
+import io.xpipe.app.fxcomps.impl.FilterComp;
+import io.xpipe.app.fxcomps.impl.HorizontalComp;
+import io.xpipe.app.resources.SystemIcon;
+import io.xpipe.app.resources.SystemIcons;
+import io.xpipe.app.storage.DataStoreEntry;
+import io.xpipe.app.util.Hyperlinks;
+
+import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.SimpleObjectProperty;
+import javafx.beans.property.SimpleStringProperty;
+import javafx.scene.layout.Region;
+import javafx.stage.Modality;
+import javafx.stage.Stage;
+
+import org.kordamp.ikonli.javafx.FontIcon;
+
+import java.util.List;
+
+public class StoreIconChoiceDialogComp extends SimpleComp {
+
+ public static void show(DataStoreEntry entry) {
+ var window = AppWindowHelper.sideWindow(
+ AppI18n.get("chooseCustomIcon"), stage -> new StoreIconChoiceDialogComp(entry, stage), false, null);
+ window.initModality(Modality.APPLICATION_MODAL);
+ window.show();
+ }
+
+ private final ObjectProperty selected = new SimpleObjectProperty<>();
+ private final DataStoreEntry entry;
+ private final Stage dialogStage;
+
+ public StoreIconChoiceDialogComp(DataStoreEntry entry, Stage dialogStage) {
+ this.entry = entry;
+ this.dialogStage = dialogStage;
+ }
+
+ @Override
+ protected Region createSimple() {
+ var filterText = new SimpleStringProperty();
+ var filter = new FilterComp(filterText).apply(struc -> {
+ dialogStage.setOnShowing(event -> {
+ struc.get().requestFocus();
+ event.consume();
+ });
+ });
+ var github = new ButtonComp(null, new FontIcon("mdi2g-github"), () -> {
+ Hyperlinks.open(Hyperlinks.SELFHST_ICONS);
+ })
+ .grow(false, true);
+ var dialog = new DialogComp() {
+ @Override
+ protected void finish() {
+ entry.setIcon(selected.get() != null ? selected.getValue().getIconName() : null, true);
+ dialogStage.close();
+ }
+
+ @Override
+ protected void discard() {}
+
+ @Override
+ public Comp> content() {
+ return new StoreIconChoiceComp(selected, SystemIcons.getSystemIcons(), 5, filterText, () -> {
+ finish();
+ });
+ }
+
+ @Override
+ protected Comp> pane(Comp> content) {
+ return content;
+ }
+
+ @Override
+ public Comp> bottom() {
+ var clear = new ButtonComp(AppI18n.observable("clear"), () -> {
+ selected.setValue(null);
+ finish();
+ })
+ .grow(false, true);
+ return new HorizontalComp(List.of(github, filter.hgrow(), clear)).spacing(10);
+ }
+
+ @Override
+ protected Comp> finishButton() {
+ return super.finishButton().disable(selected.isNull());
+ }
+ };
+ dialog.prefWidth(600);
+ dialog.prefHeight(600);
+ return dialog.createRegion();
+ }
+}
diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreIconComp.java b/app/src/main/java/io/xpipe/app/comp/store/StoreIconComp.java
new file mode 100644
index 000000000..4d7c26095
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/comp/store/StoreIconComp.java
@@ -0,0 +1,64 @@
+package io.xpipe.app.comp.store;
+
+import io.xpipe.app.fxcomps.SimpleComp;
+import io.xpipe.app.fxcomps.impl.PrettyImageHelper;
+import io.xpipe.app.fxcomps.impl.TooltipAugment;
+
+import javafx.beans.binding.Bindings;
+import javafx.geometry.Pos;
+import javafx.scene.input.MouseButton;
+import javafx.scene.input.MouseEvent;
+import javafx.scene.layout.Region;
+import javafx.scene.layout.StackPane;
+
+import lombok.AllArgsConstructor;
+import org.kordamp.ikonli.javafx.FontIcon;
+
+@AllArgsConstructor
+public class StoreIconComp extends SimpleComp {
+
+ private final StoreEntryWrapper wrapper;
+ private final int w;
+ private final int h;
+
+ @Override
+ protected Region createSimple() {
+ var imageComp = PrettyImageHelper.ofFixedSize(wrapper.getIconFile(), w, h);
+ var storeIcon = imageComp.createRegion();
+ if (wrapper.getValidity().getValue().isUsable()) {
+ new TooltipAugment<>(wrapper.getEntry().getProvider().displayName(), null).augment(storeIcon);
+ }
+
+ var background = new Region();
+ background.getStyleClass().add("background");
+
+ var dots = new FontIcon("mdi2d-dots-horizontal");
+ dots.setIconSize((int) (h * 1.3));
+
+ var stack = new StackPane(background, storeIcon, dots);
+ stack.setMinHeight(w + 7);
+ stack.setMinWidth(w + 7);
+ stack.setMaxHeight(w + 7);
+ stack.setMaxWidth(w + 7);
+ stack.getStyleClass().add("icon");
+ stack.setAlignment(Pos.CENTER);
+
+ dots.visibleProperty().bind(stack.hoverProperty());
+ storeIcon
+ .opacityProperty()
+ .bind(Bindings.createDoubleBinding(
+ () -> {
+ return stack.isHover() ? 0.5 : 1.0;
+ },
+ stack.hoverProperty()));
+
+ stack.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> {
+ if (event.getButton() == MouseButton.PRIMARY) {
+ StoreIconChoiceDialogComp.show(wrapper.getEntry());
+ event.consume();
+ }
+ });
+
+ return stack;
+ }
+}
diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreIntroComp.java b/app/src/main/java/io/xpipe/app/comp/store/StoreIntroComp.java
index 60719766a..c427fca82 100644
--- a/app/src/main/java/io/xpipe/app/comp/store/StoreIntroComp.java
+++ b/app/src/main/java/io/xpipe/app/comp/store/StoreIntroComp.java
@@ -39,12 +39,12 @@ public class StoreIntroComp extends SimpleComp {
var scanButton = new Button(null, new FontIcon("mdi2m-magnify"));
scanButton.textProperty().bind(AppI18n.observable("detectConnections"));
- scanButton.setOnAction(event -> ScanAlert.showAsync(DataStorage.get().local()));
+ scanButton.setOnAction(event -> ScanAlert.showAsync(DataStorage.get().local(), null));
scanButton.setDefaultButton(true);
var scanPane = new StackPane(scanButton);
scanPane.setAlignment(Pos.CENTER);
- var img = new PrettySvgComp(new SimpleStringProperty("Wave.svg"), 80, 150).createRegion();
+ var img = new PrettySvgComp(new SimpleStringProperty("graphics/Wave.svg"), 80, 150).createRegion();
var text = new VBox(title, introDesc);
text.setSpacing(5);
text.setAlignment(Pos.CENTER_LEFT);
diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreNotesComp.java b/app/src/main/java/io/xpipe/app/comp/store/StoreNotesComp.java
index 35431fb16..654ede6df 100644
--- a/app/src/main/java/io/xpipe/app/comp/store/StoreNotesComp.java
+++ b/app/src/main/java/io/xpipe/app/comp/store/StoreNotesComp.java
@@ -96,6 +96,9 @@ public class StoreNotesComp extends Comp {
ref.get().hide();
}
+ @Override
+ protected void discard() {}
+
@Override
protected String finishKey() {
return "apply";
diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreQuickAccessButtonComp.java b/app/src/main/java/io/xpipe/app/comp/store/StoreQuickAccessButtonComp.java
index 47a513865..d53029e53 100644
--- a/app/src/main/java/io/xpipe/app/comp/store/StoreQuickAccessButtonComp.java
+++ b/app/src/main/java/io/xpipe/app/comp/store/StoreQuickAccessButtonComp.java
@@ -41,8 +41,7 @@ public class StoreQuickAccessButtonComp extends Comp> {
private MenuItem recurse(ContextMenu contextMenu, StoreSection section) {
var c = section.getShownChildren();
var w = section.getWrapper();
- var graphic =
- w.getEntry().getProvider().getDisplayIconFileName(w.getEntry().getStore());
+ var graphic = w.getEntry().getEffectiveIconFile();
if (c.getList().isEmpty()) {
var item = ContextMenuHelper.item(
new LabelGraphic.ImageGraphic(graphic, 16), w.getName().getValue());
diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreSection.java b/app/src/main/java/io/xpipe/app/comp/store/StoreSection.java
index 8c244d783..1961c8da4 100644
--- a/app/src/main/java/io/xpipe/app/comp/store/StoreSection.java
+++ b/app/src/main/java/io/xpipe/app/comp/store/StoreSection.java
@@ -176,7 +176,8 @@ public class StoreSection {
var showProvider = true;
try {
showProvider = other.getEntry().getProvider().shouldShow(other);
- } catch (Exception ignored) {}
+ } catch (Exception ignored) {
+ }
return showProvider;
},
e.getPersistentState(),
diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreSectionComp.java b/app/src/main/java/io/xpipe/app/comp/store/StoreSectionComp.java
index 154e72013..7303c7127 100644
--- a/app/src/main/java/io/xpipe/app/comp/store/StoreSectionComp.java
+++ b/app/src/main/java/io/xpipe/app/comp/store/StoreSectionComp.java
@@ -7,6 +7,7 @@ import io.xpipe.app.fxcomps.augment.GrowAugment;
import io.xpipe.app.fxcomps.impl.HorizontalComp;
import io.xpipe.app.fxcomps.impl.IconButtonComp;
import io.xpipe.app.fxcomps.impl.VerticalComp;
+import io.xpipe.app.fxcomps.util.LabelGraphic;
import io.xpipe.app.storage.DataColor;
import io.xpipe.app.util.ThreadHelper;
@@ -68,11 +69,15 @@ public class StoreSectionComp extends Comp> {
private Comp> createExpandButton() {
var expandButton = new IconButtonComp(
- Bindings.createStringBinding(
- () -> section.getWrapper().getExpanded().get()
- && section.getShownChildren().getList().size() > 0
- ? "mdal-keyboard_arrow_down"
- : "mdal-keyboard_arrow_right",
+ Bindings.createObjectBinding(
+ () -> new LabelGraphic.IconGraphic(
+ section.getWrapper().getExpanded().get()
+ && section.getShownChildren()
+ .getList()
+ .size()
+ > 0
+ ? "mdal-keyboard_arrow_down"
+ : "mdal-keyboard_arrow_right"),
section.getWrapper().getExpanded(),
section.getShownChildren().getList()),
() -> {
diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreSectionMiniComp.java b/app/src/main/java/io/xpipe/app/comp/store/StoreSectionMiniComp.java
index 9e35bf600..a02c91314 100644
--- a/app/src/main/java/io/xpipe/app/comp/store/StoreSectionMiniComp.java
+++ b/app/src/main/java/io/xpipe/app/comp/store/StoreSectionMiniComp.java
@@ -8,6 +8,7 @@ import io.xpipe.app.fxcomps.impl.HorizontalComp;
import io.xpipe.app.fxcomps.impl.IconButtonComp;
import io.xpipe.app.fxcomps.impl.PrettyImageHelper;
import io.xpipe.app.fxcomps.impl.VerticalComp;
+import io.xpipe.app.fxcomps.util.LabelGraphic;
import io.xpipe.app.storage.DataColor;
import javafx.beans.binding.Bindings;
@@ -52,15 +53,9 @@ public class StoreSectionMiniComp extends Comp> {
if (section.getWrapper() != null) {
var root = new ButtonComp(section.getWrapper().nameProperty(), () -> {})
.apply(struc -> {
- var provider = section.getWrapper().getEntry().getProvider();
struc.get()
- .setGraphic(PrettyImageHelper.ofFixedSizeSquare(
- provider != null
- ? provider.getDisplayIconFileName(section.getWrapper()
- .getEntry()
- .getStore())
- : null,
- 16)
+ .setGraphic(PrettyImageHelper.ofFixedSize(
+ section.getWrapper().getIconFile(), 16, 16)
.createRegion());
})
.apply(struc -> {
@@ -81,8 +76,9 @@ public class StoreSectionMiniComp extends Comp> {
new SimpleBooleanProperty(section.getWrapper().getExpanded().get()
&& section.getShownChildren().getList().size() > 0);
var button = new IconButtonComp(
- Bindings.createStringBinding(
- () -> expanded.get() ? "mdal-keyboard_arrow_down" : "mdal-keyboard_arrow_right",
+ Bindings.createObjectBinding(
+ () -> new LabelGraphic.IconGraphic(
+ expanded.get() ? "mdal-keyboard_arrow_down" : "mdal-keyboard_arrow_right"),
expanded),
() -> {
expanded.set(!expanded.get());
diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreViewState.java b/app/src/main/java/io/xpipe/app/comp/store/StoreViewState.java
index c86b069dc..c2297d6d2 100644
--- a/app/src/main/java/io/xpipe/app/comp/store/StoreViewState.java
+++ b/app/src/main/java/io/xpipe/app/comp/store/StoreViewState.java
@@ -98,10 +98,11 @@ public class StoreViewState {
private void initFilterJump() {
var all = getAllConnectionsCategory();
filter.addListener((observable, oldValue, newValue) -> {
- var matchingCats = categories.getList().stream().filter(storeCategoryWrapper -> storeCategoryWrapper.getRoot().equals(all))
- .filter(storeCategoryWrapper -> storeCategoryWrapper.getDirectContainedEntries()
- .stream()
- .anyMatch(wrapper -> wrapper.matchesFilter(newValue)))
+ var matchingCats = categories.getList().stream()
+ .filter(storeCategoryWrapper ->
+ storeCategoryWrapper.getRoot().equals(all))
+ .filter(storeCategoryWrapper -> storeCategoryWrapper.getDirectContainedEntries().stream()
+ .anyMatch(wrapper -> wrapper.matchesFilter(newValue)))
.toList();
if (matchingCats.size() == 1) {
activeCategory.setValue(matchingCats.getFirst());
diff --git a/app/src/main/java/io/xpipe/app/core/App.java b/app/src/main/java/io/xpipe/app/core/App.java
index c370764a2..8b1f3bcb7 100644
--- a/app/src/main/java/io/xpipe/app/core/App.java
+++ b/app/src/main/java/io/xpipe/app/core/App.java
@@ -10,6 +10,8 @@ import io.xpipe.app.util.LicenseProvider;
import javafx.application.Application;
import javafx.beans.binding.Bindings;
+import javafx.beans.property.SimpleDoubleProperty;
+import javafx.beans.value.ObservableDoubleValue;
import javafx.stage.Stage;
import lombok.Getter;
@@ -63,4 +65,12 @@ public class App extends Application {
stage.requestFocus();
});
}
+
+ public ObservableDoubleValue displayScale() {
+ if (getStage() == null) {
+ return new SimpleDoubleProperty(1.0);
+ }
+
+ return getStage().outputScaleXProperty();
+ }
}
diff --git a/app/src/main/java/io/xpipe/app/core/AppDesktopIntegration.java b/app/src/main/java/io/xpipe/app/core/AppDesktopIntegration.java
index 8f680a9ca..bdad8b00d 100644
--- a/app/src/main/java/io/xpipe/app/core/AppDesktopIntegration.java
+++ b/app/src/main/java/io/xpipe/app/core/AppDesktopIntegration.java
@@ -9,10 +9,10 @@ import io.xpipe.app.util.PlatformState;
import io.xpipe.app.util.ThreadHelper;
import io.xpipe.core.process.OsType;
-import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.desktop.*;
import java.util.List;
+import javax.imageio.ImageIO;
public class AppDesktopIntegration {
@@ -36,7 +36,8 @@ public class AppDesktopIntegration {
ThreadHelper.sleep(1000);
OperationMode.close();
});
- }}
+ }
+ }
});
}
diff --git a/app/src/main/java/io/xpipe/app/core/AppExtensionManager.java b/app/src/main/java/io/xpipe/app/core/AppExtensionManager.java
index 6a9f064a0..58e6776ca 100644
--- a/app/src/main/java/io/xpipe/app/core/AppExtensionManager.java
+++ b/app/src/main/java/io/xpipe/app/core/AppExtensionManager.java
@@ -1,10 +1,11 @@
package io.xpipe.app.core;
import io.xpipe.app.ext.ExtensionException;
+import io.xpipe.app.ext.ProcessControlProvider;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.issue.TrackEvent;
+import io.xpipe.app.resources.AppResources;
import io.xpipe.core.process.OsType;
-import io.xpipe.app.ext.ProcessControlProvider;
import io.xpipe.core.util.ModuleHelper;
import io.xpipe.core.util.ModuleLayerLoader;
import io.xpipe.core.util.XPipeInstallation;
@@ -55,8 +56,8 @@ public class AppExtensionManager {
ErrorEvent.fromThrowable(t).handle();
});
} catch (Throwable t) {
- throw new ExtensionException(
- "Service provider initialization failed. Is the installation data corrupt?", t);
+ throw ExtensionException.corrupt(
+ "Service provider initialization failed", t);
}
}
}
@@ -72,7 +73,7 @@ public class AppExtensionManager {
private void loadBaseExtension() {
var baseModule = findAndParseExtension("base", ModuleLayer.boot());
if (baseModule.isEmpty()) {
- throw new ExtensionException("Missing base module. Is the installation data corrupt?");
+ throw ExtensionException.corrupt("Missing base module");
}
baseLayer = baseModule.get().getModule().getLayer();
@@ -205,8 +206,8 @@ public class AppExtensionManager {
var ext = getExtensionFromDir(layer, dir);
if (ext.isEmpty()) {
if (AppProperties.get().isFullVersion()) {
- throw new ExtensionException(
- "Unable to load extension from directory " + dir + ". Is the installation corrupted?");
+ throw ExtensionException.corrupt(
+ "Unable to load extension from directory " + dir);
}
} else {
if (loadedExtensions.stream()
diff --git a/app/src/main/java/io/xpipe/app/core/AppFont.java b/app/src/main/java/io/xpipe/app/core/AppFont.java
index 92af9378c..99ca4dfd2 100644
--- a/app/src/main/java/io/xpipe/app/core/AppFont.java
+++ b/app/src/main/java/io/xpipe/app/core/AppFont.java
@@ -1,6 +1,7 @@
package io.xpipe.app.core;
import io.xpipe.app.issue.TrackEvent;
+import io.xpipe.app.resources.AppResources;
import io.xpipe.core.process.OsType;
import javafx.scene.Node;
diff --git a/app/src/main/java/io/xpipe/app/core/AppGreetings.java b/app/src/main/java/io/xpipe/app/core/AppGreetings.java
index b44ac8813..4d061087d 100644
--- a/app/src/main/java/io/xpipe/app/core/AppGreetings.java
+++ b/app/src/main/java/io/xpipe/app/core/AppGreetings.java
@@ -4,6 +4,7 @@ import io.xpipe.app.comp.base.MarkdownComp;
import io.xpipe.app.core.mode.OperationMode;
import io.xpipe.app.core.window.AppWindowHelper;
import io.xpipe.app.fxcomps.Comp;
+import io.xpipe.app.resources.AppResources;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.geometry.Insets;
diff --git a/app/src/main/java/io/xpipe/app/core/AppImages.java b/app/src/main/java/io/xpipe/app/core/AppImages.java
deleted file mode 100644
index f0101fadc..000000000
--- a/app/src/main/java/io/xpipe/app/core/AppImages.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package io.xpipe.app.core;
-
-import io.xpipe.app.issue.ErrorEvent;
-import io.xpipe.app.issue.TrackEvent;
-
-import javafx.scene.image.Image;
-import javafx.scene.image.WritableImage;
-
-import org.apache.commons.io.FilenameUtils;
-
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.HashMap;
-import java.util.Map;
-
-public class AppImages {
-
- public static final Image DEFAULT_IMAGE = new WritableImage(1, 1);
- private static final Map images = new HashMap<>();
- private static final Map svgImages = new HashMap<>();
-
- public static void init() {
- if (images.size() > 0 || svgImages.size() > 0) {
- return;
- }
-
- TrackEvent.info("Loading images ...");
- for (var module : AppExtensionManager.getInstance().getContentModules()) {
- loadDirectory(module.getName(), "img", true, true);
- }
- }
-
- public static void loadDirectory(String module, String dir, boolean loadImages, boolean loadSvgs) {
- AppResources.with(module, dir, basePath -> {
- if (!Files.exists(basePath)) {
- return;
- }
-
- var simpleName = FilenameUtils.getExtension(module);
- String defaultPrefix = simpleName + ":";
- Files.walkFileTree(basePath, new SimpleFileVisitor<>() {
- @Override
- public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
- var relativeFileName = FilenameUtils.separatorsToUnix(
- basePath.relativize(file).toString());
- try {
- if (FilenameUtils.getExtension(file.toString()).equals("svg") && loadSvgs) {
- var s = Files.readString(file);
- svgImages.put(defaultPrefix + relativeFileName, s);
- } else if (loadImages) {
- images.put(defaultPrefix + relativeFileName, loadImage(file));
- }
- } catch (IOException ex) {
- ErrorEvent.fromThrowable(ex).omitted(true).build().handle();
- }
- return FileVisitResult.CONTINUE;
- }
- });
- });
- }
-
- public static String svgImage(String file) {
- if (file == null) {
- return "";
- }
-
- var key = file.contains(":") ? file : "app:" + file;
-
- if (svgImages.containsKey(key)) {
- return svgImages.get(key);
- }
-
- TrackEvent.warn("Svg image " + key + " not found");
- return "";
- }
-
- public static boolean hasNormalImage(String file) {
- if (file == null) {
- return false;
- }
-
- var key = file.contains(":") ? file : "app:" + file;
- return images.containsKey(key);
- }
-
- public static boolean hasSvgImage(String file) {
- if (file == null) {
- return false;
- }
-
- var key = file.contains(":") ? file : "app:" + file;
- return svgImages.containsKey(key);
- }
-
- public static Image image(String file) {
- if (file == null) {
- return DEFAULT_IMAGE;
- }
-
- var key = file.contains(":") ? file : "app:" + file;
-
- if (images.containsKey(key)) {
- return images.get(key);
- }
-
- TrackEvent.warn("Normal image " + key + " not found");
- return DEFAULT_IMAGE;
- }
-
- public static BufferedImage toAwtImage(Image fxImage) {
- BufferedImage img =
- new BufferedImage((int) fxImage.getWidth(), (int) fxImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
- for (int x = 0; x < fxImage.getWidth(); x++) {
- for (int y = 0; y < fxImage.getHeight(); y++) {
- int rgb = fxImage.getPixelReader().getArgb(x, y);
- img.setRGB(x, y, rgb);
- }
- }
- return img;
- }
-
- public static Image loadImage(Path p) {
- if (p == null) {
- return DEFAULT_IMAGE;
- }
-
- if (!Files.isRegularFile(p)) {
- TrackEvent.error("Image file " + p + " not found.");
- return DEFAULT_IMAGE;
- }
-
- try (var in = Files.newInputStream(p)) {
- return new Image(in, -1, -1, true, true);
- } catch (IOException e) {
- ErrorEvent.fromThrowable(e).omitted(true).build().handle();
- return DEFAULT_IMAGE;
- }
- }
-}
diff --git a/app/src/main/java/io/xpipe/app/core/AppLayoutModel.java b/app/src/main/java/io/xpipe/app/core/AppLayoutModel.java
index b58fb9e2e..e7cdae97c 100644
--- a/app/src/main/java/io/xpipe/app/core/AppLayoutModel.java
+++ b/app/src/main/java/io/xpipe/app/core/AppLayoutModel.java
@@ -3,14 +3,17 @@ package io.xpipe.app.core;
import io.xpipe.app.beacon.AppBeaconServer;
import io.xpipe.app.browser.session.BrowserSessionComp;
import io.xpipe.app.browser.session.BrowserSessionModel;
+import io.xpipe.app.comp.base.TerminalViewDockComp;
import io.xpipe.app.comp.store.StoreLayoutComp;
import io.xpipe.app.fxcomps.Comp;
+import io.xpipe.app.fxcomps.util.LabelGraphic;
import io.xpipe.app.prefs.AppPrefsComp;
import io.xpipe.app.util.Hyperlinks;
import io.xpipe.app.util.LicenseProvider;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleObjectProperty;
+import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyCodeCombination;
@@ -21,6 +24,7 @@ import lombok.Data;
import lombok.Getter;
import lombok.extern.jackson.Jacksonized;
+import java.time.*;
import java.util.ArrayList;
import java.util.List;
@@ -38,7 +42,7 @@ public class AppLayoutModel {
public AppLayoutModel(SavedState savedState) {
this.savedState = savedState;
this.entries = createEntryList();
- this.selected = new SimpleObjectProperty<>(entries.get(1));
+ this.selected = new SimpleObjectProperty<>(entries.get(0));
}
public static AppLayoutModel get() {
@@ -56,66 +60,100 @@ public class AppLayoutModel {
}
public void selectBrowser() {
- selected.setValue(entries.getFirst());
+ selected.setValue(entries.get(1));
}
- public void selectSettings() {
+ public void selectTerminal() {
selected.setValue(entries.get(2));
}
- public void selectLicense() {
+ public void selectSettings() {
selected.setValue(entries.get(3));
}
+ public void selectLicense() {
+ selected.setValue(entries.get(4));
+ }
+
public void selectConnections() {
- selected.setValue(entries.get(1));
+ selected.setValue(entries.get(0));
}
private List createEntryList() {
var l = new ArrayList<>(List.of(
new Entry(
- AppI18n.observable("browser"),
- "mdi2f-file-cabinet",
- new BrowserSessionComp(BrowserSessionModel.DEFAULT),
+ AppI18n.observable("connections"),
+ new LabelGraphic.IconGraphic("mdi2c-connection"),
+ new StoreLayoutComp(),
null,
new KeyCodeCombination(KeyCode.DIGIT1, KeyCombination.SHORTCUT_DOWN)),
new Entry(
- AppI18n.observable("connections"),
- "mdi2c-connection",
- new StoreLayoutComp(),
+ AppI18n.observable("browser"),
+ new LabelGraphic.IconGraphic("mdi2f-file-cabinet"),
+ new BrowserSessionComp(BrowserSessionModel.DEFAULT),
null,
new KeyCodeCombination(KeyCode.DIGIT2, KeyCombination.SHORTCUT_DOWN)),
+ new Entry(
+ AppI18n.observable("terminal"),
+ new LabelGraphic.IconGraphic("mdi2m-monitor-screenshot"),
+ new TerminalViewDockComp(),
+ null,
+ new KeyCodeCombination(KeyCode.DIGIT3, KeyCombination.SHORTCUT_DOWN)),
new Entry(
AppI18n.observable("settings"),
- "mdsmz-miscellaneous_services",
+ new LabelGraphic.IconGraphic("mdsmz-miscellaneous_services"),
new AppPrefsComp(),
null,
new KeyCodeCombination(KeyCode.DIGIT3, KeyCombination.SHORTCUT_DOWN)),
new Entry(
AppI18n.observable("explorePlans"),
- "mdi2p-professional-hexagon",
+ new LabelGraphic.IconGraphic("mdi2p-professional-hexagon"),
LicenseProvider.get().overviewPage(),
null,
null),
new Entry(
AppI18n.observable("visitGithubRepository"),
- "mdi2g-github",
+ new LabelGraphic.IconGraphic("mdi2g-github"),
null,
() -> Hyperlinks.open(Hyperlinks.GITHUB),
null),
new Entry(
AppI18n.observable("discord"),
- "mdi2d-discord",
+ new LabelGraphic.IconGraphic("mdi2d-discord"),
null,
() -> Hyperlinks.open(Hyperlinks.DISCORD),
null),
new Entry(
AppI18n.observable("api"),
- "mdi2c-code-json",
+ new LabelGraphic.IconGraphic("mdi2c-code-json"),
null,
() -> Hyperlinks.open(
"http://localhost:" + AppBeaconServer.get().getPort()),
- null)));
+ null)
+ // new Entry(
+ // AppI18n.observable("webtop"),
+ // "mdi2d-desktop-mac",
+ // null,
+ // () -> Hyperlinks.open(Hyperlinks.GITHUB_WEBTOP),
+ // null)
+ ));
+
+ var now = Instant.now();
+ var zone = ZoneId.of(ZoneId.SHORT_IDS.get("PST"));
+ var phStart = ZonedDateTime.of(2024, 10, 22, 0, 1, 0, 0, zone).toInstant();
+ var clicked = AppCache.get("phClicked",Boolean.class,() -> false);
+ var phShow = now.isAfter(phStart) && !clicked;
+ if (phShow) {
+ l.add(new Entry(
+ new SimpleStringProperty("Product Hunt"),
+ new LabelGraphic.ImageGraphic("app:producthunt-color.png", 24),
+ null,
+ () -> {
+ AppCache.update("phClicked", true);
+ Hyperlinks.open(Hyperlinks.PRODUCT_HUNT);
+ },
+ null));
+ }
return l;
}
@@ -129,5 +167,9 @@ public class AppLayoutModel {
}
public record Entry(
- ObservableValue name, String icon, Comp> comp, Runnable action, KeyCombination combination) {}
+ ObservableValue name,
+ LabelGraphic icon,
+ Comp> comp,
+ Runnable action,
+ KeyCombination combination) {}
}
diff --git a/app/src/main/java/io/xpipe/app/core/AppResources.java b/app/src/main/java/io/xpipe/app/core/AppResources.java
deleted file mode 100644
index ec0bc9119..000000000
--- a/app/src/main/java/io/xpipe/app/core/AppResources.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package io.xpipe.app.core;
-
-import io.xpipe.app.issue.ErrorEvent;
-import io.xpipe.core.util.FailableConsumer;
-import io.xpipe.modulefs.ModuleFileSystem;
-
-import java.io.IOException;
-import java.net.JarURLConnection;
-import java.net.URI;
-import java.net.URL;
-import java.nio.file.FileSystems;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Map;
-import java.util.Optional;
-import java.util.concurrent.ConcurrentHashMap;
-
-public class AppResources {
-
- public static final String XPIPE_MODULE = "io.xpipe.app";
-
- private static final Map fileSystems = new ConcurrentHashMap<>();
-
- public static void reset() {
- fileSystems.forEach((s, moduleFileSystem) -> {
- try {
- moduleFileSystem.close();
- } catch (IOException ignored) {
- // Usually when updating, a SIGTERM is sent to this application.
- // However, it takes a while to shut down but the installer is deleting files meanwhile.
- // It can happen that the jar it does not exist anymore
- }
- });
- fileSystems.clear();
- }
-
- private static ModuleFileSystem openFileSystemIfNeeded(String module) throws IOException {
- var layer = AppExtensionManager.getInstance() != null
- ? AppExtensionManager.getInstance().getExtendedLayer()
- : null;
-
- // Only cache file systems with extended layer
- if (layer != null && fileSystems.containsKey(module)) {
- return fileSystems.get(module);
- }
-
- if (layer == null) {
- layer = ModuleLayer.boot();
- }
-
- var fs = (ModuleFileSystem) FileSystems.newFileSystem(URI.create("module:/" + module), Map.of("layer", layer));
- if (AppExtensionManager.getInstance() != null) {
- fileSystems.put(module, fs);
- }
- return fs;
- }
-
- public static Optional getResourceURL(String module, String file) {
- try {
- var fs = openFileSystemIfNeeded(module);
- var f = fs.getPath(module.replace('.', '/') + "/resources/" + file);
- var url = f.getWrappedPath().toUri().toURL();
- return Optional.of(url);
- } catch (IOException e) {
- ErrorEvent.fromThrowable(e).omitted(true).build().handle();
- return Optional.empty();
- }
- }
-
- public static void with(String module, String file, FailableConsumer con) {
- if (AppProperties.get() != null
- && !AppProperties.get().isImage()
- && AppProperties.get().isDeveloperMode()) {
- // Check if resource was found. If we use external processed resources, we can't use local dev resources
- if (withLocalDevResource(module, file, con)) {
- return;
- }
- }
-
- withResource(module, file, con);
- }
-
- public static void withResourceInLayer(
- String module, String file, ModuleLayer layer, FailableConsumer con) {
- try (var fs = FileSystems.newFileSystem(URI.create("module:/" + module), Map.of("layer", layer))) {
- var f = fs.getPath(module.replace('.', '/') + "/resources/" + file);
- con.accept(f);
- } catch (IOException e) {
- ErrorEvent.fromThrowable(e).omitted(true).build().handle();
- }
- }
-
- private static void withResource(String module, String file, FailableConsumer con) {
- var path = module.startsWith("io.xpipe") ? module.replace('.', '/') + "/resources/" + file : file;
- try {
- var fs = openFileSystemIfNeeded(module);
- var f = fs.getPath(path);
- con.accept(f);
- } catch (IOException e) {
- ErrorEvent.fromThrowable(e).omitted(true).build().handle();
- }
- }
-
- private static boolean withLocalDevResource(String module, String file, FailableConsumer con) {
- try {
- var fs = openFileSystemIfNeeded(module);
- var url = fs.getPath("").getWrappedPath().toUri().toURL();
- if (!url.getProtocol().equals("jar")) {
- return false;
- }
-
- JarURLConnection connection = (JarURLConnection) url.openConnection();
- URL fileUrl = connection.getJarFileURL();
- var jarFile = Path.of(fileUrl.toURI());
- var resDir = jarFile.getParent()
- .getParent()
- .getParent()
- .resolve("src")
- .resolve("main")
- .resolve("resources");
- var f = resDir.resolve(module.replace('.', '/') + "/resources/" + file);
- if (!Files.exists(f)) {
- return false;
- }
-
- con.accept(f);
- } catch (Exception e) {
- ErrorEvent.fromThrowable(e).omitted(true).build().handle();
- }
- return true;
- }
-}
diff --git a/app/src/main/java/io/xpipe/app/core/AppStyle.java b/app/src/main/java/io/xpipe/app/core/AppStyle.java
index e009c3f4b..44486a20e 100644
--- a/app/src/main/java/io/xpipe/app/core/AppStyle.java
+++ b/app/src/main/java/io/xpipe/app/core/AppStyle.java
@@ -3,6 +3,7 @@ package io.xpipe.app.core;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.issue.TrackEvent;
import io.xpipe.app.prefs.AppPrefs;
+import io.xpipe.app.resources.AppResources;
import javafx.scene.Scene;
diff --git a/app/src/main/java/io/xpipe/app/core/AppTheme.java b/app/src/main/java/io/xpipe/app/core/AppTheme.java
index 05cdb6cb8..b0ac3c689 100644
--- a/app/src/main/java/io/xpipe/app/core/AppTheme.java
+++ b/app/src/main/java/io/xpipe/app/core/AppTheme.java
@@ -6,6 +6,7 @@ import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.issue.TrackEvent;
import io.xpipe.app.prefs.AppPrefs;
+import io.xpipe.app.resources.AppResources;
import io.xpipe.core.process.OsType;
import javafx.animation.Interpolator;
diff --git a/app/src/main/java/io/xpipe/app/core/AppTrayIcon.java b/app/src/main/java/io/xpipe/app/core/AppTrayIcon.java
index 7a641ccd7..cfd8c881b 100644
--- a/app/src/main/java/io/xpipe/app/core/AppTrayIcon.java
+++ b/app/src/main/java/io/xpipe/app/core/AppTrayIcon.java
@@ -2,6 +2,8 @@ package io.xpipe.app.core;
import io.xpipe.app.core.mode.OperationMode;
import io.xpipe.app.issue.ErrorEvent;
+import io.xpipe.app.resources.AppImages;
+import io.xpipe.app.resources.AppResources;
import io.xpipe.core.process.OsType;
import java.awt.*;
diff --git a/app/src/main/java/io/xpipe/app/core/check/AppAvCheck.java b/app/src/main/java/io/xpipe/app/core/check/AppAvCheck.java
index 4dff8398a..d75c301cb 100644
--- a/app/src/main/java/io/xpipe/app/core/check/AppAvCheck.java
+++ b/app/src/main/java/io/xpipe/app/core/check/AppAvCheck.java
@@ -1,9 +1,13 @@
package io.xpipe.app.core.check;
import io.xpipe.app.comp.base.MarkdownComp;
-import io.xpipe.app.core.*;
+import io.xpipe.app.core.AppI18n;
+import io.xpipe.app.core.AppProperties;
+import io.xpipe.app.core.AppState;
+import io.xpipe.app.core.AppStyle;
import io.xpipe.app.core.mode.OperationMode;
import io.xpipe.app.core.window.AppWindowHelper;
+import io.xpipe.app.resources.AppResources;
import io.xpipe.app.util.PlatformState;
import io.xpipe.app.util.WindowsRegistry;
import io.xpipe.core.process.OsType;
@@ -42,7 +46,6 @@ public class AppAvCheck {
PlatformState.initPlatformOrThrow();
AppStyle.init();
- AppImages.init();
var a = AppWindowHelper.showBlockingAlert(alert -> {
alert.setTitle(AppI18n.get("antivirusNoticeTitle"));
diff --git a/app/src/main/java/io/xpipe/app/core/check/AppBundledToolsCheck.java b/app/src/main/java/io/xpipe/app/core/check/AppBundledToolsCheck.java
index 57aefbcab..7c745b1a1 100644
--- a/app/src/main/java/io/xpipe/app/core/check/AppBundledToolsCheck.java
+++ b/app/src/main/java/io/xpipe/app/core/check/AppBundledToolsCheck.java
@@ -8,7 +8,9 @@ import java.util.concurrent.TimeUnit;
public class AppBundledToolsCheck {
private static boolean getResult() {
- var fc = new ProcessBuilder("where", "ssh").redirectErrorStream(true).redirectOutput(ProcessBuilder.Redirect.DISCARD);
+ var fc = new ProcessBuilder("where", "ssh")
+ .redirectErrorStream(true)
+ .redirectOutput(ProcessBuilder.Redirect.DISCARD);
try {
var proc = fc.start();
proc.waitFor(2, TimeUnit.SECONDS);
diff --git a/app/src/main/java/io/xpipe/app/core/check/AppGpuCheck.java b/app/src/main/java/io/xpipe/app/core/check/AppGpuCheck.java
new file mode 100644
index 000000000..1b669a94e
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/core/check/AppGpuCheck.java
@@ -0,0 +1,22 @@
+package io.xpipe.app.core.check;
+
+import io.xpipe.app.prefs.AppPrefs;
+import io.xpipe.app.util.PlatformState;
+
+import javafx.application.ConditionalFeature;
+import javafx.application.Platform;
+
+public class AppGpuCheck {
+
+ public static void check() {
+ if (PlatformState.getCurrent() != PlatformState.RUNNING) {
+ return;
+ }
+
+ if (Platform.isSupported(ConditionalFeature.SCENE3D)) {
+ return;
+ }
+
+ AppPrefs.get().performanceMode.setValue(true);
+ }
+}
diff --git a/app/src/main/java/io/xpipe/app/core/check/AppJavaOptionsCheck.java b/app/src/main/java/io/xpipe/app/core/check/AppJavaOptionsCheck.java
new file mode 100644
index 000000000..e351e3c5c
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/core/check/AppJavaOptionsCheck.java
@@ -0,0 +1,28 @@
+package io.xpipe.app.core.check;
+
+import io.xpipe.app.core.AppCache;
+import io.xpipe.app.issue.ErrorEvent;
+
+public class AppJavaOptionsCheck {
+
+ public static void check() {
+ if (AppCache.get("javaOptionsWarningShown", Boolean.class,() -> false)) {
+ return;
+ }
+
+ var env = System.getenv("_JAVA_OPTIONS");
+ if (env == null) {
+ return;
+ }
+
+ ErrorEvent.fromMessage(
+ "You have configured the global environment variable _JAVA_OPTIONS=%s on your system."
+ .formatted(env)
+ + " This will forcefully apply all custom JVM options to XPipe and can cause a variety of different issues."
+ + " Please remove this global environment variable and use local configuration instead for your other JVM programs.")
+ .noDefaultActions()
+ .expected()
+ .handle();
+ AppCache.update("javaOptionsWarningShown", true);
+ }
+}
diff --git a/app/src/main/java/io/xpipe/app/core/check/AppRosettaCheck.java b/app/src/main/java/io/xpipe/app/core/check/AppRosettaCheck.java
index e555e7c00..c97b14478 100644
--- a/app/src/main/java/io/xpipe/app/core/check/AppRosettaCheck.java
+++ b/app/src/main/java/io/xpipe/app/core/check/AppRosettaCheck.java
@@ -25,8 +25,11 @@ public class AppRosettaCheck {
if (ret.get().equals("1")) {
ErrorEvent.fromMessage("You are running the Intel version of XPipe on an Apple Silicon system."
- + " There is a native build available that comes with much better performance."
- + " Please install that one instead.");
+ + " There is a native build available that comes with much better performance."
+ + " Please install that one instead.")
+ .noDefaultActions()
+ .expected()
+ .handle();
}
}
}
diff --git a/app/src/main/java/io/xpipe/app/core/check/AppShellCheck.java b/app/src/main/java/io/xpipe/app/core/check/AppShellCheck.java
index 9d792cea7..15dc09272 100644
--- a/app/src/main/java/io/xpipe/app/core/check/AppShellCheck.java
+++ b/app/src/main/java/io/xpipe/app/core/check/AppShellCheck.java
@@ -1,9 +1,9 @@
package io.xpipe.app.core.check;
+import io.xpipe.app.ext.ProcessControlProvider;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.util.LocalShell;
import io.xpipe.core.process.OsType;
-import io.xpipe.app.ext.ProcessControlProvider;
import io.xpipe.core.process.ProcessOutputException;
import lombok.Value;
diff --git a/app/src/main/java/io/xpipe/app/core/mode/BaseMode.java b/app/src/main/java/io/xpipe/app/core/mode/BaseMode.java
index 79be0a3a7..a9f19a6b7 100644
--- a/app/src/main/java/io/xpipe/app/core/mode/BaseMode.java
+++ b/app/src/main/java/io/xpipe/app/core/mode/BaseMode.java
@@ -8,8 +8,11 @@ import io.xpipe.app.core.*;
import io.xpipe.app.core.check.*;
import io.xpipe.app.ext.ActionProvider;
import io.xpipe.app.ext.DataStoreProviders;
+import io.xpipe.app.ext.ProcessControlProvider;
import io.xpipe.app.issue.TrackEvent;
import io.xpipe.app.prefs.AppPrefs;
+import io.xpipe.app.resources.AppResources;
+import io.xpipe.app.resources.SystemIcons;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStorageSyncHandler;
import io.xpipe.app.update.XPipeDistributionType;
@@ -44,6 +47,7 @@ public class BaseMode extends OperationMode {
AppCertutilCheck.check();
AppBundledToolsCheck.check();
AppAvCheck.check();
+ AppJavaOptionsCheck.check();
AppSid.init();
LocalShell.init();
AppShellCheck.check();
@@ -56,12 +60,14 @@ public class BaseMode extends OperationMode {
DataStorageSyncHandler.getInstance().retrieveSyncedData();
AppPrefs.initSharedRemote();
UnlockAlert.showIfNeeded();
+ SystemIcons.init();
DataStorage.init();
DataStoreProviders.init();
AppFileWatcher.init();
FileBridge.init();
BlobManager.init();
ActionProvider.initProviders();
+ TerminalView.init();
TrackEvent.info("Finished base components initialization");
initialized = true;
}
@@ -70,7 +76,7 @@ public class BaseMode extends OperationMode {
public void onSwitchFrom() {}
@Override
- public void finalTeardown() {
+ public void finalTeardown() throws Exception {
TrackEvent.info("Background mode shutdown started");
BrowserSessionModel.DEFAULT.reset();
SshLocalBridge.reset();
@@ -78,12 +84,14 @@ public class BaseMode extends OperationMode {
DataStoreProviders.reset();
DataStorage.reset();
AppPrefs.reset();
+ DataStorageSyncHandler.getInstance().reset();
+ LocalShell.reset();
+ ProcessControlProvider.get().reset();
AppResources.reset();
AppExtensionManager.reset();
AppDataLock.unlock();
BlobManager.reset();
FileBridge.reset();
- // Shut down server last to keep a non-daemon thread running
AppBeaconServer.reset();
TrackEvent.info("Background mode shutdown finished");
}
diff --git a/app/src/main/java/io/xpipe/app/core/mode/GuiMode.java b/app/src/main/java/io/xpipe/app/core/mode/GuiMode.java
index ad26c5d96..80c2280c4 100644
--- a/app/src/main/java/io/xpipe/app/core/mode/GuiMode.java
+++ b/app/src/main/java/io/xpipe/app/core/mode/GuiMode.java
@@ -4,6 +4,7 @@ import io.xpipe.app.browser.file.LocalFileSystem;
import io.xpipe.app.browser.icon.FileIconManager;
import io.xpipe.app.core.App;
import io.xpipe.app.core.AppGreetings;
+import io.xpipe.app.core.AppLayoutModel;
import io.xpipe.app.core.check.AppPtbCheck;
import io.xpipe.app.core.window.AppMainWindow;
import io.xpipe.app.fxcomps.util.PlatformThread;
@@ -39,6 +40,7 @@ public class GuiMode extends PlatformMode {
AppGreetings.showIfNeeded();
AppPtbCheck.check();
NativeBridge.init();
+ AppLayoutModel.init();
TrackEvent.info("Waiting for window setup completion ...");
PlatformThread.runLaterIfNeededBlocking(() -> {
@@ -63,4 +65,10 @@ public class GuiMode extends PlatformMode {
UpdateChangelogAlert.showIfNeeded();
}
+
+ @Override
+ public void finalTeardown() throws Throwable {
+ LocalFileSystem.reset();
+ super.finalTeardown();
+ }
}
diff --git a/app/src/main/java/io/xpipe/app/core/mode/OperationMode.java b/app/src/main/java/io/xpipe/app/core/mode/OperationMode.java
index fd5b6c206..cabdad67e 100644
--- a/app/src/main/java/io/xpipe/app/core/mode/OperationMode.java
+++ b/app/src/main/java/io/xpipe/app/core/mode/OperationMode.java
@@ -225,6 +225,8 @@ public abstract class OperationMode {
CURRENT.finalTeardown();
}
CURRENT = null;
+ // Restart local shell
+ LocalShell.init();
r.run();
} catch (Throwable ex) {
ErrorEvent.fromThrowable(ex).handle();
@@ -293,17 +295,27 @@ public abstract class OperationMode {
inShutdown = true;
OperationMode.inShutdownHook = inShutdownHook;
- try {
- if (CURRENT != null) {
- CURRENT.finalTeardown();
+ // Keep a non-daemon thread running
+ var thread = ThreadHelper.createPlatformThread("shutdown", false, () -> {
+ try {
+ if (CURRENT != null) {
+ CURRENT.finalTeardown();
+ }
+ CURRENT = null;
+ } catch (Throwable t) {
+ ErrorEvent.fromThrowable(t).term().handle();
+ OperationMode.halt(1);
}
- CURRENT = null;
- } catch (Throwable t) {
- ErrorEvent.fromThrowable(t).term().handle();
+
+ OperationMode.halt(hasError ? 1 : 0);
+ });
+ thread.start();
+
+ try {
+ thread.join();
+ } catch (InterruptedException ignored) {
OperationMode.halt(1);
}
-
- OperationMode.halt(hasError ? 1 : 0);
}
// public static synchronized void reload() {
diff --git a/app/src/main/java/io/xpipe/app/core/mode/PlatformMode.java b/app/src/main/java/io/xpipe/app/core/mode/PlatformMode.java
index b5cb69efe..3499dd5e6 100644
--- a/app/src/main/java/io/xpipe/app/core/mode/PlatformMode.java
+++ b/app/src/main/java/io/xpipe/app/core/mode/PlatformMode.java
@@ -3,8 +3,10 @@ package io.xpipe.app.core.mode;
import io.xpipe.app.comp.store.StoreViewState;
import io.xpipe.app.core.*;
import io.xpipe.app.core.check.AppFontLoadingCheck;
+import io.xpipe.app.core.check.AppGpuCheck;
import io.xpipe.app.issue.TrackEvent;
import io.xpipe.app.prefs.AppPrefs;
+import io.xpipe.app.resources.AppImages;
import io.xpipe.app.update.UpdateAvailableAlert;
import io.xpipe.app.util.PlatformState;
import io.xpipe.app.util.ThreadHelper;
@@ -29,11 +31,14 @@ public abstract class PlatformMode extends OperationMode {
PlatformState.initPlatformOrThrow();
// Check if we can load system fonts or fail
AppFontLoadingCheck.check();
+ // Can be loaded async
+ var imageThread = ThreadHelper.runFailableAsync(() -> {
+ AppImages.init();
+ });
+ AppGpuCheck.check();
AppFont.init();
AppTheme.init();
AppStyle.init();
- AppImages.init();
- AppLayoutModel.init();
TrackEvent.info("Finished essential component initialization before platform");
TrackEvent.info("Launching application ...");
@@ -56,6 +61,7 @@ public abstract class PlatformMode extends OperationMode {
}
StoreViewState.init();
+ imageThread.join();
}
@Override
diff --git a/app/src/main/java/io/xpipe/app/core/window/AppMainWindow.java b/app/src/main/java/io/xpipe/app/core/window/AppMainWindow.java
index 025100903..dc4d6d17e 100644
--- a/app/src/main/java/io/xpipe/app/core/window/AppMainWindow.java
+++ b/app/src/main/java/io/xpipe/app/core/window/AppMainWindow.java
@@ -1,7 +1,6 @@
package io.xpipe.app.core.window;
import io.xpipe.app.core.AppCache;
-import io.xpipe.app.core.AppImages;
import io.xpipe.app.core.AppProperties;
import io.xpipe.app.core.AppTheme;
import io.xpipe.app.core.mode.OperationMode;
@@ -10,8 +9,10 @@ import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.issue.TrackEvent;
import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.app.prefs.CloseBehaviourAlert;
+import io.xpipe.app.resources.AppImages;
import io.xpipe.app.util.ThreadHelper;
import io.xpipe.core.process.OsType;
+
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.geometry.Rectangle2D;
@@ -24,17 +25,18 @@ import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.stage.Screen;
import javafx.stage.Stage;
+
import lombok.Builder;
import lombok.Getter;
import lombok.Value;
import lombok.extern.jackson.Jacksonized;
-import javax.imageio.ImageIO;
import java.io.IOException;
import java.nio.file.Path;
import java.time.Duration;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
+import javax.imageio.ImageIO;
public class AppMainWindow {
@@ -262,6 +264,9 @@ public class AppMainWindow {
public void show() {
stage.show();
+ if (OsType.getLocal() == OsType.WINDOWS) {
+ NativeWinWindowControl.MAIN_WINDOW = new NativeWinWindowControl(stage);
+ }
}
private void setupContent(Comp> content) {
diff --git a/app/src/main/java/io/xpipe/app/core/window/AppWindowHelper.java b/app/src/main/java/io/xpipe/app/core/window/AppWindowHelper.java
index ae4d0b5e2..79070c556 100644
--- a/app/src/main/java/io/xpipe/app/core/window/AppWindowHelper.java
+++ b/app/src/main/java/io/xpipe/app/core/window/AppWindowHelper.java
@@ -5,6 +5,8 @@ import io.xpipe.app.core.*;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.issue.TrackEvent;
import io.xpipe.app.prefs.AppPrefs;
+import io.xpipe.app.resources.AppImages;
+import io.xpipe.app.resources.AppResources;
import io.xpipe.app.util.InputHelper;
import io.xpipe.app.util.ThreadHelper;
import io.xpipe.core.process.OsType;
diff --git a/app/src/main/java/io/xpipe/app/core/window/NativeMacOsWindowControl.java b/app/src/main/java/io/xpipe/app/core/window/NativeMacOsWindowControl.java
index c15d14a10..315a22680 100644
--- a/app/src/main/java/io/xpipe/app/core/window/NativeMacOsWindowControl.java
+++ b/app/src/main/java/io/xpipe/app/core/window/NativeMacOsWindowControl.java
@@ -1,11 +1,13 @@
package io.xpipe.app.core.window;
-import com.sun.jna.NativeLong;
import io.xpipe.app.core.AppProperties;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.util.NativeBridge;
import io.xpipe.core.util.ModuleHelper;
+
import javafx.stage.Window;
+
+import com.sun.jna.NativeLong;
import lombok.Getter;
import lombok.SneakyThrows;
diff --git a/app/src/main/java/io/xpipe/app/core/window/NativeWinWindowControl.java b/app/src/main/java/io/xpipe/app/core/window/NativeWinWindowControl.java
index 398f33b36..c3cb376a6 100644
--- a/app/src/main/java/io/xpipe/app/core/window/NativeWinWindowControl.java
+++ b/app/src/main/java/io/xpipe/app/core/window/NativeWinWindowControl.java
@@ -1,5 +1,7 @@
package io.xpipe.app.core.window;
+import com.sun.jna.ptr.IntByReference;
+import io.xpipe.app.util.Rect;
import javafx.stage.Window;
import com.sun.jna.Library;
@@ -13,10 +15,29 @@ import lombok.Getter;
import lombok.SneakyThrows;
import java.lang.reflect.Method;
+import java.util.Optional;
+import java.util.concurrent.atomic.AtomicReference;
@Getter
public class NativeWinWindowControl {
+ public static Optional byPid(long pid) {
+ var ref = new AtomicReference();
+ User32.INSTANCE.EnumWindows((hWnd, data) -> {
+ var wpid = new IntByReference();
+ User32.INSTANCE.GetWindowThreadProcessId(hWnd, wpid);
+ if (wpid.getValue() == pid) {
+ ref.set(new NativeWinWindowControl(hWnd));
+ return false;
+ } else {
+ return true;
+ }
+ }, null);
+ return Optional.ofNullable(ref.get());
+ }
+
+ public static NativeWinWindowControl MAIN_WINDOW;
+
private final WinDef.HWND windowHandle;
@SneakyThrows
@@ -38,8 +59,28 @@ public class NativeWinWindowControl {
this.windowHandle = windowHandle;
}
- public void move(int x, int y, int w, int h) {
- User32.INSTANCE.SetWindowPos(windowHandle, new WinDef.HWND(), x, y, w, h, 0);
+ public void alwaysInFront() {
+ orderRelative(new WinDef.HWND(new Pointer( 0xFFFFFFFFFFFFFFFFL)));
+ }
+
+ public void orderRelative(WinDef.HWND predecessor) {
+ User32.INSTANCE.SetWindowPos(windowHandle, predecessor, 0, 0, 0, 0, User32.SWP_NOACTIVATE | User32.SWP_NOMOVE | User32.SWP_NOSIZE);
+ }
+
+ public void show() {
+ User32.INSTANCE.ShowWindow(windowHandle,User32.SW_RESTORE);
+ }
+
+ public void close() {
+ User32.INSTANCE.CloseWindow(windowHandle);
+ }
+
+ public void minimize() {
+ User32.INSTANCE.ShowWindow(windowHandle,User32.SW_MINIMIZE);
+ }
+
+ public void move(Rect bounds) {
+ User32.INSTANCE.SetWindowPos(windowHandle, null, bounds.getX(), bounds.getY(), bounds.getW(), bounds.getH(), User32.SWP_NOACTIVATE);
}
public boolean setWindowAttribute(int attribute, boolean attributeValue) {
diff --git a/app/src/main/java/io/xpipe/app/ext/ContainerImageStore.java b/app/src/main/java/io/xpipe/app/ext/ContainerImageStore.java
new file mode 100644
index 000000000..fa5139226
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/ext/ContainerImageStore.java
@@ -0,0 +1,6 @@
+package io.xpipe.app.ext;
+
+public interface ContainerImageStore {
+
+ String getImageName();
+}
diff --git a/app/src/main/java/io/xpipe/app/ext/DataStoreProvider.java b/app/src/main/java/io/xpipe/app/ext/DataStoreProvider.java
index cb1e01cd1..27ab1af3d 100644
--- a/app/src/main/java/io/xpipe/app/ext/DataStoreProvider.java
+++ b/app/src/main/java/io/xpipe/app/ext/DataStoreProvider.java
@@ -7,9 +7,9 @@ import io.xpipe.app.comp.store.StoreEntryWrapper;
import io.xpipe.app.comp.store.StoreSection;
import io.xpipe.app.comp.store.StoreSectionComp;
import io.xpipe.app.core.AppI18n;
-import io.xpipe.app.core.AppImages;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.issue.ErrorEvent;
+import io.xpipe.app.resources.AppImages;
import io.xpipe.app.storage.DataStoreEntry;
import io.xpipe.core.store.DataStore;
import io.xpipe.core.util.JacksonizedValue;
@@ -57,12 +57,12 @@ public interface DataStoreProvider {
default void validate() {
for (Class> storeClass : getStoreClasses()) {
if (!JacksonizedValue.class.isAssignableFrom(storeClass)) {
- throw new ExtensionException(
+ throw ExtensionException.corrupt(
String.format("Store class %s is not a Jacksonized value", storeClass.getSimpleName()));
}
if (getUsageCategory() == null) {
- throw new ExtensionException("Provider %s does not have the usage category".formatted(getId()));
+ throw ExtensionException.corrupt("Provider %s does not have the usage category".formatted(getId()));
}
}
}
diff --git a/app/src/main/java/io/xpipe/app/ext/ExtensionException.java b/app/src/main/java/io/xpipe/app/ext/ExtensionException.java
index e26db7670..d89baeb8c 100644
--- a/app/src/main/java/io/xpipe/app/ext/ExtensionException.java
+++ b/app/src/main/java/io/xpipe/app/ext/ExtensionException.java
@@ -1,14 +1,16 @@
package io.xpipe.app.ext;
+import io.xpipe.core.util.XPipeInstallation;
+
public class ExtensionException extends RuntimeException {
public ExtensionException() {}
- public ExtensionException(String message) {
+ private ExtensionException(String message) {
super(message);
}
- public ExtensionException(String message, Throwable cause) {
+ private ExtensionException(String message, Throwable cause) {
super(message, cause);
}
@@ -20,7 +22,18 @@ public class ExtensionException extends RuntimeException {
super(message, cause, enableSuppression, writableStackTrace);
}
+ public static ExtensionException corrupt(String message, Throwable cause) {
+ try {
+ var loc = XPipeInstallation.getCurrentInstallationBasePath();
+ var full = message + ".\n\n" + "Please check whether the XPipe installation data at " + loc + " is corrupted.";
+ return new ExtensionException(full, cause);
+ } catch (Throwable t) {
+ var full = message + ".\n\n" + "Please check whether the XPipe installation data is corrupted.";
+ return new ExtensionException(full, cause);
+ }
+ }
+
public static ExtensionException corrupt(String message) {
- return new ExtensionException(message + ". Is the installation data corrupt?");
+ return corrupt(message, null);
}
}
diff --git a/app/src/main/java/io/xpipe/app/ext/LocalStore.java b/app/src/main/java/io/xpipe/app/ext/LocalStore.java
index fe2c79287..ab23d77a1 100644
--- a/app/src/main/java/io/xpipe/app/ext/LocalStore.java
+++ b/app/src/main/java/io/xpipe/app/ext/LocalStore.java
@@ -20,7 +20,7 @@ public class LocalStore extends JacksonizedValue
}
@Override
- public ShellControl control() {
+ public ShellControl parentControl() {
var pc = ProcessControlProvider.get().createLocalProcessControl(true);
pc.withSourceStore(this);
pc.withShellStateInit(this);
@@ -28,6 +28,11 @@ public class LocalStore extends JacksonizedValue
return pc;
}
+ @Override
+ public ShellControl control(ShellControl parent) {
+ return parent;
+ }
+
@Override
public DataStore getNetworkParent() {
return null;
diff --git a/app/src/main/java/io/xpipe/app/ext/ProcessControlProvider.java b/app/src/main/java/io/xpipe/app/ext/ProcessControlProvider.java
index 3196ac000..99c6468d6 100644
--- a/app/src/main/java/io/xpipe/app/ext/ProcessControlProvider.java
+++ b/app/src/main/java/io/xpipe/app/ext/ProcessControlProvider.java
@@ -3,6 +3,7 @@ package io.xpipe.app.ext;
import io.xpipe.app.storage.DataStoreEntryRef;
import io.xpipe.core.process.*;
import io.xpipe.core.store.DataStore;
+
import lombok.NonNull;
import java.util.ServiceLoader;
@@ -22,6 +23,8 @@ public abstract class ProcessControlProvider {
return INSTANCE;
}
+ public abstract void reset();
+
public abstract ShellControl withDefaultScripts(ShellControl pc);
public abstract ShellControl sub(
diff --git a/app/src/main/java/io/xpipe/app/ext/ScanProvider.java b/app/src/main/java/io/xpipe/app/ext/ScanProvider.java
index 8bc28c6c9..e7bae26a9 100644
--- a/app/src/main/java/io/xpipe/app/ext/ScanProvider.java
+++ b/app/src/main/java/io/xpipe/app/ext/ScanProvider.java
@@ -31,11 +31,11 @@ public abstract class ScanProvider {
String nameKey;
boolean disabled;
boolean defaultSelected;
- FailableRunnable scanner;
+ FailableRunnable scanner;
String licenseFeatureId;
public ScanOperation(
- String nameKey, boolean disabled, boolean defaultSelected, FailableRunnable scanner) {
+ String nameKey, boolean disabled, boolean defaultSelected, FailableRunnable scanner) {
this.nameKey = nameKey;
this.disabled = disabled;
this.defaultSelected = defaultSelected;
diff --git a/app/src/main/java/io/xpipe/app/fxcomps/impl/DataStoreChoiceComp.java b/app/src/main/java/io/xpipe/app/fxcomps/impl/DataStoreChoiceComp.java
index 24e8ecc9c..320d0a529 100644
--- a/app/src/main/java/io/xpipe/app/fxcomps/impl/DataStoreChoiceComp.java
+++ b/app/src/main/java/io/xpipe/app/fxcomps/impl/DataStoreChoiceComp.java
@@ -4,6 +4,7 @@ import io.xpipe.app.comp.base.ButtonComp;
import io.xpipe.app.comp.store.*;
import io.xpipe.app.core.AppFont;
import io.xpipe.app.core.AppI18n;
+import io.xpipe.app.ext.LocalStore;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.storage.DataStorage;
@@ -11,7 +12,6 @@ import io.xpipe.app.storage.DataStoreEntry;
import io.xpipe.app.storage.DataStoreEntryRef;
import io.xpipe.app.util.DataStoreCategoryChoiceComp;
import io.xpipe.core.store.DataStore;
-import io.xpipe.app.ext.LocalStore;
import io.xpipe.core.store.ShellStore;
import javafx.beans.binding.Bindings;
@@ -200,18 +200,10 @@ public class DataStoreChoiceComp extends SimpleComp {
button.apply(struc -> {
struc.get().setMaxWidth(2000);
struc.get().setAlignment(Pos.CENTER_LEFT);
- Comp> graphic = new PrettySvgComp(
+ Comp> graphic = PrettyImageHelper.ofFixedSize(
Bindings.createStringBinding(
() -> {
- if (selected.getValue() == null) {
- return null;
- }
-
- return selected.getValue()
- .get()
- .getProvider()
- .getDisplayIconFileName(
- selected.getValue().getStore());
+ return selected.getValue().get().getEffectiveIconFile();
},
selected),
16,
diff --git a/app/src/main/java/io/xpipe/app/fxcomps/impl/DataStoreListChoiceComp.java b/app/src/main/java/io/xpipe/app/fxcomps/impl/DataStoreListChoiceComp.java
index 2e901e5e8..12341a04f 100644
--- a/app/src/main/java/io/xpipe/app/fxcomps/impl/DataStoreListChoiceComp.java
+++ b/app/src/main/java/io/xpipe/app/fxcomps/impl/DataStoreListChoiceComp.java
@@ -46,7 +46,7 @@ public class DataStoreListChoiceComp extends SimpleComp {
var label = new LabelComp(t.get().getName()).apply(struc -> struc.get()
.setGraphic(PrettyImageHelper.ofFixedSizeSquare(
- t.get().getProvider().getDisplayIconFileName(t.getStore()), 16)
+ t.get().getEffectiveIconFile(), 16)
.createRegion()));
var delete = new IconButtonComp("mdal-delete_outline", () -> {
selectedList.remove(t);
diff --git a/app/src/main/java/io/xpipe/app/fxcomps/impl/IconButtonComp.java b/app/src/main/java/io/xpipe/app/fxcomps/impl/IconButtonComp.java
index 438247b0e..eeba80d85 100644
--- a/app/src/main/java/io/xpipe/app/fxcomps/impl/IconButtonComp.java
+++ b/app/src/main/java/io/xpipe/app/fxcomps/impl/IconButtonComp.java
@@ -3,6 +3,7 @@ package io.xpipe.app.fxcomps.impl;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.CompStructure;
import io.xpipe.app.fxcomps.SimpleCompStructure;
+import io.xpipe.app.fxcomps.util.LabelGraphic;
import io.xpipe.app.fxcomps.util.PlatformThread;
import javafx.beans.property.SimpleObjectProperty;
@@ -16,23 +17,31 @@ import org.kordamp.ikonli.javafx.FontIcon;
public class IconButtonComp extends Comp> {
- private final ObservableValue icon;
+ private final ObservableValue extends LabelGraphic> icon;
private final Runnable listener;
public IconButtonComp(String defaultVal) {
+ this(new SimpleObjectProperty<>(new LabelGraphic.IconGraphic(defaultVal)), null);
+ }
+
+ public IconButtonComp(String defaultVal, Runnable listener) {
+ this(new SimpleObjectProperty<>(new LabelGraphic.IconGraphic(defaultVal)), listener);
+ }
+
+ public IconButtonComp(LabelGraphic defaultVal) {
this(new SimpleObjectProperty<>(defaultVal), null);
}
- public IconButtonComp(ObservableValue icon) {
+ public IconButtonComp(ObservableValue extends LabelGraphic> icon) {
this.icon = icon;
this.listener = null;
}
- public IconButtonComp(String defaultVal, Runnable listener) {
+ public IconButtonComp(LabelGraphic defaultVal, Runnable listener) {
this(new SimpleObjectProperty<>(defaultVal), listener);
}
- public IconButtonComp(ObservableValue icon, Runnable listener) {
+ public IconButtonComp(ObservableValue extends LabelGraphic> icon, Runnable listener) {
this.icon = PlatformThread.sync(icon);
this.listener = listener;
}
@@ -41,18 +50,17 @@ public class IconButtonComp extends Comp> {
public CompStructure createBase() {
var button = new Button();
button.getStyleClass().add(Styles.FLAT);
-
- var fi = new FontIcon(icon.getValue());
- fi.setFocusTraversable(false);
- icon.addListener((c, o, n) -> {
- fi.setIconLiteral(n);
+ icon.subscribe(labelGraphic -> {
+ button.setGraphic(labelGraphic.createGraphicNode());
+ if (button.getGraphic() instanceof FontIcon fi) {
+ fi.setIconSize((int) new Size(button.getFont().getSize(), SizeUnits.PT).pixels());
+ }
});
- fi.setIconSize((int) new Size(fi.getFont().getSize(), SizeUnits.PT).pixels());
- button.fontProperty().addListener((c, o, n) -> {
- fi.setIconSize((int) new Size(n.getSize(), SizeUnits.PT).pixels());
+ button.fontProperty().subscribe((n) -> {
+ if (button.getGraphic() instanceof FontIcon fi) {
+ fi.setIconSize((int) new Size(n.getSize(), SizeUnits.PT).pixels());
+ }
});
- // fi.iconColorProperty().bind(button.textFillProperty());
- button.setGraphic(fi);
if (listener != null) {
button.setOnAction(e -> {
listener.run();
diff --git a/app/src/main/java/io/xpipe/app/fxcomps/impl/PrettyImageComp.java b/app/src/main/java/io/xpipe/app/fxcomps/impl/PrettyImageComp.java
index 8dc024a68..9ec6d224d 100644
--- a/app/src/main/java/io/xpipe/app/fxcomps/impl/PrettyImageComp.java
+++ b/app/src/main/java/io/xpipe/app/fxcomps/impl/PrettyImageComp.java
@@ -1,10 +1,10 @@
package io.xpipe.app.fxcomps.impl;
-import io.xpipe.app.core.AppImages;
import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.issue.TrackEvent;
import io.xpipe.app.prefs.AppPrefs;
+import io.xpipe.app.resources.AppImages;
import io.xpipe.core.store.FileNames;
import javafx.beans.binding.Bindings;
diff --git a/app/src/main/java/io/xpipe/app/fxcomps/impl/PrettyImageHelper.java b/app/src/main/java/io/xpipe/app/fxcomps/impl/PrettyImageHelper.java
index e5ea5d319..58e048bf6 100644
--- a/app/src/main/java/io/xpipe/app/fxcomps/impl/PrettyImageHelper.java
+++ b/app/src/main/java/io/xpipe/app/fxcomps/impl/PrettyImageHelper.java
@@ -1,55 +1,70 @@
package io.xpipe.app.fxcomps.impl;
-import io.xpipe.app.core.AppImages;
+import io.xpipe.app.core.App;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.util.BindingsHelper;
+import io.xpipe.app.resources.AppImages;
import io.xpipe.core.store.FileNames;
+import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
+import java.util.List;
import java.util.Optional;
public class PrettyImageHelper {
- private static Optional rasterizedImageIfExists(String img, int width, int height) {
+ private static Optional rasterizedImageIfExists(String img, int height) {
if (img != null && img.endsWith(".svg")) {
var base = FileNames.getBaseName(img);
var renderedName = base + "-" + height + ".png";
- if (AppImages.hasNormalImage(base + "-" + height + ".png")) {
+ if (AppImages.hasNormalImage(renderedName)) {
return Optional.of(renderedName);
}
}
+ if (img != null && img.endsWith(".png")) {
+ if (AppImages.hasNormalImage(img)) {
+ return Optional.of(img);
+ }
+ }
+
return Optional.empty();
}
+ private static ObservableValue rasterizedImageIfExistsScaled(String img, int height) {
+ return Bindings.createStringBinding(
+ () -> {
+ if (img == null) {
+ return null;
+ }
+
+ if (!img.endsWith(".svg")) {
+ return rasterizedImageIfExists(img, height).orElse(null);
+ }
+
+ var sizes = List.of(16, 24, 40, 80);
+ var mult = Math.round(App.getApp().displayScale().get() * height);
+ var base = FileNames.getBaseName(img);
+ var available = sizes.stream()
+ .filter(integer -> AppImages.hasNormalImage(base + "-" + integer + ".png"))
+ .toList();
+ var closest = available.stream()
+ .filter(integer -> integer >= mult)
+ .findFirst()
+ .orElse(available.size() > 0 ? available.getLast() : 0);
+ return rasterizedImageIfExists(img, closest).orElse(null);
+ },
+ App.getApp().displayScale());
+ }
+
public static Comp> ofFixedSizeSquare(String img, int size) {
return ofFixedSize(img, size, size);
}
- public static Comp> ofFixedRasterized(String img, int w, int h) {
- if (img == null) {
- return new PrettyImageComp(new SimpleStringProperty(null), w, h);
- }
-
- var rasterized = rasterizedImageIfExists(img, w, h);
- return new PrettyImageComp(new SimpleStringProperty(rasterized.orElse(null)), w, h);
- }
-
public static Comp> ofFixedSize(String img, int w, int h) {
- if (img == null) {
- return new PrettyImageComp(new SimpleStringProperty(null), w, h);
- }
-
- var rasterized = rasterizedImageIfExists(img, w, h);
- if (rasterized.isPresent()) {
- return new PrettyImageComp(new SimpleStringProperty(rasterized.get()), w, h);
- } else {
- return img.endsWith(".svg")
- ? new PrettySvgComp(new SimpleStringProperty(img), w, h)
- : new PrettyImageComp(new SimpleStringProperty(img), w, h);
- }
+ return ofFixedSize(new SimpleStringProperty(img), w, h);
}
public static Comp> ofFixedSize(ObservableValue img, int w, int h) {
@@ -57,8 +72,8 @@ public class PrettyImageHelper {
return new PrettyImageComp(new SimpleStringProperty(null), w, h);
}
- var binding = BindingsHelper.map(img, s -> {
- return rasterizedImageIfExists(s, w, h).orElse(s);
+ var binding = BindingsHelper.flatMap(img, s -> {
+ return rasterizedImageIfExistsScaled(s, h);
});
return new PrettyImageComp(binding, w, h);
}
diff --git a/app/src/main/java/io/xpipe/app/fxcomps/impl/PrettySvgComp.java b/app/src/main/java/io/xpipe/app/fxcomps/impl/PrettySvgComp.java
index 2e9fed80c..a59883bd7 100644
--- a/app/src/main/java/io/xpipe/app/fxcomps/impl/PrettySvgComp.java
+++ b/app/src/main/java/io/xpipe/app/fxcomps/impl/PrettySvgComp.java
@@ -1,9 +1,9 @@
package io.xpipe.app.fxcomps.impl;
-import io.xpipe.app.core.AppImages;
import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.prefs.AppPrefs;
+import io.xpipe.app.resources.AppImages;
import io.xpipe.core.store.FileNames;
import javafx.beans.binding.Bindings;
diff --git a/app/src/main/java/io/xpipe/app/fxcomps/impl/StoreCategoryComp.java b/app/src/main/java/io/xpipe/app/fxcomps/impl/StoreCategoryComp.java
index 4438dbaa2..c333be897 100644
--- a/app/src/main/java/io/xpipe/app/fxcomps/impl/StoreCategoryComp.java
+++ b/app/src/main/java/io/xpipe/app/fxcomps/impl/StoreCategoryComp.java
@@ -12,11 +12,11 @@ import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.fxcomps.augment.ContextMenuAugment;
import io.xpipe.app.fxcomps.util.DerivedObservableList;
+import io.xpipe.app.fxcomps.util.LabelGraphic;
import io.xpipe.app.storage.DataColor;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStoreCategory;
import io.xpipe.app.util.ContextMenuHelper;
-import io.xpipe.app.util.DataStoreFormatter;
import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleBooleanProperty;
@@ -57,11 +57,11 @@ public class StoreCategoryComp extends SimpleComp {
.createRegion();
var showing = new SimpleBooleanProperty();
- var expandIcon = Bindings.createStringBinding(
+ var expandIcon = Bindings.createObjectBinding(
() -> {
var exp = category.getExpanded().get()
&& category.getChildren().size() > 0;
- return exp ? "mdal-keyboard_arrow_down" : "mdal-keyboard_arrow_right";
+ return new LabelGraphic.IconGraphic(exp ? "mdal-keyboard_arrow_down" : "mdal-keyboard_arrow_right");
},
category.getExpanded(),
category.getChildren());
@@ -78,18 +78,18 @@ public class StoreCategoryComp extends SimpleComp {
.tooltipKey("expand", new KeyCodeCombination(KeyCode.SPACE));
var hover = new SimpleBooleanProperty();
- var statusIcon = Bindings.createStringBinding(
+ var statusIcon = Bindings.createObjectBinding(
() -> {
if (hover.get()) {
- return "mdomz-settings";
+ return new LabelGraphic.IconGraphic("mdomz-settings");
}
if (!DataStorage.get().supportsSharing()
|| !category.getCategory().canShare()) {
- return "mdi2g-git";
+ return new LabelGraphic.IconGraphic("mdi2g-git");
}
- return category.getSync().getValue() ? "mdi2g-git" : "mdi2c-cancel";
+ return new LabelGraphic.IconGraphic(category.getSync().getValue() ? "mdi2g-git" : "mdi2c-cancel");
},
category.getSync(),
hover);
@@ -196,14 +196,16 @@ public class StoreCategoryComp extends SimpleComp {
contextMenu.getItems().add(new SeparatorMenuItem());
var color = new Menu(AppI18n.get("color"), new FontIcon("mdi2f-format-color-fill"));
- var none = new MenuItem("None");
+ var none = new MenuItem();
+ none.textProperty().bind(AppI18n.observable("none"));
none.setOnAction(event -> {
category.getCategory().setColor(null);
event.consume();
});
color.getItems().add(none);
Arrays.stream(DataColor.values()).forEach(dataStoreColor -> {
- MenuItem m = new MenuItem(DataStoreFormatter.capitalize(dataStoreColor.getId()));
+ MenuItem m = new MenuItem();
+ m.textProperty().bind(AppI18n.observable(dataStoreColor.getId()));
m.setOnAction(event -> {
category.getCategory().setColor(dataStoreColor);
event.consume();
diff --git a/app/src/main/java/io/xpipe/app/issue/ErrorAction.java b/app/src/main/java/io/xpipe/app/issue/ErrorAction.java
index b93ead379..b10c89f9d 100644
--- a/app/src/main/java/io/xpipe/app/issue/ErrorAction.java
+++ b/app/src/main/java/io/xpipe/app/issue/ErrorAction.java
@@ -5,6 +5,26 @@ import io.xpipe.app.util.Hyperlinks;
public interface ErrorAction {
+ static ErrorAction openDocumentation(String link) {
+ return new ErrorAction() {
+ @Override
+ public String getName() {
+ return AppI18n.get("openDocumentation");
+ }
+
+ @Override
+ public String getDescription() {
+ return AppI18n.get("openDocumentationDescription");
+ }
+
+ @Override
+ public boolean handle(ErrorEvent event) {
+ Hyperlinks.open(link);
+ return false;
+ }
+ };
+ }
+
static ErrorAction reportOnGithub() {
return new ErrorAction() {
@Override
diff --git a/app/src/main/java/io/xpipe/app/issue/ErrorHandlerComp.java b/app/src/main/java/io/xpipe/app/issue/ErrorHandlerComp.java
index d5054accc..944319ade 100644
--- a/app/src/main/java/io/xpipe/app/issue/ErrorHandlerComp.java
+++ b/app/src/main/java/io/xpipe/app/issue/ErrorHandlerComp.java
@@ -254,14 +254,19 @@ public class ErrorHandlerComp extends SimpleComp {
actionBox.getChildren().add(ac);
}
- if (!event.isDisableDefaultActions() || event.getCustomActions().isEmpty()) {
+ if (!event.isDisableDefaultActions()) {
for (var action :
List.of(ErrorAction.automaticallyReport(), ErrorAction.reportOnGithub(), ErrorAction.ignore())) {
var ac = createActionComp(action);
actionBox.getChildren().add(ac);
}
- actionBox.getChildren().get(1).getStyleClass().addAll(BUTTON_OUTLINED, ACCENT);
+ } else if (event.getCustomActions().isEmpty()) {
+ for (var action : List.of(ErrorAction.ignore())) {
+ var ac = createActionComp(action);
+ actionBox.getChildren().add(ac);
+ }
}
+ actionBox.getChildren().get(1).getStyleClass().addAll(BUTTON_OUTLINED, ACCENT);
content.getChildren().addAll(actionBox);
content.getStyleClass().add("top");
diff --git a/app/src/main/java/io/xpipe/app/issue/UserReportComp.java b/app/src/main/java/io/xpipe/app/issue/UserReportComp.java
index 431b965ab..b6d892f70 100644
--- a/app/src/main/java/io/xpipe/app/issue/UserReportComp.java
+++ b/app/src/main/java/io/xpipe/app/issue/UserReportComp.java
@@ -8,6 +8,7 @@ import io.xpipe.app.core.*;
import io.xpipe.app.core.window.AppWindowHelper;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.SimpleComp;
+import io.xpipe.app.resources.AppResources;
import javafx.beans.property.ListProperty;
import javafx.beans.property.SimpleListProperty;
diff --git a/app/src/main/java/io/xpipe/app/launcher/LauncherCommand.java b/app/src/main/java/io/xpipe/app/launcher/LauncherCommand.java
index 812012608..3dff94e2e 100644
--- a/app/src/main/java/io/xpipe/app/launcher/LauncherCommand.java
+++ b/app/src/main/java/io/xpipe/app/launcher/LauncherCommand.java
@@ -112,17 +112,21 @@ public class LauncherCommand implements Callable {
}
try {
- client.get().performRequest(DaemonFocusExchange.Request.builder()
- .mode(getEffectiveMode())
- .build());
+ client.get()
+ .performRequest(DaemonFocusExchange.Request.builder()
+ .mode(getEffectiveMode())
+ .build());
if (!inputs.isEmpty()) {
- client.get().performRequest(DaemonOpenExchange.Request.builder()
- .arguments(inputs)
- .build());
+ client.get()
+ .performRequest(DaemonOpenExchange.Request.builder()
+ .arguments(inputs)
+ .build());
}
} catch (Exception ex) {
// Wait until shutdown has completed
- if (ex.getMessage() != null && ex.getMessage().contains("Daemon is currently in shutdown") && attemptCounter < 10) {
+ if (ex.getMessage() != null
+ && ex.getMessage().contains("Daemon is currently in shutdown")
+ && attemptCounter < 10) {
ThreadHelper.sleep(1000);
checkStart(++attemptCounter);
return;
diff --git a/app/src/main/java/io/xpipe/app/prefs/AboutCategory.java b/app/src/main/java/io/xpipe/app/prefs/AboutCategory.java
index 750d820df..e0de6d6da 100644
--- a/app/src/main/java/io/xpipe/app/prefs/AboutCategory.java
+++ b/app/src/main/java/io/xpipe/app/prefs/AboutCategory.java
@@ -115,7 +115,7 @@ public class AboutCategory extends AppPrefsCategory {
AppI18n.observable("xPipeClient"),
new SimpleStringProperty("Version " + AppProperties.get().getVersion() + " ("
+ AppProperties.get().getArch() + ")"),
- "logo.png");
+ "logo/logo.png");
});
if (OsType.getLocal() != OsType.MACOS) {
diff --git a/app/src/main/java/io/xpipe/app/prefs/AppPrefs.java b/app/src/main/java/io/xpipe/app/prefs/AppPrefs.java
index 6c883cae9..0149c637f 100644
--- a/app/src/main/java/io/xpipe/app/prefs/AppPrefs.java
+++ b/app/src/main/java/io/xpipe/app/prefs/AppPrefs.java
@@ -1,9 +1,6 @@
package io.xpipe.app.prefs;
-import io.xpipe.app.core.AppCache;
-import io.xpipe.app.core.AppLayoutModel;
-import io.xpipe.app.core.AppProperties;
-import io.xpipe.app.core.AppTheme;
+import io.xpipe.app.core.*;
import io.xpipe.app.ext.PrefsHandler;
import io.xpipe.app.ext.PrefsProvider;
import io.xpipe.app.fxcomps.Comp;
@@ -11,6 +8,7 @@ import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.terminal.ExternalTerminalType;
+import io.xpipe.app.update.XPipeDistributionType;
import io.xpipe.app.util.PasswordLockSecretValue;
import io.xpipe.core.util.InPlaceSecretValue;
import io.xpipe.core.util.ModuleHelper;
@@ -38,14 +36,17 @@ public class AppPrefs {
private static AppPrefs INSTANCE;
private final List> mapping = new ArrayList<>();
+ final BooleanProperty dontAllowTerminalRestart =
+ mapVaultSpecific(new SimpleBooleanProperty(false), "dontAllowTerminalRestart", Boolean.class);
final BooleanProperty enableHttpApi =
mapVaultSpecific(new SimpleBooleanProperty(false), "enableHttpApi", Boolean.class);
final BooleanProperty dontAutomaticallyStartVmSshServer =
mapVaultSpecific(new SimpleBooleanProperty(false), "dontAutomaticallyStartVmSshServer", Boolean.class);
final BooleanProperty dontAcceptNewHostKeys =
mapVaultSpecific(new SimpleBooleanProperty(false), "dontAcceptNewHostKeys", Boolean.class);
- final BooleanProperty performanceMode = map(new SimpleBooleanProperty(false), "performanceMode", Boolean.class);
- public final BooleanProperty useBundledTools = map(new SimpleBooleanProperty(false), "useBundledTools", Boolean.class);
+ public final BooleanProperty performanceMode = map(new SimpleBooleanProperty(), "performanceMode", Boolean.class);
+ public final BooleanProperty useBundledTools =
+ map(new SimpleBooleanProperty(false), "useBundledTools", Boolean.class);
public final ObjectProperty theme =
map(new SimpleObjectProperty<>(), "theme", AppTheme.Theme.class);
final BooleanProperty useSystemFont = map(new SimpleBooleanProperty(true), "useSystemFont", Boolean.class);
@@ -75,6 +76,8 @@ public class AppPrefs {
mapVaultSpecific(new SimpleBooleanProperty(false), "dontCachePasswords", Boolean.class);
public final BooleanProperty denyTempScriptCreation =
mapVaultSpecific(new SimpleBooleanProperty(false), "denyTempScriptCreation", Boolean.class);
+ final Property passwordManager =
+ mapVaultSpecific(new SimpleObjectProperty<>(), "passwordManager", ExternalPasswordManager.class);
final StringProperty passwordManagerCommand =
map(new SimpleStringProperty(""), "passwordManagerCommand", String.class);
final ObjectProperty startupBehaviour =
@@ -104,6 +107,8 @@ public class AppPrefs {
map(new SimpleBooleanProperty(true), "openConnectionSearchWindowOnConnectionCreation", Boolean.class);
final ObjectProperty storageDirectory =
map(new SimpleObjectProperty<>(DEFAULT_STORAGE_DIR), "storageDirectory", Path.class);
+ final BooleanProperty confirmAllDeletions =
+ map(new SimpleBooleanProperty(false), "confirmAllDeletions", Boolean.class);
final BooleanProperty developerMode = map(new SimpleBooleanProperty(false), "developerMode", Boolean.class);
final BooleanProperty developerDisableUpdateVersionCheck =
map(new SimpleBooleanProperty(false), "developerDisableUpdateVersionCheck", Boolean.class);
@@ -150,6 +155,10 @@ public class AppPrefs {
return enableHttpApi;
}
+ public ObservableBooleanValue dontAllowTerminalRestart() {
+ return dontAllowTerminalRestart;
+ }
+
private final IntegerProperty editorReloadTimeout =
map(new SimpleIntegerProperty(1000), "editorReloadTimeout", Integer.class);
private final BooleanProperty confirmDeletions =
@@ -253,6 +262,10 @@ public class AppPrefs {
developerMode());
}
+ public ObservableValue externalPasswordManager() {
+ return passwordManager;
+ }
+
public ObservableValue language() {
return language;
}
@@ -476,6 +489,9 @@ public class AppPrefs {
if (rdpClientType.get() == null) {
rdpClientType.setValue(ExternalRdpClientType.determineDefault());
}
+ if (AppState.get().isInitialLaunch()) {
+ performanceMode.setValue(XPipeDistributionType.get() == XPipeDistributionType.WEBTOP);
+ }
}
public Comp> getCustomComp(String id) {
diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java b/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java
index 196fc64f1..f9c6096fc 100644
--- a/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java
+++ b/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java
@@ -75,7 +75,7 @@ public abstract class ExternalApplicationType implements PrefsChoiceValue {
public boolean isAvailable() {
try (ShellControl pc = LocalShell.getShell()) {
- return pc.executeSimpleBooleanCommand(pc.getShellDialect().getWhichCommand(executable));
+ return CommandSupport.findProgram(pc, executable).isPresent();
} catch (Exception e) {
ErrorEvent.fromThrowable(e).omit().handle();
return false;
@@ -115,14 +115,9 @@ public abstract class ExternalApplicationType implements PrefsChoiceValue {
protected Optional determineFromPath() {
// Try to locate if it is in the Path
try (var sc = LocalShell.getShell().start()) {
- var out = sc.command(CommandBuilder.ofFunction(
- var1 -> var1.getShellDialect().getWhichCommand(executable)))
- .readStdoutIfPossible();
+ var out = CommandSupport.findProgram(sc, executable);
if (out.isPresent()) {
- var first = out.get().lines().findFirst();
- if (first.isPresent()) {
- return first.map(String::trim).map(Path::of);
- }
+ return out.map(Path::of);
}
} catch (Exception ex) {
ErrorEvent.fromThrowable(ex).omit().handle();
diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java b/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java
index 24fa44ba8..7c8efa1c0 100644
--- a/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java
+++ b/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java
@@ -79,7 +79,10 @@ public interface ExternalEditorType extends PrefsChoiceValue {
LinuxPathType VSCODE_LINUX = new LinuxPathType("app.vscode", "code") {
@Override
public void launch(Path file) throws Exception {
- var builder = CommandBuilder.of().fixedEnvrironment("DONT_PROMPT_WSL_INSTALL", "No_Prompt_please").addFile(executable).addFile(file.toString());
+ var builder = CommandBuilder.of()
+ .fixedEnvrironment("DONT_PROMPT_WSL_INSTALL", "No_Prompt_please")
+ .addFile(executable)
+ .addFile(file.toString());
ExternalApplicationHelper.startAsync(builder);
}
};
diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalPasswordManager.java b/app/src/main/java/io/xpipe/app/prefs/ExternalPasswordManager.java
index 0f999ea5b..20f1c5685 100644
--- a/app/src/main/java/io/xpipe/app/prefs/ExternalPasswordManager.java
+++ b/app/src/main/java/io/xpipe/app/prefs/ExternalPasswordManager.java
@@ -1,6 +1,9 @@
package io.xpipe.app.prefs;
import io.xpipe.app.ext.PrefsChoiceValue;
+import io.xpipe.app.ext.ProcessControlProvider;
+import io.xpipe.app.issue.ErrorEvent;
+import io.xpipe.app.util.LocalShell;
import io.xpipe.core.process.OsType;
import java.util.List;
@@ -8,74 +11,123 @@ import java.util.stream.Stream;
public interface ExternalPasswordManager extends PrefsChoiceValue {
- String getTemplate();
+ String retrievePassword(String key);
+
+ ExternalPasswordManager COMMAND = new ExternalPasswordManager() {
- ExternalPasswordManager BITWARDEN = new ExternalPasswordManager() {
@Override
- public String getTemplate() {
- return "bw get password $KEY --nointeraction --raw";
+ public String retrievePassword(String key) {
+ var cmd = AppPrefs.get().passwordManagerString(key);
+ if (cmd == null) {
+ return null;
+ }
+
+ try (var cc = ProcessControlProvider.get().createLocalProcessControl(true).command(cmd).start()) {
+ var out = cc.readStdoutOrThrow();
+
+ // Dashlane fixes
+ var rawCmd = AppPrefs.get().passwordManagerCommand.get();
+ if (rawCmd.contains("dcli")) {
+ out = out.lines().findFirst().map(s -> s.trim().replaceAll("\\s+$", "")).orElse(null);
+ }
+
+ return out;
+ } catch (Exception ex) {
+ ErrorEvent.fromThrowable("Unable to retrieve password with command " + cmd, ex)
+ .expected()
+ .handle();
+ return null;
+ }
}
@Override
public String getId() {
- return "bitwarden";
+ return "command";
}
};
- ExternalPasswordManager ONEPASSWORD = new ExternalPasswordManager() {
+ ExternalPasswordManager WINDOWS_CREDENTIAL_MANAGER = new ExternalPasswordManager() {
+
+ private boolean loaded = false;
+
@Override
- public String getTemplate() {
- return "op read $KEY --force";
+ public synchronized String retrievePassword(String key) {
+ try {
+ if (!loaded) {
+ loaded = true;
+ var cmd =
+ """
+ $code = @"
+ using System.Text;
+ using System;
+ using System.Runtime.InteropServices;
+
+ namespace CredManager {
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+ public struct CredentialMem
+ {
+ public int flags;
+ public int type;
+ public string targetName;
+ public string comment;
+ public System.Runtime.InteropServices.ComTypes.FILETIME lastWritten;
+ public int credentialBlobSize;
+ public IntPtr credentialBlob;
+ public int persist;
+ public int attributeCount;
+ public IntPtr credAttribute;
+ public string targetAlias;
+ public string userName;
+ }
+
+ public class Credential {
+ [DllImport("advapi32.dll", EntryPoint = "CredReadW", CharSet = CharSet.Unicode, SetLastError = true)]
+ private static extern bool CredRead(string target, int type, int reservedFlag, out IntPtr credentialPtr);
+
+ public static string GetUserPassword(string target)
+ {
+ CredentialMem credMem;
+ IntPtr credPtr;
+
+ if (CredRead(target, 1, 0, out credPtr))
+ {
+ credMem = Marshal.PtrToStructure(credPtr);
+ byte[] passwordBytes = new byte[credMem.credentialBlobSize];
+ Marshal.Copy(credMem.credentialBlob, passwordBytes, 0, credMem.credentialBlobSize);
+ return Encoding.Unicode.GetString(passwordBytes);
+ } else {
+ throw new Exception("No credentials found for target: " + target);
+ }
+ }
+ }
+ }
+ "@
+ Add-Type -TypeDefinition $code -Language CSharp
+ """;
+ LocalShell.getLocalPowershell().command(cmd).execute();
+ }
+
+ return LocalShell.getLocalPowershell()
+ .command("[CredManager.Credential]::GetUserPassword(\"" + key.replaceAll("\"", "`\"") + "\")")
+ .readStdoutOrThrow();
+ } catch (Exception ex) {
+ ErrorEvent.fromThrowable(ex).expected().handle();
+ return null;
+ }
}
@Override
public String getId() {
- return "1password";
- }
- };
-
- ExternalPasswordManager DASHLANE = new ExternalPasswordManager() {
- @Override
- public String getTemplate() {
- return "dcli password --output console $KEY";
- }
-
- @Override
- public String getId() {
- return "dashlane";
- }
- };
-
- ExternalPasswordManager LASTPASS = new ExternalPasswordManager() {
- @Override
- public String getTemplate() {
- return "lpass show --password $KEY";
- }
-
- @Override
- public String getId() {
- return "lastpass";
- }
- };
-
- ExternalPasswordManager MACOS_KEYCHAIN = new ExternalPasswordManager() {
- @Override
- public String getTemplate() {
- return "security find-generic-password -w -l $KEY";
- }
-
- @Override
- public String getId() {
- return "macosKeychain";
+ return "windowsCredentialManager";
}
@Override
public boolean isSelectable() {
- return OsType.getLocal() == OsType.MACOS;
+ return OsType.getLocal() == OsType.WINDOWS;
}
};
- List ALL = Stream.of(ONEPASSWORD, BITWARDEN, DASHLANE, LASTPASS, MACOS_KEYCHAIN)
+ List ALL = Stream.of(COMMAND, WINDOWS_CREDENTIAL_MANAGER)
.filter(externalPasswordManager -> externalPasswordManager.isSelectable())
.toList();
}
diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalPasswordManagerTemplate.java b/app/src/main/java/io/xpipe/app/prefs/ExternalPasswordManagerTemplate.java
new file mode 100644
index 000000000..7f0a2d7ad
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/prefs/ExternalPasswordManagerTemplate.java
@@ -0,0 +1,81 @@
+package io.xpipe.app.prefs;
+
+import io.xpipe.app.ext.PrefsChoiceValue;
+import io.xpipe.core.process.OsType;
+
+import java.util.List;
+import java.util.stream.Stream;
+
+public interface ExternalPasswordManagerTemplate extends PrefsChoiceValue {
+
+ String getTemplate();
+
+ ExternalPasswordManagerTemplate BITWARDEN = new ExternalPasswordManagerTemplate() {
+ @Override
+ public String getTemplate() {
+ return "bw get password $KEY --nointeraction --raw";
+ }
+
+ @Override
+ public String getId() {
+ return "bitwarden";
+ }
+ };
+
+ ExternalPasswordManagerTemplate ONEPASSWORD = new ExternalPasswordManagerTemplate() {
+ @Override
+ public String getTemplate() {
+ return "op read $KEY --force";
+ }
+
+ @Override
+ public String getId() {
+ return "1password";
+ }
+ };
+
+ ExternalPasswordManagerTemplate DASHLANE = new ExternalPasswordManagerTemplate() {
+ @Override
+ public String getTemplate() {
+ return "dcli password --output console $KEY";
+ }
+
+ @Override
+ public String getId() {
+ return "dashlane";
+ }
+ };
+
+ ExternalPasswordManagerTemplate LASTPASS = new ExternalPasswordManagerTemplate() {
+ @Override
+ public String getTemplate() {
+ return "lpass show --password $KEY";
+ }
+
+ @Override
+ public String getId() {
+ return "lastpass";
+ }
+ };
+
+ ExternalPasswordManagerTemplate MACOS_KEYCHAIN = new ExternalPasswordManagerTemplate() {
+ @Override
+ public String getTemplate() {
+ return "security find-generic-password -w -l $KEY";
+ }
+
+ @Override
+ public String getId() {
+ return "macosKeychain";
+ }
+
+ @Override
+ public boolean isSelectable() {
+ return OsType.getLocal() == OsType.MACOS;
+ }
+ };
+
+ List ALL = Stream.of(ONEPASSWORD, BITWARDEN, DASHLANE, LASTPASS, MACOS_KEYCHAIN)
+ .filter(externalPasswordManager -> externalPasswordManager.isSelectable())
+ .toList();
+}
diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalRdpClientType.java b/app/src/main/java/io/xpipe/app/prefs/ExternalRdpClientType.java
index f304a61ef..18d377697 100644
--- a/app/src/main/java/io/xpipe/app/prefs/ExternalRdpClientType.java
+++ b/app/src/main/java/io/xpipe/app/prefs/ExternalRdpClientType.java
@@ -50,6 +50,10 @@ public interface ExternalRdpClientType extends PrefsChoiceValue {
return input;
}
+ if (input.get("username").isEmpty()) {
+ return input;
+ }
+
var pass = configuration.getPassword();
if (pass == null) {
return input;
diff --git a/app/src/main/java/io/xpipe/app/prefs/LockChangeAlert.java b/app/src/main/java/io/xpipe/app/prefs/LockChangeAlert.java
new file mode 100644
index 000000000..dd2f16196
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/prefs/LockChangeAlert.java
@@ -0,0 +1,55 @@
+package io.xpipe.app.prefs;
+
+import io.xpipe.app.core.AppI18n;
+import io.xpipe.app.core.window.AppWindowHelper;
+import io.xpipe.app.fxcomps.impl.LabelComp;
+import io.xpipe.app.fxcomps.impl.SecretFieldComp;
+import io.xpipe.core.util.InPlaceSecretValue;
+
+import javafx.beans.binding.Bindings;
+import javafx.beans.property.SimpleObjectProperty;
+import javafx.scene.control.Alert;
+import javafx.scene.control.ButtonType;
+import javafx.scene.layout.VBox;
+
+import atlantafx.base.controls.Spacer;
+
+import java.util.Objects;
+
+public class LockChangeAlert {
+
+ public static void show() {
+ var prop1 = new SimpleObjectProperty();
+ var prop2 = new SimpleObjectProperty();
+ AppWindowHelper.showBlockingAlert(alert -> {
+ alert.setTitle(AppI18n.get("lockCreationAlertTitle"));
+ alert.setHeaderText(AppI18n.get("lockCreationAlertHeader"));
+ alert.setAlertType(Alert.AlertType.CONFIRMATION);
+
+ var label1 = new LabelComp(AppI18n.observable("passphrase")).createRegion();
+ var p1 = new SecretFieldComp(prop1, false).createRegion();
+ p1.setStyle("-fx-border-width: 1px");
+
+ var label2 = new LabelComp(AppI18n.observable("repeatPassphrase")).createRegion();
+ var p2 = new SecretFieldComp(prop2, false).createRegion();
+ p1.setStyle("-fx-border-width: 1px");
+
+ var content = new VBox(label1, p1, new Spacer(15), label2, p2);
+ content.setSpacing(5);
+ alert.getDialogPane().setContent(content);
+
+ var button = alert.getDialogPane().lookupButton(ButtonType.OK);
+ button.disableProperty()
+ .bind(Bindings.createBooleanBinding(
+ () -> {
+ return !Objects.equals(prop1.getValue(), prop2.getValue());
+ },
+ prop1,
+ prop2));
+ })
+ .filter(b -> b.getButtonData().isDefaultButton())
+ .ifPresent(t -> {
+ AppPrefs.get().changeLock(prop1.getValue());
+ });
+ }
+}
diff --git a/app/src/main/java/io/xpipe/app/prefs/PasswordManagerCategory.java b/app/src/main/java/io/xpipe/app/prefs/PasswordManagerCategory.java
index 4e98b1705..60d6e6389 100644
--- a/app/src/main/java/io/xpipe/app/prefs/PasswordManagerCategory.java
+++ b/app/src/main/java/io/xpipe/app/prefs/PasswordManagerCategory.java
@@ -3,102 +3,142 @@ package io.xpipe.app.prefs;
import io.xpipe.app.comp.base.ButtonComp;
import io.xpipe.app.comp.base.IntegratedTextAreaComp;
import io.xpipe.app.core.AppI18n;
+import io.xpipe.app.ext.ProcessControlProvider;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.impl.HorizontalComp;
+import io.xpipe.app.fxcomps.impl.LabelComp;
import io.xpipe.app.fxcomps.impl.TextFieldComp;
import io.xpipe.app.fxcomps.impl.VerticalComp;
+import io.xpipe.app.fxcomps.util.BindingsHelper;
import io.xpipe.app.util.OptionsBuilder;
-import io.xpipe.app.util.TerminalLauncher;
import io.xpipe.app.util.ThreadHelper;
-import io.xpipe.core.process.CommandBuilder;
-import io.xpipe.core.process.CommandControl;
-import io.xpipe.app.ext.ProcessControlProvider;
-import io.xpipe.app.ext.LocalStore;
+import javafx.application.Platform;
import javafx.beans.property.SimpleStringProperty;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.MenuButton;
import javafx.scene.control.MenuItem;
+import javafx.scene.input.KeyCode;
+import javafx.scene.layout.Region;
import atlantafx.base.theme.Styles;
+import lombok.Value;
import org.kordamp.ikonli.javafx.FontIcon;
+import java.util.ArrayList;
import java.util.List;
public class PasswordManagerCategory extends AppPrefsCategory {
+ @Value
+ private static class Choice {
+ String id;
+ String template;
+ ExternalPasswordManager passwordManager;
+ }
+
@Override
protected String getId() {
return "passwordManager";
}
- private Comp> createTemplateChoice() {
- return Comp.of(() -> {
- var cb = new MenuButton();
- cb.textProperty().bind(AppI18n.observable("templates"));
- ExternalPasswordManager.ALL.forEach(externalPasswordManager -> {
- var m = new MenuItem(
- externalPasswordManager.toTranslatedString().getValue());
- m.setOnAction(event -> {
- AppPrefs.get().passwordManagerCommand.set(externalPasswordManager.getTemplate());
- event.consume();
- });
- cb.getItems().add(m);
- });
- return cb;
- });
- }
-
@Override
protected Comp> create() {
+ var choices = new ArrayList();
+ ExternalPasswordManagerTemplate.ALL.forEach(externalPasswordManagerTemplate -> {
+ choices.add(new Choice(
+ externalPasswordManagerTemplate.getId(),
+ externalPasswordManagerTemplate.getTemplate(),
+ ExternalPasswordManager.COMMAND));
+ });
+ ExternalPasswordManager.ALL.stream()
+ .filter(externalPasswordManager -> externalPasswordManager != ExternalPasswordManager.COMMAND)
+ .forEach(externalPasswordManager -> {
+ choices.add(new Choice(externalPasswordManager.getId(), null, externalPasswordManager));
+ });
+
var prefs = AppPrefs.get();
var testPasswordManagerValue = new SimpleStringProperty();
+ var testPasswordManagerResult = new SimpleStringProperty();
Runnable test = () -> {
- var cmd = prefs.passwordManagerString(testPasswordManagerValue.get());
- if (cmd == null) {
- return;
- }
-
ThreadHelper.runFailableAsync(() -> {
- TerminalLauncher.open(
- "Password test",
- new LocalStore()
- .control()
- .command(CommandBuilder.ofFunction(sc -> cmd
- + "\n"
- + sc.getShellDialect().getEchoCommand("Is this your password?", false)))
- .terminalExitMode(CommandControl.TerminalExitMode.KEEP_OPEN));
+ if (prefs.passwordManager.getValue() == null) {
+ return;
+ }
+
+ var r = prefs.passwordManager.getValue().retrievePassword(testPasswordManagerValue.get());
+ Platform.runLater(() -> {
+ testPasswordManagerResult.set(r);
+ ThreadHelper.runAsync(() -> {
+ ThreadHelper.sleep(5000);
+ Platform.runLater(() -> {
+ testPasswordManagerResult.set(null);
+ });
+ });
+ });
});
};
- var c = new IntegratedTextAreaComp(
+ var command = new IntegratedTextAreaComp(
prefs.passwordManagerCommand,
- true,
- "pw",
+ false,
+ "command",
new SimpleStringProperty(ProcessControlProvider.get()
.getEffectiveLocalDialect()
.getScriptFileEnding()))
.apply(struc -> {
struc.getTextArea().setPromptText("mypassmgr get $KEY");
})
+ .disable(prefs.passwordManagerCommand.isNull())
+ .hide(prefs.passwordManagerCommand.isNull())
.minWidth(350)
.minHeight(120);
- var visit = createTemplateChoice();
- var choice = new VerticalComp(List.of(c, visit)).apply(struc -> {
+ var templates = Comp.of(() -> {
+ var cb = new MenuButton();
+ cb.textProperty().bind(BindingsHelper.flatMap(prefs.passwordManager, externalPasswordManager -> {
+ return externalPasswordManager != null
+ ? AppI18n.observable(externalPasswordManager.getId())
+ : AppI18n.observable("selectType");
+ }));
+ choices.forEach(e -> {
+ var m = new MenuItem();
+ m.textProperty().bind(AppI18n.observable(e.getId()));
+ m.setOnAction(event -> {
+ AppPrefs.get().passwordManagerCommand.set(e.getTemplate());
+ AppPrefs.get().passwordManager.setValue(e.getPasswordManager());
+ event.consume();
+ });
+ cb.getItems().add(m);
+ });
+ return cb;
+ });
+ var choice = new VerticalComp(List.of(templates, command)).apply(struc -> {
struc.get().setAlignment(Pos.CENTER_LEFT);
struc.get().setSpacing(10);
});
+ var testInput = new HorizontalComp(List.>of(
+ new TextFieldComp(testPasswordManagerValue)
+ .apply(struc -> struc.get().setPromptText("Enter password key"))
+ .styleClass(Styles.LEFT_PILL)
+ .apply(struc -> struc.get().setOnKeyPressed(event -> {
+ if (event.getCode() == KeyCode.ENTER) {
+ test.run();
+ event.consume();
+ }
+ })),
+ new ButtonComp(null, new FontIcon("mdi2p-play"), test).styleClass(Styles.RIGHT_PILL)));
+ testInput.apply(struc -> {
+ var first = ((Region) struc.get().getChildren().get(0));
+ var second = ((Region) struc.get().getChildren().get(1));
+ second.prefHeightProperty().bind(first.heightProperty());
+ });
+
var testPasswordManager = new HorizontalComp(List.of(
- new TextFieldComp(testPasswordManagerValue)
- .apply(struc -> struc.get().setPromptText("Enter password key"))
- .styleClass(Styles.LEFT_PILL)
- .grow(false, true),
- new ButtonComp(null, new FontIcon("mdi2p-play"), test)
- .styleClass(Styles.RIGHT_PILL)
- .grow(false, true)))
- .padding(new Insets(15, 0, 0, 0))
+ testInput, Comp.hspacer(25), new LabelComp(testPasswordManagerResult).apply(struc -> struc.get()
+ .setOpacity(0.5))))
+ .padding(new Insets(10, 0, 0, 0))
.apply(struc -> struc.get().setAlignment(Pos.CENTER_LEFT))
.apply(struc -> struc.get().setFillHeight(true));
return new OptionsBuilder()
diff --git a/app/src/main/java/io/xpipe/app/prefs/SecurityCategory.java b/app/src/main/java/io/xpipe/app/prefs/SecurityCategory.java
index c3b4f8756..c1b3093cc 100644
--- a/app/src/main/java/io/xpipe/app/prefs/SecurityCategory.java
+++ b/app/src/main/java/io/xpipe/app/prefs/SecurityCategory.java
@@ -28,7 +28,10 @@ public class SecurityCategory extends AppPrefsCategory {
.nameAndDescription("dontAutomaticallyStartVmSshServer")
.addToggle(prefs.dontAutomaticallyStartVmSshServer)
.nameAndDescription("disableTerminalRemotePasswordPreparation")
- .addToggle(prefs.disableTerminalRemotePasswordPreparation));
+ .addToggle(prefs.disableTerminalRemotePasswordPreparation)
+ .nameAndDescription("dontAllowTerminalRestart")
+ .addToggle(prefs.dontAllowTerminalRestart)
+ );
return builder.buildComp();
}
}
diff --git a/app/src/main/java/io/xpipe/app/prefs/SyncCategory.java b/app/src/main/java/io/xpipe/app/prefs/SyncCategory.java
index 2f111a05b..6e6e99336 100644
--- a/app/src/main/java/io/xpipe/app/prefs/SyncCategory.java
+++ b/app/src/main/java/io/xpipe/app/prefs/SyncCategory.java
@@ -1,19 +1,28 @@
package io.xpipe.app.prefs;
-import atlantafx.base.theme.Styles;
import io.xpipe.app.comp.base.ButtonComp;
+import io.xpipe.app.comp.base.MarkdownComp;
import io.xpipe.app.core.AppI18n;
+import io.xpipe.app.core.mode.OperationMode;
+import io.xpipe.app.core.window.AppWindowHelper;
import io.xpipe.app.fxcomps.Comp;
-import io.xpipe.app.fxcomps.impl.StackComp;
+import io.xpipe.app.fxcomps.impl.HorizontalComp;
+import io.xpipe.app.fxcomps.impl.TextFieldComp;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStorageSyncHandler;
import io.xpipe.app.util.DesktopHelper;
import io.xpipe.app.util.OptionsBuilder;
import io.xpipe.app.util.ThreadHelper;
+
import javafx.application.Platform;
+import javafx.beans.property.SimpleBooleanProperty;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
+import javafx.scene.control.Alert;
+import javafx.scene.control.ButtonType;
import javafx.scene.layout.Region;
+
+import atlantafx.base.theme.Styles;
import org.kordamp.ikonli.javafx.FontIcon;
import java.util.List;
@@ -26,22 +35,60 @@ public class SyncCategory extends AppPrefsCategory {
return "sync";
}
+ private static void showHelpAlert() {
+ AppWindowHelper.showAlert(
+ alert -> {
+ alert.setTitle(AppI18n.get("gitVault"));
+ alert.setAlertType(Alert.AlertType.NONE);
+
+ var activated = AppI18n.get().getMarkdownDocumentation("app:vault");
+ var markdown = new MarkdownComp(activated, s -> s)
+ .prefWidth(550)
+ .prefHeight(550)
+ .createRegion();
+ alert.getDialogPane().setContent(markdown);
+ alert.getButtonTypes().add(ButtonType.OK);
+ },
+ buttonType -> {});
+ }
+
public Comp> create() {
var prefs = AppPrefs.get();
AtomicReference button = new AtomicReference<>();
- var terminalTest = new StackComp(
- List.of(new ButtonComp(AppI18n.observable("test"), new FontIcon("mdi2p-play"), () -> {
- ThreadHelper.runAsync(() -> {
- var r = DataStorageSyncHandler.getInstance().validateConnection();
- if (r) {
- Platform.runLater(() -> {
- button.get().getStyleClass().add(Styles.SUCCESS);
- });
- }
+
+ var canRestart = new SimpleBooleanProperty(false);
+ var testButton = new ButtonComp(AppI18n.observable("test"), new FontIcon("mdi2p-play"), () -> {
+ ThreadHelper.runAsync(() -> {
+ var r = DataStorageSyncHandler.getInstance().validateConnection();
+ if (r) {
+ Platform.runLater(() -> {
+ button.get().getStyleClass().add(Styles.SUCCESS);
+ canRestart.set(true);
});
- }).apply(struc -> button.set(struc.get())).padding(new Insets(6, 10, 6, 6))))
+ }
+ });
+ });
+ testButton.apply(struc -> button.set(struc.get()));
+ testButton.padding(new Insets(6, 10, 6, 6));
+
+ var restartButton = new ButtonComp(AppI18n.observable("restart"), new FontIcon("mdi2r-restart"), () -> {
+ OperationMode.restart();
+ });
+ restartButton.visible(canRestart);
+ restartButton.padding(new Insets(6, 10, 6, 6));
+
+ var testRow = new HorizontalComp(List.of(testButton, restartButton))
+ .spacing(10)
.padding(new Insets(10, 0, 0, 0))
.apply(struc -> struc.get().setAlignment(Pos.CENTER_LEFT));
+
+ var remoteRepo = new TextFieldComp(prefs.storageGitRemote).hgrow();
+ var helpButton = new ButtonComp(AppI18n.observable("help"), new FontIcon("mdi2h-help-circle-outline"), () -> {
+ showHelpAlert();
+ });
+ var remoteRow = new HorizontalComp(List.of(remoteRepo, helpButton)).spacing(10);
+ remoteRow.apply(struc -> struc.get().setAlignment(Pos.CENTER_LEFT));
+
var builder = new OptionsBuilder();
builder.addTitle("sync")
.sub(new OptionsBuilder()
@@ -49,9 +96,9 @@ public class SyncCategory extends AppPrefsCategory {
.description("enableGitStorageDescription")
.addToggle(prefs.enableGitStorage)
.nameAndDescription("storageGitRemote")
- .addString(prefs.storageGitRemote)
+ .addComp(remoteRow, prefs.storageGitRemote)
.disable(prefs.enableGitStorage.not())
- .addComp(terminalTest)
+ .addComp(testRow)
.disable(prefs.storageGitRemote.isNull().or(prefs.enableGitStorage.not()))
.addComp(prefs.getCustomComp("gitVaultIdentityStrategy"))
.nameAndDescription("openDataDir")
diff --git a/app/src/main/java/io/xpipe/app/prefs/TerminalCategory.java b/app/src/main/java/io/xpipe/app/prefs/TerminalCategory.java
index 2ebdd1bac..cba814cee 100644
--- a/app/src/main/java/io/xpipe/app/prefs/TerminalCategory.java
+++ b/app/src/main/java/io/xpipe/app/prefs/TerminalCategory.java
@@ -2,6 +2,7 @@ package io.xpipe.app.prefs;
import io.xpipe.app.comp.base.ButtonComp;
import io.xpipe.app.core.AppI18n;
+import io.xpipe.app.ext.LocalStore;
import io.xpipe.app.ext.PrefsChoiceValue;
import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.impl.ChoiceComp;
@@ -13,7 +14,6 @@ import io.xpipe.app.util.Hyperlinks;
import io.xpipe.app.util.OptionsBuilder;
import io.xpipe.app.util.TerminalLauncher;
import io.xpipe.app.util.ThreadHelper;
-import io.xpipe.app.ext.LocalStore;
import javafx.beans.binding.Bindings;
import javafx.geometry.Insets;
diff --git a/app/src/main/java/io/xpipe/app/prefs/ThirdPartyDependency.java b/app/src/main/java/io/xpipe/app/prefs/ThirdPartyDependency.java
index b03266e41..43163d29a 100644
--- a/app/src/main/java/io/xpipe/app/prefs/ThirdPartyDependency.java
+++ b/app/src/main/java/io/xpipe/app/prefs/ThirdPartyDependency.java
@@ -1,7 +1,7 @@
package io.xpipe.app.prefs;
import io.xpipe.app.core.AppExtensionManager;
-import io.xpipe.app.core.AppResources;
+import io.xpipe.app.resources.AppResources;
import org.apache.commons.io.FilenameUtils;
diff --git a/app/src/main/java/io/xpipe/app/prefs/TroubleshootCategory.java b/app/src/main/java/io/xpipe/app/prefs/TroubleshootCategory.java
index 6cdc19439..8f0866a2e 100644
--- a/app/src/main/java/io/xpipe/app/prefs/TroubleshootCategory.java
+++ b/app/src/main/java/io/xpipe/app/prefs/TroubleshootCategory.java
@@ -47,9 +47,12 @@ public class TroubleshootCategory extends AppPrefsCategory {
.toString(),
XPipeInstallation.getDaemonDebugScriptPath(OsType.getLocal()));
// We can't use the SSH bridge
- var type = ExternalTerminalType.determineNonSshBridgeFallback(AppPrefs.get().terminalType().getValue());
- TerminalLauncher.openDirect("XPipe Debug", sc -> sc.getShellDialect()
- .runScriptCommand(sc, script), type);
+ var type = ExternalTerminalType.determineNonSshBridgeFallback(
+ AppPrefs.get().terminalType().getValue());
+ TerminalLauncher.openDirect(
+ "XPipe Debug",
+ sc -> sc.getShellDialect().runScriptCommand(sc, script),
+ type);
});
e.consume();
})
diff --git a/app/src/main/java/io/xpipe/app/prefs/VaultCategory.java b/app/src/main/java/io/xpipe/app/prefs/VaultCategory.java
index c95a10521..681e5ad72 100644
--- a/app/src/main/java/io/xpipe/app/prefs/VaultCategory.java
+++ b/app/src/main/java/io/xpipe/app/prefs/VaultCategory.java
@@ -4,15 +4,14 @@ import io.xpipe.app.comp.base.ButtonComp;
import io.xpipe.app.core.AppI18n;
import io.xpipe.app.core.window.AppWindowHelper;
import io.xpipe.app.fxcomps.Comp;
-import io.xpipe.app.util.LockChangeAlert;
import io.xpipe.app.util.OptionsBuilder;
import io.xpipe.app.util.Validator;
import io.xpipe.core.util.XPipeInstallation;
import javafx.application.Platform;
import javafx.beans.binding.Bindings;
-
import javafx.beans.property.SimpleBooleanProperty;
+
import lombok.SneakyThrows;
public class VaultCategory extends AppPrefsCategory {
@@ -40,8 +39,11 @@ public class VaultCategory extends AppPrefsCategory {
var encryptVault = new SimpleBooleanProperty(prefs.encryptAllVaultData().get());
encryptVault.addListener((observable, oldValue, newValue) -> {
- if (!newValue && !AppWindowHelper.showConfirmationAlert(
- "confirmVaultUnencryptTitle", "confirmVaultUnencryptHeader", "confirmVaultUnencryptContent")) {
+ if (!newValue
+ && !AppWindowHelper.showConfirmationAlert(
+ "confirmVaultUnencryptTitle",
+ "confirmVaultUnencryptHeader",
+ "confirmVaultUnencryptContent")) {
Platform.runLater(() -> {
encryptVault.set(true);
});
diff --git a/app/src/main/java/io/xpipe/app/prefs/WorkflowCategory.java b/app/src/main/java/io/xpipe/app/prefs/WorkflowCategory.java
index 3185aea46..f0e21a3b3 100644
--- a/app/src/main/java/io/xpipe/app/prefs/WorkflowCategory.java
+++ b/app/src/main/java/io/xpipe/app/prefs/WorkflowCategory.java
@@ -14,7 +14,7 @@ public class WorkflowCategory extends AppPrefsCategory {
protected Comp> create() {
var prefs = AppPrefs.get();
return new OptionsBuilder()
- .addTitle("workflow")
+ .addTitle("connections")
.sub(new OptionsBuilder()
.nameAndDescription("condenseConnectionDisplay")
.addToggle(prefs.condenseConnectionDisplay)
@@ -24,6 +24,10 @@ public class WorkflowCategory extends AppPrefsCategory {
.addToggle(prefs.openConnectionSearchWindowOnConnectionCreation)
.nameAndDescription("requireDoubleClickForConnections")
.addToggle(prefs.requireDoubleClickForConnections))
+ .addTitle("fileBrowser")
+ .sub(new OptionsBuilder()
+ .nameAndDescription("confirmAllDeletions")
+ .addToggle(prefs.confirmAllDeletions))
.buildComp();
}
}
diff --git a/app/src/main/java/io/xpipe/app/prefs/WorkspaceCreationAlert.java b/app/src/main/java/io/xpipe/app/prefs/WorkspaceCreationAlert.java
index 08910ca81..96ba9daef 100644
--- a/app/src/main/java/io/xpipe/app/prefs/WorkspaceCreationAlert.java
+++ b/app/src/main/java/io/xpipe/app/prefs/WorkspaceCreationAlert.java
@@ -8,6 +8,7 @@ import io.xpipe.app.core.window.AppWindowHelper;
import io.xpipe.app.util.*;
import io.xpipe.core.process.OsType;
import io.xpipe.core.util.XPipeInstallation;
+
import javafx.beans.property.SimpleObjectProperty;
import javafx.geometry.Insets;
import javafx.scene.control.ButtonType;
diff --git a/app/src/main/java/io/xpipe/app/resources/AppImages.java b/app/src/main/java/io/xpipe/app/resources/AppImages.java
new file mode 100644
index 000000000..ae13d2156
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/resources/AppImages.java
@@ -0,0 +1,155 @@
+package io.xpipe.app.resources;
+
+import io.xpipe.app.core.AppExtensionManager;
+import io.xpipe.app.issue.ErrorEvent;
+import io.xpipe.app.issue.TrackEvent;
+
+import javafx.scene.image.Image;
+import javafx.scene.image.WritableImage;
+
+import org.apache.commons.io.FilenameUtils;
+
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.time.Duration;
+import java.time.Instant;
+import java.util.HashMap;
+import java.util.Map;
+
+public class AppImages {
+
+ public static final Image DEFAULT_IMAGE = new WritableImage(1, 1);
+ private static final Map images = new HashMap<>();
+ private static final Map svgImages = new HashMap<>();
+
+ public static void init() {
+ if (images.size() > 0 || svgImages.size() > 0) {
+ return;
+ }
+
+ TrackEvent.info("Loading images ...");
+ for (var module : AppExtensionManager.getInstance().getContentModules()) {
+ loadDirectory(module.getName(), "img", true, true);
+ }
+ }
+
+ public static void loadDirectory(String module, String dir, boolean loadImages, boolean loadSvgs) {
+ var start = Instant.now();
+ AppResources.with(module, dir, basePath -> {
+ if (!Files.exists(basePath)) {
+ return;
+ }
+
+ var simpleName = FilenameUtils.getExtension(module);
+ String defaultPrefix = simpleName + ":";
+ Files.walkFileTree(basePath, new SimpleFileVisitor<>() {
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
+ var relativeFileName = FilenameUtils.separatorsToUnix(
+ basePath.relativize(file).toString());
+ var key = defaultPrefix + relativeFileName;
+ if (images.containsKey(key) || svgImages.containsKey(key)) {
+ return FileVisitResult.CONTINUE;
+ }
+
+ try {
+ if (FilenameUtils.getExtension(file.toString()).equals("svg") && loadSvgs) {
+ var s = Files.readString(file);
+ svgImages.put(key, s);
+ } else if (loadImages) {
+ images.put(key, loadImage(file));
+ }
+ } catch (IOException ex) {
+ ErrorEvent.fromThrowable(ex).omitted(true).build().handle();
+ }
+ return FileVisitResult.CONTINUE;
+ }
+ });
+ });
+ var elapsed = Duration.between(start, Instant.now());
+ TrackEvent.trace("Loaded images in " + module + ":" + dir + " in " + elapsed.toMillis() + " ms");
+ }
+
+ public static String svgImage(String file) {
+ if (file == null) {
+ return "";
+ }
+
+ var key = file.contains(":") ? file : "app:" + file;
+
+ if (svgImages.containsKey(key)) {
+ return svgImages.get(key);
+ }
+
+ TrackEvent.warn("Svg image " + key + " not found");
+ return "";
+ }
+
+ public static boolean hasNormalImage(String file) {
+ if (file == null) {
+ return false;
+ }
+
+ var key = file.contains(":") ? file : "app:" + file;
+ return images.containsKey(key);
+ }
+
+ public static boolean hasSvgImage(String file) {
+ if (file == null) {
+ return false;
+ }
+
+ var key = file.contains(":") ? file : "app:" + file;
+ return svgImages.containsKey(key);
+ }
+
+ public static Image image(String file) {
+ if (file == null) {
+ return DEFAULT_IMAGE;
+ }
+
+ var key = file.contains(":") ? file : "app:" + file;
+
+ if (images.containsKey(key)) {
+ return images.get(key);
+ }
+
+ TrackEvent.warn("Normal image " + key + " not found");
+ return DEFAULT_IMAGE;
+ }
+
+ public static BufferedImage toAwtImage(Image fxImage) {
+ BufferedImage img =
+ new BufferedImage((int) fxImage.getWidth(), (int) fxImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
+ for (int x = 0; x < fxImage.getWidth(); x++) {
+ for (int y = 0; y < fxImage.getHeight(); y++) {
+ int rgb = fxImage.getPixelReader().getArgb(x, y);
+ img.setRGB(x, y, rgb);
+ }
+ }
+ return img;
+ }
+
+ public static Image loadImage(Path p) {
+ if (p == null) {
+ return DEFAULT_IMAGE;
+ }
+
+ if (!Files.isRegularFile(p)) {
+ TrackEvent.error("Image file " + p + " not found.");
+ return DEFAULT_IMAGE;
+ }
+
+ try (var in = Files.newInputStream(p)) {
+ return new Image(in, -1, -1, true, true);
+ } catch (IOException e) {
+ ErrorEvent.fromThrowable(e).omitted(true).build().handle();
+ return DEFAULT_IMAGE;
+ }
+ }
+}
diff --git a/app/src/main/java/io/xpipe/app/resources/AppResources.java b/app/src/main/java/io/xpipe/app/resources/AppResources.java
new file mode 100644
index 000000000..6854b7bbb
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/resources/AppResources.java
@@ -0,0 +1,134 @@
+package io.xpipe.app.resources;
+
+import io.xpipe.app.core.AppExtensionManager;
+import io.xpipe.app.core.AppProperties;
+import io.xpipe.app.issue.ErrorEvent;
+import io.xpipe.core.util.FailableConsumer;
+import io.xpipe.modulefs.ModuleFileSystem;
+
+import java.io.IOException;
+import java.net.JarURLConnection;
+import java.net.URI;
+import java.net.URL;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class AppResources {
+
+ public static final String XPIPE_MODULE = "io.xpipe.app";
+
+ private static final Map fileSystems = new ConcurrentHashMap<>();
+
+ public static void reset() {
+ fileSystems.forEach((s, moduleFileSystem) -> {
+ try {
+ moduleFileSystem.close();
+ } catch (IOException ignored) {
+ // Usually when updating, a SIGTERM is sent to this application.
+ // However, it takes a while to shut down but the installer is deleting files meanwhile.
+ // It can happen that the jar it does not exist anymore
+ }
+ });
+ fileSystems.clear();
+ }
+
+ private static ModuleFileSystem openFileSystemIfNeeded(String module) throws IOException {
+ var layer = AppExtensionManager.getInstance() != null
+ ? AppExtensionManager.getInstance().getExtendedLayer()
+ : null;
+
+ // Only cache file systems with extended layer
+ if (layer != null && fileSystems.containsKey(module)) {
+ return fileSystems.get(module);
+ }
+
+ if (layer == null) {
+ layer = ModuleLayer.boot();
+ }
+
+ var fs = (ModuleFileSystem) FileSystems.newFileSystem(URI.create("module:/" + module), Map.of("layer", layer));
+ if (AppExtensionManager.getInstance() != null) {
+ fileSystems.put(module, fs);
+ }
+ return fs;
+ }
+
+ public static Optional getResourceURL(String module, String file) {
+ try {
+ var fs = openFileSystemIfNeeded(module);
+ var f = fs.getPath(module.replace('.', '/') + "/resources/" + file);
+ var url = f.getWrappedPath().toUri().toURL();
+ return Optional.of(url);
+ } catch (IOException e) {
+ ErrorEvent.fromThrowable(e).omitted(true).build().handle();
+ return Optional.empty();
+ }
+ }
+
+ public static void with(String module, String file, FailableConsumer con) {
+ if (AppProperties.get() != null
+ && !AppProperties.get().isImage()
+ && AppProperties.get().isDeveloperMode()) {
+ // Check if resource was found. If we use external processed resources, we can't use local dev resources
+ if (withLocalDevResource(module, file, con)) {
+ return;
+ }
+ }
+
+ withResource(module, file, con);
+ }
+
+ public static void withResourceInLayer(
+ String module, String file, ModuleLayer layer, FailableConsumer con) {
+ try (var fs = FileSystems.newFileSystem(URI.create("module:/" + module), Map.of("layer", layer))) {
+ var f = fs.getPath(module.replace('.', '/') + "/resources/" + file);
+ con.accept(f);
+ } catch (IOException e) {
+ ErrorEvent.fromThrowable(e).omitted(true).build().handle();
+ }
+ }
+
+ private static void withResource(String module, String file, FailableConsumer con) {
+ var path = module.startsWith("io.xpipe") ? module.replace('.', '/') + "/resources/" + file : file;
+ try {
+ var fs = openFileSystemIfNeeded(module);
+ var f = fs.getPath(path);
+ con.accept(f);
+ } catch (IOException e) {
+ ErrorEvent.fromThrowable(e).omitted(true).build().handle();
+ }
+ }
+
+ private static boolean withLocalDevResource(String module, String file, FailableConsumer con) {
+ try {
+ var fs = openFileSystemIfNeeded(module);
+ var url = fs.getPath("").getWrappedPath().toUri().toURL();
+ if (!url.getProtocol().equals("jar")) {
+ return false;
+ }
+
+ JarURLConnection connection = (JarURLConnection) url.openConnection();
+ URL fileUrl = connection.getJarFileURL();
+ var jarFile = Path.of(fileUrl.toURI());
+ var resDir = jarFile.getParent()
+ .getParent()
+ .getParent()
+ .resolve("src")
+ .resolve("main")
+ .resolve("resources");
+ var f = resDir.resolve(module.replace('.', '/') + "/resources/" + file);
+ if (!Files.exists(f)) {
+ return false;
+ }
+
+ con.accept(f);
+ } catch (Exception e) {
+ ErrorEvent.fromThrowable(e).omitted(true).build().handle();
+ }
+ return true;
+ }
+}
diff --git a/app/src/main/java/io/xpipe/app/resources/ContainerAutoSystemIcon.java b/app/src/main/java/io/xpipe/app/resources/ContainerAutoSystemIcon.java
new file mode 100644
index 000000000..02a6f7d45
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/resources/ContainerAutoSystemIcon.java
@@ -0,0 +1,45 @@
+package io.xpipe.app.resources;
+
+import io.xpipe.app.ext.ContainerImageStore;
+import io.xpipe.core.process.ShellControl;
+import io.xpipe.core.store.DataStore;
+
+import lombok.EqualsAndHashCode;
+import lombok.Value;
+
+import java.util.function.Predicate;
+
+@Value
+@EqualsAndHashCode(callSuper = true)
+public class ContainerAutoSystemIcon extends SystemIcon {
+
+ Predicate imageCheck;
+
+ public ContainerAutoSystemIcon(String iconName, String displayName, Predicate imageCheck) {
+ super(iconName, displayName);
+ this.imageCheck = imageCheck;
+ }
+
+ @Override
+ public boolean isApplicable(ShellControl sc) {
+ var source = sc.getSourceStore();
+ if (source.isEmpty()) {
+ return false;
+ }
+
+ return isApplicable(source.get());
+ }
+
+ @Override
+ public boolean isApplicable(DataStore store) {
+ if (!(store instanceof ContainerImageStore containerImageStore)) {
+ return false;
+ }
+
+ if (containerImageStore.getImageName() == null) {
+ return false;
+ }
+
+ return imageCheck.test(containerImageStore.getImageName());
+ }
+}
diff --git a/app/src/main/java/io/xpipe/app/resources/FileAutoSystemIcon.java b/app/src/main/java/io/xpipe/app/resources/FileAutoSystemIcon.java
new file mode 100644
index 000000000..3fa43cf65
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/resources/FileAutoSystemIcon.java
@@ -0,0 +1,36 @@
+package io.xpipe.app.resources;
+
+import io.xpipe.core.process.OsType;
+import io.xpipe.core.process.ShellControl;
+
+import lombok.EqualsAndHashCode;
+import lombok.Value;
+
+@Value
+@EqualsAndHashCode(callSuper = true)
+public class FileAutoSystemIcon extends SystemIcon {
+
+ OsType.Any osType;
+ String file;
+
+ public FileAutoSystemIcon(String iconName, String displayName, OsType.Any osType, String file) {
+ super(iconName, displayName);
+ this.osType = osType;
+ this.file = file;
+ }
+
+ @Override
+ public boolean isApplicable(ShellControl sc) throws Exception {
+ if (sc.getOsType() != osType) {
+ return false;
+ }
+
+ var abs = sc.getShellDialect().evaluateExpression(sc, file).readStdoutIfPossible();
+ if (abs.isEmpty()) {
+ return false;
+ }
+
+ return sc.getShellDialect().createFileExistsCommand(sc, abs.get()).executeAndCheck()
+ || sc.getShellDialect().directoryExists(sc, abs.get()).executeAndCheck();
+ }
+}
diff --git a/app/src/main/java/io/xpipe/app/resources/ShellAutoSystemIcon.java b/app/src/main/java/io/xpipe/app/resources/ShellAutoSystemIcon.java
new file mode 100644
index 000000000..427747985
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/resources/ShellAutoSystemIcon.java
@@ -0,0 +1,25 @@
+package io.xpipe.app.resources;
+
+import io.xpipe.core.process.ShellControl;
+import io.xpipe.core.util.FailableFunction;
+
+import lombok.EqualsAndHashCode;
+import lombok.Value;
+
+@Value
+@EqualsAndHashCode(callSuper = true)
+public class ShellAutoSystemIcon extends SystemIcon {
+
+ FailableFunction applicable;
+
+ public ShellAutoSystemIcon(
+ String iconName, String displayName, FailableFunction applicable) {
+ super(iconName, displayName);
+ this.applicable = applicable;
+ }
+
+ @Override
+ public boolean isApplicable(ShellControl sc) throws Exception {
+ return applicable.apply(sc);
+ }
+}
diff --git a/app/src/main/java/io/xpipe/app/resources/SystemIcon.java b/app/src/main/java/io/xpipe/app/resources/SystemIcon.java
new file mode 100644
index 000000000..7c87333df
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/resources/SystemIcon.java
@@ -0,0 +1,23 @@
+package io.xpipe.app.resources;
+
+import io.xpipe.core.process.ShellControl;
+import io.xpipe.core.store.DataStore;
+
+import lombok.Value;
+import lombok.experimental.NonFinal;
+
+@Value
+@NonFinal
+public class SystemIcon {
+
+ String iconName;
+ String displayName;
+
+ public boolean isApplicable(ShellControl sc) throws Exception {
+ return false;
+ }
+
+ public boolean isApplicable(DataStore store) {
+ return false;
+ }
+}
diff --git a/app/src/main/java/io/xpipe/app/resources/SystemIcons.java b/app/src/main/java/io/xpipe/app/resources/SystemIcons.java
new file mode 100644
index 000000000..da770c132
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/resources/SystemIcons.java
@@ -0,0 +1,119 @@
+package io.xpipe.app.resources;
+
+import io.xpipe.core.process.OsType;
+import io.xpipe.core.process.ShellControl;
+import io.xpipe.core.process.ShellDialects;
+import io.xpipe.core.process.ShellStoreState;
+import io.xpipe.core.store.DataStore;
+import io.xpipe.core.store.StatefulDataStore;
+
+import org.apache.commons.io.FilenameUtils;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Optional;
+
+public class SystemIcons {
+
+ private static final List AUTO_SYSTEM_ICONS = List.of(
+ new SystemIcon("opnsense", "opnsense") {
+ @Override
+ public boolean isApplicable(DataStore store) {
+ return store instanceof StatefulDataStore> statefulDataStore
+ && statefulDataStore.getState() instanceof ShellStoreState shellStoreState
+ && shellStoreState.getShellDialect() == ShellDialects.OPNSENSE;
+ }
+ },
+ new SystemIcon("pfsense", "pfsense") {
+ @Override
+ public boolean isApplicable(DataStore store) {
+ return store instanceof StatefulDataStore> statefulDataStore
+ && statefulDataStore.getState() instanceof ShellStoreState shellStoreState
+ && shellStoreState.getShellDialect() == ShellDialects.PFSENSE;
+ }
+ },
+ new ContainerAutoSystemIcon("file-browser", "file browser", name -> name.contains("filebrowser")),
+ new FileAutoSystemIcon("syncthing", "syncthing", OsType.LINUX, "~/.local/state/syncthing"));
+
+ private static final List SYSTEM_ICONS = new ArrayList<>();
+ private static boolean loaded = false;
+
+ public static synchronized void init() {
+ if (SYSTEM_ICONS.size() > 0) {
+ return;
+ }
+
+ SYSTEM_ICONS.addAll(AUTO_SYSTEM_ICONS);
+ AppResources.with(AppResources.XPIPE_MODULE, "img/system", path -> {
+ try (var stream = Files.list(path)) {
+ var all = stream.toList();
+ for (Path file : all) {
+ var name = FilenameUtils.getBaseName(file.getFileName().toString());
+ if (name.contains("-dark") || name.contains("-16") || name.contains("-24")) {
+ continue;
+ }
+ var base = name.replaceAll("-40", "");
+ if (AUTO_SYSTEM_ICONS.stream()
+ .anyMatch(autoSystemIcon ->
+ autoSystemIcon.getIconName().equals(base))) {
+ continue;
+ }
+ var displayName = base.replaceAll("-", " ");
+ SYSTEM_ICONS.add(new SystemIcon(base, displayName));
+ }
+ }
+ });
+ SYSTEM_ICONS.sort(Comparator.comparing(systemIcon -> systemIcon.getIconName()));
+ }
+
+ public static synchronized void load() {
+ if (loaded) {
+ return;
+ }
+
+ AppImages.loadDirectory(AppResources.XPIPE_MODULE, "img/system", true, false);
+ loaded = true;
+ }
+
+ public static Optional getForId(String id) {
+ if (id == null) {
+ return Optional.empty();
+ }
+
+ for (SystemIcon systemIcon : SYSTEM_ICONS) {
+ if (systemIcon.getIconName().equals(id)) {
+ return Optional.of(systemIcon);
+ }
+ }
+ return Optional.empty();
+ }
+
+ public static Optional detectForSystem(ShellControl sc) throws Exception {
+ for (var autoSystemIcon : AUTO_SYSTEM_ICONS) {
+ if (autoSystemIcon.isApplicable(sc)) {
+ return Optional.of(autoSystemIcon);
+ }
+ }
+ return Optional.empty();
+ }
+
+ public static Optional detectForStore(DataStore store) {
+ if (store == null) {
+ return Optional.empty();
+ }
+
+ for (var autoSystemIcon : AUTO_SYSTEM_ICONS) {
+ if (autoSystemIcon.isApplicable(store)) {
+ return Optional.of(autoSystemIcon);
+ }
+ }
+ return Optional.empty();
+ }
+
+ public static List getSystemIcons() {
+ return SYSTEM_ICONS;
+ }
+}
diff --git a/app/src/main/java/io/xpipe/app/storage/DataStorage.java b/app/src/main/java/io/xpipe/app/storage/DataStorage.java
index 3ce2fd280..3e96c2219 100644
--- a/app/src/main/java/io/xpipe/app/storage/DataStorage.java
+++ b/app/src/main/java/io/xpipe/app/storage/DataStorage.java
@@ -1,6 +1,7 @@
package io.xpipe.app.storage;
import io.xpipe.app.comp.store.StoreSortMode;
+import io.xpipe.app.ext.LocalStore;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.issue.TrackEvent;
import io.xpipe.app.prefs.AppPrefs;
@@ -8,8 +9,8 @@ import io.xpipe.app.util.FixedHierarchyStore;
import io.xpipe.app.util.ThreadHelper;
import io.xpipe.core.store.DataStore;
import io.xpipe.core.store.FixedChildStore;
-import io.xpipe.app.ext.LocalStore;
import io.xpipe.core.store.StorePath;
+import io.xpipe.core.store.ValidationContext;
import io.xpipe.core.util.UuidHelper;
import javafx.util.Pair;
@@ -130,6 +131,16 @@ public abstract class DataStorage {
private void dispose() {
save(true);
+ var finalizing = false;
+ for (DataStoreEntry entry : getStoreEntries()) {
+ // Prevent blocking of shutdown
+ if (entry.finalizeEntryAsync()) {
+ finalizing = true;
+ }
+ }
+ if (finalizing) {
+ ThreadHelper.sleep(1000);
+ }
}
protected void setupBuiltinCategories() {
@@ -352,21 +363,32 @@ public abstract class DataStorage {
}
@SneakyThrows
- public boolean refreshChildren(DataStoreEntry e) {
- return refreshChildren(e, false);
+ public boolean refreshChildren(DataStoreEntry e, ValidationContext> context) {
+ return refreshChildren(e, context, false);
}
- public boolean refreshChildren(DataStoreEntry e, boolean throwOnFail) throws Exception {
- if (!(e.getStore() instanceof FixedHierarchyStore h)) {
+ @SuppressWarnings("unchecked")
+ public > boolean refreshChildren(DataStoreEntry e, T context, boolean throwOnFail)
+ throws Exception {
+ if (!(e.getStore() instanceof FixedHierarchyStore> h)) {
return false;
}
e.incrementBusyCounter();
List extends DataStoreEntryRef extends FixedChildStore>> newChildren;
+ var hadContext = context != null;
try {
- newChildren = h.listChildren(e).stream()
- .filter(dataStoreEntryRef -> dataStoreEntryRef != null && dataStoreEntryRef.get() != null)
- .toList();
+ if (context == null) {
+ context = (T) h.createContext();
+ if (context == null) {
+ return false;
+ }
+ }
+
+ newChildren = ((FixedHierarchyStore) h)
+ .listChildren(context).stream()
+ .filter(dataStoreEntryRef -> dataStoreEntryRef != null && dataStoreEntryRef.get() != null)
+ .toList();
} catch (Exception ex) {
if (throwOnFail) {
throw ex;
@@ -375,6 +397,9 @@ public abstract class DataStorage {
return false;
}
} finally {
+ if (context != null && !hadContext) {
+ context.close();
+ }
e.decrementBusyCounter();
}
diff --git a/app/src/main/java/io/xpipe/app/storage/DataStorageSyncHandler.java b/app/src/main/java/io/xpipe/app/storage/DataStorageSyncHandler.java
index e610cdc5f..86e3b5513 100644
--- a/app/src/main/java/io/xpipe/app/storage/DataStorageSyncHandler.java
+++ b/app/src/main/java/io/xpipe/app/storage/DataStorageSyncHandler.java
@@ -10,6 +10,8 @@ public interface DataStorageSyncHandler {
return (DataStorageSyncHandler) ProcessControlProvider.get().getGitStorageHandler();
}
+ void reset() throws Exception;
+
boolean validateConnection();
boolean supportsSync();
@@ -29,4 +31,6 @@ public interface DataStorageSyncHandler {
void handleCategory(DataStoreCategory category, boolean exists, boolean dirty);
void handleDeletion(Path target, String name);
+
+ Path getDirectory();
}
diff --git a/app/src/main/java/io/xpipe/app/storage/DataStoreEntry.java b/app/src/main/java/io/xpipe/app/storage/DataStoreEntry.java
index c9f195c17..b20ad891a 100644
--- a/app/src/main/java/io/xpipe/app/storage/DataStoreEntry.java
+++ b/app/src/main/java/io/xpipe/app/storage/DataStoreEntry.java
@@ -3,7 +3,8 @@ package io.xpipe.app.storage;
import io.xpipe.app.ext.DataStoreProvider;
import io.xpipe.app.ext.DataStoreProviders;
import io.xpipe.app.issue.ErrorEvent;
-import io.xpipe.app.util.FixedHierarchyStore;
+import io.xpipe.app.resources.SystemIcons;
+import io.xpipe.app.util.ThreadHelper;
import io.xpipe.core.store.*;
import io.xpipe.core.util.JacksonMapper;
@@ -22,7 +23,6 @@ import java.nio.file.Path;
import java.time.Instant;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Collectors;
import java.util.stream.Stream;
@Value
@@ -69,6 +69,9 @@ public class DataStoreEntry extends StorageElement {
@NonFinal
Order explicitOrder;
+ @NonFinal
+ String icon;
+
private DataStoreEntry(
Path directory,
UUID uuid,
@@ -85,7 +88,8 @@ public class DataStoreEntry extends StorageElement {
boolean expanded,
DataColor color,
String notes,
- Order explicitOrder) {
+ Order explicitOrder,
+ String icon) {
super(directory, uuid, name, lastUsed, lastModified, color, expanded, dirty);
this.categoryUuid = categoryUuid;
this.store = store;
@@ -96,6 +100,7 @@ public class DataStoreEntry extends StorageElement {
this.provider = store != null ? DataStoreProviders.byStore(store) : null;
this.storePersistentStateNode = storePersistentState;
this.notes = notes;
+ this.icon = icon;
}
private DataStoreEntry(
@@ -106,11 +111,13 @@ public class DataStoreEntry extends StorageElement {
Instant lastUsed,
Instant lastModified,
DataStore store,
- Order explicitOrder) {
+ Order explicitOrder,
+ String icon) {
super(directory, uuid, name, lastUsed, lastModified, null, false, false);
this.categoryUuid = categoryUuid;
this.store = store;
this.explicitOrder = explicitOrder;
+ this.icon = icon;
this.storeNode = null;
this.validity = Validity.INCOMPLETE;
this.configuration = Configuration.defaultConfiguration();
@@ -128,6 +135,7 @@ public class DataStoreEntry extends StorageElement {
Instant.now(),
Instant.now(),
store,
+ null,
null);
}
@@ -144,6 +152,7 @@ public class DataStoreEntry extends StorageElement {
var validity = storeFromNode == null
? Validity.LOAD_FAILED
: store.isComplete() ? Validity.COMPLETE : Validity.INCOMPLETE;
+ var icon = SystemIcons.detectForStore(store);
var entry = new DataStoreEntry(
null,
uuid,
@@ -160,10 +169,39 @@ public class DataStoreEntry extends StorageElement {
false,
null,
null,
- null);
+ null,
+ icon.map(systemIcon -> systemIcon.getIconName()).orElse(null));
return entry;
}
+ public String getEffectiveIconFile() {
+ if (getValidity() == Validity.LOAD_FAILED) {
+ return "disabled_icon.png";
+ }
+
+ if (icon == null) {
+ return getProvider().getDisplayIconFileName(getStore());
+ }
+
+ return "app:system/" + icon + ".svg";
+ }
+
+ void refreshIcon() {
+ if (icon != null && SystemIcons.getForId(icon).isEmpty()) {
+ icon = null;
+ return;
+ }
+
+ if (icon != null) {
+ return;
+ }
+
+ var icon = SystemIcons.detectForStore(store);
+ if (icon.isPresent()) {
+ setIcon(icon.get().getIconName(), true);
+ }
+ }
+
public static Optional fromDirectory(Path dir) throws Exception {
ObjectMapper mapper = JacksonMapper.getDefault();
@@ -196,6 +234,9 @@ public class DataStoreEntry extends StorageElement {
})
.orElse(null);
+ var iconNode = json.get("icon");
+ String icon = iconNode != null && !iconNode.isNull() ? iconNode.asText() : null;
+
var persistentState = stateJson.get("persistentState");
var lastUsed = Optional.ofNullable(stateJson.get("lastUsed"))
.map(jsonNode -> jsonNode.textValue())
@@ -266,7 +307,8 @@ public class DataStoreEntry extends StorageElement {
expanded,
color,
notes,
- order));
+ order,
+ icon));
}
public void setExplicitOrder(Order uuid) {
@@ -338,11 +380,24 @@ public class DataStoreEntry extends StorageElement {
return (T) storePersistentState;
}
+ public void setIcon(String icon, boolean force) {
+ if (this.icon != null && !force) {
+ return;
+ }
+
+ var changed = !Objects.equals(this.icon, icon);
+ this.icon = icon;
+ if (changed) {
+ notifyUpdate(false, true);
+ }
+ }
+
public void setStorePersistentState(DataStoreState value) {
var changed = !Objects.equals(storePersistentState, value);
this.storePersistentState = value;
this.storePersistentStateNode = JacksonMapper.getDefault().valueToTree(value);
if (changed) {
+ refreshIcon();
notifyUpdate(false, true);
}
}
@@ -380,6 +435,7 @@ public class DataStoreEntry extends StorageElement {
obj.put("name", name);
obj.put("categoryUuid", categoryUuid.toString());
obj.set("color", mapper.valueToTree(color));
+ obj.set("icon", mapper.valueToTree(icon));
stateObj.put("lastUsed", lastUsed.toString());
stateObj.put("lastModified", lastModified.toString());
stateObj.set("persistentState", storePersistentStateNode);
@@ -426,6 +482,7 @@ public class DataStoreEntry extends StorageElement {
validity = store == null ? Validity.LOAD_FAILED : store.isComplete() ? Validity.COMPLETE : Validity.INCOMPLETE;
storePersistentState = e.storePersistentState;
storePersistentStateNode = e.storePersistentStateNode;
+ icon = e.icon;
notifyUpdate(false, true);
}
@@ -459,19 +516,46 @@ public class DataStoreEntry extends StorageElement {
}
public void validateOrThrow() throws Throwable {
+ validateOrThrowAndClose(null);
+ }
+
+ public boolean validateOrThrowAndClose(ValidationContext> existingContext) throws Throwable {
+ var subContext = validateAndKeepOpenOrThrowAndClose(existingContext);
+ if (subContext != null) {
+ subContext.close();
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public ValidationContext> validateAndKeepOpenOrThrowAndClose(ValidationContext> existingContext)
+ throws Throwable {
if (store == null) {
- return;
+ return null;
+ }
+
+ if (!(store instanceof ValidatableStore> l)) {
+ return null;
}
try {
store.checkComplete();
incrementBusyCounter();
- if (store instanceof ValidatableStore l) {
- l.validate();
- } else if (store instanceof FixedHierarchyStore h) {
- childrenCache = h.listChildren(this).stream()
- .map(DataStoreEntryRef::get)
- .collect(Collectors.toSet());
+ ValidationContext context = existingContext != null
+ ? (ValidationContext) existingContext
+ : (ValidationContext) l.createContext();
+ if (context == null) {
+ return null;
+ }
+
+ try {
+ var r = ((ValidatableStore>) l).validate(context);
+ return r;
+ } catch (Throwable t) {
+ context.close();
+ throw t;
}
} finally {
decrementBusyCounter();
@@ -514,7 +598,6 @@ public class DataStoreEntry extends StorageElement {
notifyUpdate(false, false);
}
- @SneakyThrows
public void initializeEntry() {
if (store instanceof ExpandedLifecycleStore lifecycleStore) {
try {
@@ -530,7 +613,6 @@ public class DataStoreEntry extends StorageElement {
}
}
- @SneakyThrows
public void finalizeEntry() {
if (store instanceof ExpandedLifecycleStore lifecycleStore) {
try {
@@ -546,6 +628,17 @@ public class DataStoreEntry extends StorageElement {
}
}
+ public boolean finalizeEntryAsync() {
+ if (store instanceof ExpandedLifecycleStore) {
+ ThreadHelper.runAsync(() -> {
+ finalizeEntry();
+ });
+ return true;
+ } else {
+ return false;
+ }
+ }
+
public boolean shouldSave() {
return getStore() != null;
}
diff --git a/app/src/main/java/io/xpipe/app/storage/StandardStorage.java b/app/src/main/java/io/xpipe/app/storage/StandardStorage.java
index 2d4e18709..596310e63 100644
--- a/app/src/main/java/io/xpipe/app/storage/StandardStorage.java
+++ b/app/src/main/java/io/xpipe/app/storage/StandardStorage.java
@@ -1,11 +1,11 @@
package io.xpipe.app.storage;
import io.xpipe.app.ext.DataStorageExtensionProvider;
+import io.xpipe.app.ext.LocalStore;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.issue.TrackEvent;
import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.core.process.OsType;
-import io.xpipe.app.ext.LocalStore;
import io.xpipe.core.util.JacksonMapper;
import com.fasterxml.jackson.core.JacksonException;
@@ -174,17 +174,17 @@ public class StandardStorage extends DataStorage {
ErrorEvent.fromThrowable(exception.get()).expected().handle();
}
- storeEntriesSet.forEach(dataStoreCategory -> {
- if (dataStoreCategory.getCategoryUuid() == null
- || getStoreCategoryIfPresent(dataStoreCategory.getCategoryUuid())
- .isEmpty()) {
- dataStoreCategory.setCategoryUuid(DEFAULT_CATEGORY_UUID);
+ storeEntriesSet.forEach(e -> {
+ if (e.getCategoryUuid() == null
+ || getStoreCategoryIfPresent(e.getCategoryUuid()).isEmpty()) {
+ e.setCategoryUuid(DEFAULT_CATEGORY_UUID);
}
- if (dataStoreCategory.getCategoryUuid() != null
- && dataStoreCategory.getCategoryUuid().equals(ALL_CONNECTIONS_CATEGORY_UUID)) {
- dataStoreCategory.setCategoryUuid(DEFAULT_CATEGORY_UUID);
+ if (e.getCategoryUuid() != null && e.getCategoryUuid().equals(ALL_CONNECTIONS_CATEGORY_UUID)) {
+ e.setCategoryUuid(DEFAULT_CATEGORY_UUID);
}
+
+ e.refreshIcon();
});
}
} catch (IOException ex) {
diff --git a/app/src/main/java/io/xpipe/app/storage/StorageElement.java b/app/src/main/java/io/xpipe/app/storage/StorageElement.java
index 4961c3b04..c6b8c6ab1 100644
--- a/app/src/main/java/io/xpipe/app/storage/StorageElement.java
+++ b/app/src/main/java/io/xpipe/app/storage/StorageElement.java
@@ -130,7 +130,6 @@ public abstract class StorageElement {
notifyUpdate(false, false);
}
-
public void setLastUsed(Instant lastUsed) {
if (lastUsed.equals(this.lastUsed)) {
return;
diff --git a/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java
index faf722313..b5803dd2c 100644
--- a/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java
+++ b/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java
@@ -13,9 +13,11 @@ import io.xpipe.app.util.*;
import io.xpipe.core.process.*;
import io.xpipe.core.store.FilePath;
import io.xpipe.core.util.FailableFunction;
+
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonBar;
import javafx.scene.control.ButtonType;
+
import lombok.Getter;
import lombok.Value;
import lombok.With;
@@ -112,6 +114,11 @@ public interface ExternalTerminalType extends PrefsChoiceValue {
}
}
+ @Override
+ public String getWebsite() {
+ return "https://www.netsarang.com/en/xshell/";
+ }
+
@Override
public boolean supportsTabs() {
return true;
@@ -211,6 +218,11 @@ public interface ExternalTerminalType extends PrefsChoiceValue {
return false;
}
+ @Override
+ public String getWebsite() {
+ return "https://www.vandyke.com/products/securecrt/";
+ }
+
@Override
protected void execute(Path file, LaunchConfiguration configuration) throws Exception {
try (var sc = LocalShell.getShell()) {
@@ -259,6 +271,11 @@ public interface ExternalTerminalType extends PrefsChoiceValue {
return true;
}
+ @Override
+ public String getWebsite() {
+ return "https://mobaxterm.mobatek.net/";
+ }
+
@Override
protected void execute(Path file, LaunchConfiguration configuration) throws Exception {
try (var sc = LocalShell.getShell()) {
@@ -275,10 +292,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue {
var rawCommand = command.buildSimple();
var script = ScriptHelper.getExecScriptFile(sc, "sh");
Files.writeString(Path.of(script.toString()), rawCommand);
- var fixedFile = script
- .toString()
- .replaceAll("\\\\", "/")
- .replaceAll("\\s", "\\$0");
+ var fixedFile = script.toString().replaceAll("\\\\", "/").replaceAll("\\s", "\\$0");
sc.command(CommandBuilder.of()
.addFile(file.toString())
.add("-newtab")
@@ -317,6 +331,11 @@ public interface ExternalTerminalType extends PrefsChoiceValue {
}
}
+ @Override
+ public String getWebsite() {
+ return "https://termius.com/";
+ }
+
@Override
public boolean supportsTabs() {
return true;
@@ -1032,8 +1051,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue {
DEEPIN_TERMINAL,
FOOT,
Q_TERMINAL,
- TERMIUS
- );
+ TERMIUS);
List MACOS_TERMINALS = List.of(
WARP,
ITERM2,
diff --git a/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java
index 42e8a93af..0ca65961a 100644
--- a/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java
+++ b/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java
@@ -96,7 +96,7 @@ public interface KittyTerminalType extends ExternalTerminalType {
public boolean isAvailable() {
try (ShellControl pc = LocalShell.getShell()) {
- return pc.executeSimpleBooleanCommand(pc.getShellDialect().getWhichCommand("kitty"));
+ return CommandSupport.findProgram(pc, "kitty").isPresent();
} catch (Exception e) {
ErrorEvent.fromThrowable(e).omit().handle();
return false;
diff --git a/app/src/main/java/io/xpipe/app/terminal/WezTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/WezTerminalType.java
index 572217a5d..436aa899f 100644
--- a/app/src/main/java/io/xpipe/app/terminal/WezTerminalType.java
+++ b/app/src/main/java/io/xpipe/app/terminal/WezTerminalType.java
@@ -124,13 +124,13 @@ public interface WezTerminalType extends ExternalTerminalType {
@Override
public void launch(LaunchConfiguration configuration) throws Exception {
try (var sc = LocalShell.getShell()) {
- var path = sc.command(String.format(
+ var pathOut = sc.command(String.format(
"mdfind -name '%s' -onlyin /Applications -onlyin ~/Applications -onlyin /System/Applications 2>/dev/null",
applicationName))
.readStdoutOrThrow();
+ var path = Path.of(pathOut);
var spawn = sc.command(CommandBuilder.of()
- .addFile(Path.of(path)
- .resolve("Contents")
+ .addFile(path.resolve("Contents")
.resolve("MacOS")
.resolve("wezterm")
.toString())
@@ -139,8 +139,7 @@ public interface WezTerminalType extends ExternalTerminalType {
.executeAndCheck();
if (!spawn) {
ExternalApplicationHelper.startAsync(CommandBuilder.of()
- .addFile(Path.of(path)
- .resolve("Contents")
+ .addFile(path.resolve("Contents")
.resolve("MacOS")
.resolve("wezterm-gui")
.toString())
diff --git a/app/src/main/java/io/xpipe/app/update/AppInstaller.java b/app/src/main/java/io/xpipe/app/update/AppInstaller.java
index 8cacf61af..a66965ccf 100644
--- a/app/src/main/java/io/xpipe/app/update/AppInstaller.java
+++ b/app/src/main/java/io/xpipe/app/update/AppInstaller.java
@@ -3,6 +3,7 @@ package io.xpipe.app.update;
import io.xpipe.app.core.AppLogs;
import io.xpipe.app.core.AppProperties;
import io.xpipe.app.core.mode.OperationMode;
+import io.xpipe.app.ext.LocalStore;
import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.app.terminal.ExternalTerminalType;
import io.xpipe.app.util.LocalShell;
@@ -12,7 +13,6 @@ import io.xpipe.app.util.ThreadHelper;
import io.xpipe.core.process.OsType;
import io.xpipe.core.process.ShellDialects;
import io.xpipe.core.store.FileNames;
-import io.xpipe.app.ext.LocalStore;
import io.xpipe.core.util.FailableRunnable;
import io.xpipe.core.util.XPipeInstallation;
@@ -165,7 +165,8 @@ public class AppInstaller {
runAndClose(() -> {
// We can't use the SSH bridge
- var type = ExternalTerminalType.determineNonSshBridgeFallback(AppPrefs.get().terminalType().getValue());
+ var type = ExternalTerminalType.determineNonSshBridgeFallback(
+ AppPrefs.get().terminalType().getValue());
TerminalLauncher.openDirect("XPipe Updater", sc -> command, type);
});
}
@@ -205,7 +206,8 @@ public class AppInstaller {
runAndClose(() -> {
// We can't use the SSH bridge
- var type = ExternalTerminalType.determineNonSshBridgeFallback(AppPrefs.get().terminalType().getValue());
+ var type = ExternalTerminalType.determineNonSshBridgeFallback(
+ AppPrefs.get().terminalType().getValue());
TerminalLauncher.openDirect("XPipe Updater", sc -> command, type);
});
}
@@ -245,7 +247,8 @@ public class AppInstaller {
runAndClose(() -> {
// We can't use the SSH bridge
- var type = ExternalTerminalType.determineNonSshBridgeFallback(AppPrefs.get().terminalType().getValue());
+ var type = ExternalTerminalType.determineNonSshBridgeFallback(
+ AppPrefs.get().terminalType().getValue());
TerminalLauncher.openDirect("XPipe Updater", sc -> command, type);
});
}
diff --git a/app/src/main/java/io/xpipe/app/update/ChocoUpdater.java b/app/src/main/java/io/xpipe/app/update/ChocoUpdater.java
index ff0d80717..affc965fa 100644
--- a/app/src/main/java/io/xpipe/app/update/ChocoUpdater.java
+++ b/app/src/main/java/io/xpipe/app/update/ChocoUpdater.java
@@ -1,9 +1,9 @@
package io.xpipe.app.update;
import io.xpipe.app.core.AppProperties;
+import io.xpipe.app.ext.LocalStore;
import io.xpipe.app.fxcomps.impl.CodeSnippet;
import io.xpipe.app.fxcomps.impl.CodeSnippetComp;
-import io.xpipe.app.ext.LocalStore;
import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.layout.Region;
diff --git a/app/src/main/java/io/xpipe/app/update/PortableUpdater.java b/app/src/main/java/io/xpipe/app/update/PortableUpdater.java
index 8aafadc40..13313b668 100644
--- a/app/src/main/java/io/xpipe/app/update/PortableUpdater.java
+++ b/app/src/main/java/io/xpipe/app/update/PortableUpdater.java
@@ -13,8 +13,8 @@ import java.time.Instant;
public class PortableUpdater extends UpdateHandler {
- public PortableUpdater() {
- super(true);
+ public PortableUpdater(boolean thread) {
+ super(thread);
}
@Override
diff --git a/app/src/main/java/io/xpipe/app/update/XPipeDistributionType.java b/app/src/main/java/io/xpipe/app/update/XPipeDistributionType.java
index 0d6c8d6e3..58c88c8a2 100644
--- a/app/src/main/java/io/xpipe/app/update/XPipeDistributionType.java
+++ b/app/src/main/java/io/xpipe/app/update/XPipeDistributionType.java
@@ -12,15 +12,18 @@ import io.xpipe.core.util.XPipeInstallation;
import lombok.Getter;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.Arrays;
import java.util.function.Supplier;
public enum XPipeDistributionType {
UNKNOWN("unknown", false, () -> new GitHubUpdater(false)),
DEVELOPMENT("development", true, () -> new GitHubUpdater(false)),
- PORTABLE("portable", false, () -> new PortableUpdater()),
+ PORTABLE("portable", false, () -> new PortableUpdater(true)),
NATIVE_INSTALLATION("install", true, () -> new GitHubUpdater(true)),
HOMEBREW("homebrew", true, () -> new HomebrewUpdater()),
+ WEBTOP("webtop", true, () -> new PortableUpdater(false)),
CHOCO("choco", true, () -> new ChocoUpdater());
private static XPipeDistributionType type;
@@ -95,6 +98,12 @@ public enum XPipeDistributionType {
return UNKNOWN;
}
+ if (OsType.getLocal() == OsType.LINUX
+ && "/config".equals(System.getProperty("user.home"))
+ && Files.isDirectory(Path.of("/kclient"))) {
+ return WEBTOP;
+ }
+
try (var sc = LocalShell.getShell()) {
// In theory, we can also add && !AppProperties.get().isStaging() here, but we want to replicate the
// production behavior
diff --git a/app/src/main/java/io/xpipe/app/util/AppJacksonModule.java b/app/src/main/java/io/xpipe/app/util/AppJacksonModule.java
index 5723810f7..f2bd390c3 100644
--- a/app/src/main/java/io/xpipe/app/util/AppJacksonModule.java
+++ b/app/src/main/java/io/xpipe/app/util/AppJacksonModule.java
@@ -1,8 +1,8 @@
package io.xpipe.app.util;
+import io.xpipe.app.ext.LocalStore;
import io.xpipe.app.storage.*;
import io.xpipe.app.terminal.ExternalTerminalType;
-import io.xpipe.app.ext.LocalStore;
import io.xpipe.core.util.EncryptedSecretValue;
import io.xpipe.core.util.JacksonMapper;
import io.xpipe.core.util.SecretValue;
diff --git a/app/src/main/java/io/xpipe/app/util/AsktextAlert.java b/app/src/main/java/io/xpipe/app/util/AsktextAlert.java
new file mode 100644
index 000000000..d705d1334
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/util/AsktextAlert.java
@@ -0,0 +1,94 @@
+package io.xpipe.app.util;
+
+import io.xpipe.app.core.AppI18n;
+import io.xpipe.app.core.AppStyle;
+import io.xpipe.app.core.AppTheme;
+import io.xpipe.app.core.window.AppWindowHelper;
+import io.xpipe.app.fxcomps.impl.TextFieldComp;
+
+import javafx.animation.AnimationTimer;
+import javafx.application.Platform;
+import javafx.beans.property.SimpleObjectProperty;
+import javafx.scene.control.Alert;
+import javafx.scene.layout.StackPane;
+import javafx.stage.Stage;
+
+import java.util.Optional;
+
+public class AsktextAlert {
+
+ public static Optional query(String prompt) {
+ if (!PlatformState.initPlatformIfNeeded()) {
+ return Optional.empty();
+ }
+
+ AppStyle.init();
+ AppTheme.init();
+
+ var prop = new SimpleObjectProperty();
+ var r = AppWindowHelper.showBlockingAlert(alert -> {
+ alert.setTitle(AppI18n.get("asktextAlertTitle"));
+ alert.setHeaderText(prompt);
+ alert.setAlertType(Alert.AlertType.CONFIRMATION);
+
+ var text = new TextFieldComp(prop, false).createStructure();
+ alert.getDialogPane().setContent(new StackPane(text.get()));
+ var stage = (Stage) alert.getDialogPane().getScene().getWindow();
+ stage.setAlwaysOnTop(true);
+
+ var anim = new AnimationTimer() {
+
+ private long lastRun = 0;
+ private int regainedFocusCount;
+
+ @Override
+ public void handle(long now) {
+ if (!stage.isShowing()) {
+ return;
+ }
+
+ if (regainedFocusCount >= 2) {
+ return;
+ }
+
+ if (lastRun == 0) {
+ lastRun = now;
+ return;
+ }
+
+ long elapsed = (now - lastRun) / 1_000_000;
+ if (elapsed < 500) {
+ return;
+ }
+
+ var hasFocus = stage.isFocused();
+ if (!hasFocus) {
+ regainedFocusCount++;
+ }
+ stage.requestFocus();
+ lastRun = now;
+ }
+ };
+
+ alert.setOnShown(event -> {
+ stage.requestFocus();
+ anim.start();
+ // Wait 1 pulse before focus so that the scene can be assigned to text
+ Platform.runLater(() -> {
+ text.get().requestFocus();
+ text.get().end();
+ });
+ event.consume();
+ });
+
+ alert.setOnHiding(event -> {
+ anim.stop();
+ });
+ })
+ .filter(b -> b.getButtonData().isDefaultButton())
+ .map(t -> {
+ return prop.getValue() != null ? prop.getValue() : null;
+ });
+ return r;
+ }
+}
diff --git a/app/src/main/java/io/xpipe/app/util/CommandSupport.java b/app/src/main/java/io/xpipe/app/util/CommandSupport.java
index b1b04b2d6..21107dbea 100644
--- a/app/src/main/java/io/xpipe/app/util/CommandSupport.java
+++ b/app/src/main/java/io/xpipe/app/util/CommandSupport.java
@@ -6,8 +6,17 @@ import io.xpipe.core.process.ShellControl;
import io.xpipe.core.util.FailableSupplier;
import java.io.IOException;
+import java.util.Optional;
public class CommandSupport {
+
+ public static Optional findProgram(ShellControl processControl, String name) throws Exception {
+ var out = processControl
+ .command(processControl.getShellDialect().getWhichCommand(name))
+ .readStdoutIfPossible();
+ return out.flatMap(s -> s.lines().findFirst()).map(String::trim);
+ }
+
public static boolean isInPath(ShellControl processControl, String executable) throws Exception {
return processControl.executeSimpleBooleanCommand(
processControl.getShellDialect().getWhichCommand(executable));
diff --git a/app/src/main/java/io/xpipe/app/util/DesktopHelper.java b/app/src/main/java/io/xpipe/app/util/DesktopHelper.java
index f3e99c20a..addb6bcd8 100644
--- a/app/src/main/java/io/xpipe/app/util/DesktopHelper.java
+++ b/app/src/main/java/io/xpipe/app/util/DesktopHelper.java
@@ -72,7 +72,10 @@ public class DesktopHelper {
}
var file = new FilePath(path);
- sc.command(CommandBuilder.of().add("xdg-open").addFile(kind == FileKind.DIRECTORY ? file : file.getParent())).execute();
+ sc.command(CommandBuilder.of()
+ .add("xdg-open")
+ .addFile(kind == FileKind.DIRECTORY ? file : file.getParent()))
+ .execute();
}
case OsType.MacOs macOs -> {
sc.executeSimpleCommand("open " + (kind == FileKind.DIRECTORY ? "" : "-R ") + d.fileArgument(path));
@@ -99,7 +102,7 @@ public class DesktopHelper {
try {
Desktop.getDesktop().open(file.toFile());
} catch (Exception e) {
- ErrorEvent.fromThrowable(e).omit().handle();
+ ErrorEvent.fromThrowable(e).expected().handle();
}
});
}
@@ -107,6 +110,7 @@ public class DesktopHelper {
public static void browseFileInDirectory(Path file) {
if (!Desktop.getDesktop().isSupported(Desktop.Action.BROWSE_FILE_DIR)) {
if (!Desktop.getDesktop().isSupported(Desktop.Action.OPEN)) {
+ ErrorEvent.fromMessage("Desktop integration unable to open file " + file).expected().handle();
return;
}
@@ -114,7 +118,7 @@ public class DesktopHelper {
try {
Desktop.getDesktop().open(file.getParent().toFile());
} catch (Exception e) {
- ErrorEvent.fromThrowable(e).omit().handle();
+ ErrorEvent.fromThrowable(e).expected().handle();
}
});
return;
@@ -124,7 +128,7 @@ public class DesktopHelper {
try {
Desktop.getDesktop().browseFileDirectory(file.toFile());
} catch (Exception e) {
- ErrorEvent.fromThrowable(e).omit().handle();
+ ErrorEvent.fromThrowable(e).expected().handle();
}
});
}
diff --git a/app/src/main/java/io/xpipe/app/util/FileReference.java b/app/src/main/java/io/xpipe/app/util/FileReference.java
index cf4ed4137..9897ea734 100644
--- a/app/src/main/java/io/xpipe/app/util/FileReference.java
+++ b/app/src/main/java/io/xpipe/app/util/FileReference.java
@@ -1,9 +1,9 @@
package io.xpipe.app.util;
+import io.xpipe.app.ext.LocalStore;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStoreEntryRef;
import io.xpipe.core.store.FileSystemStore;
-import io.xpipe.app.ext.LocalStore;
import io.xpipe.core.util.JacksonizedValue;
import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/app/src/main/java/io/xpipe/app/util/FixedHierarchyStore.java b/app/src/main/java/io/xpipe/app/util/FixedHierarchyStore.java
index d06ad3e5f..f8104e303 100644
--- a/app/src/main/java/io/xpipe/app/util/FixedHierarchyStore.java
+++ b/app/src/main/java/io/xpipe/app/util/FixedHierarchyStore.java
@@ -1,17 +1,24 @@
package io.xpipe.app.util;
-import io.xpipe.app.storage.DataStoreEntry;
import io.xpipe.app.storage.DataStoreEntryRef;
import io.xpipe.core.store.DataStore;
import io.xpipe.core.store.FixedChildStore;
+import io.xpipe.core.store.ValidatableStore;
+import io.xpipe.core.store.ValidationContext;
import java.util.List;
-public interface FixedHierarchyStore extends DataStore {
+public interface FixedHierarchyStore> extends ValidatableStore, DataStore {
default boolean removeLeftovers() {
return true;
}
- List extends DataStoreEntryRef extends FixedChildStore>> listChildren(DataStoreEntry self) throws Exception;
+ @Override
+ default T validate(T context) throws Exception {
+ listChildren(context);
+ return null;
+ }
+
+ List extends DataStoreEntryRef extends FixedChildStore>> listChildren(T context) throws Exception;
}
diff --git a/app/src/main/java/io/xpipe/app/util/HumanReadableFormat.java b/app/src/main/java/io/xpipe/app/util/HumanReadableFormat.java
index a7054d851..c2be39371 100644
--- a/app/src/main/java/io/xpipe/app/util/HumanReadableFormat.java
+++ b/app/src/main/java/io/xpipe/app/util/HumanReadableFormat.java
@@ -1,5 +1,7 @@
package io.xpipe.app.util;
+import io.xpipe.app.core.AppI18n;
+
import java.text.CharacterIterator;
import java.text.StringCharacterIterator;
import java.time.Duration;
@@ -7,7 +9,6 @@ import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.WeekFields;
-import java.util.Locale;
import java.util.Objects;
public final class HumanReadableFormat {
@@ -57,29 +58,31 @@ public final class HumanReadableFormat {
// not this year
if (x.getYear() != now.getYear()) {
- return DAY_MONTH_YEAR.format(x);
+ return DAY_MONTH_YEAR
+ .withLocale(AppI18n.get().getLoaded().getLocale())
+ .format(x);
}
// not this week
if (getWeekNumber(x) != getWeekNumber(now)) {
- return DAY_MONTH.format(x);
+ return DAY_MONTH.withLocale(AppI18n.get().getLoaded().getLocale()).format(x);
}
// not today
int xDay = x.getDayOfWeek().getValue();
int nowDay = now.getDayOfWeek().getValue();
if (xDay == nowDay - 1) {
- return "Yesterday";
+ return AppI18n.get("yesterday");
}
if (xDay != nowDay) {
- return DAY_OF_WEEK.format(x);
+ return DAY_OF_WEEK.withLocale(AppI18n.get().getLoaded().getLocale()).format(x);
}
- return HOUR_MINUTE.format(x);
+ return HOUR_MINUTE.withLocale(AppI18n.get().getLoaded().getLocale()).format(x);
}
private static int getWeekNumber(LocalDateTime date) {
- return date.get(WeekFields.of(Locale.getDefault()).weekOfYear());
+ return date.get(WeekFields.of(AppI18n.get().getLoaded().getLocale()).weekOfYear());
}
public static String duration(Duration duration) {
diff --git a/app/src/main/java/io/xpipe/app/util/Hyperlinks.java b/app/src/main/java/io/xpipe/app/util/Hyperlinks.java
index d444b1e6c..5bacad2c5 100644
--- a/app/src/main/java/io/xpipe/app/util/Hyperlinks.java
+++ b/app/src/main/java/io/xpipe/app/util/Hyperlinks.java
@@ -5,6 +5,7 @@ import io.xpipe.app.issue.ErrorEvent;
public class Hyperlinks {
public static final String DOUBLE_PROMPT = "https://docs.xpipe.io/two-step-connections";
+ public static final String AGENT_SETUP = "https://docs.xpipe.io/ssh-agent-socket";
public static final String GITHUB = "https://github.com/xpipe-io/xpipe";
public static final String GITHUB_PTB = "https://github.com/xpipe-io/xpipe";
public static final String PRIVACY = "https://docs.xpipe.io/privacy-policy";
@@ -12,8 +13,12 @@ public class Hyperlinks {
public static final String SECURITY = "https://docs.xpipe.io/security";
public static final String TRANSLATE = "https://github.com/xpipe-io/xpipe/tree/master/lang";
public static final String DISCORD = "https://discord.gg/8y89vS8cRb";
+ public static final String GITHUB_WEBTOP = "https://github.com/xpipe-io/xpipe-webtop";
+ public static final String SELFHST_ICONS = "https://github.com/selfhst/icons";
public static final String SLACK =
"https://join.slack.com/t/XPipe/shared_invite/zt-1awjq0t5j-5i4UjNJfNe1VN4b_auu6Cg";
+ public static final String PRODUCT_HUNT =
+ "https://www.producthunt.com/posts/xpipe?embed=true&utm_source=badge-featured&utm_medium=badge&utm_souce=badge-xpipe";
static final String[] browsers = {
"xdg-open", "google-chrome", "firefox", "opera", "konqueror", "mozilla", "gnome-open", "open"
diff --git a/app/src/main/java/io/xpipe/app/util/Indicator.java b/app/src/main/java/io/xpipe/app/util/Indicator.java
deleted file mode 100644
index 03aac1296..000000000
--- a/app/src/main/java/io/xpipe/app/util/Indicator.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package io.xpipe.app.util;
-
-import javafx.animation.AnimationTimer;
-import javafx.scene.Group;
-import javafx.scene.Parent;
-import javafx.scene.paint.Color;
-import javafx.scene.shape.*;
-
-public class Indicator {
-
- private static final Color lColor = Color.rgb(0x66, 0x66, 0x66);
- private static final Color rColor = Color.rgb(0x0f, 0x87, 0xc3);
-
- private static final PathElement[] ELEMS = new PathElement[] {
- new MoveTo(9.2362945, 19.934046),
- new CubicCurveTo(-1.3360939, -0.28065, -1.9963146, -1.69366, -1.9796182, -2.95487),
- new CubicCurveTo(-0.1152909, -1.41268, -0.5046634, -3.07081, -1.920768, -3.72287),
- new CubicCurveTo(-1.4711631, -0.77284, -3.4574873, -0.11153, -4.69154031, -1.40244),
- new CubicCurveTo(-1.30616123, -1.40422, -0.5308003, -4.1855799, 1.46313121, -4.4219799),
- new CubicCurveTo(1.4290018, -0.25469, 3.1669517, -0.0875, 4.1676818, -1.36207),
- new CubicCurveTo(0.9172241, -1.12206, 0.9594176, -2.63766, 1.0685793, -4.01259),
- new CubicCurveTo(0.4020299, -1.95732999, 3.2823027, -2.72818999, 4.5638567, -1.15760999),
- new CubicCurveTo(1.215789, 1.31824999, 0.738899, 3.90740999, -1.103778, 4.37267999),
- new CubicCurveTo(-1.3972543, 0.40868, -3.0929979, 0.0413, -4.2208253, 1.16215),
- new CubicCurveTo(-1.3524806, 1.26423, -1.3178578, 3.29187, -1.1086673, 4.9895199),
- new CubicCurveTo(0.167826, 1.28946, 1.0091133, 2.5347, 2.3196964, 2.86608),
- new CubicCurveTo(1.6253079, 0.53477, 3.4876372, 0.45004, 5.0294052, -0.30121),
- new CubicCurveTo(1.335829, -0.81654, 1.666839, -2.49408, 1.717756, -3.9432),
- new CubicCurveTo(0.08759, -1.1232899, 0.704887, -2.3061299, 1.871843, -2.5951699),
- new CubicCurveTo(1.534558, -0.50726, 3.390804, 0.62784, 3.467269, 2.28631),
- new CubicCurveTo(0.183147, 1.4285099, -0.949563, 2.9179999, -2.431156, 2.9383699),
- new CubicCurveTo(-1.390597, 0.17337, -3.074035, 0.18128, -3.971365, 1.45069),
- new CubicCurveTo(-0.99314, 1.271, -0.676157, 2.98683, -1.1715, 4.43018),
- new CubicCurveTo(-0.518248, 1.11436, -1.909118, 1.63902, -3.0700005, 1.37803),
- new ClosePath()
- };
-
- static {
- for (int i = 1; i < ELEMS.length; ++i) {
- ELEMS[i].setAbsolute(false);
- }
- }
-
- private final Path left;
- private final Path right;
- private final Group g;
- private final int steps;
-
- private boolean fw = true;
- private int step = 0;
-
- public Indicator(int ticksPerCycle, double scale) {
- this.steps = ticksPerCycle;
-
- left = new Path(ELEMS);
- right = new Path(ELEMS);
-
- left.setScaleX(scale);
- left.setScaleY(scale);
- right.setScaleX(-1 * scale);
- right.setScaleY(-1 * scale);
- right.setTranslateX(7.266 * scale);
- right.setOpacity(0.0);
-
- left.setStroke(null);
- right.setStroke(null);
- left.setFill(lColor);
- right.setFill(rColor);
-
- g = new Group(left, right);
-
- AnimationTimer timer = new AnimationTimer() {
- @Override
- public void handle(long l) {
- step();
- }
- };
- timer.start();
- }
-
- public Parent getNode() {
- return g;
- }
-
- private void step() {
- double lOpacity, rOpacity;
-
- step += fw ? 1 : -1;
-
- if (step == steps) {
- fw = false;
- lOpacity = 0.0;
- rOpacity = 1.0;
- } else if (step == 0) {
- fw = true;
- lOpacity = 1.0;
- rOpacity = 0.0;
- } else {
- lOpacity = 1.0 * (steps - step) / steps;
- rOpacity = 1.0 * step / steps;
- }
-
- left.setOpacity(lOpacity);
- right.setOpacity(rOpacity);
- }
-}
diff --git a/app/src/main/java/io/xpipe/app/util/LockChangeAlert.java b/app/src/main/java/io/xpipe/app/util/LockChangeAlert.java
deleted file mode 100644
index b575bf0f3..000000000
--- a/app/src/main/java/io/xpipe/app/util/LockChangeAlert.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package io.xpipe.app.util;
-
-import io.xpipe.app.core.AppI18n;
-import io.xpipe.app.core.window.AppWindowHelper;
-import io.xpipe.app.fxcomps.impl.LabelComp;
-import io.xpipe.app.fxcomps.impl.SecretFieldComp;
-import io.xpipe.app.prefs.AppPrefs;
-import io.xpipe.core.util.InPlaceSecretValue;
-
-import javafx.beans.binding.Bindings;
-import javafx.beans.property.SimpleObjectProperty;
-import javafx.scene.control.Alert;
-import javafx.scene.control.ButtonType;
-import javafx.scene.layout.VBox;
-
-import atlantafx.base.controls.Spacer;
-
-import java.util.Objects;
-
-public class LockChangeAlert {
-
- public static void show() {
- var prop1 = new SimpleObjectProperty();
- var prop2 = new SimpleObjectProperty();
- AppWindowHelper.showBlockingAlert(alert -> {
- alert.setTitle(AppI18n.get("lockCreationAlertTitle"));
- alert.setHeaderText(AppI18n.get("lockCreationAlertHeader"));
- alert.setAlertType(Alert.AlertType.CONFIRMATION);
-
- var label1 = new LabelComp(AppI18n.observable("passphrase")).createRegion();
- var p1 = new SecretFieldComp(prop1, false).createRegion();
- p1.setStyle("-fx-border-width: 1px");
-
- var label2 = new LabelComp(AppI18n.observable("repeatPassphrase")).createRegion();
- var p2 = new SecretFieldComp(prop2, false).createRegion();
- p1.setStyle("-fx-border-width: 1px");
-
- var content = new VBox(label1, p1, new Spacer(15), label2, p2);
- content.setSpacing(5);
- alert.getDialogPane().setContent(content);
-
- var button = alert.getDialogPane().lookupButton(ButtonType.OK);
- button.disableProperty()
- .bind(Bindings.createBooleanBinding(
- () -> {
- return !Objects.equals(prop1.getValue(), prop2.getValue());
- },
- prop1,
- prop2));
- })
- .filter(b -> b.getButtonData().isDefaultButton())
- .ifPresent(t -> {
- AppPrefs.get().changeLock(prop1.getValue());
- });
- }
-}
diff --git a/app/src/main/java/io/xpipe/app/util/NamedCharacter.java b/app/src/main/java/io/xpipe/app/util/NamedCharacter.java
deleted file mode 100644
index cddadccdc..000000000
--- a/app/src/main/java/io/xpipe/app/util/NamedCharacter.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package io.xpipe.app.util;
-
-import io.xpipe.core.dialog.QueryConverter;
-
-import lombok.Value;
-
-import java.util.List;
-
-@Value
-public class NamedCharacter {
-
- char character;
- List names;
- String translationKey;
-
- public static QueryConverter converter(List chars, boolean allowOthers) {
- return new QueryConverter<>() {
- @Override
- protected Character fromString(String s) {
- if (s.length() == 0) {
- throw new IllegalArgumentException("No character");
- }
-
- var byName = chars.stream()
- .filter(nc -> nc.getNames().stream()
- .anyMatch(n -> n.toLowerCase().contains(s.toLowerCase())))
- .findFirst()
- .orElse(null);
- if (byName != null) {
- return byName.getCharacter();
- }
-
- var byChar = chars.stream()
- .filter(nc -> String.valueOf(nc.getCharacter()).equalsIgnoreCase(s))
- .findFirst()
- .orElse(null);
- if (byChar != null) {
- return byChar.getCharacter();
- }
-
- if (!allowOthers) {
- throw new IllegalArgumentException("Unknown character: " + s);
- }
-
- return QueryConverter.CHARACTER.convertFromString(s);
- }
-
- @Override
- protected String toString(Character value) {
- var byChar = chars.stream()
- .filter(nc -> value.equals(nc.getCharacter()))
- .findFirst()
- .orElse(null);
- if (byChar != null) {
- return byChar.getNames().getFirst();
- }
-
- return value.toString();
- }
- };
- }
-}
diff --git a/app/src/main/java/io/xpipe/app/util/PlatformState.java b/app/src/main/java/io/xpipe/app/util/PlatformState.java
index 41f1205e3..fc24928d3 100644
--- a/app/src/main/java/io/xpipe/app/util/PlatformState.java
+++ b/app/src/main/java/io/xpipe/app/util/PlatformState.java
@@ -84,7 +84,7 @@ public enum PlatformState {
// fails
} catch (HeadlessException h) {
var msg = (OsType.getLocal().equals(OsType.LINUX)
- ? "No X11 DISPLAY variable was set or no headful library support was found."
+ ? "No DISPLAY variable was set or no headful library support was found."
: "The application does not have desktop access, but this program performed an operation which requires it.")
+ "\n\n"
+ "Please note that XPipe is a desktop application that should be run on your local workstation."
@@ -137,26 +137,21 @@ public enum PlatformState {
try {
latch.await();
PlatformState.setCurrent(PlatformState.RUNNING);
- return;
} catch (InterruptedException e) {
lastError = e;
- return;
}
} catch (Throwable t) {
// Check if we already exited
if ("Platform.exit has been called".equals(t.getMessage())) {
PlatformState.setCurrent(PlatformState.EXITED);
lastError = t;
- return;
} else if ("Toolkit already initialized".equals(t.getMessage())) {
PlatformState.setCurrent(PlatformState.RUNNING);
- return;
} else {
// Platform initialization has failed in this case
PlatformState.setCurrent(PlatformState.EXITED);
TrackEvent.error(t.getMessage());
lastError = t;
- return;
}
}
}
diff --git a/app/src/main/java/io/xpipe/app/util/PrettyListView.java b/app/src/main/java/io/xpipe/app/util/PrettyListView.java
deleted file mode 100644
index a37214219..000000000
--- a/app/src/main/java/io/xpipe/app/util/PrettyListView.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package io.xpipe.app.util;
-
-import javafx.collections.FXCollections;
-import javafx.collections.ObservableList;
-import javafx.geometry.Insets;
-import javafx.geometry.Orientation;
-import javafx.scene.Node;
-import javafx.scene.control.ListView;
-import javafx.scene.control.MultipleSelectionModel;
-import javafx.scene.control.ScrollBar;
-
-import java.util.Set;
-
-public class PrettyListView extends ListView {
-
- private final ScrollBar vBar = new ScrollBar();
- private final ScrollBar hBar = new ScrollBar();
-
- public PrettyListView() {
- super();
- skinProperty().addListener(it -> {
- // first bind, then add new scrollbars, otherwise the new bars will be found
- bindScrollBars();
- getChildren().addAll(vBar, hBar);
- });
-
- vBar.setManaged(false);
- vBar.setOrientation(Orientation.VERTICAL);
- vBar.getStyleClass().add("pretty-scroll-bar");
- // vBar.visibleProperty().bind(vBar.visibleAmountProperty().isNotEqualTo(0));
-
- hBar.setManaged(false);
- hBar.setOrientation(Orientation.HORIZONTAL);
- hBar.getStyleClass().add("pretty-scroll-bar");
- hBar.visibleProperty().setValue(false);
- }
-
- public void disableSelection() {
- setSelectionModel(new NoSelectionModel<>());
- }
-
- private void bindScrollBars() {
- final Set nodes = lookupAll("VirtualScrollBar");
- for (Node node : nodes) {
- if (node instanceof ScrollBar bar) {
- if (bar.getOrientation().equals(Orientation.VERTICAL)) {
- bindScrollBars(vBar, bar, true);
- } else if (bar.getOrientation().equals(Orientation.HORIZONTAL)) {
- bindScrollBars(hBar, bar, false);
- }
- }
- }
- }
-
- private void bindScrollBars(ScrollBar scrollBarA, ScrollBar scrollBarB, boolean bindVisibility) {
- scrollBarA.valueProperty().bindBidirectional(scrollBarB.valueProperty());
- scrollBarA.minProperty().bindBidirectional(scrollBarB.minProperty());
- scrollBarA.maxProperty().bindBidirectional(scrollBarB.maxProperty());
- scrollBarA.visibleAmountProperty().bindBidirectional(scrollBarB.visibleAmountProperty());
- scrollBarA.unitIncrementProperty().bindBidirectional(scrollBarB.unitIncrementProperty());
- scrollBarA.blockIncrementProperty().bindBidirectional(scrollBarB.blockIncrementProperty());
- if (bindVisibility) {
- scrollBarA.visibleProperty().bind(scrollBarB.visibleProperty());
- }
- }
-
- @Override
- protected void layoutChildren() {
- super.layoutChildren();
-
- Insets insets = getInsets();
- double w = getWidth();
- double h = getHeight();
- final double prefWidth = vBar.prefWidth(-1);
- vBar.resizeRelocate(
- w - prefWidth - insets.getRight(),
- insets.getTop(),
- prefWidth,
- h - insets.getTop() - insets.getBottom());
-
- final double prefHeight = hBar.prefHeight(-1);
- hBar.resizeRelocate(
- insets.getLeft(),
- h - prefHeight - insets.getBottom(),
- w - insets.getLeft() - insets.getRight(),
- prefHeight);
- }
-
- public static class NoSelectionModel extends MultipleSelectionModel {
-
- @Override
- public ObservableList getSelectedIndices() {
- return FXCollections.emptyObservableList();
- }
-
- @Override
- public ObservableList getSelectedItems() {
- return FXCollections.emptyObservableList();
- }
-
- @Override
- public void selectIndices(int index, int... indices) {}
-
- @Override
- public void selectAll() {}
-
- @Override
- public void selectFirst() {}
-
- @Override
- public void selectLast() {}
-
- @Override
- public void clearAndSelect(int index) {}
-
- @Override
- public void select(int index) {}
-
- @Override
- public void select(T obj) {}
-
- @Override
- public void clearSelection(int index) {}
-
- @Override
- public void clearSelection() {}
-
- @Override
- public boolean isSelected(int index) {
- return false;
- }
-
- @Override
- public boolean isEmpty() {
- return true;
- }
-
- @Override
- public void selectPrevious() {}
-
- @Override
- public void selectNext() {}
- }
-}
diff --git a/app/src/main/java/io/xpipe/app/util/ProxyManagerProviderImpl.java b/app/src/main/java/io/xpipe/app/util/ProxyManagerProviderImpl.java
deleted file mode 100644
index 760ca6254..000000000
--- a/app/src/main/java/io/xpipe/app/util/ProxyManagerProviderImpl.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package io.xpipe.app.util;
-
-import io.xpipe.app.core.AppI18n;
-import io.xpipe.app.core.window.AppWindowHelper;
-import io.xpipe.core.process.ShellControl;
-import io.xpipe.core.util.ProxyManagerProvider;
-
-import javafx.scene.control.Alert;
-
-import java.util.Optional;
-
-public class ProxyManagerProviderImpl extends ProxyManagerProvider {
-
- private static boolean showAlert() {
- return AppWindowHelper.showBlockingAlert(alert -> {
- alert.setAlertType(Alert.AlertType.CONFIRMATION);
- alert.setTitle(AppI18n.get("connectorInstallationTitle"));
- alert.setHeaderText(AppI18n.get("connectorInstallationHeader"));
- alert.getDialogPane()
- .setContent(AppWindowHelper.alertContentText(AppI18n.get("connectorInstallationContent")));
- })
- .filter(buttonType -> buttonType.getButtonData().isDefaultButton())
- .isPresent();
- }
-
- @Override
- public Optional checkCompatibility(ShellControl s) {
- return Optional.empty();
- }
-
- @Override
- public boolean setup(ShellControl s) {
- return true;
- }
-}
diff --git a/app/src/main/java/io/xpipe/app/util/RdpConfig.java b/app/src/main/java/io/xpipe/app/util/RdpConfig.java
index 031445e3d..220483f3a 100644
--- a/app/src/main/java/io/xpipe/app/util/RdpConfig.java
+++ b/app/src/main/java/io/xpipe/app/util/RdpConfig.java
@@ -70,6 +70,12 @@ public class RdpConfig {
.collect(Collectors.joining("\n"));
}
+ public RdpConfig withRemoved(String key) {
+ var map = new LinkedHashMap(content);
+ map.remove(key);
+ return new RdpConfig(map);
+ }
+
public Optional get(String key) {
return Optional.ofNullable(content.get(key));
}
diff --git a/app/src/main/java/io/xpipe/app/util/Rect.java b/app/src/main/java/io/xpipe/app/util/Rect.java
new file mode 100644
index 000000000..99888c955
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/util/Rect.java
@@ -0,0 +1,9 @@
+package io.xpipe.app.util;
+
+import lombok.Value;
+
+@Value
+public class Rect {
+ int x, y;
+ int w, h;
+}
diff --git a/app/src/main/java/io/xpipe/app/util/ScanAlert.java b/app/src/main/java/io/xpipe/app/util/ScanAlert.java
index 1dfdac33c..93a5284c4 100644
--- a/app/src/main/java/io/xpipe/app/util/ScanAlert.java
+++ b/app/src/main/java/io/xpipe/app/util/ScanAlert.java
@@ -1,40 +1,23 @@
package io.xpipe.app.util;
import io.xpipe.app.comp.base.DialogComp;
-import io.xpipe.app.comp.base.ListSelectorComp;
-import io.xpipe.app.comp.store.StoreViewState;
-import io.xpipe.app.core.AppI18n;
import io.xpipe.app.ext.ScanProvider;
-import io.xpipe.app.fxcomps.Comp;
-import io.xpipe.app.fxcomps.impl.DataStoreChoiceComp;
import io.xpipe.app.issue.ErrorEvent;
-import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStoreEntry;
-import io.xpipe.app.storage.DataStoreEntryRef;
import io.xpipe.core.process.ShellControl;
import io.xpipe.core.process.ShellStoreState;
import io.xpipe.core.process.ShellTtyState;
import io.xpipe.core.store.ShellStore;
-
-import javafx.application.Platform;
-import javafx.beans.property.*;
-import javafx.beans.value.ObservableValue;
-import javafx.collections.FXCollections;
-import javafx.geometry.Insets;
-import javafx.scene.layout.StackPane;
-import javafx.scene.layout.VBox;
-import javafx.stage.Stage;
+import io.xpipe.core.store.ShellValidationContext;
+import io.xpipe.core.store.ValidationContext;
import java.util.ArrayList;
import java.util.List;
import java.util.function.BiFunction;
-import java.util.function.Function;
-
-import static javafx.scene.layout.Priority.ALWAYS;
public class ScanAlert {
- public static void showAsync(DataStoreEntry entry) {
+ public static void showAsync(DataStoreEntry entry, ValidationContext> context) {
ThreadHelper.runAsync(() -> {
var showForCon = entry == null
|| (entry.getStore() instanceof ShellStore
@@ -42,208 +25,53 @@ public class ScanAlert {
|| shellStoreState.getTtyState() == null
|| shellStoreState.getTtyState() == ShellTtyState.NONE));
if (showForCon) {
- showForShellStore(entry);
+ showForShellStore(entry, (ShellValidationContext) context);
}
});
}
- public static void showForShellStore(DataStoreEntry initial) {
- show(initial, (DataStoreEntry entry, ShellControl sc) -> {
- if (!sc.canHaveSubshells()) {
- return null;
- }
-
- if (!sc.getShellDialect().getDumbMode().supportsAnyPossibleInteraction()) {
- return null;
- }
-
- if (sc.getTtyState() != ShellTtyState.NONE) {
- return null;
- }
-
- var providers = ScanProvider.getAll();
- var applicable = new ArrayList();
- for (ScanProvider scanProvider : providers) {
- try {
- // Previous scan operation could have exited the shell
- sc.start();
- ScanProvider.ScanOperation operation = scanProvider.create(entry, sc);
- if (operation != null) {
- applicable.add(operation);
+ public static void showForShellStore(DataStoreEntry initial, ShellValidationContext context) {
+ show(
+ initial,
+ (DataStoreEntry entry, ShellControl sc) -> {
+ if (!sc.canHaveSubshells()) {
+ return null;
}
- } catch (Exception ex) {
- ErrorEvent.fromThrowable(ex).handle();
- }
- }
- return applicable;
- });
+
+ if (!sc.getShellDialect().getDumbMode().supportsAnyPossibleInteraction()) {
+ return null;
+ }
+
+ if (sc.getTtyState() != ShellTtyState.NONE) {
+ return null;
+ }
+
+ var providers = ScanProvider.getAll();
+ var applicable = new ArrayList();
+ for (ScanProvider scanProvider : providers) {
+ try {
+ // Previous scan operation could have exited the shell
+ sc.start();
+ ScanProvider.ScanOperation operation = scanProvider.create(entry, sc);
+ if (operation != null) {
+ applicable.add(operation);
+ }
+ } catch (Exception ex) {
+ ErrorEvent.fromThrowable(ex).handle();
+ }
+ }
+ return applicable;
+ },
+ context);
}
private static void show(
DataStoreEntry initialStore,
- BiFunction> applicable) {
+ BiFunction> applicable,
+ ShellValidationContext shellValidationContext) {
DialogComp.showWindow(
"scanAlertTitle",
- stage -> new Dialog(stage, initialStore != null ? initialStore.ref() : null, applicable));
- }
-
- private static class Dialog extends DialogComp {
-
- private final DataStoreEntryRef initialStore;
- private final BiFunction> applicable;
- private final Stage window;
- private final ObjectProperty> entry;
- private final ListProperty selected =
- new SimpleListProperty<>(FXCollections.observableArrayList());
- private final BooleanProperty busy = new SimpleBooleanProperty();
- private ShellControl shellControl;
-
- private Dialog(
- Stage window,
- DataStoreEntryRef entry,
- BiFunction> applicable) {
- this.window = window;
- this.initialStore = entry;
- this.entry = new SimpleObjectProperty<>(entry);
- this.applicable = applicable;
- }
-
- @Override
- protected ObservableValue busy() {
- return busy;
- }
-
- @Override
- protected void finish() {
- ThreadHelper.runFailableAsync(() -> {
- try {
- if (entry.get() == null) {
- return;
- }
-
- Platform.runLater(() -> {
- window.close();
- });
-
- BooleanScope.executeExclusive(busy, () -> {
- entry.get().get().setExpanded(true);
- var copy = new ArrayList<>(selected);
- for (var a : copy) {
- // If the user decided to remove the selected entry
- // while the scan is running, just return instantly
- if (!DataStorage.get()
- .getStoreEntriesSet()
- .contains(entry.get().get())) {
- return;
- }
-
- // Previous scan operation could have exited the shell
- shellControl.start();
-
- try {
- a.getScanner().run();
- } catch (Exception ex) {
- ErrorEvent.fromThrowable(ex).handle();
- }
- }
- });
- } finally {
- if (shellControl != null) {
- shellControl.close();
- }
- shellControl = null;
- }
- });
- }
-
- @Override
- protected Comp> pane(Comp> content) {
- return content;
- }
-
- @Override
- public Comp> content() {
- StackPane stackPane = new StackPane();
- stackPane.getStyleClass().add("scan-list");
-
- var b = new OptionsBuilder()
- .name("scanAlertChoiceHeader")
- .description("scanAlertChoiceHeaderDescription")
- .addComp(new DataStoreChoiceComp<>(
- DataStoreChoiceComp.Mode.OTHER,
- null,
- entry,
- ShellStore.class,
- store1 -> true,
- StoreViewState.get().getAllConnectionsCategory())
- .disable(new SimpleBooleanProperty(initialStore != null)))
- .name("scanAlertHeader")
- .description("scanAlertHeaderDescription")
- .addComp(Comp.of(() -> stackPane).vgrow())
- .buildComp()
- .prefWidth(500)
- .prefHeight(680)
- .apply(struc -> {
- VBox.setVgrow(struc.get().getChildren().get(1), ALWAYS);
- })
- .padding(new Insets(5, 20, 20, 20));
-
- entry.subscribe(newValue -> {
- selected.clear();
- stackPane.getChildren().clear();
-
- if (newValue == null) {
- return;
- }
-
- ThreadHelper.runFailableAsync(() -> {
- BooleanScope.executeExclusive(busy, () -> {
- if (shellControl != null) {
- shellControl.close();
- shellControl = null;
- }
-
- shellControl = newValue.getStore().control();
- shellControl.withoutLicenseCheck();
- shellControl.start();
- var a = applicable.apply(entry.get().get(), shellControl);
-
- Platform.runLater(() -> {
- if (a == null) {
- window.close();
- return;
- }
-
- selected.setAll(a.stream()
- .filter(scanOperation ->
- scanOperation.isDefaultSelected() && !scanOperation.isDisabled())
- .toList());
- Function nameFunc = (ScanProvider.ScanOperation s) -> {
- var n = AppI18n.get(s.getNameKey());
- if (s.getLicensedFeatureId() == null) {
- return n;
- }
-
- var suffix = LicenseProvider.get().getFeature(s.getLicensedFeatureId());
- return n
- + suffix.getDescriptionSuffix()
- .map(d -> " (" + d + ")")
- .orElse("");
- };
- var r = new ListSelectorComp<>(
- a,
- nameFunc,
- selected,
- scanOperation -> scanOperation.isDisabled(),
- a.size() > 3)
- .createRegion();
- stackPane.getChildren().add(r);
- });
- });
- });
- });
-
- return b;
- }
+ stage -> new ScanDialog(
+ stage, initialStore != null ? initialStore.ref() : null, applicable, shellValidationContext));
}
}
diff --git a/app/src/main/java/io/xpipe/app/util/ScanDialog.java b/app/src/main/java/io/xpipe/app/util/ScanDialog.java
new file mode 100644
index 000000000..fb28ea03a
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/util/ScanDialog.java
@@ -0,0 +1,207 @@
+package io.xpipe.app.util;
+
+import io.xpipe.app.comp.base.DialogComp;
+import io.xpipe.app.comp.base.ListSelectorComp;
+import io.xpipe.app.comp.store.StoreViewState;
+import io.xpipe.app.core.AppI18n;
+import io.xpipe.app.ext.ScanProvider;
+import io.xpipe.app.fxcomps.Comp;
+import io.xpipe.app.fxcomps.impl.DataStoreChoiceComp;
+import io.xpipe.app.issue.ErrorEvent;
+import io.xpipe.app.storage.DataStorage;
+import io.xpipe.app.storage.DataStoreEntry;
+import io.xpipe.app.storage.DataStoreEntryRef;
+import io.xpipe.core.process.ShellControl;
+import io.xpipe.core.store.ShellStore;
+import io.xpipe.core.store.ShellValidationContext;
+
+import javafx.application.Platform;
+import javafx.beans.property.*;
+import javafx.beans.value.ObservableValue;
+import javafx.collections.FXCollections;
+import javafx.geometry.Insets;
+import javafx.scene.layout.StackPane;
+import javafx.scene.layout.VBox;
+import javafx.stage.Stage;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+
+import static javafx.scene.layout.Priority.ALWAYS;
+
+class ScanDialog extends DialogComp {
+
+ private final DataStoreEntryRef initialStore;
+ private final BiFunction> applicable;
+ private final Stage window;
+ private final ObjectProperty> entry;
+ private final ListProperty selected =
+ new SimpleListProperty<>(FXCollections.observableArrayList());
+ private final BooleanProperty busy = new SimpleBooleanProperty();
+ private ShellValidationContext shellValidationContext;
+
+ ScanDialog(
+ Stage window,
+ DataStoreEntryRef entry,
+ BiFunction> applicable,
+ ShellValidationContext shellValidationContext) {
+ this.window = window;
+ this.initialStore = entry;
+ this.entry = new SimpleObjectProperty<>(entry);
+ this.applicable = applicable;
+ this.shellValidationContext = shellValidationContext;
+ }
+
+ @Override
+ protected ObservableValue busy() {
+ return busy;
+ }
+
+ @Override
+ protected void finish() {
+ ThreadHelper.runFailableAsync(() -> {
+ try {
+ if (entry.get() == null) {
+ return;
+ }
+
+ Platform.runLater(() -> {
+ window.close();
+ });
+
+ BooleanScope.executeExclusive(busy, () -> {
+ entry.get().get().setExpanded(true);
+ var copy = new ArrayList<>(selected);
+ for (var a : copy) {
+ // If the user decided to remove the selected entry
+ // while the scan is running, just return instantly
+ if (!DataStorage.get()
+ .getStoreEntriesSet()
+ .contains(entry.get().get())) {
+ return;
+ }
+
+ // Previous scan operation could have exited the shell
+ shellValidationContext.get().start();
+
+ try {
+ a.getScanner().run();
+ } catch (Throwable ex) {
+ ErrorEvent.fromThrowable(ex).handle();
+ }
+ }
+ });
+ } finally {
+ shellValidationContext.close();
+ shellValidationContext = null;
+ }
+ });
+ }
+
+ @Override
+ protected void discard() {
+ ThreadHelper.runAsync(() -> {
+ if (shellValidationContext != null) {
+ shellValidationContext.close();
+ shellValidationContext = null;
+ }
+ });
+ }
+
+ @Override
+ protected Comp> pane(Comp> content) {
+ return content;
+ }
+
+ @Override
+ public Comp> content() {
+ StackPane stackPane = new StackPane();
+ stackPane.getStyleClass().add("scan-list");
+
+ var b = new OptionsBuilder()
+ .name("scanAlertChoiceHeader")
+ .description("scanAlertChoiceHeaderDescription")
+ .addComp(new DataStoreChoiceComp<>(
+ DataStoreChoiceComp.Mode.OTHER,
+ null,
+ entry,
+ ShellStore.class,
+ store1 -> true,
+ StoreViewState.get().getAllConnectionsCategory())
+ .disable(new SimpleBooleanProperty(initialStore != null)))
+ .name("scanAlertHeader")
+ .description("scanAlertHeaderDescription")
+ .addComp(Comp.of(() -> stackPane).vgrow())
+ .buildComp()
+ .prefWidth(500)
+ .prefHeight(680)
+ .apply(struc -> {
+ VBox.setVgrow(struc.get().getChildren().get(1), ALWAYS);
+ })
+ .padding(new Insets(5, 20, 20, 20));
+
+ entry.subscribe(newValue -> {
+ onUpdate(newValue, stackPane);
+ });
+
+ return b;
+ }
+
+ private void onUpdate(DataStoreEntryRef newValue, StackPane stackPane) {
+ selected.clear();
+ stackPane.getChildren().clear();
+
+ if (newValue == null) {
+ return;
+ }
+
+ ThreadHelper.runFailableAsync(() -> {
+ BooleanScope.executeExclusive(busy, () -> {
+ if (shellValidationContext != null) {
+ shellValidationContext.close();
+ shellValidationContext = null;
+ }
+
+ shellValidationContext = new ShellValidationContext(
+ newValue.getStore().control().withoutLicenseCheck().start());
+
+ // Handle window close while connection is established
+ if (!window.isShowing()) {
+ discard();
+ return;
+ }
+
+ var a = applicable.apply(entry.get().get(), shellValidationContext.get());
+
+ Platform.runLater(() -> {
+ if (a == null) {
+ window.close();
+ return;
+ }
+
+ selected.setAll(a.stream()
+ .filter(scanOperation -> scanOperation.isDefaultSelected() && !scanOperation.isDisabled())
+ .toList());
+ Function nameFunc = (ScanProvider.ScanOperation s) -> {
+ var n = AppI18n.get(s.getNameKey());
+ if (s.getLicensedFeatureId() == null) {
+ return n;
+ }
+
+ var suffix = LicenseProvider.get().getFeature(s.getLicensedFeatureId());
+ return n
+ + suffix.getDescriptionSuffix()
+ .map(d -> " (" + d + ")")
+ .orElse("");
+ };
+ var r = new ListSelectorComp<>(
+ a, nameFunc, selected, scanOperation -> scanOperation.isDisabled(), a.size() > 3)
+ .createRegion();
+ stackPane.getChildren().add(r);
+ });
+ });
+ });
+ }
+}
diff --git a/app/src/main/java/io/xpipe/app/util/SecretRetrievalStrategy.java b/app/src/main/java/io/xpipe/app/util/SecretRetrievalStrategy.java
index 5ba54ca15..a48fe484d 100644
--- a/app/src/main/java/io/xpipe/app/util/SecretRetrievalStrategy.java
+++ b/app/src/main/java/io/xpipe/app/util/SecretRetrievalStrategy.java
@@ -1,9 +1,9 @@
package io.xpipe.app.util;
+import io.xpipe.app.ext.LocalStore;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.app.storage.DataStoreSecret;
-import io.xpipe.app.ext.LocalStore;
import io.xpipe.core.util.InPlaceSecretValue;
import com.fasterxml.jackson.annotation.JsonSubTypes;
@@ -124,17 +124,13 @@ public interface SecretRetrievalStrategy {
return new SecretQuery() {
@Override
public SecretQueryResult query(String prompt) {
- var cmd = AppPrefs.get().passwordManagerString(key);
- if (cmd == null) {
+ var pm = AppPrefs.get().externalPasswordManager().getValue();
+ if (pm == null) {
return new SecretQueryResult(null, SecretQueryState.RETRIEVAL_FAILURE);
}
- String r;
- try (var cc = new LocalStore().control().command(cmd).start()) {
- r = cc.readStdoutOrThrow();
- } catch (Exception ex) {
- ErrorEvent.fromThrowable("Unable to retrieve password with command " + cmd, ex)
- .handle();
+ var r = pm.retrievePassword(key);
+ if (r == null) {
return new SecretQueryResult(null, SecretQueryState.RETRIEVAL_FAILURE);
}
diff --git a/app/src/main/java/io/xpipe/app/util/SecretRetrievalStrategyHelper.java b/app/src/main/java/io/xpipe/app/util/SecretRetrievalStrategyHelper.java
index 6cc64defe..78c8e11f2 100644
--- a/app/src/main/java/io/xpipe/app/util/SecretRetrievalStrategyHelper.java
+++ b/app/src/main/java/io/xpipe/app/util/SecretRetrievalStrategyHelper.java
@@ -121,7 +121,6 @@ public class SecretRetrievalStrategyHelper {
case 2 -> passwordManager;
case 3 -> customCommand;
case 4 -> new SimpleObjectProperty<>(new SecretRetrievalStrategy.Prompt());
- case 5 -> new SimpleObjectProperty<>();
default -> new SimpleObjectProperty<>();
};
},
diff --git a/app/src/main/java/io/xpipe/app/util/ShellTemp.java b/app/src/main/java/io/xpipe/app/util/ShellTemp.java
index c323b1f63..5f4e99e1d 100644
--- a/app/src/main/java/io/xpipe/app/util/ShellTemp.java
+++ b/app/src/main/java/io/xpipe/app/util/ShellTemp.java
@@ -63,7 +63,8 @@ public class ShellTemp {
var systemTemp = proc.getSystemTemporaryDirectory();
if (!d.directoryExists(proc, systemTemp.toString()).executeAndCheck()
|| !checkDirectoryPermissions(proc, systemTemp.toString())) {
- throw ErrorEvent.expected(new IOException("No permissions to access system temporary directory %s".formatted(systemTemp)));
+ throw ErrorEvent.expected(
+ new IOException("No permissions to access system temporary directory %s".formatted(systemTemp)));
}
// We don't do this anymore, we hope that all the legacy directories have been cleared now
diff --git a/app/src/main/java/io/xpipe/app/util/SshLocalBridge.java b/app/src/main/java/io/xpipe/app/util/SshLocalBridge.java
index 63d973c65..3d9572bad 100644
--- a/app/src/main/java/io/xpipe/app/util/SshLocalBridge.java
+++ b/app/src/main/java/io/xpipe/app/util/SshLocalBridge.java
@@ -2,10 +2,10 @@ package io.xpipe.app.util;
import io.xpipe.app.beacon.AppBeaconServer;
import io.xpipe.app.core.AppProperties;
+import io.xpipe.app.ext.ProcessControlProvider;
import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.core.process.CommandBuilder;
import io.xpipe.core.process.OsType;
-import io.xpipe.app.ext.ProcessControlProvider;
import io.xpipe.core.process.ShellControl;
import io.xpipe.core.util.XPipeInstallation;
@@ -15,6 +15,7 @@ import lombok.Setter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.util.regex.Pattern;
@Getter
public class SshLocalBridge {
@@ -109,8 +110,7 @@ public class SshLocalBridge {
}
var config = INSTANCE.getConfig();
- var command = "\"" + XPipeInstallation.getLocalDefaultCliExecutable() + "\" ssh-launch "
- + sc.getShellDialect().environmentVariable("SSH_ORIGINAL_COMMAND");
+ var command = get().getRemoteCommand(sc);
var pidFile = bridgeDir.resolve("sshd.pid");
var content =
"""
@@ -148,6 +148,18 @@ public class SshLocalBridge {
}
}
+ private String getRemoteCommand(ShellControl sc) {
+ var command = "\"" + XPipeInstallation.getLocalDefaultCliExecutable() + "\" ssh-launch "
+ + sc.getShellDialect().environmentVariable("SSH_ORIGINAL_COMMAND");
+ var p = Pattern.compile("\".+?\\\\Users\\\\([^\\\\]+)\\\\(.+)\"");
+ var matcher = p.matcher(command);
+ if (matcher.find() && matcher.group(1).contains(" ")) {
+ return matcher.replaceFirst("\"$2\"");
+ } else {
+ return command;
+ }
+ }
+
private void updateConfig() throws IOException {
var file = Path.of(System.getProperty("user.home"), ".ssh", "config");
if (!Files.exists(file)) {
@@ -178,8 +190,12 @@ public class SshLocalBridge {
.resolve("sshd")
.toString();
} else {
- var exec = sc.executeSimpleStringCommand(sc.getShellDialect().getWhichCommand("sshd"));
- return exec;
+ var exec = CommandSupport.findProgram(sc, "sshd");
+ if (exec.isEmpty()) {
+ throw ErrorEvent.expected(new IllegalStateException(
+ "No sshd executable found in PATH. The SSH terminal bridge requires a local ssh server"));
+ }
+ return exec.get();
}
}
diff --git a/app/src/main/java/io/xpipe/app/util/TerminalLaunchRequest.java b/app/src/main/java/io/xpipe/app/util/TerminalLaunchRequest.java
new file mode 100644
index 000000000..dbba16969
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/util/TerminalLaunchRequest.java
@@ -0,0 +1,87 @@
+package io.xpipe.app.util;
+
+import io.xpipe.beacon.BeaconServerException;
+import io.xpipe.core.process.*;
+import io.xpipe.core.store.FilePath;
+import lombok.Setter;
+import lombok.Value;
+import lombok.experimental.NonFinal;
+
+import java.nio.file.Path;
+import java.util.UUID;
+import java.util.concurrent.CountDownLatch;
+
+@Value
+public class TerminalLaunchRequest {
+
+ UUID request;
+ ProcessControl processControl;
+ TerminalInitScriptConfig config;
+ String workingDirectory;
+
+ @Setter
+ @NonFinal
+ TerminalLaunchResult result;
+
+ @Setter
+ @NonFinal
+ boolean setupCompleted;
+
+
+ public Path waitForCompletion() throws BeaconServerException {
+ while (true) {
+ if (getResult() == null) {
+ ThreadHelper.sleep(10);
+ continue;
+ }
+
+ var r = getResult();
+ if (r instanceof TerminalLaunchResult.ResultFailure failure) {
+ var t = failure.getThrowable();
+ throw new BeaconServerException(t);
+ }
+
+ return ((TerminalLaunchResult.ResultSuccess) r).getTargetScript();
+ }
+ }
+
+ public CountDownLatch setupRequestAsync() {
+ var latch = new CountDownLatch(1);
+ ThreadHelper.runAsync(() -> {
+ setupRequest();
+ latch.countDown();
+ });
+ return latch;
+ }
+
+ public void setupRequest() {
+ var wd = new WorkingDirectoryFunction() {
+
+ @Override
+ public boolean isFixed() {
+ return true;
+ }
+
+ @Override
+ public boolean isSpecified() {
+ return workingDirectory != null;
+ }
+
+ @Override
+ public FilePath apply(ShellControl shellControl) {
+ if (workingDirectory == null) {
+ return null;
+ }
+
+ return new FilePath(workingDirectory);
+ }
+ };
+
+ try {
+ var file = ScriptHelper.createLocalExecScript(processControl.prepareTerminalOpen(config, wd));
+ setResult(new TerminalLaunchResult.ResultSuccess(Path.of(file.toString())));
+ } catch (Exception e) {
+ setResult(new TerminalLaunchResult.ResultFailure(e));
+ }
+ }
+}
diff --git a/app/src/main/java/io/xpipe/app/util/TerminalLaunchResult.java b/app/src/main/java/io/xpipe/app/util/TerminalLaunchResult.java
new file mode 100644
index 000000000..0e9203a3e
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/util/TerminalLaunchResult.java
@@ -0,0 +1,18 @@
+package io.xpipe.app.util;
+
+import lombok.Value;
+
+import java.nio.file.Path;
+
+public interface TerminalLaunchResult {
+
+ @Value
+ public static class ResultSuccess implements TerminalLaunchResult {
+ Path targetScript;
+ }
+
+ @Value
+ public static class ResultFailure implements TerminalLaunchResult {
+ Throwable throwable;
+ }
+}
diff --git a/app/src/main/java/io/xpipe/app/util/TerminalLauncher.java b/app/src/main/java/io/xpipe/app/util/TerminalLauncher.java
index 7f58c9a51..10c681d69 100644
--- a/app/src/main/java/io/xpipe/app/util/TerminalLauncher.java
+++ b/app/src/main/java/io/xpipe/app/util/TerminalLauncher.java
@@ -25,7 +25,8 @@ public class TerminalLauncher {
openDirect(title, command, type);
}
- public static void openDirect(String title, FailableFunction command, ExternalTerminalType type)
+ public static void openDirect(
+ String title, FailableFunction command, ExternalTerminalType type)
throws Exception {
try (var sc = LocalShell.getShell().start()) {
var script = ScriptHelper.constructTerminalInitFile(
diff --git a/app/src/main/java/io/xpipe/app/util/TerminalLauncherManager.java b/app/src/main/java/io/xpipe/app/util/TerminalLauncherManager.java
index fa71a1bc6..27d9563d2 100644
--- a/app/src/main/java/io/xpipe/app/util/TerminalLauncherManager.java
+++ b/app/src/main/java/io/xpipe/app/util/TerminalLauncherManager.java
@@ -1,153 +1,85 @@
package io.xpipe.app.util;
+import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.beacon.BeaconClientException;
import io.xpipe.beacon.BeaconServerException;
import io.xpipe.core.process.ProcessControl;
-import io.xpipe.core.process.ShellControl;
import io.xpipe.core.process.TerminalInitScriptConfig;
-import io.xpipe.core.process.WorkingDirectoryFunction;
-import io.xpipe.core.store.FilePath;
-
-import lombok.Setter;
-import lombok.Value;
-import lombok.experimental.NonFinal;
import java.nio.file.Path;
-import java.util.*;
+import java.util.LinkedHashMap;
+import java.util.SequencedMap;
+import java.util.UUID;
import java.util.concurrent.CountDownLatch;
public class TerminalLauncherManager {
- private static final SequencedMap entries = new LinkedHashMap<>();
-
- private static void prepare(
- ProcessControl processControl, TerminalInitScriptConfig config, String directory, Entry entry) {
- var workingDirectory = new WorkingDirectoryFunction() {
-
- @Override
- public boolean isFixed() {
- return true;
- }
-
- @Override
- public boolean isSpecified() {
- return directory != null;
- }
-
- @Override
- public FilePath apply(ShellControl shellControl) {
- if (directory == null) {
- return null;
- }
-
- return new FilePath(directory);
- }
- };
-
- try {
- var file = ScriptHelper.createLocalExecScript(processControl.prepareTerminalOpen(config, workingDirectory));
- entry.setResult(new ResultSuccess(Path.of(file.toString())));
- } catch (Exception e) {
- entry.setResult(new ResultFailure(e));
- }
- }
+ private static final SequencedMap entries = new LinkedHashMap<>();
public static CountDownLatch submitAsync(
- UUID request, ProcessControl processControl, TerminalInitScriptConfig config, String directory) {
+ UUID request, ProcessControl processControl, TerminalInitScriptConfig config, String directory) throws
+ BeaconClientException {
synchronized (entries) {
- var entry = new Entry(request, processControl, config, directory, null);
- entries.put(request, entry);
- var latch = new CountDownLatch(1);
- ThreadHelper.runAsync(() -> {
- prepare(processControl, config, directory, entry);
- latch.countDown();
- });
- return latch;
+ var req = entries.get(request);
+ if (req == null) {
+ req = new TerminalLaunchRequest(request, processControl, config, directory, null, false);
+ entries.put(request, req);
+ } else {
+ req.setResult(null);
+ }
+
+ return req.setupRequestAsync();
}
}
- public static Path waitForNextLaunch() throws BeaconClientException, BeaconServerException {
- Map.Entry first;
+ public static Path sshLaunchExchange() throws BeaconClientException, BeaconServerException {
+ TerminalLaunchRequest last;
synchronized (entries) {
- if (entries.isEmpty()) {
+ var all = entries.values().stream().toList();
+ last = !all.isEmpty() ? all.getLast() : null;
+ if (last == null) {
throw new BeaconClientException("Unknown launch request");
}
-
- first = entries.firstEntry();
- entries.remove(first.getKey());
}
- return waitForCompletion(first.getValue());
+ return last.waitForCompletion();
}
- public static Path waitForCompletion(UUID request) throws BeaconClientException, BeaconServerException {
- Entry e;
+ public static Path waitExchange(UUID request) throws BeaconClientException, BeaconServerException {
+ TerminalLaunchRequest req;
synchronized (entries) {
- e = entries.get(request);
+ req = entries.get(request);
}
- if (e == null) {
+ if (req == null) {
throw new BeaconClientException("Unknown launch request " + request);
}
-
- return waitForCompletion(e);
- }
-
- public static Path waitForCompletion(Entry e) throws BeaconServerException {
- while (true) {
- if (e.result == null) {
- ThreadHelper.sleep(10);
- continue;
- }
-
- synchronized (entries) {
- var r = e.getResult();
- if (r instanceof ResultFailure failure) {
- entries.remove(e.getRequest());
- var t = failure.getThrowable();
- throw new BeaconServerException(t);
- }
-
- return ((ResultSuccess) r).getTargetScript();
- }
+ if (req.isSetupCompleted() && AppPrefs.get().dontAllowTerminalRestart().get()) {
+ throw new BeaconClientException("Terminal session restarts have been disabled in the security settings");
+ }
+ if (req.isSetupCompleted()) {
+ submitAsync(req.getRequest(), req.getProcessControl(), req.getConfig(), req.getWorkingDirectory());
+ }
+ try {
+ return req.waitForCompletion();
+ } finally {
+ req.setSetupCompleted(true);
}
}
- public static Path performLaunch(UUID request) throws BeaconClientException {
+ public static Path launchExchange(UUID request) throws BeaconClientException {
synchronized (entries) {
- var e = entries.remove(request);
+ var e = entries.values().stream()
+ .filter(entry -> entry.getRequest().equals(request))
+ .findFirst()
+ .orElse(null);
if (e == null) {
throw new BeaconClientException("Unknown launch request " + request);
}
- if (!(e.result instanceof ResultSuccess)) {
+ if (!(e.getResult() instanceof TerminalLaunchResult.ResultSuccess)) {
throw new BeaconClientException("Invalid launch request state " + request);
}
- return ((ResultSuccess) e.getResult()).getTargetScript();
+ return ((TerminalLaunchResult.ResultSuccess) e.getResult()).getTargetScript();
}
}
-
- public interface Result {}
-
- @Value
- public static class Entry {
-
- UUID request;
- ProcessControl processControl;
- TerminalInitScriptConfig config;
- String workingDirectory;
-
- @Setter
- @NonFinal
- Result result;
- }
-
- @Value
- public static class ResultSuccess implements Result {
- Path targetScript;
- }
-
- @Value
- public static class ResultFailure implements Result {
- Throwable throwable;
- }
}
diff --git a/app/src/main/java/io/xpipe/app/util/TerminalView.java b/app/src/main/java/io/xpipe/app/util/TerminalView.java
new file mode 100644
index 000000000..80953d772
--- /dev/null
+++ b/app/src/main/java/io/xpipe/app/util/TerminalView.java
@@ -0,0 +1,219 @@
+package io.xpipe.app.util;
+
+import io.xpipe.app.core.AppLayoutModel;
+import io.xpipe.app.core.window.NativeWinWindowControl;
+import io.xpipe.app.issue.TrackEvent;
+import javafx.application.Platform;
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.Value;
+import lombok.experimental.FieldDefaults;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TerminalView {
+
+ @Value
+ public static class Session {
+ ProcessHandle shell;
+ ProcessHandle terminal;
+ }
+
+ @Getter
+ public static abstract class TerminalInstance {
+
+ private final ProcessHandle terminal;
+
+ protected Rect lastBounds;
+ protected boolean customBounds;
+
+ protected TerminalInstance(ProcessHandle terminal) {this.terminal = terminal;}
+
+ public abstract void show();
+
+ public abstract void minimize();
+
+ public abstract void front();
+
+ public abstract void back();
+
+ public abstract void updatePosition(Rect bounds);
+
+ public abstract void close();
+
+ public abstract Rect queryBounds();
+
+ public final void updateBoundsState() {
+ var bounds = queryBounds();
+ if (lastBounds != null && !lastBounds.equals(bounds)) {
+ customBounds = true;
+ }
+ lastBounds = bounds;
+ }
+ }
+
+ @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
+ public static final class WindowsTerminalInstance extends TerminalInstance {
+
+ NativeWinWindowControl control;
+
+ public WindowsTerminalInstance(ProcessHandle terminal, NativeWinWindowControl control) {
+ super(terminal);
+ this.control = control;
+ }
+
+ @Override
+ public void show() {
+ this.control.show();
+ front();
+ }
+
+ @Override
+ public void minimize() {
+ this.control.minimize();
+ }
+
+ @Override
+ public void front() {
+ this.control.alwaysInFront();
+ }
+
+ @Override
+ public void back() {
+ NativeWinWindowControl.MAIN_WINDOW.orderRelative(control.getWindowHandle());
+ }
+
+ @Override
+ public void updatePosition(Rect bounds) {
+ control.move(bounds);
+ this.lastBounds = bounds;
+ this.customBounds = false;
+ }
+
+ @Override
+ public void close() {
+ this.control.close();
+ }
+
+ @Override
+ public Rect queryBounds() {
+ return null;
+ }
+ }
+
+ private final List sessions = new ArrayList<>();
+ private final List terminalInstances = new ArrayList<>();
+
+ private Rect viewBounds;
+ private boolean viewActive;
+
+ public synchronized void open(long pid) {
+ var processHandle = ProcessHandle.of(pid);
+ if (processHandle.isEmpty() || !processHandle.get().isAlive()) {
+ return;
+ }
+
+ var shell = processHandle.get().parent();
+ if (shell.isEmpty()) {
+ return;
+ }
+
+ var terminal = shell.get().parent();
+ if (terminal.isEmpty()) {
+ return;
+ }
+
+ var session = new Session(shell.get(), terminal.get());
+ sessions.add(session);
+
+ var instance = terminalInstances.stream().filter(i -> i.terminal.equals(terminal.get())).findFirst();
+ if (instance.isPresent()) {
+ return;
+ }
+
+ var control = NativeWinWindowControl.byPid(terminal.get().pid());
+ if (control.isEmpty()) {
+ return;
+ }
+ terminalInstances.add(new WindowsTerminalInstance(terminal.get(), control.get()));
+ Platform.runLater(() -> {
+ AppLayoutModel.get().selectTerminal();
+ });
+ }
+
+ public synchronized void tick() {
+ sessions.removeIf(session -> !session.shell.isAlive() || !session.terminal.isAlive());
+ for (TerminalInstance terminalInstance : new ArrayList<>(terminalInstances)) {
+ var alive = terminalInstance.terminal.isAlive();
+ if (!alive) {
+ terminalInstances.remove(terminalInstance);
+ TrackEvent.withTrace("Terminal session is dead").tag("pid", terminalInstance.getTerminal().pid()).handle();
+ }
+ }
+
+ terminalInstances.forEach(terminalInstance -> {
+ terminalInstance.updateBoundsState();
+ });
+ }
+
+ public synchronized void toggleView(boolean active) {
+ if (viewActive == active) {
+ return;
+ }
+
+ this.viewActive = active;
+ if (active) {
+ terminalInstances.forEach(terminalInstance -> terminalInstance.front());
+ updatePositions();
+ }
+ }
+
+ public synchronized void onFocusLost() {
+ terminalInstances.forEach(terminalInstance -> terminalInstance.back());
+ }
+
+ public synchronized void onFocusGain() {
+ terminalInstances.forEach(terminalInstance -> terminalInstance.show());
+ }
+
+ public synchronized void onMinimize() {
+ terminalInstances.forEach(terminalInstance -> terminalInstance.minimize());
+ }
+
+ public synchronized void onClose() {
+ terminalInstances.forEach(terminalInstance -> terminalInstance.close());
+ }
+
+ private void updatePositions() {
+ terminalInstances.forEach(terminalInstance -> terminalInstance.updatePosition(viewBounds));
+ }
+
+ public void resizeView(int x, int y, int w, int h) {
+ this.viewBounds = new Rect(x,y,w,h);
+ if (viewActive) {
+ updatePositions();
+ }
+ }
+
+ public void clickView() {
+ updatePositions();
+ }
+
+ private static TerminalView INSTANCE;
+
+ public static void init() {
+ var instance = new TerminalView();
+ ThreadHelper.createPlatformThread("terminal-view", true, () -> {
+ while (true) {
+ instance.tick();
+ ThreadHelper.sleep(1000);
+ }
+ }).start();
+ INSTANCE = instance;
+ }
+
+ public static TerminalView get() {
+ return INSTANCE;
+ }
+}
diff --git a/app/src/main/java/io/xpipe/app/util/UserConfig.java b/app/src/main/java/io/xpipe/app/util/UserConfig.java
deleted file mode 100644
index a81691adc..000000000
--- a/app/src/main/java/io/xpipe/app/util/UserConfig.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package io.xpipe.app.util;
-
-public class UserConfig {}
diff --git a/app/src/main/java/io/xpipe/app/util/Validatable.java b/app/src/main/java/io/xpipe/app/util/Validatable.java
deleted file mode 100644
index 27838d582..000000000
--- a/app/src/main/java/io/xpipe/app/util/Validatable.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package io.xpipe.app.util;
-
-public interface Validatable {
-
- Validator getValidator();
-}
diff --git a/app/src/main/java/io/xpipe/app/util/WindowsRegistry.java b/app/src/main/java/io/xpipe/app/util/WindowsRegistry.java
index a2aca1d11..fc7f257b5 100644
--- a/app/src/main/java/io/xpipe/app/util/WindowsRegistry.java
+++ b/app/src/main/java/io/xpipe/app/util/WindowsRegistry.java
@@ -104,6 +104,22 @@ public abstract class WindowsRegistry {
public static class Remote extends WindowsRegistry {
+ public static Optional readOutputValue(String original) {
+ // Output has the following format:
+ // \n\n\n\t\t
+ if (original.contains("\t")) {
+ String[] parsed = original.split("\t");
+ return Optional.of(parsed[parsed.length - 1]);
+ }
+
+ if (original.contains(" ")) {
+ String[] parsed = original.split(" ");
+ return Optional.of(parsed[parsed.length - 1]);
+ }
+
+ return Optional.empty();
+ }
+
private final ShellControl shellControl;
public Remote(ShellControl shellControl) {
@@ -150,19 +166,7 @@ public abstract class WindowsRegistry {
return Optional.empty();
}
- // Output has the following format:
- // \n\n\n\t\t
- if (output.get().contains("\t")) {
- String[] parsed = output.get().split("\t");
- return Optional.of(parsed[parsed.length - 1]);
- }
-
- if (output.get().contains(" ")) {
- String[] parsed = output.get().split(" ");
- return Optional.of(parsed[parsed.length - 1]);
- }
-
- return Optional.empty();
+ return readOutputValue(output.get());
}
@Override
diff --git a/app/src/main/java/module-info.java b/app/src/main/java/module-info.java
index 8826cf215..3f714f216 100644
--- a/app/src/main/java/module-info.java
+++ b/app/src/main/java/module-info.java
@@ -7,13 +7,11 @@ import io.xpipe.app.issue.EventHandlerImpl;
import io.xpipe.app.storage.DataStateProviderImpl;
import io.xpipe.app.util.AppJacksonModule;
import io.xpipe.app.util.LicenseProvider;
-import io.xpipe.app.util.ProxyManagerProviderImpl;
import io.xpipe.app.util.TerminalLauncher;
import io.xpipe.beacon.BeaconInterface;
import io.xpipe.core.util.DataStateProvider;
import io.xpipe.core.util.ModuleLayerLoader;
import io.xpipe.core.util.ProxyFunction;
-import io.xpipe.core.util.ProxyManagerProvider;
import com.fasterxml.jackson.databind.Module;
import org.slf4j.spi.SLF4JServiceProvider;
@@ -45,6 +43,7 @@ open module io.xpipe.app {
exports io.xpipe.app.browser.fs;
exports io.xpipe.app.browser.file;
exports io.xpipe.app.core.window;
+ exports io.xpipe.app.resources;
requires com.sun.jna;
requires com.sun.jna.platform;
@@ -87,7 +86,6 @@ open module io.xpipe.app {
// Required runtime modules
requires jdk.charsets;
requires jdk.crypto.cryptoki;
- requires jdk.crypto.ec;
requires jdk.localedata;
requires jdk.accessibility;
requires org.kordamp.ikonli.material2;
@@ -124,8 +122,6 @@ open module io.xpipe.app {
ScanProvider.Loader;
provides DataStateProvider with
DataStateProviderImpl;
- provides ProxyManagerProvider with
- ProxyManagerProviderImpl;
provides SLF4JServiceProvider with
AppLogs.Slf4jProvider;
provides EventHandler with
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/default_folder_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/default_folder_opened-24.png
deleted file mode 100644
index 51cc58ad1..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/default_folder_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/default_root_folder_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/default_root_folder_opened-24.png
deleted file mode 100644
index ee38d7179..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/default_root_folder_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_android_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_android_opened-24.png
deleted file mode 100644
index 6ded0f2ba..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_android_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_api_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_api_opened-24.png
deleted file mode 100644
index 222f4a2f5..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_api_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_app_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_app_opened-24.png
deleted file mode 100644
index bfc90d0e9..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_app_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_arangodb_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_arangodb_opened-24.png
deleted file mode 100644
index 8f5ff14a5..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_arangodb_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_asset_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_asset_opened-24.png
deleted file mode 100644
index 73ba8aaf2..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_asset_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_audio_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_audio_opened-24.png
deleted file mode 100644
index 7fd9c2c13..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_audio_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_aurelia_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_aurelia_opened-24.png
deleted file mode 100644
index b59dd56e8..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_aurelia_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_aws_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_aws_opened-24.png
deleted file mode 100644
index 3f54b850b..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_aws_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_azure_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_azure_opened-24.png
deleted file mode 100644
index a931fc7a9..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_azure_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_azurepipelines_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_azurepipelines_opened-24.png
deleted file mode 100644
index 3a230544e..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_azurepipelines_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_binary_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_binary_opened-24.png
deleted file mode 100644
index 39dafdb1c..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_binary_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bloc_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bloc_opened-24.png
deleted file mode 100644
index 8492150c1..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bloc_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_blueprint_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_blueprint_opened-24.png
deleted file mode 100644
index b0025986a..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_blueprint_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bot_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bot_opened-24.png
deleted file mode 100644
index 11b4c12b9..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bot_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bower_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bower_opened-24.png
deleted file mode 100644
index ed6965ebc..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bower_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_buildkite_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_buildkite_opened-24.png
deleted file mode 100644
index 031b1938f..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_buildkite_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cake_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cake_opened-24.png
deleted file mode 100644
index 8d3bf737d..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cake_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_certificate_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_certificate_opened-24.png
deleted file mode 100644
index 3b45aa87e..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_certificate_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_chef_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_chef_opened-24.png
deleted file mode 100644
index afad82d6d..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_chef_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_circleci_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_circleci_opened-24.png
deleted file mode 100644
index a1c1544f5..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_circleci_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cli_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cli_opened-24.png
deleted file mode 100644
index 87884711f..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cli_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_client_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_client_opened-24.png
deleted file mode 100644
index 9c3134a01..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_client_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cmake_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cmake_opened-24.png
deleted file mode 100644
index 07d590ee7..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cmake_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_common_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_common_opened-24.png
deleted file mode 100644
index 5e653467e..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_common_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_component_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_component_opened-24.png
deleted file mode 100644
index de1c60fa5..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_component_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_composer_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_composer_opened-24.png
deleted file mode 100644
index 6a6f98bd8..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_composer_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_config_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_config_opened-24.png
deleted file mode 100644
index 276fc7c69..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_config_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_controller_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_controller_opened-24.png
deleted file mode 100644
index bd10590e0..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_controller_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_coverage_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_coverage_opened-24.png
deleted file mode 100644
index 5a3d86851..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_coverage_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_css_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_css_opened-24.png
deleted file mode 100644
index debfa3c0b..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_css_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cubit_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cubit_opened-24.png
deleted file mode 100644
index 19c989c4e..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cubit_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cypress_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cypress_opened-24.png
deleted file mode 100644
index 11e448912..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cypress_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dapr_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dapr_opened-24.png
deleted file mode 100644
index adb6ee03c..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dapr_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_datadog_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_datadog_opened-24.png
deleted file mode 100644
index 45f59bbc4..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_datadog_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_db_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_db_opened-24.png
deleted file mode 100644
index ab65e3ea5..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_db_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_debian_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_debian_opened-24.png
deleted file mode 100644
index f8db62af8..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_debian_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dependabot_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dependabot_opened-24.png
deleted file mode 100644
index b980db3f6..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dependabot_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_devcontainer_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_devcontainer_opened-24.png
deleted file mode 100644
index 239845c11..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_devcontainer_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dist_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dist_opened-24.png
deleted file mode 100644
index 7fc903c7d..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dist_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_docker_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_docker_opened-24.png
deleted file mode 100644
index 2e368ae3d..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_docker_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_docs_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_docs_opened-24.png
deleted file mode 100644
index dbee04087..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_docs_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_e2e_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_e2e_opened-24.png
deleted file mode 100644
index 33d0f9c05..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_e2e_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_elasticbeanstalk_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_elasticbeanstalk_opened-24.png
deleted file mode 100644
index 9f892f284..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_elasticbeanstalk_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_electron_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_electron_opened-24.png
deleted file mode 100644
index 05e043cff..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_electron_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_expo_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_expo_opened-24.png
deleted file mode 100644
index 35a47cfcd..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_expo_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_favicon_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_favicon_opened-24.png
deleted file mode 100644
index 9ca7567a4..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_favicon_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_flow_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_flow_opened-24.png
deleted file mode 100644
index 87f120f9f..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_flow_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_fonts_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_fonts_opened-24.png
deleted file mode 100644
index 7308e30f3..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_fonts_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gcp_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gcp_opened-24.png
deleted file mode 100644
index 90a54ee9f..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gcp_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_git_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_git_opened-24.png
deleted file mode 100644
index 3c502f8db..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_git_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_github_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_github_opened-24.png
deleted file mode 100644
index ffa11fd5d..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_github_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gitlab_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gitlab_opened-24.png
deleted file mode 100644
index 209322f6d..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gitlab_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gradle_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gradle_opened-24.png
deleted file mode 100644
index 8f9b9f379..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gradle_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_graphql_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_graphql_opened-24.png
deleted file mode 100644
index 159ebf08c..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_graphql_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_grunt_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_grunt_opened-24.png
deleted file mode 100644
index b3a660cfc..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_grunt_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gulp_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gulp_opened-24.png
deleted file mode 100644
index db014ede1..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gulp_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_haxelib_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_haxelib_opened-24.png
deleted file mode 100644
index 0698ed985..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_haxelib_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_helper_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_helper_opened-24.png
deleted file mode 100644
index 2143d8d53..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_helper_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_hook_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_hook_opened-24.png
deleted file mode 100644
index 7356d3788..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_hook_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_husky_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_husky_opened-24.png
deleted file mode 100644
index abbb917d9..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_husky_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_idea_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_idea_opened-24.png
deleted file mode 100644
index cf944d40e..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_idea_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_images_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_images_opened-24.png
deleted file mode 100644
index 2d0052bc6..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_images_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_include_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_include_opened-24.png
deleted file mode 100644
index fffc8fa19..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_include_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_interfaces_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_interfaces_opened-24.png
deleted file mode 100644
index 0d8a7ee45..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_interfaces_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_ios_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_ios_opened-24.png
deleted file mode 100644
index e93706a92..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_ios_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_js_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_js_opened-24.png
deleted file mode 100644
index 61b1bd684..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_js_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_json_official_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_json_official_opened-24.png
deleted file mode 100644
index 4c9e95aa3..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_json_official_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_json_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_json_opened-24.png
deleted file mode 100644
index f9f0ebe06..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_json_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_kubernetes_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_kubernetes_opened-24.png
deleted file mode 100644
index 08fd1a173..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_kubernetes_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_less_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_less_opened-24.png
deleted file mode 100644
index 37f81e6c8..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_less_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_library_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_library_opened-24.png
deleted file mode 100644
index 0f46310bc..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_library_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_cypress_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_cypress_opened-24.png
deleted file mode 100644
index b2bdd2a3c..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_cypress_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_electron_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_electron_opened-24.png
deleted file mode 100644
index d23d7e66c..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_electron_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_expo_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_expo_opened-24.png
deleted file mode 100644
index 57ccef368..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_expo_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_fonts_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_fonts_opened-24.png
deleted file mode 100644
index 41fd3433b..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_fonts_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_gradle_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_gradle_opened-24.png
deleted file mode 100644
index 0fdd949f3..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_gradle_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_meteor_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_meteor_opened-24.png
deleted file mode 100644
index 25e168834..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_meteor_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_mysql_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_mysql_opened-24.png
deleted file mode 100644
index 0240810bc..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_mysql_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_node_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_node_opened-24.png
deleted file mode 100644
index 92aa4b4eb..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_node_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_redux_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_redux_opened-24.png
deleted file mode 100644
index ee10b7a05..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_redux_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_sass_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_sass_opened-24.png
deleted file mode 100644
index 595e25be9..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_sass_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_linux_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_linux_opened-24.png
deleted file mode 100644
index 34db943e9..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_linux_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_locale_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_locale_opened-24.png
deleted file mode 100644
index f8f6d6e07..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_locale_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_log_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_log_opened-24.png
deleted file mode 100644
index 7a388eef9..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_log_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_macos_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_macos_opened-24.png
deleted file mode 100644
index 2beef8dd1..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_macos_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mariadb_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mariadb_opened-24.png
deleted file mode 100644
index 63056d43a..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mariadb_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_maven_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_maven_opened-24.png
deleted file mode 100644
index 4a50e4387..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_maven_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_memcached_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_memcached_opened-24.png
deleted file mode 100644
index 3e6759813..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_memcached_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_meteor_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_meteor_opened-24.png
deleted file mode 100644
index cfa29650d..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_meteor_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_middleware_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_middleware_opened-24.png
deleted file mode 100644
index 2a49c1bad..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_middleware_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_minikube_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_minikube_opened-24.png
deleted file mode 100644
index e856a64f1..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_minikube_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mjml_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mjml_opened-24.png
deleted file mode 100644
index 0720060cb..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mjml_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mock_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mock_opened-24.png
deleted file mode 100644
index 947a06b5b..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mock_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_model_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_model_opened-24.png
deleted file mode 100644
index 0f9b2a2dc..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_model_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_module_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_module_opened-24.png
deleted file mode 100644
index f97fb9e64..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_module_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mongodb_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mongodb_opened-24.png
deleted file mode 100644
index a6627091c..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mongodb_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mysql_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mysql_opened-24.png
deleted file mode 100644
index 4d57b89ce..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mysql_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_next_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_next_opened-24.png
deleted file mode 100644
index 1ce1254ea..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_next_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nginx_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nginx_opened-24.png
deleted file mode 100644
index f3bd3e146..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nginx_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nix_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nix_opened-24.png
deleted file mode 100644
index 6501c222f..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nix_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_node_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_node_opened-24.png
deleted file mode 100644
index 47126672b..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_node_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_notification_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_notification_opened-24.png
deleted file mode 100644
index 44ae6305c..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_notification_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nuget_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nuget_opened-24.png
deleted file mode 100644
index 3684f16c9..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nuget_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nuxt_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nuxt_opened-24.png
deleted file mode 100644
index 3d1fb5567..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nuxt_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_package_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_package_opened-24.png
deleted file mode 100644
index 48e08fd57..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_package_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_paket_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_paket_opened-24.png
deleted file mode 100644
index 2484d74ca..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_paket_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_php_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_php_opened-24.png
deleted file mode 100644
index f00d2f540..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_php_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_platformio_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_platformio_opened-24.png
deleted file mode 100644
index 7b1567495..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_platformio_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_plugin_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_plugin_opened-24.png
deleted file mode 100644
index 8561bc538..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_plugin_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_prisma_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_prisma_opened-24.png
deleted file mode 100644
index af5aa9643..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_prisma_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_private_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_private_opened-24.png
deleted file mode 100644
index 65f9855b6..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_private_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_public_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_public_opened-24.png
deleted file mode 100644
index 46857aa91..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_public_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_python_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_python_opened-24.png
deleted file mode 100644
index 9aa7ecca2..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_python_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_ravendb_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_ravendb_opened-24.png
deleted file mode 100644
index 890145fe8..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_ravendb_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_redis_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_redis_opened-24.png
deleted file mode 100644
index 61c0393a5..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_redis_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_redux_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_redux_opened-24.png
deleted file mode 100644
index d380b159c..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_redux_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_route_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_route_opened-24.png
deleted file mode 100644
index 55f19053d..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_route_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_sass_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_sass_opened-24.png
deleted file mode 100644
index 40db5c209..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_sass_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_script_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_script_opened-24.png
deleted file mode 100644
index c301473c5..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_script_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_server_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_server_opened-24.png
deleted file mode 100644
index 84bb108ef..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_server_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_services_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_services_opened-24.png
deleted file mode 100644
index 159710337..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_services_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_shared_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_shared_opened-24.png
deleted file mode 100644
index 7daab2457..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_shared_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_src_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_src_opened-24.png
deleted file mode 100644
index bd9d4f90b..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_src_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_sso_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_sso_opened-24.png
deleted file mode 100644
index 5b80f699f..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_sso_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_story_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_story_opened-24.png
deleted file mode 100644
index 43f7eccef..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_story_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_style_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_style_opened-24.png
deleted file mode 100644
index faa5706b5..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_style_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_tauri_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_tauri_opened-24.png
deleted file mode 100644
index 56417713e..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_tauri_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_temp_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_temp_opened-24.png
deleted file mode 100644
index 06af86b6f..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_temp_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_template_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_template_opened-24.png
deleted file mode 100644
index 672c8b84d..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_template_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_test_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_test_opened-24.png
deleted file mode 100644
index 61ee3c5f5..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_test_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_theme_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_theme_opened-24.png
deleted file mode 100644
index b37a3a7ac..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_theme_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_tools_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_tools_opened-24.png
deleted file mode 100644
index f134883f8..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_tools_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_travis_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_travis_opened-24.png
deleted file mode 100644
index a51adc823..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_travis_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_trunk_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_trunk_opened-24.png
deleted file mode 100644
index 67352ea10..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_trunk_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typescript_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typescript_opened-24.png
deleted file mode 100644
index ee0689546..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typescript_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typings2_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typings2_opened-24.png
deleted file mode 100644
index e45011154..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typings2_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typings_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typings_opened-24.png
deleted file mode 100644
index c00f3f252..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typings_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vagrant_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vagrant_opened-24.png
deleted file mode 100644
index 8aa75895c..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vagrant_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_video_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_video_opened-24.png
deleted file mode 100644
index bac8cd997..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_video_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_view_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_view_opened-24.png
deleted file mode 100644
index 743f7dc15..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_view_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vs2_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vs2_opened-24.png
deleted file mode 100644
index f4625bec6..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vs2_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vs_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vs_opened-24.png
deleted file mode 100644
index 14190e098..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vs_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode2_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode2_opened-24.png
deleted file mode 100644
index 624f7bb7c..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode2_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode3_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode3_opened-24.png
deleted file mode 100644
index b96c0125c..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode3_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_opened-24.png
deleted file mode 100644
index 27f814782..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test2_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test2_opened-24.png
deleted file mode 100644
index b5202ffca..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test2_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test3_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test3_opened-24.png
deleted file mode 100644
index ffc6b08bb..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test3_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test_opened-24.png
deleted file mode 100644
index 6b42adac2..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_webpack_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_webpack_opened-24.png
deleted file mode 100644
index 26d5d65bc..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_webpack_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_windows_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_windows_opened-24.png
deleted file mode 100644
index e3ff7f829..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_windows_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_www_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_www_opened-24.png
deleted file mode 100644
index a0bc78a44..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_www_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_yarn_opened-24.png b/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_yarn_opened-24.png
deleted file mode 100644
index b13532c02..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_yarn_opened-24.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/default_file-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/default_file-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/default_file-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/default_file-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/default_folder-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/default_folder-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/default_folder-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/default_folder-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/default_root_folder-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/default_root_folder-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/default_root_folder-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/default_root_folder-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_access-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_access-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_access-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_access-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_access2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_access2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_access2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_access2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_actionscript-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_actionscript-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_actionscript-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_actionscript-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_actionscript2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_actionscript2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_actionscript2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_actionscript2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ada-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ada-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ada-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ada-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_advpl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_advpl-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_advpl-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_advpl-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_affectscript-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_affectscript-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_affectscript-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_affectscript-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_affinitydesigner-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_affinitydesigner-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_affinitydesigner-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_affinitydesigner-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_affinityphoto-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_affinityphoto-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_affinityphoto-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_affinityphoto-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_affinitypublisher-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_affinitypublisher-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_affinitypublisher-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_affinitypublisher-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ai-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ai-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ai-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ai-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ai2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ai2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ai2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ai2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_al-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_al-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_al-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_al-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_al_dal-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_al_dal-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_al_dal-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_al_dal-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_allcontributors-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_allcontributors-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_allcontributors-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_allcontributors-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_angular-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_angular-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_angular-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_angular-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ansible-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ansible-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ansible-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ansible-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_antlr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_antlr-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_antlr-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_antlr-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_anyscript-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_anyscript-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_anyscript-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_anyscript-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_apache-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_apache-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_apache-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_apache-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_apex-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_apex-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_apex-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_apex-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_api_extractor-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_api_extractor-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_api_extractor-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_api_extractor-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_apib-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_apib-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_apib-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_apib-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_apib2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_apib2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_apib2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_apib2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_apl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_apl-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_apl-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_apl-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_applescript-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_applescript-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_applescript-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_applescript-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_appscript-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_appscript-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_appscript-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_appscript-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_appsemble-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_appsemble-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_appsemble-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_appsemble-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_appveyor-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_appveyor-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_appveyor-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_appveyor-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_arduino-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_arduino-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_arduino-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_arduino-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_asciidoc-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_asciidoc-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_asciidoc-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_asciidoc-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_asp-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_asp-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_asp-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_asp-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_aspx-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_aspx-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_aspx-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_aspx-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_assembly-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_assembly-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_assembly-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_assembly-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_astro-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_astro-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_astro-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_astro-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_astroconfig-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_astroconfig-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_astroconfig-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_astroconfig-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ats-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ats-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ats-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ats-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_audio-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_audio-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_audio-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_audio-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_aurelia-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_aurelia-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_aurelia-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_aurelia-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_autohotkey-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_autohotkey-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_autohotkey-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_autohotkey-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_autoit-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_autoit-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_autoit-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_autoit-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_avif-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_avif-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_avif-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_avif-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_avro-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_avro-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_avro-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_avro-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_awk-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_awk-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_awk-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_awk-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_aws-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_aws-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_aws-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_aws-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_azure-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_azure-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_azure-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_azure-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_azurepipelines-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_azurepipelines-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_azurepipelines-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_azurepipelines-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_babel-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_babel-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_babel-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_babel-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_babel2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_babel2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_babel2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_babel2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ballerina-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ballerina-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ballerina-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ballerina-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bat-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bat-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bat-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bat-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bats-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bats-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bats-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bats-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bazaar-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bazaar-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bazaar-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bazaar-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bazel-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bazel-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bazel-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bazel-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bazel_ignore-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bazel_ignore-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bazel_ignore-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bazel_ignore-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bazel_version-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bazel_version-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bazel_version-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bazel_version-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_befunge-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_befunge-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_befunge-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_befunge-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bicep-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bicep-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bicep-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bicep-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_biml-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_biml-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_biml-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_biml-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_binary-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_binary-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_binary-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_binary-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bitbucketpipeline-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bitbucketpipeline-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bitbucketpipeline-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bitbucketpipeline-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bithound-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bithound-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bithound-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bithound-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_blade-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_blade-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_blade-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_blade-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_blitzbasic-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_blitzbasic-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_blitzbasic-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_blitzbasic-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bolt-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bolt-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bolt-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bolt-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bosque-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bosque-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bosque-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bosque-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bower-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bower-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bower-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bower-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bower2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bower2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bower2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bower2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_browserslist-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_browserslist-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_browserslist-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_browserslist-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_buckbuild-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_buckbuild-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_buckbuild-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_buckbuild-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bun-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bun-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bun-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bun-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bundler-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bundler-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bundler-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bundler-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bunfig-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bunfig-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bunfig-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_bunfig-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_c-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_c-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_c-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_c-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_c2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_c2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_c2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_c2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_c3-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_c3-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_c3-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_c3-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_c_al-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_c_al-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_c_al-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_c_al-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cabal-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cabal-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cabal-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cabal-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_caddy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_caddy-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_caddy-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_caddy-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cake-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cake-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cake-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cake-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cakephp-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cakephp-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cakephp-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cakephp-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_capacitor-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_capacitor-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_capacitor-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_capacitor-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cargo-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cargo-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cargo-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cargo-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_casc-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_casc-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_casc-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_casc-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cddl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cddl-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cddl-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cddl-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cert-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cert-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cert-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cert-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ceylon-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ceylon-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ceylon-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ceylon-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cf-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cf-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cf-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cf-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cf2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cf2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cf2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cf2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cfc-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cfc-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cfc-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cfc-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cfc2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cfc2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cfc2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cfc2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cfm-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cfm-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cfm-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cfm-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cfm2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cfm2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cfm2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cfm2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cheader-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cheader-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cheader-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cheader-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_chef-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_chef-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_chef-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_chef-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_chef_cookbook-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_chef_cookbook-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_chef_cookbook-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_chef_cookbook-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_circleci-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_circleci-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_circleci-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_circleci-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_class-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_class-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_class-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_class-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_clojure-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_clojure-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_clojure-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_clojure-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_clojurescript-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_clojurescript-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_clojurescript-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_clojurescript-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cloudfoundry-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cloudfoundry-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cloudfoundry-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cloudfoundry-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cmake-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cmake-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cmake-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cmake-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cobol-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cobol-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cobol-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cobol-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codacy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_codacy-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codacy-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_codacy-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codeclimate-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_codeclimate-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codeclimate-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_codeclimate-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codecov-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_codecov-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codecov-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_codecov-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codekit-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_codekit-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codekit-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_codekit-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codeowners-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_codeowners-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codeowners-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_codeowners-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codeql-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_codeql-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codeql-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_codeql-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_coffeelint-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_coffeelint-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_coffeelint-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_coffeelint-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_coffeescript-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_coffeescript-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_coffeescript-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_coffeescript-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_commitizen-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_commitizen-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_commitizen-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_commitizen-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_commitlint-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_commitlint-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_commitlint-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_commitlint-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_compass-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_compass-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_compass-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_compass-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_composer-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_composer-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_composer-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_composer-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_conan-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_conan-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_conan-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_conan-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_conda-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_conda-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_conda-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_conda-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_config-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_config-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_config-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_config-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_confluence-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_confluence-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_confluence-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_confluence-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_coveralls-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_coveralls-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_coveralls-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_coveralls-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cpp-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cpp-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cpp-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cpp-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cpp2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cpp2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cpp2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cpp2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cpp3-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cpp3-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cpp3-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cpp3-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cppheader-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cppheader-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cppheader-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cppheader-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_crowdin-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_crowdin-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_crowdin-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_crowdin-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_crystal-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_crystal-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_crystal-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_crystal-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_csharp-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_csharp-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_csharp-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_csharp-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_csharp2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_csharp2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_csharp2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_csharp2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cspell-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cspell-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cspell-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cspell-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_csproj-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_csproj-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_csproj-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_csproj-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_css-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_css-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_css-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_css-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_csscomb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_csscomb-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_csscomb-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_csscomb-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_csslint-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_csslint-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_csslint-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_csslint-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cssmap-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cssmap-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cssmap-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cssmap-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cucumber-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cucumber-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cucumber-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cucumber-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cuda-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cuda-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cuda-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cuda-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cvs-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cvs-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cvs-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cvs-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cypress-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cypress-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cypress-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cypress-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cypress_spec-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cypress_spec-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cypress_spec-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cypress_spec-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cython-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cython-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cython-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_cython-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dal-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dal-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dal-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dal-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_darcs-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_darcs-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_darcs-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_darcs-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dartlang-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dartlang-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dartlang-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dartlang-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dartlang_generated-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dartlang_generated-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dartlang_generated-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dartlang_generated-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dartlang_ignore-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dartlang_ignore-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dartlang_ignore-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dartlang_ignore-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_datadog-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_datadog-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_datadog-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_datadog-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_db-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_db-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_db-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_db-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_delphi-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_delphi-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_delphi-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_delphi-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_deno-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_deno-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_deno-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_deno-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dependabot-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dependabot-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dependabot-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dependabot-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dependencies-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dependencies-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dependencies-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dependencies-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_devcontainer-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_devcontainer-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_devcontainer-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_devcontainer-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dhall-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dhall-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dhall-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dhall-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_diff-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_diff-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_diff-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_diff-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_django-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_django-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_django-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_django-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dlang-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dlang-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dlang-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dlang-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_docker-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_docker-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_docker-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_docker-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_docker2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_docker2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_docker2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_docker2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dockertest-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dockertest-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dockertest-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dockertest-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dockertest2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dockertest2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dockertest2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dockertest2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_docpad-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_docpad-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_docpad-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_docpad-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_docz-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_docz-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_docz-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_docz-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dojo-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dojo-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dojo-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dojo-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_doppler-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_doppler-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_doppler-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_doppler-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dotjs-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dotjs-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dotjs-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dotjs-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_doxygen-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_doxygen-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_doxygen-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_doxygen-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_drawio-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_drawio-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_drawio-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_drawio-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_drone-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_drone-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_drone-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_drone-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_drools-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_drools-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_drools-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_drools-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dustjs-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dustjs-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dustjs-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dustjs-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dvc-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dvc-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dvc-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dvc-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dylan-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dylan-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dylan-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_dylan-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_earthly-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_earthly-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_earthly-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_earthly-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eas-metadata-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_eas-metadata-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eas-metadata-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_eas-metadata-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_edge-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_edge-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_edge-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_edge-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_edge2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_edge2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_edge2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_edge2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_editorconfig-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_editorconfig-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_editorconfig-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_editorconfig-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eex-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_eex-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eex-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_eex-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ejs-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ejs-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ejs-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ejs-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_elastic-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_elastic-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_elastic-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_elastic-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_elasticbeanstalk-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_elasticbeanstalk-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_elasticbeanstalk-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_elasticbeanstalk-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eleventy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_eleventy-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eleventy-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_eleventy-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eleventy2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_eleventy2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eleventy2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_eleventy2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_elixir-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_elixir-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_elixir-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_elixir-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_elm-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_elm-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_elm-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_elm-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_elm2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_elm2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_elm2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_elm2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_emacs-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_emacs-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_emacs-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_emacs-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ember-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ember-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ember-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ember-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ensime-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ensime-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ensime-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ensime-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eps-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_eps-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eps-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_eps-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_erb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_erb-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_erb-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_erb-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_erlang-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_erlang-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_erlang-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_erlang-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_erlang2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_erlang2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_erlang2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_erlang2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_esbuild-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_esbuild-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_esbuild-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_esbuild-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eslint-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_eslint-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eslint-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_eslint-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eslint2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_eslint2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eslint2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_eslint2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_esphome-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_esphome-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_esphome-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_esphome-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_excel-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_excel-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_excel-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_excel-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_excel2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_excel2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_excel2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_excel2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_expo-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_expo-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_expo-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_expo-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_falcon-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_falcon-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_falcon-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_falcon-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fantasticon-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fantasticon-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fantasticon-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fantasticon-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fauna-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fauna-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fauna-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fauna-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_favicon-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_favicon-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_favicon-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_favicon-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fbx-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fbx-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fbx-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fbx-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_firebase-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_firebase-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_firebase-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_firebase-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_firebasehosting-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_firebasehosting-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_firebasehosting-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_firebasehosting-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_firestore-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_firestore-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_firestore-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_firestore-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fitbit-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fitbit-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fitbit-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fitbit-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fla-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fla-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fla-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fla-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_flareact-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_flareact-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_flareact-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_flareact-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_flash-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_flash-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_flash-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_flash-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_floobits-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_floobits-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_floobits-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_floobits-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_flow-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_flow-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_flow-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_flow-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_flutter-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_flutter-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_flutter-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_flutter-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_flutter_package-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_flutter_package-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_flutter_package-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_flutter_package-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_font-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_font-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_font-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_font-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_formkit-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_formkit-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_formkit-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_formkit-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fortran-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fortran-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fortran-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fortran-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fossa-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fossa-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fossa-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fossa-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fossil-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fossil-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fossil-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fossil-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_freemarker-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_freemarker-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_freemarker-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_freemarker-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fsharp-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fsharp-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fsharp-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fsharp-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fsharp2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fsharp2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fsharp2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fsharp2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fsproj-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fsproj-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fsproj-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fsproj-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fthtml-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fthtml-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fthtml-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fthtml-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_funding-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_funding-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_funding-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_funding-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fusebox-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fusebox-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fusebox-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_fusebox-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_galen-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_galen-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_galen-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_galen-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_galen2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_galen2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_galen2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_galen2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gamemaker-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gamemaker-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gamemaker-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gamemaker-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gamemaker2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gamemaker2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gamemaker2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gamemaker2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gamemaker81-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gamemaker81-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gamemaker81-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gamemaker81-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gatsby-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gatsby-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gatsby-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gatsby-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gcloud-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gcloud-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gcloud-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gcloud-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gcode-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gcode-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gcode-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gcode-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gdscript-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gdscript-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gdscript-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gdscript-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_genstat-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_genstat-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_genstat-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_genstat-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_git-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_git-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_git-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_git-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_git2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_git2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_git2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_git2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gitlab-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gitlab-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gitlab-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gitlab-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gitpod-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gitpod-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gitpod-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gitpod-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_glide-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_glide-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_glide-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_glide-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_glitter-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_glitter-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_glitter-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_glitter-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_glsl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_glsl-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_glsl-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_glsl-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_glyphs-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_glyphs-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_glyphs-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_glyphs-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gnu-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gnu-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gnu-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gnu-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gnuplot-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gnuplot-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gnuplot-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gnuplot-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_go-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_go-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_aqua-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_go_aqua-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_aqua-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_go_aqua-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_black-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_go_black-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_black-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_go_black-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_fuchsia-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_go_fuchsia-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_fuchsia-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_go_fuchsia-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_gopher-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_go_gopher-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_gopher-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_go_gopher-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_lightblue-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_go_lightblue-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_lightblue-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_go_lightblue-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_package-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_go_package-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_package-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_go_package-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_white-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_go_white-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_white-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_go_white-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_work-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_go_work-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_work-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_go_work-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_yellow-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_go_yellow-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_yellow-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_go_yellow-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_goctl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_goctl-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_goctl-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_goctl-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_godot-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_godot-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_godot-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_godot-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gradle-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gradle-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gradle-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gradle-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gradle2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gradle2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gradle2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gradle2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_graphql-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_graphql-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_graphql-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_graphql-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_graphql_config-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_graphql_config-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_graphql_config-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_graphql_config-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_graphviz-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_graphviz-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_graphviz-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_graphviz-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_greenkeeper-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_greenkeeper-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_greenkeeper-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_greenkeeper-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gridsome-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gridsome-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gridsome-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gridsome-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_groovy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_groovy-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_groovy-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_groovy-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_groovy2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_groovy2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_groovy2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_groovy2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_grunt-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_grunt-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_grunt-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_grunt-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gulp-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gulp-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gulp-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_gulp-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haml-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_haml-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haml-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_haml-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_handlebars-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_handlebars-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_handlebars-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_handlebars-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_handlebars2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_handlebars2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_handlebars2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_handlebars2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_harbour-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_harbour-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_harbour-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_harbour-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hardhat-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_hardhat-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hardhat-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_hardhat-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hashicorp-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_hashicorp-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hashicorp-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_hashicorp-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haskell-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_haskell-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haskell-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_haskell-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haskell2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_haskell2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haskell2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_haskell2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haxe-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_haxe-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haxe-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_haxe-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haxecheckstyle-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_haxecheckstyle-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haxecheckstyle-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_haxecheckstyle-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haxedevelop-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_haxedevelop-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haxedevelop-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_haxedevelop-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_helix-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_helix-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_helix-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_helix-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_helm-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_helm-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_helm-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_helm-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hjson-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_hjson-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hjson-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_hjson-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hlsl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_hlsl-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hlsl-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_hlsl-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_homeassistant-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_homeassistant-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_homeassistant-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_homeassistant-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_horusec-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_horusec-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_horusec-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_horusec-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_host-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_host-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_host-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_host-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_html-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_html-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_html-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_html-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_htmlhint-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_htmlhint-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_htmlhint-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_htmlhint-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_http-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_http-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_http-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_http-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hunspell-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_hunspell-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hunspell-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_hunspell-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_husky-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_husky-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_husky-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_husky-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_hy-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hy-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_hy-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hygen-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_hygen-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hygen-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_hygen-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hypr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_hypr-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hypr-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_hypr-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_icl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_icl-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_icl-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_icl-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_idris-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_idris-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_idris-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_idris-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_idrisbin-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_idrisbin-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_idrisbin-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_idrisbin-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_idrispkg-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_idrispkg-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_idrispkg-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_idrispkg-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_image-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_image-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_image-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_image-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_imba-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_imba-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_imba-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_imba-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_inc-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_inc-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_inc-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_inc-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_infopath-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_infopath-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_infopath-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_infopath-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_informix-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_informix-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_informix-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_informix-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ini-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ini-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ini-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ini-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ink-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ink-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ink-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ink-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_innosetup-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_innosetup-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_innosetup-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_innosetup-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_io-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_io-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_io-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_io-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_iodine-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_iodine-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_iodine-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_iodine-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ionic-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ionic-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ionic-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ionic-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jake-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jake-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jake-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jake-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_janet-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_janet-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_janet-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_janet-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jar-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jar-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jar-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jar-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jasmine-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jasmine-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jasmine-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jasmine-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_java-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_java-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_java-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_java-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jbuilder-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jbuilder-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jbuilder-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jbuilder-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jekyll-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jekyll-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jekyll-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jekyll-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jenkins-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jenkins-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jenkins-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jenkins-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jest-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jest-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jest-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jest-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jest_snapshot-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jest_snapshot-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jest_snapshot-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jest_snapshot-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jinja-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jinja-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jinja-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jinja-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jpm-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jpm-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jpm-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jpm-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_js_official-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_js_official-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_js_official-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_js_official-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsbeautify-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jsbeautify-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsbeautify-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jsbeautify-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsconfig-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jsconfig-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsconfig-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jsconfig-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jscpd-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jscpd-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jscpd-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jscpd-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jshint-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jshint-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jshint-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jshint-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsmap-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jsmap-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsmap-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jsmap-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_json-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_json-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_json-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_json-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_json2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_json2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_json2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_json2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_json5-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_json5-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_json5-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_json5-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_json_official-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_json_official-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_json_official-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_json_official-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsonld-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jsonld-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsonld-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jsonld-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsonnet-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jsonnet-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsonnet-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jsonnet-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsp-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jsp-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsp-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jsp-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jss-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jss-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jss-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jss-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_julia-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_julia-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_julia-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_julia-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_julia2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_julia2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_julia2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_julia2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jupyter-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jupyter-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jupyter-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_jupyter-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_k-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_k-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_k-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_k-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_karma-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_karma-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_karma-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_karma-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_key-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_key-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_key-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_key-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kitchenci-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_kitchenci-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kitchenci-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_kitchenci-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kite-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_kite-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kite-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_kite-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kivy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_kivy-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kivy-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_kivy-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kos-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_kos-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kos-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_kos-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kotlin-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_kotlin-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kotlin-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_kotlin-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kusto-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_kusto-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kusto-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_kusto-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_latino-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_latino-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_latino-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_latino-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_layout-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_layout-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_layout-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_layout-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lerna-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lerna-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lerna-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lerna-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_less-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_less-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_less-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_less-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lex-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lex-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lex-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lex-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_license-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_license-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_license-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_license-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_licensebat-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_licensebat-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_licensebat-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_licensebat-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_actionscript2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_actionscript2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_actionscript2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_actionscript2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_ada-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_ada-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_ada-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_ada-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_apl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_apl-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_apl-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_apl-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_babel-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_babel-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_babel-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_babel-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_babel2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_babel2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_babel2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_babel2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_cabal-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_cabal-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_cabal-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_cabal-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_circleci-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_circleci-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_circleci-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_circleci-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_cloudfoundry-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_cloudfoundry-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_cloudfoundry-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_cloudfoundry-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_codacy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_codacy-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_codacy-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_codacy-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_codeclimate-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_codeclimate-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_codeclimate-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_codeclimate-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_codeowners-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_codeowners-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_codeowners-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_codeowners-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_config-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_config-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_config-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_config-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_crystal-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_crystal-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_crystal-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_crystal-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_cypress-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_cypress-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_cypress-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_cypress-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_cypress_spec-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_cypress_spec-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_cypress_spec-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_cypress_spec-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_db-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_db-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_db-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_db-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_deno-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_deno-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_deno-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_deno-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_dhall-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_dhall-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_dhall-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_dhall-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_docpad-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_docpad-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_docpad-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_docpad-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_drone-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_drone-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_drone-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_drone-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_eas-metadata-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_eas-metadata-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_eas-metadata-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_eas-metadata-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_eleventy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_eleventy-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_eleventy-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_eleventy-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_eleventy2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_eleventy2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_eleventy2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_eleventy2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_esphome-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_esphome-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_esphome-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_esphome-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_expo-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_expo-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_expo-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_expo-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_firebasehosting-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_firebasehosting-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_firebasehosting-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_firebasehosting-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_fla-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_fla-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_fla-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_fla-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_font-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_font-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_font-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_font-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_gamemaker2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_gamemaker2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_gamemaker2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_gamemaker2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_gradle-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_gradle-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_gradle-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_gradle-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_hashicorp-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_hashicorp-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_hashicorp-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_hashicorp-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_hjson-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_hjson-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_hjson-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_hjson-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_ini-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_ini-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_ini-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_ini-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_io-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_io-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_io-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_io-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_jsconfig-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_jsconfig-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_jsconfig-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_jsconfig-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_jsmap-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_jsmap-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_jsmap-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_jsmap-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_json-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_json-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_json-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_json-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_json5-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_json5-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_json5-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_json5-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_jsonld-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_jsonld-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_jsonld-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_jsonld-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_kite-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_kite-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_kite-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_kite-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_lerna-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_lerna-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_lerna-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_lerna-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_mailing-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_mailing-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_mailing-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_mailing-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_mdx-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_mdx-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_mdx-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_mdx-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_mlang-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_mlang-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_mlang-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_mlang-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_mustache-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_mustache-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_mustache-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_mustache-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_next-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_next-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_next-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_next-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_nim-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_nim-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_nim-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_nim-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_nx-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_nx-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_nx-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_nx-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_objidconfig-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_objidconfig-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_objidconfig-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_objidconfig-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_openHAB-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_openHAB-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_openHAB-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_openHAB-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_pcl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_pcl-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_pcl-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_pcl-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_pnpm-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_pnpm-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_pnpm-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_pnpm-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_prettier-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_prettier-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_prettier-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_prettier-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_prisma-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_prisma-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_prisma-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_prisma-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_purescript-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_purescript-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_purescript-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_purescript-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_quasar-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_quasar-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_quasar-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_quasar-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_razzle-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_razzle-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_razzle-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_razzle-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_rehype-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_rehype-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_rehype-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_rehype-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_remark-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_remark-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_remark-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_remark-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_replit-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_replit-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_replit-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_replit-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_retext-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_retext-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_retext-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_retext-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_rome-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_rome-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_rome-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_rome-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_rubocop-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_rubocop-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_rubocop-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_rubocop-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_rust-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_rust-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_rust-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_rust-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_rust_toolchain-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_rust_toolchain-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_rust_toolchain-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_rust_toolchain-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_shaderlab-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_shaderlab-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_shaderlab-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_shaderlab-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_solidity-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_solidity-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_solidity-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_solidity-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_stylelint-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_stylelint-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_stylelint-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_stylelint-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_stylus-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_stylus-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_stylus-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_stylus-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_symfony-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_symfony-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_symfony-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_symfony-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_systemd-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_systemd-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_systemd-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_systemd-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_systemverilog-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_systemverilog-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_systemverilog-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_systemverilog-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_testcafe-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_testcafe-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_testcafe-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_testcafe-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_testjs-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_testjs-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_testjs-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_testjs-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_tex-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_tex-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_tex-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_tex-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_todo-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_todo-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_todo-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_todo-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_toit-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_toit-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_toit-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_toit-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_toml-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_toml-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_toml-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_toml-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_tree-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_tree-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_tree-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_tree-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_turbo-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_turbo-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_turbo-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_turbo-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_unibeautify-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_unibeautify-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_unibeautify-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_unibeautify-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_vash-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_vash-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_vash-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_vash-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_vsix-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_vsix-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_vsix-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_vsix-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_vsixmanifest-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_vsixmanifest-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_vsixmanifest-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_vsixmanifest-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_xfl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_xfl-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_xfl-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_xfl-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_yaml-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_yaml-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_yaml-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_yaml-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_zeit-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_zeit-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_zeit-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_light_zeit-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lighthouse-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lighthouse-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lighthouse-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lighthouse-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lilypond-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lilypond-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lilypond-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lilypond-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lime-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lime-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lime-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lime-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lintstagedrc-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lintstagedrc-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lintstagedrc-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lintstagedrc-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_liquid-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_liquid-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_liquid-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_liquid-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lisp-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lisp-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lisp-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lisp-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_livescript-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_livescript-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_livescript-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_livescript-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lnk-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lnk-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lnk-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lnk-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_locale-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_locale-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_locale-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_locale-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_log-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_log-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_log-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_log-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lolcode-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lolcode-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lolcode-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lolcode-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lsl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lsl-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lsl-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lsl-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lua-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lua-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lua-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lua-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_luau-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_luau-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_luau-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_luau-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lync-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lync-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lync-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_lync-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mailing-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mailing-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mailing-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mailing-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_manifest-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_manifest-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_manifest-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_manifest-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_manifest_bak-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_manifest_bak-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_manifest_bak-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_manifest_bak-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_manifest_skip-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_manifest_skip-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_manifest_skip-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_manifest_skip-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_map-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_map-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_map-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_map-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mariadb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mariadb-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mariadb-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mariadb-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_markdown-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_markdown-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_markdown-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_markdown-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_markdownlint-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_markdownlint-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_markdownlint-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_markdownlint-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_markdownlint_ignore-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_markdownlint_ignore-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_markdownlint_ignore-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_markdownlint_ignore-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_marko-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_marko-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_marko-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_marko-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_markojs-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_markojs-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_markojs-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_markojs-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_master-co-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_master-co-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_master-co-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_master-co-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_matlab-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_matlab-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_matlab-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_matlab-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_maven-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_maven-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_maven-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_maven-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_maxscript-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_maxscript-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_maxscript-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_maxscript-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_maya-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_maya-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_maya-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_maya-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mdx-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mdx-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mdx-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mdx-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mediawiki-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mediawiki-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mediawiki-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mediawiki-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mercurial-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mercurial-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mercurial-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mercurial-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_meson-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_meson-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_meson-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_meson-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_meteor-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_meteor-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_meteor-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_meteor-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mjml-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mjml-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mjml-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mjml-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mlang-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mlang-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mlang-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mlang-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mocha-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mocha-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mocha-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mocha-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_modernizr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_modernizr-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_modernizr-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_modernizr-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mojolicious-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mojolicious-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mojolicious-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mojolicious-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_moleculer-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_moleculer-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_moleculer-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_moleculer-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mondoo-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mondoo-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mondoo-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mondoo-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mongo-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mongo-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mongo-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mongo-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_monotone-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_monotone-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_monotone-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_monotone-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_motif-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_motif-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_motif-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_motif-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mson-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mson-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mson-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mson-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mustache-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mustache-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mustache-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mustache-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mysql-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mysql-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mysql-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_mysql-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ndst-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ndst-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ndst-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ndst-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nearly-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nearly-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nearly-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nearly-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_adapter_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_adapter_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_adapter_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_adapter_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_adapter_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_adapter_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_adapter_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_adapter_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_controller_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_controller_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_controller_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_controller_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_controller_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_controller_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_controller_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_controller_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_decorator_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_decorator_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_decorator_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_decorator_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_decorator_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_decorator_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_decorator_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_decorator_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_filter_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_filter_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_filter_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_filter_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_filter_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_filter_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_filter_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_filter_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_gateway_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_gateway_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_gateway_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_gateway_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_gateway_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_gateway_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_gateway_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_gateway_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_guard_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_guard_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_guard_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_guard_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_guard_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_guard_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_guard_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_guard_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_interceptor_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_interceptor_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_interceptor_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_interceptor_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_interceptor_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_interceptor_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_interceptor_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_interceptor_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_middleware_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_middleware_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_middleware_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_middleware_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_middleware_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_middleware_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_middleware_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_middleware_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_module_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_module_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_module_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_module_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_module_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_module_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_module_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_module_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_pipe_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_pipe_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_pipe_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_pipe_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_pipe_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_pipe_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_pipe_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_pipe_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_service_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_service_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_service_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_service_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_service_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_service_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_service_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nest_service_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nestjs-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nestjs-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nestjs-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nestjs-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_netlify-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_netlify-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_netlify-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_netlify-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_next-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_next-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_next-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_next-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_css-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_component_css-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_css-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_component_css-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_dart-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_component_dart-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_dart-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_component_dart-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_html-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_component_html-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_html-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_component_html-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_component_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_component_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_js2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_component_js2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_js2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_component_js2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_less-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_component_less-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_less-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_component_less-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_sass-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_component_sass-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_sass-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_component_sass-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_scss-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_component_scss-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_scss-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_component_scss-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_component_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_component_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_ts2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_component_ts2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_ts2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_component_ts2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_controller_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_controller_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_controller_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_controller_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_controller_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_controller_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_controller_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_controller_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_directive_dart-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_directive_dart-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_directive_dart-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_directive_dart-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_directive_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_directive_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_directive_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_directive_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_directive_js2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_directive_js2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_directive_js2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_directive_js2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_directive_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_directive_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_directive_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_directive_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_directive_ts2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_directive_ts2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_directive_ts2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_directive_ts2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_guard_dart-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_guard_dart-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_guard_dart-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_guard_dart-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_guard_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_guard_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_guard_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_guard_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_guard_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_guard_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_guard_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_guard_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_interceptor_dart-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_interceptor_dart-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_interceptor_dart-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_interceptor_dart-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_interceptor_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_interceptor_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_interceptor_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_interceptor_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_interceptor_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_interceptor_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_interceptor_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_interceptor_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_module_dart-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_module_dart-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_module_dart-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_module_dart-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_module_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_module_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_module_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_module_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_module_js2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_module_js2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_module_js2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_module_js2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_module_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_module_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_module_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_module_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_module_ts2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_module_ts2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_module_ts2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_module_ts2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_pipe_dart-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_pipe_dart-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_pipe_dart-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_pipe_dart-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_pipe_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_pipe_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_pipe_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_pipe_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_pipe_js2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_pipe_js2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_pipe_js2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_pipe_js2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_pipe_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_pipe_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_pipe_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_pipe_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_pipe_ts2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_pipe_ts2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_pipe_ts2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_pipe_ts2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_routing_dart-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_routing_dart-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_routing_dart-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_routing_dart-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_routing_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_routing_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_routing_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_routing_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_routing_js2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_routing_js2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_routing_js2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_routing_js2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_routing_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_routing_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_routing_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_routing_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_routing_ts2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_routing_ts2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_routing_ts2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_routing_ts2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_service_dart-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_service_dart-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_service_dart-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_service_dart-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_service_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_service_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_service_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_service_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_service_js2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_service_js2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_service_js2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_service_js2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_service_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_service_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_service_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_service_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_service_ts2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_service_ts2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_service_ts2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_service_ts2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_smart_component_dart-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_smart_component_dart-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_smart_component_dart-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_smart_component_dart-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_smart_component_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_smart_component_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_smart_component_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_smart_component_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_smart_component_js2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_smart_component_js2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_smart_component_js2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_smart_component_js2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_smart_component_ts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_smart_component_ts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_smart_component_ts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_smart_component_ts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_smart_component_ts2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_smart_component_ts2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_smart_component_ts2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_smart_component_ts2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_tailwind-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_tailwind-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_tailwind-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ng_tailwind-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nginx-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nginx-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nginx-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nginx-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nim-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nim-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nim-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nim-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nimble-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nimble-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nimble-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nimble-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ninja-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ninja-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ninja-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ninja-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nix-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nix-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nix-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nix-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_njsproj-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_njsproj-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_njsproj-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_njsproj-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_noc-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_noc-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_noc-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_noc-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_node-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_node-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_node-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_node-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_node2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_node2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_node2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_node2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nodemon-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nodemon-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nodemon-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nodemon-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_npm-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_npm-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_npm-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_npm-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nsi-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nsi-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nsi-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nsi-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nsri-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nsri-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nsri-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nsri-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nsri-integrity-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nsri-integrity-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nsri-integrity-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nsri-integrity-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nuget-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nuget-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nuget-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nuget-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_numpy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_numpy-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_numpy-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_numpy-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nunjucks-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nunjucks-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nunjucks-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nunjucks-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nuxt-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nuxt-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nuxt-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nuxt-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nx-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nx-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nx-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nx-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nyc-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nyc-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nyc-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_nyc-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_objectivec-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_objectivec-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_objectivec-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_objectivec-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_objectivecpp-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_objectivecpp-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_objectivecpp-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_objectivecpp-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_objidconfig-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_objidconfig-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_objidconfig-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_objidconfig-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ocaml-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ocaml-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ocaml-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ocaml-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ogone-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ogone-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ogone-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ogone-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_onenote-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_onenote-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_onenote-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_onenote-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_openHAB-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_openHAB-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_openHAB-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_openHAB-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_opencl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_opencl-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_opencl-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_opencl-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_openscad-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_openscad-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_openscad-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_openscad-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_org-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_org-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_org-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_org-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_outlook-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_outlook-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_outlook-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_outlook-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ovpn-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ovpn-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ovpn-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ovpn-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_package-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_package-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_package-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_package-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_paket-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_paket-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_paket-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_paket-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_patch-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_patch-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_patch-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_patch-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pcl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pcl-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pcl-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pcl-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pddl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pddl-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pddl-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pddl-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pddl_happenings-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pddl_happenings-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pddl_happenings-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pddl_happenings-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pddl_plan-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pddl_plan-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pddl_plan-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pddl_plan-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pdf-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pdf-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pdf-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pdf-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pdf2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pdf2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pdf2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pdf2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_peeky-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_peeky-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_peeky-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_peeky-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_perl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_perl-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_perl-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_perl-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_perl2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_perl2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_perl2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_perl2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_perl6-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_perl6-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_perl6-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_perl6-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pgsql-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pgsql-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pgsql-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pgsql-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_photoshop-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_photoshop-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_photoshop-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_photoshop-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_photoshop2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_photoshop2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_photoshop2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_photoshop2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_php-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_php-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_php-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_php-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_php2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_php2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_php2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_php2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_php3-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_php3-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_php3-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_php3-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_phpcsfixer-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_phpcsfixer-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_phpcsfixer-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_phpcsfixer-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_phpstan-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_phpstan-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_phpstan-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_phpstan-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_phpunit-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_phpunit-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_phpunit-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_phpunit-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_phraseapp-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_phraseapp-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_phraseapp-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_phraseapp-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pine-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pine-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pine-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pine-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pip-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pip-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pip-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pip-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pipeline-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pipeline-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pipeline-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pipeline-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plantuml-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_plantuml-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plantuml-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_plantuml-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_platformio-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_platformio-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_platformio-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_platformio-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_playwright-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_playwright-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_playwright-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_playwright-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plsql-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_plsql-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plsql-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_plsql-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plsql_package-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_plsql_package-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plsql_package-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_plsql_package-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plsql_package_body-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_plsql_package_body-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plsql_package_body-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_plsql_package_body-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plsql_package_header-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_plsql_package_header-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plsql_package_header-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_plsql_package_header-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plsql_package_spec-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_plsql_package_spec-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plsql_package_spec-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_plsql_package_spec-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pm2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pm2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pm2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pm2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pnpm-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pnpm-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pnpm-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pnpm-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_poedit-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_poedit-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_poedit-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_poedit-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_poetry-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_poetry-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_poetry-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_poetry-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_polymer-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_polymer-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_polymer-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_polymer-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pony-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pony-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pony-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pony-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_postcss-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_postcss-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_postcss-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_postcss-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_postcssconfig-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_postcssconfig-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_postcssconfig-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_postcssconfig-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powerpoint-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_powerpoint-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powerpoint-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_powerpoint-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powerpoint2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_powerpoint2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powerpoint2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_powerpoint2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_powershell-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_powershell-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_powershell2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_powershell2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_format-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_powershell_format-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_format-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_powershell_format-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_psd-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_powershell_psd-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_psd-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_powershell_psd-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_psd2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_powershell_psd2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_psd2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_powershell_psd2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_psm-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_powershell_psm-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_psm-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_powershell_psm-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_psm2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_powershell_psm2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_psm2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_powershell_psm2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_types-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_powershell_types-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_types-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_powershell_types-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_preact-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_preact-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_preact-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_preact-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_precommit-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_precommit-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_precommit-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_precommit-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_prettier-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_prettier-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_prettier-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_prettier-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_prisma-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_prisma-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_prisma-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_prisma-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_processinglang-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_processinglang-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_processinglang-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_processinglang-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_procfile-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_procfile-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_procfile-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_procfile-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_progress-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_progress-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_progress-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_progress-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_prolog-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_prolog-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_prolog-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_prolog-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_prometheus-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_prometheus-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_prometheus-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_prometheus-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_protobuf-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_protobuf-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_protobuf-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_protobuf-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_protractor-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_protractor-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_protractor-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_protractor-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_publisher-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_publisher-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_publisher-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_publisher-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pug-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pug-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pug-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pug-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pulumi-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pulumi-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pulumi-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pulumi-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_puppet-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_puppet-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_puppet-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_puppet-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_purescript-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_purescript-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_purescript-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_purescript-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pyret-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pyret-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pyret-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pyret-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_python-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_python-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_python-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_python-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pythowo-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pythowo-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pythowo-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pythowo-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pytyped-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pytyped-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pytyped-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pytyped-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pyup-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pyup-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pyup-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_pyup-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_q-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_q-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_q-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_q-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_qbs-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_qbs-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_qbs-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_qbs-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_qlikview-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_qlikview-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_qlikview-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_qlikview-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_qml-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_qml-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_qml-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_qml-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_qmldir-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_qmldir-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_qmldir-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_qmldir-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_qsharp-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_qsharp-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_qsharp-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_qsharp-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_quasar-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_quasar-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_quasar-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_quasar-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_r-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_r-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_r-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_r-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_racket-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_racket-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_racket-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_racket-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rails-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rails-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rails-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rails-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rake-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rake-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rake-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rake-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_raml-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_raml-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_raml-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_raml-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_razor-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_razor-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_razor-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_razor-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_razzle-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_razzle-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_razzle-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_razzle-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_reactjs-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_reactjs-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_reactjs-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_reactjs-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_reacttemplate-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_reacttemplate-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_reacttemplate-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_reacttemplate-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_reactts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_reactts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_reactts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_reactts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_reason-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_reason-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_reason-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_reason-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_red-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_red-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_red-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_red-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_registry-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_registry-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_registry-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_registry-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rego-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rego-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rego-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rego-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rehype-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rehype-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rehype-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rehype-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_remark-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_remark-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_remark-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_remark-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_renovate-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_renovate-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_renovate-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_renovate-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_replit-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_replit-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_replit-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_replit-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rescript-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rescript-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rescript-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rescript-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rest-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rest-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rest-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rest-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_retext-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_retext-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_retext-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_retext-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rexx-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rexx-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rexx-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rexx-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_riot-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_riot-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_riot-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_riot-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rmd-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rmd-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rmd-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rmd-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_robotframework-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_robotframework-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_robotframework-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_robotframework-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_robots-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_robots-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_robots-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_robots-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rollup-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rollup-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rollup-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rollup-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rome-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rome-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rome-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rome-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ron-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ron-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ron-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ron-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rproj-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rproj-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rproj-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rproj-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rspec-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rspec-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rspec-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rspec-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rubocop-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rubocop-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rubocop-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rubocop-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ruby-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ruby-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ruby-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ruby-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rust-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rust-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rust-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rust-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rust_toolchain-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rust_toolchain-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rust_toolchain-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_rust_toolchain-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sails-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sails-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sails-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sails-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_saltstack-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_saltstack-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_saltstack-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_saltstack-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_san-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_san-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_san-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_san-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sapphire_framework_cli-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sapphire_framework_cli-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sapphire_framework_cli-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sapphire_framework_cli-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sas-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sas-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sas-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sas-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sass-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sass-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sass-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sass-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sbt-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sbt-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sbt-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sbt-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_scala-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_scala-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_scala-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_scala-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_scilab-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_scilab-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_scilab-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_scilab-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_script-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_script-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_script-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_script-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_scss-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_scss-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_scss-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_scss-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_scss2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_scss2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_scss2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_scss2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sdlang-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sdlang-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sdlang-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sdlang-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sentry-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sentry-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sentry-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sentry-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sequelize-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sequelize-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sequelize-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sequelize-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_serverless-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_serverless-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_serverless-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_serverless-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_shaderlab-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_shaderlab-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_shaderlab-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_shaderlab-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_shell-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_shell-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_shell-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_shell-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_shellcheck-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_shellcheck-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_shellcheck-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_shellcheck-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_shuttle-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_shuttle-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_shuttle-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_shuttle-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_silverstripe-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_silverstripe-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_silverstripe-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_silverstripe-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_siyuan-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_siyuan-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_siyuan-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_siyuan-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sketch-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sketch-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sketch-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sketch-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_skipper-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_skipper-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_skipper-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_skipper-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_slang-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_slang-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_slang-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_slang-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_slashup-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_slashup-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_slashup-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_slashup-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_slice-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_slice-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_slice-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_slice-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_slim-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_slim-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_slim-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_slim-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sln-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sln-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sln-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sln-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sln2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sln2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sln2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sln2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_smarty-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_smarty-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_smarty-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_smarty-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_snapcraft-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_snapcraft-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_snapcraft-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_snapcraft-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_snort-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_snort-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_snort-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_snort-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_snyk-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_snyk-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_snyk-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_snyk-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_solidarity-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_solidarity-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_solidarity-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_solidarity-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_solidity-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_solidity-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_solidity-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_solidity-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_source-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_source-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_source-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_source-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_spacengine-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_spacengine-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_spacengine-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_spacengine-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sparql-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sparql-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sparql-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sparql-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sqf-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sqf-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sqf-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sqf-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sql-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sql-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sql-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sql-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sqlite-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sqlite-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sqlite-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sqlite-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_squirrel-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_squirrel-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_squirrel-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_squirrel-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sss-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sss-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sss-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_sss-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stan-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_stan-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stan-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_stan-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stata-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_stata-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stata-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_stata-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stencil-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_stencil-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stencil-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_stencil-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_storyboard-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_storyboard-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_storyboard-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_storyboard-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_storybook-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_storybook-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_storybook-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_storybook-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stryker-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_stryker-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stryker-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_stryker-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stylable-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_stylable-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stylable-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_stylable-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_style-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_style-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_style-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_style-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_styled-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_styled-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_styled-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_styled-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stylelint-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_stylelint-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stylelint-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_stylelint-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stylish_haskell-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_stylish_haskell-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stylish_haskell-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_stylish_haskell-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stylus-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_stylus-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stylus-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_stylus-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_subversion-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_subversion-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_subversion-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_subversion-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_svelte-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_svelte-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_svelte-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_svelte-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_svg-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_svg-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_svg-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_svg-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_swagger-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_swagger-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_swagger-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_swagger-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_swift-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_swift-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_swift-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_swift-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_swig-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_swig-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_swig-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_swig-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_symfony-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_symfony-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_symfony-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_symfony-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_systemd-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_systemd-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_systemd-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_systemd-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_systemverilog-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_systemverilog-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_systemverilog-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_systemverilog-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_t4tt-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_t4tt-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_t4tt-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_t4tt-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tailwind-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tailwind-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tailwind-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tailwind-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tauri-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tauri-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tauri-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tauri-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tcl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tcl-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tcl-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tcl-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_teal-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_teal-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_teal-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_teal-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tera-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tera-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tera-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tera-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_terraform-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_terraform-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_terraform-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_terraform-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_test-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_test-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_test-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_test-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_testcafe-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_testcafe-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_testcafe-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_testcafe-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_testjs-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_testjs-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_testjs-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_testjs-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_testts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_testts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_testts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_testts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tex-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tex-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tex-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tex-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_text-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_text-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_text-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_text-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_textile-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_textile-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_textile-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_textile-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tfs-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tfs-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tfs-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tfs-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tiltfile-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tiltfile-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tiltfile-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tiltfile-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_todo-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_todo-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_todo-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_todo-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_toit-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_toit-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_toit-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_toit-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_toml-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_toml-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_toml-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_toml-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tox-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tox-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tox-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tox-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_travis-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_travis-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_travis-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_travis-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tree-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tree-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tree-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tree-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tres-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tres-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tres-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tres-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_truffle-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_truffle-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_truffle-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_truffle-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_trunk-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_trunk-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_trunk-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_trunk-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tscn-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tscn-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tscn-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tscn-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tsconfig-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tsconfig-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tsconfig-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tsconfig-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tsconfig_official-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tsconfig_official-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tsconfig_official-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tsconfig_official-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tslint-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tslint-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tslint-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tslint-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tt-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tt-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tt-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tt-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ttcn-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ttcn-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ttcn-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_ttcn-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tuc-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tuc-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tuc-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_tuc-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_turbo-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_turbo-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_turbo-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_turbo-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_twig-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_twig-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_twig-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_twig-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typedoc-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_typedoc-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typedoc-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_typedoc-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typescript-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_typescript-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typescript-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_typescript-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typescript_official-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_typescript_official-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typescript_official-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_typescript_official-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typescriptdef-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_typescriptdef-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typescriptdef-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_typescriptdef-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typescriptdef_official-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_typescriptdef_official-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typescriptdef_official-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_typescriptdef_official-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typo3-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_typo3-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typo3-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_typo3-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_unibeautify-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_unibeautify-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_unibeautify-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_unibeautify-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_unison-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_unison-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_unison-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_unison-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_unlicense-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_unlicense-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_unlicense-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_unlicense-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vagrant-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vagrant-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vagrant-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vagrant-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vala-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vala-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vala-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vala-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vanilla_extract-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vanilla_extract-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vanilla_extract-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vanilla_extract-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vapi-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vapi-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vapi-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vapi-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vapor-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vapor-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vapor-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vapor-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vash-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vash-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vash-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vash-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vb-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vb-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vb-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vba-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vba-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vba-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vba-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vbhtml-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vbhtml-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vbhtml-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vbhtml-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vbproj-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vbproj-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vbproj-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vbproj-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vcxproj-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vcxproj-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vcxproj-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vcxproj-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_velocity-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_velocity-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_velocity-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_velocity-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_verilog-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_verilog-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_verilog-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_verilog-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vhdl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vhdl-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vhdl-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vhdl-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_video-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_video-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_video-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_video-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_view-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_view-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_view-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_view-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vim-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vim-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vim-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vim-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vite-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vite-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vite-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vite-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vitest-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vitest-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vitest-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vitest-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vlang-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vlang-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vlang-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vlang-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_volt-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_volt-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_volt-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_volt-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vscode-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vscode-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vscode-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vscode-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vscode-insiders-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vscode-insiders-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vscode-insiders-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vscode-insiders-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vscode2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vscode2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vscode2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vscode2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vscode3-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vscode3-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vscode3-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vscode3-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vsix-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vsix-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vsix-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vsix-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vsixmanifest-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vsixmanifest-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vsixmanifest-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vsixmanifest-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vue-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vue-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vue-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vue-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vueconfig-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vueconfig-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vueconfig-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_vueconfig-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wallaby-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wallaby-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wallaby-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wallaby-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wally-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wally-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wally-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wally-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wasm-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wasm-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wasm-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wasm-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_watchmanconfig-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_watchmanconfig-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_watchmanconfig-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_watchmanconfig-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_webpack-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_webpack-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_webpack-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_webpack-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wenyan-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wenyan-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wenyan-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wenyan-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wercker-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wercker-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wercker-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wercker-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wgsl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wgsl-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wgsl-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wgsl-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wikitext-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wikitext-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wikitext-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wikitext-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_windi-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_windi-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_windi-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_windi-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wolfram-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wolfram-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wolfram-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wolfram-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_word-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_word-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_word-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_word-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_word2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_word2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_word2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_word2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wpml-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wpml-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wpml-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wpml-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wurst-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wurst-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wurst-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wurst-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wxml-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wxml-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wxml-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wxml-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wxss-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wxss-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wxss-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_wxss-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xcode-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_xcode-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xcode-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_xcode-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xfl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_xfl-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xfl-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_xfl-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xib-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_xib-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xib-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_xib-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xliff-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_xliff-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xliff-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_xliff-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xmake-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_xmake-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xmake-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_xmake-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xml-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_xml-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xml-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_xml-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xquery-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_xquery-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xquery-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_xquery-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xsl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_xsl-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xsl-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_xsl-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yacc-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_yacc-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yacc-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_yacc-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yaml-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_yaml-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yaml-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_yaml-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yamllint-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_yamllint-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yamllint-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_yamllint-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yandex-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_yandex-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yandex-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_yandex-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yang-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_yang-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yang-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_yang-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yarn-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_yarn-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yarn-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_yarn-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yeoman-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_yeoman-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yeoman-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_yeoman-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_zeit-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_zeit-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_zeit-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_zeit-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_zig-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_zig-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_zig-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_zig-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_zip-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_zip-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_zip-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_zip-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_zip2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_zip2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_zip2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/file_type_zip2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_android-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_android-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_android-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_android-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_api-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_api-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_api-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_api-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_app-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_app-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_app-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_app-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_arangodb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_arangodb-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_arangodb-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_arangodb-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_asset-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_asset-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_asset-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_asset-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_audio-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_audio-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_audio-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_audio-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_aurelia-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_aurelia-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_aurelia-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_aurelia-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_aws-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_aws-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_aws-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_aws-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_azure-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_azure-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_azure-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_azure-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_azurepipelines-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_azurepipelines-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_azurepipelines-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_azurepipelines-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_binary-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_binary-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_binary-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_binary-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bloc-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_bloc-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bloc-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_bloc-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_blueprint-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_blueprint-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_blueprint-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_blueprint-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bot-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_bot-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bot-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_bot-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bower-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_bower-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bower-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_bower-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_buildkite-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_buildkite-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_buildkite-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_buildkite-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cake-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_cake-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cake-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_cake-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_certificate-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_certificate-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_certificate-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_certificate-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_chef-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_chef-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_chef-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_chef-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_circleci-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_circleci-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_circleci-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_circleci-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cli-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_cli-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cli-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_cli-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_client-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_client-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_client-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_client-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cmake-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_cmake-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cmake-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_cmake-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_common-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_common-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_common-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_common-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_component-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_component-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_component-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_component-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_composer-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_composer-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_composer-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_composer-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_config-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_config-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_config-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_config-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_controller-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_controller-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_controller-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_controller-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_coverage-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_coverage-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_coverage-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_coverage-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_css-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_css-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_css-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_css-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cubit-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_cubit-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cubit-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_cubit-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cypress-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_cypress-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cypress-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_cypress-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dapr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_dapr-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dapr-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_dapr-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_datadog-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_datadog-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_datadog-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_datadog-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_db-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_db-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_db-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_db-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_debian-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_debian-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_debian-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_debian-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dependabot-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_dependabot-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dependabot-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_dependabot-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_devcontainer-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_devcontainer-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_devcontainer-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_devcontainer-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dist-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_dist-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dist-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_dist-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_docker-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_docker-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_docker-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_docker-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_docs-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_docs-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_docs-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_docs-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_e2e-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_e2e-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_e2e-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_e2e-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_elasticbeanstalk-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_elasticbeanstalk-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_elasticbeanstalk-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_elasticbeanstalk-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_electron-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_electron-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_electron-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_electron-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_expo-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_expo-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_expo-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_expo-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_favicon-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_favicon-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_favicon-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_favicon-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_flow-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_flow-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_flow-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_flow-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_fonts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_fonts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_fonts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_fonts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gcp-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_gcp-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gcp-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_gcp-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_git-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_git-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_git-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_git-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_github-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_github-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_github-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_github-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gitlab-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_gitlab-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gitlab-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_gitlab-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gradle-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_gradle-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gradle-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_gradle-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_graphql-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_graphql-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_graphql-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_graphql-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_grunt-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_grunt-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_grunt-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_grunt-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gulp-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_gulp-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gulp-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_gulp-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_haxelib-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_haxelib-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_haxelib-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_haxelib-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_helper-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_helper-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_helper-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_helper-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_hook-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_hook-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_hook-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_hook-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_husky-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_husky-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_husky-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_husky-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_idea-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_idea-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_idea-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_idea-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_images-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_images-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_images-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_images-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_include-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_include-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_include-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_include-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_interfaces-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_interfaces-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_interfaces-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_interfaces-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_ios-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_ios-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_ios-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_ios-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_js-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_js-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_js-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_json-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_json-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_json-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_json-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_json_official-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_json_official-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_json_official-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_json_official-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_kubernetes-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_kubernetes-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_kubernetes-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_kubernetes-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_less-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_less-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_less-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_less-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_library-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_library-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_library-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_library-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_cypress-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_light_cypress-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_cypress-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_light_cypress-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_electron-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_light_electron-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_electron-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_light_electron-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_expo-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_light_expo-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_expo-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_light_expo-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_fonts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_light_fonts-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_fonts-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_light_fonts-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_gradle-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_light_gradle-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_gradle-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_light_gradle-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_meteor-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_light_meteor-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_meteor-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_light_meteor-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_mysql-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_light_mysql-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_mysql-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_light_mysql-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_node-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_light_node-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_node-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_light_node-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_redux-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_light_redux-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_redux-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_light_redux-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_sass-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_light_sass-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_sass-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_light_sass-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_linux-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_linux-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_linux-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_linux-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_locale-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_locale-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_locale-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_locale-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_log-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_log-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_log-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_log-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_macos-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_macos-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_macos-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_macos-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mariadb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_mariadb-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mariadb-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_mariadb-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_maven-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_maven-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_maven-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_maven-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_memcached-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_memcached-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_memcached-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_memcached-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_meteor-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_meteor-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_meteor-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_meteor-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_middleware-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_middleware-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_middleware-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_middleware-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_minikube-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_minikube-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_minikube-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_minikube-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mjml-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_mjml-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mjml-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_mjml-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mock-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_mock-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mock-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_mock-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_model-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_model-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_model-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_model-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_module-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_module-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_module-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_module-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mongodb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_mongodb-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mongodb-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_mongodb-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mysql-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_mysql-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mysql-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_mysql-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_next-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_next-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_next-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_next-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nginx-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_nginx-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nginx-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_nginx-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nix-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_nix-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nix-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_nix-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_node-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_node-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_node-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_node-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_notification-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_notification-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_notification-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_notification-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nuget-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_nuget-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nuget-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_nuget-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nuxt-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_nuxt-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nuxt-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_nuxt-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_package-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_package-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_package-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_package-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_paket-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_paket-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_paket-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_paket-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_php-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_php-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_php-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_php-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_platformio-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_platformio-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_platformio-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_platformio-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_plugin-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_plugin-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_plugin-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_plugin-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_prisma-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_prisma-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_prisma-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_prisma-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_private-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_private-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_private-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_private-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_public-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_public-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_public-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_public-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_python-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_python-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_python-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_python-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_ravendb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_ravendb-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_ravendb-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_ravendb-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_redis-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_redis-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_redis-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_redis-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_redux-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_redux-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_redux-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_redux-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_route-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_route-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_route-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_route-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_sass-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_sass-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_sass-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_sass-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_script-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_script-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_script-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_script-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_server-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_server-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_server-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_server-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_services-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_services-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_services-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_services-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_shared-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_shared-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_shared-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_shared-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_src-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_src-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_src-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_src-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_sso-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_sso-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_sso-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_sso-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_story-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_story-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_story-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_story-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_style-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_style-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_style-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_style-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_tauri-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_tauri-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_tauri-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_tauri-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_temp-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_temp-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_temp-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_temp-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_template-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_template-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_template-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_template-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_test-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_test-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_test-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_test-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_theme-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_theme-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_theme-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_theme-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_tools-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_tools-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_tools-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_tools-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_travis-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_travis-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_travis-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_travis-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_trunk-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_trunk-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_trunk-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_trunk-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typescript-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_typescript-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typescript-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_typescript-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typings-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_typings-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typings-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_typings-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typings2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_typings2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typings2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_typings2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vagrant-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_vagrant-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vagrant-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_vagrant-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_video-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_video-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_video-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_video-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_view-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_view-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_view-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_view-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vs-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_vs-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vs-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_vs-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vs2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_vs2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vs2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_vs2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_vscode-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_vscode-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_vscode2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_vscode2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode3-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_vscode3-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode3-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_vscode3-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_vscode_test-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_vscode_test-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test2-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_vscode_test2-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test2-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_vscode_test2-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test3-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_vscode_test3-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test3-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_vscode_test3-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_webpack-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_webpack-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_webpack-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_webpack-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_windows-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_windows-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_windows-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_windows-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_www-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_www-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_www-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_www-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_yarn-24.png b/app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_yarn-24.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_yarn-24.png
rename to app/src/main/resources/io/xpipe/app/resources/img/browser/folder_type_yarn-24.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/file_drag_icon.png b/app/src/main/resources/io/xpipe/app/resources/img/file_drag_icon.png
deleted file mode 100644
index 135b5b83e..000000000
Binary files a/app/src/main/resources/io/xpipe/app/resources/img/file_drag_icon.png and /dev/null differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/Hips-dark.svg b/app/src/main/resources/io/xpipe/app/resources/img/graphics/Hips-dark.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/Hips-dark.svg
rename to app/src/main/resources/io/xpipe/app/resources/img/graphics/Hips-dark.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/Hips.svg b/app/src/main/resources/io/xpipe/app/resources/img/graphics/Hips.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/Hips.svg
rename to app/src/main/resources/io/xpipe/app/resources/img/graphics/Hips.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/Wave-dark.svg b/app/src/main/resources/io/xpipe/app/resources/img/graphics/Wave-dark.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/Wave-dark.svg
rename to app/src/main/resources/io/xpipe/app/resources/img/graphics/Wave-dark.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/Wave.svg b/app/src/main/resources/io/xpipe/app/resources/img/graphics/Wave.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/Wave.svg
rename to app/src/main/resources/io/xpipe/app/resources/img/graphics/Wave.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/logo.png b/app/src/main/resources/io/xpipe/app/resources/img/logo/logo.png
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/logo.png
rename to app/src/main/resources/io/xpipe/app/resources/img/logo/logo.png
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/alma-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/alma-40.png
new file mode 100644
index 000000000..fbf6a87b9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/alma-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/alpine-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/alpine-40.png
new file mode 100644
index 000000000..a5f60021b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/alpine-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/amazon-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/amazon-40.png
new file mode 100644
index 000000000..81aae0017
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/amazon-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/arch-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/arch-40.png
new file mode 100644
index 000000000..520dd6894
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/arch-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/centos-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/centos-40.png
new file mode 100644
index 000000000..488b844f4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/centos-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/debian-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/debian-40.png
new file mode 100644
index 000000000..49a264f17
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/debian-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/elementary-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/os/elementary-40-dark.png
new file mode 100644
index 000000000..f002fcf21
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/elementary-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/elementary-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/elementary-40.png
new file mode 100644
index 000000000..4bac0ee98
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/elementary-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/endeavour-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/os/endeavour-40-dark.png
new file mode 100644
index 000000000..84686cb5e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/endeavour-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/endeavour-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/endeavour-40.png
new file mode 100644
index 000000000..c666e928d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/endeavour-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/fedora-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/fedora-40.png
new file mode 100644
index 000000000..4e1f68724
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/fedora-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/freebsd-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/freebsd-40.png
new file mode 100644
index 000000000..d3367130d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/freebsd-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/garuda-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/garuda-40.png
new file mode 100644
index 000000000..2a3be6661
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/garuda-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/gentoo-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/gentoo-40.png
new file mode 100644
index 000000000..ef3deb4e5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/gentoo-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/kali-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/kali-40.png
new file mode 100644
index 000000000..c91399484
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/kali-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/kubuntu-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/kubuntu-40.png
new file mode 100644
index 000000000..09f6b5b52
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/kubuntu-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/linux-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/linux-40.png
new file mode 100644
index 000000000..55e73cb40
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/linux-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/macos-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/os/macos-40-dark.png
new file mode 100644
index 000000000..533549b6e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/macos-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/macos-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/macos-40.png
new file mode 100644
index 000000000..b606e05a6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/macos-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/manjaro-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/manjaro-40.png
new file mode 100644
index 000000000..29b3a00eb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/manjaro-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/mint-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/mint-40.png
new file mode 100644
index 000000000..aaa7cf4da
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/mint-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/netbsd-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/netbsd-40.png
new file mode 100644
index 000000000..706a2c520
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/netbsd-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/nixos-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/nixos-40.png
new file mode 100644
index 000000000..ca315c4d0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/nixos-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/openbsd-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/openbsd-40.png
new file mode 100644
index 000000000..62078528e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/openbsd-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/pop-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/pop-40.png
new file mode 100644
index 000000000..76b96e5af
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/pop-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/redhat-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/redhat-40.png
new file mode 100644
index 000000000..18eed7784
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/redhat-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/rocky-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/rocky-40.png
new file mode 100644
index 000000000..75072e432
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/rocky-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/suse-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/suse-40.png
new file mode 100644
index 000000000..1447597da
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/suse-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/ubuntu-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/ubuntu-40.png
new file mode 100644
index 000000000..70feff835
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/ubuntu-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/windows-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/windows-40.png
new file mode 100644
index 000000000..88eb2090e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/windows-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/zorin-40.png b/app/src/main/resources/io/xpipe/app/resources/img/os/zorin-40.png
new file mode 100644
index 000000000..44a72a5a4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/os/zorin-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/producthunt-color.png b/app/src/main/resources/io/xpipe/app/resources/img/producthunt-color.png
new file mode 100644
index 000000000..70cde57fd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/producthunt-color.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/2fauth-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/2fauth-16-dark.png
new file mode 100644
index 000000000..c412db9ff
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/2fauth-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/2fauth-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/2fauth-16.png
new file mode 100644
index 000000000..4e6c60b69
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/2fauth-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/2fauth-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/2fauth-24-dark.png
new file mode 100644
index 000000000..4cabea38c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/2fauth-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/2fauth-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/2fauth-24.png
new file mode 100644
index 000000000..6263cf765
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/2fauth-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/2fauth-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/2fauth-40-dark.png
new file mode 100644
index 000000000..b1be5ae5f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/2fauth-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/2fauth-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/2fauth-40.png
new file mode 100644
index 000000000..244c1f4ae
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/2fauth-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/activepieces-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/activepieces-16.png
new file mode 100644
index 000000000..f909f13f2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/activepieces-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/activepieces-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/activepieces-24.png
new file mode 100644
index 000000000..8ecddf190
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/activepieces-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/activepieces-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/activepieces-40.png
new file mode 100644
index 000000000..cb8faf5d5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/activepieces-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/actual-budget-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/actual-budget-16.png
new file mode 100644
index 000000000..0658be221
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/actual-budget-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/actual-budget-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/actual-budget-24.png
new file mode 100644
index 000000000..5e21d23c8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/actual-budget-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/actual-budget-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/actual-budget-40.png
new file mode 100644
index 000000000..73678716b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/actual-budget-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/adguard-home-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/adguard-home-16.png
new file mode 100644
index 000000000..8534a6e55
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/adguard-home-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/adguard-home-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/adguard-home-24.png
new file mode 100644
index 000000000..fabc381e1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/adguard-home-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/adguard-home-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/adguard-home-40.png
new file mode 100644
index 000000000..0e225e2c8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/adguard-home-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/adminer-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/adminer-16-dark.png
new file mode 100644
index 000000000..354ebab0c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/adminer-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/adminer-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/adminer-16.png
new file mode 100644
index 000000000..e06f1f44b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/adminer-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/adminer-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/adminer-24-dark.png
new file mode 100644
index 000000000..8206214d3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/adminer-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/adminer-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/adminer-24.png
new file mode 100644
index 000000000..0cec03729
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/adminer-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/adminer-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/adminer-40-dark.png
new file mode 100644
index 000000000..cdb9d2fd7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/adminer-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/adminer-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/adminer-40.png
new file mode 100644
index 000000000..1b8fa9b35
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/adminer-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/affine-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/affine-16-dark.png
new file mode 100644
index 000000000..df48e3a10
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/affine-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/affine-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/affine-16.png
new file mode 100644
index 000000000..542168148
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/affine-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/affine-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/affine-24-dark.png
new file mode 100644
index 000000000..8eb886e14
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/affine-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/affine-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/affine-24.png
new file mode 100644
index 000000000..a81afa70d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/affine-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/affine-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/affine-40-dark.png
new file mode 100644
index 000000000..022fb67a0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/affine-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/affine-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/affine-40.png
new file mode 100644
index 000000000..7b17d0fb3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/affine-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/airtable-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/airtable-16.png
new file mode 100644
index 000000000..ee3bd073a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/airtable-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/airtable-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/airtable-24.png
new file mode 100644
index 000000000..ea45134ec
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/airtable-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/airtable-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/airtable-40.png
new file mode 100644
index 000000000..493a97379
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/airtable-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/akkoma-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/akkoma-16-dark.png
new file mode 100644
index 000000000..d10157fbe
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/akkoma-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/akkoma-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/akkoma-16.png
new file mode 100644
index 000000000..d249da5d1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/akkoma-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/akkoma-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/akkoma-24-dark.png
new file mode 100644
index 000000000..9164a443d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/akkoma-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/akkoma-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/akkoma-24.png
new file mode 100644
index 000000000..00a1c6ab6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/akkoma-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/akkoma-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/akkoma-40-dark.png
new file mode 100644
index 000000000..3f7e5a9b8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/akkoma-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/akkoma-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/akkoma-40.png
new file mode 100644
index 000000000..18bc7f4cf
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/akkoma-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/alist-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/alist-16.png
new file mode 100644
index 000000000..89cc943b5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/alist-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/alist-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/alist-24.png
new file mode 100644
index 000000000..928d12315
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/alist-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/alist-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/alist-40.png
new file mode 100644
index 000000000..62adc4031
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/alist-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/anonaddy-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/anonaddy-16.png
new file mode 100644
index 000000000..13aab847a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/anonaddy-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/anonaddy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/anonaddy-24.png
new file mode 100644
index 000000000..15b8bd7f7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/anonaddy-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/anonaddy-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/anonaddy-40.png
new file mode 100644
index 000000000..1aa961dfd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/anonaddy-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ansible-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ansible-16-dark.png
new file mode 100644
index 000000000..b729a71fe
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ansible-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ansible-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ansible-16.png
new file mode 100644
index 000000000..a912bbcc3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ansible-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ansible-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ansible-24-dark.png
new file mode 100644
index 000000000..9f63ff270
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ansible-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ansible-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ansible-24.png
new file mode 100644
index 000000000..1fe17247e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ansible-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ansible-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ansible-40-dark.png
new file mode 100644
index 000000000..ea0bcbc5b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ansible-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ansible-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ansible-40.png
new file mode 100644
index 000000000..91099c6ad
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ansible-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/apache-answer-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/apache-answer-16.png
new file mode 100644
index 000000000..d6aed6167
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/apache-answer-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/apache-answer-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/apache-answer-24.png
new file mode 100644
index 000000000..91421adf4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/apache-answer-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/apache-answer-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/apache-answer-40.png
new file mode 100644
index 000000000..b606d343c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/apache-answer-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/appflowy-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/appflowy-16.png
new file mode 100644
index 000000000..50bfe1d3e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/appflowy-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/appflowy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/appflowy-24.png
new file mode 100644
index 000000000..84882c405
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/appflowy-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/appflowy-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/appflowy-40.png
new file mode 100644
index 000000000..c6f386ad4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/appflowy-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/appwrite-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/appwrite-16.png
new file mode 100644
index 000000000..316811bbf
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/appwrite-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/appwrite-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/appwrite-24.png
new file mode 100644
index 000000000..efe242f64
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/appwrite-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/appwrite-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/appwrite-40.png
new file mode 100644
index 000000000..7b9c97ba3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/appwrite-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ara-records-ansible-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ara-records-ansible-16.png
new file mode 100644
index 000000000..993cea093
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ara-records-ansible-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ara-records-ansible-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ara-records-ansible-24.png
new file mode 100644
index 000000000..fdd4c0637
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ara-records-ansible-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ara-records-ansible-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ara-records-ansible-40.png
new file mode 100644
index 000000000..4fdb91aad
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ara-records-ansible-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/argo-cd-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/argo-cd-16.png
new file mode 100644
index 000000000..83f44e4d5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/argo-cd-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/argo-cd-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/argo-cd-24.png
new file mode 100644
index 000000000..d90b8291b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/argo-cd-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/argo-cd-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/argo-cd-40.png
new file mode 100644
index 000000000..2eb734e2e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/argo-cd-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/asciinema-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/asciinema-16.png
new file mode 100644
index 000000000..5d30aec97
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/asciinema-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/asciinema-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/asciinema-24.png
new file mode 100644
index 000000000..ee812dcb4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/asciinema-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/asciinema-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/asciinema-40.png
new file mode 100644
index 000000000..1ab97dda6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/asciinema-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/atuin-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/atuin-16-dark.png
new file mode 100644
index 000000000..f8feeeba7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/atuin-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/atuin-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/atuin-16.png
new file mode 100644
index 000000000..a7750f6f8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/atuin-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/atuin-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/atuin-24-dark.png
new file mode 100644
index 000000000..8d3582da4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/atuin-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/atuin-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/atuin-24.png
new file mode 100644
index 000000000..08490c5d0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/atuin-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/atuin-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/atuin-40-dark.png
new file mode 100644
index 000000000..90877e845
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/atuin-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/atuin-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/atuin-40.png
new file mode 100644
index 000000000..8269d1f44
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/atuin-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/audacity-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/audacity-16-dark.png
new file mode 100644
index 000000000..d82c08c89
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/audacity-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/audacity-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/audacity-16.png
new file mode 100644
index 000000000..2f4f9652f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/audacity-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/audacity-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/audacity-24-dark.png
new file mode 100644
index 000000000..79efc91e2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/audacity-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/audacity-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/audacity-24.png
new file mode 100644
index 000000000..f73df0ec6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/audacity-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/audacity-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/audacity-40-dark.png
new file mode 100644
index 000000000..f94a7601c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/audacity-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/audacity-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/audacity-40.png
new file mode 100644
index 000000000..4ed87fcdc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/audacity-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/audiobookshelf-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/audiobookshelf-16.png
new file mode 100644
index 000000000..489dff00b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/audiobookshelf-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/audiobookshelf-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/audiobookshelf-24.png
new file mode 100644
index 000000000..45e9040ba
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/audiobookshelf-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/audiobookshelf-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/audiobookshelf-40.png
new file mode 100644
index 000000000..6039ae03a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/audiobookshelf-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/authelia-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/authelia-16-dark.png
new file mode 100644
index 000000000..f4129f6c1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/authelia-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/authelia-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/authelia-16.png
new file mode 100644
index 000000000..cb7b60a2f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/authelia-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/authelia-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/authelia-24-dark.png
new file mode 100644
index 000000000..35f17310d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/authelia-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/authelia-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/authelia-24.png
new file mode 100644
index 000000000..55abd9ea2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/authelia-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/authelia-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/authelia-40-dark.png
new file mode 100644
index 000000000..05d1dca5c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/authelia-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/authelia-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/authelia-40.png
new file mode 100644
index 000000000..1b63c37f2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/authelia-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/authentik-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/authentik-16.png
new file mode 100644
index 000000000..9aa8c23c8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/authentik-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/authentik-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/authentik-24.png
new file mode 100644
index 000000000..8108f98a2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/authentik-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/authentik-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/authentik-40.png
new file mode 100644
index 000000000..b9eec7b19
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/authentik-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/authman-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/authman-16.png
new file mode 100644
index 000000000..3c893d51b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/authman-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/authman-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/authman-24.png
new file mode 100644
index 000000000..def205c25
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/authman-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/authman-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/authman-40.png
new file mode 100644
index 000000000..a177b2bec
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/authman-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/autobrr-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/autobrr-16.png
new file mode 100644
index 000000000..7dcacaeba
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/autobrr-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/autobrr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/autobrr-24.png
new file mode 100644
index 000000000..06ee1b4cd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/autobrr-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/autobrr-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/autobrr-40.png
new file mode 100644
index 000000000..af168d38d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/autobrr-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/automad-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/automad-16-dark.png
new file mode 100644
index 000000000..926413adc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/automad-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/automad-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/automad-16.png
new file mode 100644
index 000000000..72403b4d2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/automad-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/automad-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/automad-24-dark.png
new file mode 100644
index 000000000..bb5e085cb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/automad-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/automad-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/automad-24.png
new file mode 100644
index 000000000..03dea1c47
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/automad-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/automad-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/automad-40-dark.png
new file mode 100644
index 000000000..843127fc1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/automad-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/automad-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/automad-40.png
new file mode 100644
index 000000000..a5671d1fd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/automad-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/azuracast-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/azuracast-16.png
new file mode 100644
index 000000000..953bb1273
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/azuracast-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/azuracast-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/azuracast-24.png
new file mode 100644
index 000000000..57cfd76cf
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/azuracast-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/azuracast-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/azuracast-40.png
new file mode 100644
index 000000000..56dfc033b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/azuracast-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/backblaze-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/backblaze-16-dark.png
new file mode 100644
index 000000000..d5319aa35
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/backblaze-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/backblaze-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/backblaze-16.png
new file mode 100644
index 000000000..9727e1b2b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/backblaze-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/backblaze-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/backblaze-24-dark.png
new file mode 100644
index 000000000..58f1b1cf3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/backblaze-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/backblaze-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/backblaze-24.png
new file mode 100644
index 000000000..1ba147201
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/backblaze-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/backblaze-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/backblaze-40-dark.png
new file mode 100644
index 000000000..cab3511b0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/backblaze-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/backblaze-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/backblaze-40.png
new file mode 100644
index 000000000..364b816af
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/backblaze-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/backrest-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/backrest-16-dark.png
new file mode 100644
index 000000000..3e828b060
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/backrest-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/backrest-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/backrest-16.png
new file mode 100644
index 000000000..a48aaaa0e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/backrest-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/backrest-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/backrest-24-dark.png
new file mode 100644
index 000000000..e3af45db0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/backrest-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/backrest-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/backrest-24.png
new file mode 100644
index 000000000..db2c7ca04
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/backrest-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/backrest-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/backrest-40-dark.png
new file mode 100644
index 000000000..7ac42a32b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/backrest-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/backrest-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/backrest-40.png
new file mode 100644
index 000000000..71f2e6eda
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/backrest-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bar-assistant-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bar-assistant-16.png
new file mode 100644
index 000000000..6fa728154
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bar-assistant-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bar-assistant-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bar-assistant-24.png
new file mode 100644
index 000000000..cf5014923
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bar-assistant-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bar-assistant-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bar-assistant-40.png
new file mode 100644
index 000000000..61d50d762
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bar-assistant-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/baserow-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/baserow-16-dark.png
new file mode 100644
index 000000000..761c6e652
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/baserow-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/baserow-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/baserow-16.png
new file mode 100644
index 000000000..5b7964d8e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/baserow-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/baserow-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/baserow-24-dark.png
new file mode 100644
index 000000000..2b98e25a4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/baserow-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/baserow-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/baserow-24.png
new file mode 100644
index 000000000..eeacd97de
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/baserow-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/baserow-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/baserow-40-dark.png
new file mode 100644
index 000000000..cd812f27f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/baserow-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/baserow-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/baserow-40.png
new file mode 100644
index 000000000..bc70a7c36
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/baserow-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bigbluebutton-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bigbluebutton-16.png
new file mode 100644
index 000000000..546489bdc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bigbluebutton-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bigbluebutton-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bigbluebutton-24.png
new file mode 100644
index 000000000..724c61ab0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bigbluebutton-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bigbluebutton-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bigbluebutton-40.png
new file mode 100644
index 000000000..76af80101
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bigbluebutton-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bigcapital-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bigcapital-16.png
new file mode 100644
index 000000000..87c3deb9b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bigcapital-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bigcapital-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bigcapital-24.png
new file mode 100644
index 000000000..17259fcf7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bigcapital-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bigcapital-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bigcapital-40.png
new file mode 100644
index 000000000..3c426827a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bigcapital-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bitwarden-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bitwarden-16.png
new file mode 100644
index 000000000..b0d1af1de
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bitwarden-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bitwarden-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bitwarden-24.png
new file mode 100644
index 000000000..20d15b6e5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bitwarden-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bitwarden-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bitwarden-40.png
new file mode 100644
index 000000000..f146595c8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bitwarden-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/blocky-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/blocky-16.png
new file mode 100644
index 000000000..21021f1dc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/blocky-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/blocky-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/blocky-24.png
new file mode 100644
index 000000000..0f28b4135
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/blocky-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/blocky-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/blocky-40.png
new file mode 100644
index 000000000..a39a367b9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/blocky-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bluesky-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bluesky-16-dark.png
new file mode 100644
index 000000000..9994fb77c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bluesky-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bluesky-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bluesky-16.png
new file mode 100644
index 000000000..d4cf12add
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bluesky-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bluesky-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bluesky-24-dark.png
new file mode 100644
index 000000000..1ecdac1fa
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bluesky-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bluesky-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bluesky-24.png
new file mode 100644
index 000000000..e46ceb34d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bluesky-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bluesky-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bluesky-40-dark.png
new file mode 100644
index 000000000..0ba928506
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bluesky-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bluesky-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bluesky-40.png
new file mode 100644
index 000000000..10f223414
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bluesky-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/booklogr-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/booklogr-16.png
new file mode 100644
index 000000000..2dec2b10b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/booklogr-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/booklogr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/booklogr-24.png
new file mode 100644
index 000000000..41901a146
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/booklogr-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/booklogr-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/booklogr-40.png
new file mode 100644
index 000000000..f2b547a6b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/booklogr-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bookstack-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bookstack-16.png
new file mode 100644
index 000000000..cee3732b4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bookstack-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bookstack-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bookstack-24.png
new file mode 100644
index 000000000..354634e50
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bookstack-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bookstack-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bookstack-40.png
new file mode 100644
index 000000000..96386e5ff
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bookstack-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/borg-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/borg-16.png
new file mode 100644
index 000000000..f2f93ac31
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/borg-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/borg-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/borg-24.png
new file mode 100644
index 000000000..efc36d14f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/borg-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/borg-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/borg-40.png
new file mode 100644
index 000000000..4161f83d3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/borg-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/borgmatic-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/borgmatic-16-dark.png
new file mode 100644
index 000000000..d7ae166fc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/borgmatic-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/borgmatic-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/borgmatic-16.png
new file mode 100644
index 000000000..2b3d9dae1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/borgmatic-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/borgmatic-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/borgmatic-24-dark.png
new file mode 100644
index 000000000..6b0152c48
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/borgmatic-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/borgmatic-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/borgmatic-24.png
new file mode 100644
index 000000000..00f7102ea
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/borgmatic-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/borgmatic-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/borgmatic-40-dark.png
new file mode 100644
index 000000000..130c594ab
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/borgmatic-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/borgmatic-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/borgmatic-40.png
new file mode 100644
index 000000000..d96754f5c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/borgmatic-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/budgetbee-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/budgetbee-16.png
new file mode 100644
index 000000000..dc9a667bd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/budgetbee-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/budgetbee-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/budgetbee-24.png
new file mode 100644
index 000000000..7c4ca8ad6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/budgetbee-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/budgetbee-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/budgetbee-40.png
new file mode 100644
index 000000000..0ff651bdf
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/budgetbee-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/budibase-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/budibase-16.png
new file mode 100644
index 000000000..20d2ef1dc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/budibase-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/budibase-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/budibase-24.png
new file mode 100644
index 000000000..108e75d76
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/budibase-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/budibase-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/budibase-40.png
new file mode 100644
index 000000000..79869b4c1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/budibase-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bunkerweb-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bunkerweb-16-dark.png
new file mode 100644
index 000000000..8052cbf04
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bunkerweb-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bunkerweb-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bunkerweb-16.png
new file mode 100644
index 000000000..5e2602c10
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bunkerweb-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bunkerweb-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bunkerweb-24-dark.png
new file mode 100644
index 000000000..c4fb8ad8d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bunkerweb-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bunkerweb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bunkerweb-24.png
new file mode 100644
index 000000000..b0b154031
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bunkerweb-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bunkerweb-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bunkerweb-40-dark.png
new file mode 100644
index 000000000..2447f233b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bunkerweb-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/bunkerweb-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/bunkerweb-40.png
new file mode 100644
index 000000000..cb630ed7c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/bunkerweb-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/caddy-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/caddy-16.png
new file mode 100644
index 000000000..b2a9d1d5b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/caddy-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/caddy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/caddy-24.png
new file mode 100644
index 000000000..bd79ce3ca
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/caddy-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/caddy-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/caddy-40.png
new file mode 100644
index 000000000..89f3cabb9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/caddy-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cal-com-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cal-com-16-dark.png
new file mode 100644
index 000000000..547a9c7ab
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cal-com-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cal-com-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cal-com-16.png
new file mode 100644
index 000000000..4b0d6e135
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cal-com-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cal-com-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cal-com-24-dark.png
new file mode 100644
index 000000000..4fdf824ec
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cal-com-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cal-com-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cal-com-24.png
new file mode 100644
index 000000000..dad913d84
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cal-com-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cal-com-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cal-com-40-dark.png
new file mode 100644
index 000000000..7630bac1c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cal-com-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cal-com-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cal-com-40.png
new file mode 100644
index 000000000..f13f32332
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cal-com-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/calibre-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/calibre-16.png
new file mode 100644
index 000000000..6f440a8e0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/calibre-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/calibre-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/calibre-24.png
new file mode 100644
index 000000000..d53e60f8a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/calibre-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/calibre-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/calibre-40.png
new file mode 100644
index 000000000..4c562763b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/calibre-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/calibre-web-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/calibre-web-16.png
new file mode 100644
index 000000000..56792166a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/calibre-web-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/calibre-web-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/calibre-web-24.png
new file mode 100644
index 000000000..79df0140e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/calibre-web-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/calibre-web-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/calibre-web-40.png
new file mode 100644
index 000000000..0a8b8ddd8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/calibre-web-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/castopod-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/castopod-16.png
new file mode 100644
index 000000000..72d1647b9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/castopod-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/castopod-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/castopod-24.png
new file mode 100644
index 000000000..a5b1c912d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/castopod-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/castopod-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/castopod-40.png
new file mode 100644
index 000000000..f87e05d2d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/castopod-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/changedetection-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/changedetection-16-dark.png
new file mode 100644
index 000000000..50219446c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/changedetection-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/changedetection-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/changedetection-16.png
new file mode 100644
index 000000000..5c8a1ea23
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/changedetection-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/changedetection-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/changedetection-24-dark.png
new file mode 100644
index 000000000..0e19e6d41
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/changedetection-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/changedetection-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/changedetection-24.png
new file mode 100644
index 000000000..339b53c71
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/changedetection-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/changedetection-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/changedetection-40-dark.png
new file mode 100644
index 000000000..f82974b95
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/changedetection-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/changedetection-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/changedetection-40.png
new file mode 100644
index 000000000..8497429f5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/changedetection-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/channels-dvr-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/channels-dvr-16.png
new file mode 100644
index 000000000..da35f0a63
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/channels-dvr-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/channels-dvr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/channels-dvr-24.png
new file mode 100644
index 000000000..570c2e0c8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/channels-dvr-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/channels-dvr-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/channels-dvr-40.png
new file mode 100644
index 000000000..86c5e098d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/channels-dvr-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/chevereto-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/chevereto-16.png
new file mode 100644
index 000000000..8dda748d6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/chevereto-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/chevereto-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/chevereto-24.png
new file mode 100644
index 000000000..2b3c11c23
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/chevereto-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/chevereto-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/chevereto-40.png
new file mode 100644
index 000000000..646bfbda1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/chevereto-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/chirpy-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/chirpy-16.png
new file mode 100644
index 000000000..1d07e3e4f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/chirpy-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/chirpy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/chirpy-24.png
new file mode 100644
index 000000000..b49aa0325
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/chirpy-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/chirpy-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/chirpy-40.png
new file mode 100644
index 000000000..69c3f0377
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/chirpy-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/chromium-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/chromium-16.png
new file mode 100644
index 000000000..9cfd886e2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/chromium-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/chromium-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/chromium-24.png
new file mode 100644
index 000000000..006fe4e6a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/chromium-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/chromium-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/chromium-40.png
new file mode 100644
index 000000000..bf8089eac
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/chromium-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/clickhouse-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/clickhouse-16.png
new file mode 100644
index 000000000..016da7062
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/clickhouse-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/clickhouse-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/clickhouse-24.png
new file mode 100644
index 000000000..ca55f9377
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/clickhouse-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/clickhouse-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/clickhouse-40.png
new file mode 100644
index 000000000..4eaae4188
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/clickhouse-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cloudbeaver-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cloudbeaver-16.png
new file mode 100644
index 000000000..d91497e97
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cloudbeaver-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cloudbeaver-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cloudbeaver-24.png
new file mode 100644
index 000000000..f02f8b7fa
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cloudbeaver-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cloudbeaver-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cloudbeaver-40.png
new file mode 100644
index 000000000..7453bc7c7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cloudbeaver-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cloudflare-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cloudflare-16.png
new file mode 100644
index 000000000..fe62f15ea
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cloudflare-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cloudflare-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cloudflare-24.png
new file mode 100644
index 000000000..3d1f45c57
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cloudflare-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cloudflare-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cloudflare-40.png
new file mode 100644
index 000000000..e7b344a25
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cloudflare-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cockpit-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cockpit-16-dark.png
new file mode 100644
index 000000000..241c319d8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cockpit-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cockpit-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cockpit-16.png
new file mode 100644
index 000000000..f27f20770
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cockpit-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cockpit-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cockpit-24-dark.png
new file mode 100644
index 000000000..2fab2ef62
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cockpit-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cockpit-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cockpit-24.png
new file mode 100644
index 000000000..8a6923277
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cockpit-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cockpit-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cockpit-40-dark.png
new file mode 100644
index 000000000..b5531cb60
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cockpit-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cockpit-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cockpit-40.png
new file mode 100644
index 000000000..a7b2c734c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cockpit-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/codeberg-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/codeberg-16.png
new file mode 100644
index 000000000..9cd773d55
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/codeberg-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/codeberg-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/codeberg-24.png
new file mode 100644
index 000000000..535d3e1f7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/codeberg-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/codeberg-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/codeberg-40.png
new file mode 100644
index 000000000..77c0d4eef
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/codeberg-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/coder-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/coder-16-dark.png
new file mode 100644
index 000000000..663ad6fbd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/coder-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/coder-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/coder-16.png
new file mode 100644
index 000000000..445bf0123
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/coder-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/coder-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/coder-24-dark.png
new file mode 100644
index 000000000..834e32bfd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/coder-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/coder-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/coder-24.png
new file mode 100644
index 000000000..73fa1586b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/coder-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/coder-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/coder-40-dark.png
new file mode 100644
index 000000000..8e0662693
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/coder-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/coder-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/coder-40.png
new file mode 100644
index 000000000..31fea7ac0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/coder-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/commafeed-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/commafeed-16-dark.png
new file mode 100644
index 000000000..e98fe6908
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/commafeed-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/commafeed-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/commafeed-16.png
new file mode 100644
index 000000000..3911cc5ba
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/commafeed-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/commafeed-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/commafeed-24-dark.png
new file mode 100644
index 000000000..702cb8ebc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/commafeed-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/commafeed-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/commafeed-24.png
new file mode 100644
index 000000000..e7cbb2d11
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/commafeed-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/commafeed-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/commafeed-40-dark.png
new file mode 100644
index 000000000..fdb8fedf8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/commafeed-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/commafeed-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/commafeed-40.png
new file mode 100644
index 000000000..16f5ee544
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/commafeed-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/commento-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/commento-16-dark.png
new file mode 100644
index 000000000..d129cc79a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/commento-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/commento-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/commento-16.png
new file mode 100644
index 000000000..d43404e27
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/commento-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/commento-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/commento-24-dark.png
new file mode 100644
index 000000000..13dadd140
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/commento-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/commento-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/commento-24.png
new file mode 100644
index 000000000..ff40bc1d8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/commento-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/commento-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/commento-40-dark.png
new file mode 100644
index 000000000..050f61e58
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/commento-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/commento-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/commento-40.png
new file mode 100644
index 000000000..c070e7c06
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/commento-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/compreface-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/compreface-16.png
new file mode 100644
index 000000000..24dd99601
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/compreface-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/compreface-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/compreface-24.png
new file mode 100644
index 000000000..27d622e17
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/compreface-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/compreface-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/compreface-40.png
new file mode 100644
index 000000000..ede0a17fa
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/compreface-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/confluence-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/confluence-16.png
new file mode 100644
index 000000000..8c1cc7232
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/confluence-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/confluence-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/confluence-24.png
new file mode 100644
index 000000000..d4fb0008f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/confluence-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/confluence-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/confluence-40.png
new file mode 100644
index 000000000..11ab7ddf2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/confluence-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/converse-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/converse-16-dark.png
new file mode 100644
index 000000000..8c9acdd36
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/converse-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/converse-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/converse-16.png
new file mode 100644
index 000000000..da8be83e6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/converse-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/converse-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/converse-24-dark.png
new file mode 100644
index 000000000..78ce25911
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/converse-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/converse-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/converse-24.png
new file mode 100644
index 000000000..d22cb7fe2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/converse-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/converse-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/converse-40-dark.png
new file mode 100644
index 000000000..2e73154c6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/converse-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/converse-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/converse-40.png
new file mode 100644
index 000000000..9c8994b22
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/converse-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/couchdb-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/couchdb-16-dark.png
new file mode 100644
index 000000000..280f0dd57
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/couchdb-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/couchdb-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/couchdb-16.png
new file mode 100644
index 000000000..e61a9ee9b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/couchdb-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/couchdb-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/couchdb-24-dark.png
new file mode 100644
index 000000000..38b130d6f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/couchdb-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/couchdb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/couchdb-24.png
new file mode 100644
index 000000000..7d6bb08dd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/couchdb-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/couchdb-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/couchdb-40-dark.png
new file mode 100644
index 000000000..ba55d390d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/couchdb-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/couchdb-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/couchdb-40.png
new file mode 100644
index 000000000..20991e8d8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/couchdb-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/counter-analytics-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/counter-analytics-16.png
new file mode 100644
index 000000000..abcca4b4a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/counter-analytics-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/counter-analytics-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/counter-analytics-24.png
new file mode 100644
index 000000000..c5890922b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/counter-analytics-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/counter-analytics-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/counter-analytics-40.png
new file mode 100644
index 000000000..9474b67c7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/counter-analytics-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/crowdsec-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/crowdsec-16.png
new file mode 100644
index 000000000..80e41eb49
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/crowdsec-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/crowdsec-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/crowdsec-24.png
new file mode 100644
index 000000000..806e5b2be
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/crowdsec-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/crowdsec-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/crowdsec-40.png
new file mode 100644
index 000000000..6c06d14e9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/crowdsec-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cryptpad-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cryptpad-16.png
new file mode 100644
index 000000000..80e2f23c7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cryptpad-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cryptpad-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cryptpad-24.png
new file mode 100644
index 000000000..602daa702
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cryptpad-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cryptpad-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cryptpad-40.png
new file mode 100644
index 000000000..c2a79cefd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cryptpad-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ctfreak-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ctfreak-16.png
new file mode 100644
index 000000000..d4797147b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ctfreak-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ctfreak-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ctfreak-24.png
new file mode 100644
index 000000000..a3d9124a6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ctfreak-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ctfreak-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ctfreak-40.png
new file mode 100644
index 000000000..5dbe25d92
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ctfreak-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cyberchef-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cyberchef-16.png
new file mode 100644
index 000000000..8034d9c93
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cyberchef-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cyberchef-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cyberchef-24.png
new file mode 100644
index 000000000..b5dc1189a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cyberchef-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/cyberchef-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/cyberchef-40.png
new file mode 100644
index 000000000..c0aa6232d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/cyberchef-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/czkawka-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/czkawka-16.png
new file mode 100644
index 000000000..d134f1274
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/czkawka-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/czkawka-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/czkawka-24.png
new file mode 100644
index 000000000..e5291ec9c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/czkawka-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/czkawka-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/czkawka-40.png
new file mode 100644
index 000000000..26741fb69
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/czkawka-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dalibo-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dalibo-16-dark.png
new file mode 100644
index 000000000..459a1c806
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dalibo-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dalibo-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dalibo-16.png
new file mode 100644
index 000000000..b1c06cc01
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dalibo-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dalibo-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dalibo-24-dark.png
new file mode 100644
index 000000000..e16142e57
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dalibo-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dalibo-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dalibo-24.png
new file mode 100644
index 000000000..b7c9b39fb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dalibo-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dalibo-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dalibo-40-dark.png
new file mode 100644
index 000000000..447c589cd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dalibo-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dalibo-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dalibo-40.png
new file mode 100644
index 000000000..e166eb799
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dalibo-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/davical-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/davical-16.png
new file mode 100644
index 000000000..6c54eea58
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/davical-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/davical-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/davical-24.png
new file mode 100644
index 000000000..76a8f1f00
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/davical-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/davical-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/davical-40.png
new file mode 100644
index 000000000..8cf604d87
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/davical-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ddclient-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ddclient-16.png
new file mode 100644
index 000000000..dc8393ff0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ddclient-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ddclient-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ddclient-24.png
new file mode 100644
index 000000000..36ad4a7ee
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ddclient-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ddclient-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ddclient-40.png
new file mode 100644
index 000000000..15f4004c4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ddclient-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ddns-updater-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ddns-updater-16.png
new file mode 100644
index 000000000..b09ffad23
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ddns-updater-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ddns-updater-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ddns-updater-24.png
new file mode 100644
index 000000000..94339420f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ddns-updater-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ddns-updater-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ddns-updater-40.png
new file mode 100644
index 000000000..26c82b95a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ddns-updater-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/defguard-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/defguard-16.png
new file mode 100644
index 000000000..8f43d61e2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/defguard-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/defguard-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/defguard-24.png
new file mode 100644
index 000000000..055a76d4b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/defguard-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/defguard-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/defguard-40.png
new file mode 100644
index 000000000..2ca29305e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/defguard-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/deluge-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/deluge-16.png
new file mode 100644
index 000000000..a17094554
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/deluge-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/deluge-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/deluge-24.png
new file mode 100644
index 000000000..55be350da
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/deluge-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/deluge-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/deluge-40.png
new file mode 100644
index 000000000..2dcea28da
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/deluge-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/digitalocean-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/digitalocean-16-dark.png
new file mode 100644
index 000000000..81fe8b25a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/digitalocean-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/digitalocean-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/digitalocean-16.png
new file mode 100644
index 000000000..1868a4153
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/digitalocean-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/digitalocean-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/digitalocean-24-dark.png
new file mode 100644
index 000000000..83dafe724
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/digitalocean-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/digitalocean-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/digitalocean-24.png
new file mode 100644
index 000000000..e8c8af065
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/digitalocean-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/digitalocean-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/digitalocean-40-dark.png
new file mode 100644
index 000000000..04336ab88
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/digitalocean-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/digitalocean-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/digitalocean-40.png
new file mode 100644
index 000000000..8ba6efb20
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/digitalocean-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dillinger-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dillinger-16-dark.png
new file mode 100644
index 000000000..f3b70b96d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dillinger-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dillinger-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dillinger-16.png
new file mode 100644
index 000000000..b5a9a720d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dillinger-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dillinger-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dillinger-24-dark.png
new file mode 100644
index 000000000..76dc7e6e4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dillinger-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dillinger-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dillinger-24.png
new file mode 100644
index 000000000..c0780ce0d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dillinger-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dillinger-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dillinger-40-dark.png
new file mode 100644
index 000000000..903ce7b7d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dillinger-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dillinger-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dillinger-40.png
new file mode 100644
index 000000000..02415bda7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dillinger-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docassemble-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docassemble-16-dark.png
new file mode 100644
index 000000000..328baf1da
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docassemble-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docassemble-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docassemble-16.png
new file mode 100644
index 000000000..4b81d5bac
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docassemble-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docassemble-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docassemble-24-dark.png
new file mode 100644
index 000000000..a060b408a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docassemble-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docassemble-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docassemble-24.png
new file mode 100644
index 000000000..25152628b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docassemble-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docassemble-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docassemble-40-dark.png
new file mode 100644
index 000000000..55712fb03
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docassemble-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docassemble-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docassemble-40.png
new file mode 100644
index 000000000..2c442bcfd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docassemble-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docker-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docker-16-dark.png
new file mode 100644
index 000000000..671ab60d2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docker-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docker-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docker-16.png
new file mode 100644
index 000000000..d25f10d85
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docker-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docker-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docker-24-dark.png
new file mode 100644
index 000000000..147e7dd56
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docker-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docker-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docker-24.png
new file mode 100644
index 000000000..f986c19c7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docker-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docker-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docker-40-dark.png
new file mode 100644
index 000000000..c3e6a0f1e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docker-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docker-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docker-40.png
new file mode 100644
index 000000000..46b4de573
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docker-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docker-volume-backup-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docker-volume-backup-16.png
new file mode 100644
index 000000000..0ece60cc0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docker-volume-backup-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docker-volume-backup-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docker-volume-backup-24.png
new file mode 100644
index 000000000..72d61fdc0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docker-volume-backup-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docker-volume-backup-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docker-volume-backup-40.png
new file mode 100644
index 000000000..1d0733805
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docker-volume-backup-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dockge-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dockge-16.png
new file mode 100644
index 000000000..ecbe49154
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dockge-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dockge-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dockge-24.png
new file mode 100644
index 000000000..71b55fca6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dockge-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dockge-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dockge-40.png
new file mode 100644
index 000000000..7d5a6bf0e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dockge-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docspell-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docspell-16.png
new file mode 100644
index 000000000..7aaf4dceb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docspell-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docspell-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docspell-24.png
new file mode 100644
index 000000000..834d6ce3f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docspell-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docspell-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docspell-40.png
new file mode 100644
index 000000000..4f594aba4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docspell-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docusaurus-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docusaurus-16.png
new file mode 100644
index 000000000..32f5eb9c4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docusaurus-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docusaurus-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docusaurus-24.png
new file mode 100644
index 000000000..42477cbd0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docusaurus-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docusaurus-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docusaurus-40.png
new file mode 100644
index 000000000..564c03ccd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docusaurus-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docuseal-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docuseal-16.png
new file mode 100644
index 000000000..eb542278d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docuseal-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docuseal-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docuseal-24.png
new file mode 100644
index 000000000..7ef6daf67
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docuseal-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/docuseal-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/docuseal-40.png
new file mode 100644
index 000000000..9e7ef05bd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/docuseal-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dokemon-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dokemon-16.png
new file mode 100644
index 000000000..25cb68f08
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dokemon-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dokemon-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dokemon-24.png
new file mode 100644
index 000000000..2636e4d19
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dokemon-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dokemon-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dokemon-40.png
new file mode 100644
index 000000000..ed15a69f0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dokemon-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dokuwiki-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dokuwiki-16.png
new file mode 100644
index 000000000..f65d204ce
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dokuwiki-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dokuwiki-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dokuwiki-24.png
new file mode 100644
index 000000000..091fcb475
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dokuwiki-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dokuwiki-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dokuwiki-40.png
new file mode 100644
index 000000000..cb8bfae13
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dokuwiki-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/double-take-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/double-take-16.png
new file mode 100644
index 000000000..86a9fcf33
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/double-take-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/double-take-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/double-take-24.png
new file mode 100644
index 000000000..ebd77a042
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/double-take-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/double-take-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/double-take-40.png
new file mode 100644
index 000000000..44dd26ac3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/double-take-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dovecot-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dovecot-16.png
new file mode 100644
index 000000000..d0d38a3f2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dovecot-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dovecot-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dovecot-24.png
new file mode 100644
index 000000000..976e1da4c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dovecot-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dovecot-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dovecot-40.png
new file mode 100644
index 000000000..8032a260b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dovecot-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dozzle-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dozzle-16-dark.png
new file mode 100644
index 000000000..dbc80ef09
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dozzle-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dozzle-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dozzle-16.png
new file mode 100644
index 000000000..a8d96e152
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dozzle-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dozzle-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dozzle-24-dark.png
new file mode 100644
index 000000000..cd526b7ae
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dozzle-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dozzle-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dozzle-24.png
new file mode 100644
index 000000000..f3fbf326b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dozzle-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dozzle-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dozzle-40-dark.png
new file mode 100644
index 000000000..d8539d48c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dozzle-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dozzle-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dozzle-40.png
new file mode 100644
index 000000000..358bc0848
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dozzle-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/draw-io-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/draw-io-16.png
new file mode 100644
index 000000000..c4a89e3f4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/draw-io-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/draw-io-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/draw-io-24.png
new file mode 100644
index 000000000..171639c1a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/draw-io-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/draw-io-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/draw-io-40.png
new file mode 100644
index 000000000..581ae4f3e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/draw-io-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dropbox-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dropbox-16-dark.png
new file mode 100644
index 000000000..aad002e53
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dropbox-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dropbox-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dropbox-16.png
new file mode 100644
index 000000000..10f6e430c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dropbox-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dropbox-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dropbox-24-dark.png
new file mode 100644
index 000000000..c39123284
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dropbox-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dropbox-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dropbox-24.png
new file mode 100644
index 000000000..d0409ad7c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dropbox-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dropbox-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dropbox-40-dark.png
new file mode 100644
index 000000000..47d15537a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dropbox-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dropbox-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dropbox-40.png
new file mode 100644
index 000000000..54d4d0875
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dropbox-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dropout-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dropout-16.png
new file mode 100644
index 000000000..ebb38fa39
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dropout-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dropout-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dropout-24.png
new file mode 100644
index 000000000..827557329
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dropout-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dropout-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dropout-40.png
new file mode 100644
index 000000000..eb357be19
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dropout-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dub-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dub-16-dark.png
new file mode 100644
index 000000000..630f25b1c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dub-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dub-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dub-16.png
new file mode 100644
index 000000000..a71d56d49
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dub-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dub-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dub-24-dark.png
new file mode 100644
index 000000000..d140f7f3a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dub-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dub-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dub-24.png
new file mode 100644
index 000000000..f08bae35b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dub-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dub-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dub-40-dark.png
new file mode 100644
index 000000000..da11f1318
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dub-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/dub-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/dub-40.png
new file mode 100644
index 000000000..14f19c3f8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/dub-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/duckdns-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/duckdns-16.png
new file mode 100644
index 000000000..f6cb5e155
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/duckdns-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/duckdns-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/duckdns-24.png
new file mode 100644
index 000000000..810fb226a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/duckdns-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/duckdns-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/duckdns-40.png
new file mode 100644
index 000000000..40949b38d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/duckdns-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/duplicati-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/duplicati-16.png
new file mode 100644
index 000000000..de3252721
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/duplicati-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/duplicati-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/duplicati-24.png
new file mode 100644
index 000000000..0a950f1a2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/duplicati-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/duplicati-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/duplicati-40.png
new file mode 100644
index 000000000..f53bc5301
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/duplicati-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/element-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/element-16.png
new file mode 100644
index 000000000..2f237799d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/element-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/element-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/element-24.png
new file mode 100644
index 000000000..b005c203c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/element-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/element-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/element-40.png
new file mode 100644
index 000000000..6a373d0b6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/element-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/eleventy-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/eleventy-16-dark.png
new file mode 100644
index 000000000..e14395bf3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/eleventy-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/eleventy-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/eleventy-16.png
new file mode 100644
index 000000000..ccbfcd9a6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/eleventy-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/eleventy-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/eleventy-24-dark.png
new file mode 100644
index 000000000..f7fc5ecbb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/eleventy-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/eleventy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/eleventy-24.png
new file mode 100644
index 000000000..7ec1afeda
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/eleventy-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/eleventy-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/eleventy-40-dark.png
new file mode 100644
index 000000000..392fddaad
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/eleventy-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/eleventy-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/eleventy-40.png
new file mode 100644
index 000000000..4f1afbf32
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/eleventy-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/emby-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/emby-16.png
new file mode 100644
index 000000000..180d48b9c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/emby-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/emby-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/emby-24.png
new file mode 100644
index 000000000..dc6eb7de9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/emby-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/emby-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/emby-40.png
new file mode 100644
index 000000000..b82778c7e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/emby-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/endless-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/endless-16-dark.png
new file mode 100644
index 000000000..b074a5f51
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/endless-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/endless-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/endless-16.png
new file mode 100644
index 000000000..4895fa735
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/endless-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/endless-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/endless-24-dark.png
new file mode 100644
index 000000000..8dc641fb4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/endless-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/endless-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/endless-24.png
new file mode 100644
index 000000000..50515341e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/endless-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/endless-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/endless-40-dark.png
new file mode 100644
index 000000000..5d2735781
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/endless-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/endless-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/endless-40.png
new file mode 100644
index 000000000..94e3cb772
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/endless-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/endurain-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/endurain-16.png
new file mode 100644
index 000000000..a0c70916b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/endurain-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/endurain-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/endurain-24.png
new file mode 100644
index 000000000..6c8c69ddc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/endurain-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/endurain-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/endurain-40.png
new file mode 100644
index 000000000..7704fc619
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/endurain-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/esphome-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/esphome-16-dark.png
new file mode 100644
index 000000000..c27b26c46
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/esphome-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/esphome-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/esphome-16.png
new file mode 100644
index 000000000..fa573d2bb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/esphome-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/esphome-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/esphome-24-dark.png
new file mode 100644
index 000000000..9f87846dc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/esphome-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/esphome-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/esphome-24.png
new file mode 100644
index 000000000..2f33f7c80
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/esphome-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/esphome-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/esphome-40-dark.png
new file mode 100644
index 000000000..3d5f013e2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/esphome-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/esphome-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/esphome-40.png
new file mode 100644
index 000000000..d098483f8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/esphome-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/etesync-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/etesync-16.png
new file mode 100644
index 000000000..5270b964d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/etesync-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/etesync-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/etesync-24.png
new file mode 100644
index 000000000..2694cd2a8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/etesync-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/etesync-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/etesync-40.png
new file mode 100644
index 000000000..f688b4dd4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/etesync-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/excalidraw-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/excalidraw-16.png
new file mode 100644
index 000000000..f9c02ee9e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/excalidraw-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/excalidraw-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/excalidraw-24.png
new file mode 100644
index 000000000..f8958d9fe
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/excalidraw-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/excalidraw-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/excalidraw-40.png
new file mode 100644
index 000000000..1dc71befd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/excalidraw-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fasten-health-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fasten-health-16.png
new file mode 100644
index 000000000..f07f1115a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fasten-health-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fasten-health-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fasten-health-24.png
new file mode 100644
index 000000000..bd5cc756f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fasten-health-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fasten-health-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fasten-health-40.png
new file mode 100644
index 000000000..936ea9e7d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fasten-health-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fastmail-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fastmail-16.png
new file mode 100644
index 000000000..b2e24b574
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fastmail-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fastmail-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fastmail-24.png
new file mode 100644
index 000000000..0d9c03e14
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fastmail-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fastmail-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fastmail-40.png
new file mode 100644
index 000000000..a8e2ff32e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fastmail-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedbase-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbase-16-dark.png
new file mode 100644
index 000000000..a9a54ee4c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbase-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedbase-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbase-16.png
new file mode 100644
index 000000000..ee141c808
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbase-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedbase-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbase-24-dark.png
new file mode 100644
index 000000000..d931cccd0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbase-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedbase-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbase-24.png
new file mode 100644
index 000000000..d4f131bed
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbase-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedbase-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbase-40-dark.png
new file mode 100644
index 000000000..9e81bf2d9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbase-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedbase-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbase-40.png
new file mode 100644
index 000000000..4f8a64332
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbase-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedbin-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbin-16-dark.png
new file mode 100644
index 000000000..c51547cb1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbin-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedbin-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbin-16.png
new file mode 100644
index 000000000..d623e5b89
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbin-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedbin-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbin-24-dark.png
new file mode 100644
index 000000000..a9cd2123d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbin-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedbin-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbin-24.png
new file mode 100644
index 000000000..1b9d54072
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbin-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedbin-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbin-40-dark.png
new file mode 100644
index 000000000..e740661b0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbin-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedbin-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbin-40.png
new file mode 100644
index 000000000..b559eda4e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedbin-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedly-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedly-16-dark.png
new file mode 100644
index 000000000..bbd5c8897
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedly-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedly-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedly-16.png
new file mode 100644
index 000000000..bbd5c8897
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedly-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedly-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedly-24-dark.png
new file mode 100644
index 000000000..00b9edd12
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedly-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedly-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedly-24.png
new file mode 100644
index 000000000..00b9edd12
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedly-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedly-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedly-40-dark.png
new file mode 100644
index 000000000..9628763b5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedly-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedly-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedly-40.png
new file mode 100644
index 000000000..9628763b5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedly-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedlynx-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedlynx-16.png
new file mode 100644
index 000000000..50890f2a2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedlynx-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedlynx-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedlynx-24.png
new file mode 100644
index 000000000..8ef250f2b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedlynx-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/feedlynx-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/feedlynx-40.png
new file mode 100644
index 000000000..01f15dd18
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/feedlynx-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fenrus-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fenrus-16.png
new file mode 100644
index 000000000..246d1d783
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fenrus-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fenrus-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fenrus-24.png
new file mode 100644
index 000000000..5388eff9e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fenrus-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fenrus-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fenrus-40.png
new file mode 100644
index 000000000..97ff2c382
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fenrus-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ferdium-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ferdium-16-dark.png
new file mode 100644
index 000000000..0916d7ef9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ferdium-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ferdium-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ferdium-16.png
new file mode 100644
index 000000000..7c4af5aac
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ferdium-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ferdium-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ferdium-24-dark.png
new file mode 100644
index 000000000..c824130d8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ferdium-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ferdium-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ferdium-24.png
new file mode 100644
index 000000000..ed6f90786
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ferdium-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ferdium-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ferdium-40-dark.png
new file mode 100644
index 000000000..7c0e557f8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ferdium-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ferdium-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ferdium-40.png
new file mode 100644
index 000000000..34a2441d9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ferdium-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ferretdb-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ferretdb-16-dark.png
new file mode 100644
index 000000000..d3fe10cb0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ferretdb-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ferretdb-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ferretdb-16.png
new file mode 100644
index 000000000..1138153ae
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ferretdb-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ferretdb-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ferretdb-24-dark.png
new file mode 100644
index 000000000..2a91097fc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ferretdb-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ferretdb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ferretdb-24.png
new file mode 100644
index 000000000..954a8847e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ferretdb-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ferretdb-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ferretdb-40-dark.png
new file mode 100644
index 000000000..4a4f2bf7e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ferretdb-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ferretdb-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ferretdb-40.png
new file mode 100644
index 000000000..6c4281ec6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ferretdb-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/file-browser-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/file-browser-16.png
new file mode 100644
index 000000000..6206823ba
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/file-browser-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/file-browser-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/file-browser-24.png
new file mode 100644
index 000000000..664f9e82f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/file-browser-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/file-browser-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/file-browser-40.png
new file mode 100644
index 000000000..45fd7951e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/file-browser-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fileflows-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fileflows-16.png
new file mode 100644
index 000000000..39789d763
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fileflows-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fileflows-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fileflows-24.png
new file mode 100644
index 000000000..364cd77ce
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fileflows-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fileflows-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fileflows-40.png
new file mode 100644
index 000000000..7c7aa6251
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fileflows-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/filerun-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/filerun-16-dark.png
new file mode 100644
index 000000000..8aa680380
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/filerun-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/filerun-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/filerun-16.png
new file mode 100644
index 000000000..e63e6397c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/filerun-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/filerun-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/filerun-24-dark.png
new file mode 100644
index 000000000..26a50b33f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/filerun-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/filerun-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/filerun-24.png
new file mode 100644
index 000000000..8c6e5d47c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/filerun-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/filerun-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/filerun-40-dark.png
new file mode 100644
index 000000000..b81bcc227
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/filerun-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/filerun-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/filerun-40.png
new file mode 100644
index 000000000..c863b25d3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/filerun-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/filestash-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/filestash-16.png
new file mode 100644
index 000000000..1ce91e941
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/filestash-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/filestash-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/filestash-24.png
new file mode 100644
index 000000000..735d9a596
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/filestash-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/filestash-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/filestash-40.png
new file mode 100644
index 000000000..547c33c37
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/filestash-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/firefly-iii-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/firefly-iii-16.png
new file mode 100644
index 000000000..58492d32b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/firefly-iii-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/firefly-iii-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/firefly-iii-24.png
new file mode 100644
index 000000000..305b1fcff
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/firefly-iii-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/firefly-iii-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/firefly-iii-40.png
new file mode 100644
index 000000000..b794f19b9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/firefly-iii-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fittrackee-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fittrackee-16.png
new file mode 100644
index 000000000..378e897bb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fittrackee-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fittrackee-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fittrackee-24.png
new file mode 100644
index 000000000..961155d3d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fittrackee-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fittrackee-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fittrackee-40.png
new file mode 100644
index 000000000..3bd687e49
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fittrackee-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/flaresolverr-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/flaresolverr-16.png
new file mode 100644
index 000000000..db3da0703
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/flaresolverr-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/flaresolverr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/flaresolverr-24.png
new file mode 100644
index 000000000..c5a472d21
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/flaresolverr-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/flaresolverr-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/flaresolverr-40.png
new file mode 100644
index 000000000..61d43e4bd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/flaresolverr-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/flarum-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/flarum-16.png
new file mode 100644
index 000000000..bc4af4525
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/flarum-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/flarum-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/flarum-24.png
new file mode 100644
index 000000000..e8a188d3d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/flarum-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/flarum-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/flarum-40.png
new file mode 100644
index 000000000..ddb921b02
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/flarum-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fluffychat-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fluffychat-16-dark.png
new file mode 100644
index 000000000..5f01a56a3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fluffychat-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fluffychat-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fluffychat-16.png
new file mode 100644
index 000000000..46e4daf3b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fluffychat-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fluffychat-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fluffychat-24-dark.png
new file mode 100644
index 000000000..dbf584ac0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fluffychat-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fluffychat-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fluffychat-24.png
new file mode 100644
index 000000000..5c15af410
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fluffychat-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fluffychat-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fluffychat-40-dark.png
new file mode 100644
index 000000000..916b309b3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fluffychat-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fluffychat-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fluffychat-40.png
new file mode 100644
index 000000000..edeb0179c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fluffychat-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/forgejo-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/forgejo-16.png
new file mode 100644
index 000000000..8e1f853a2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/forgejo-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/forgejo-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/forgejo-24.png
new file mode 100644
index 000000000..1cd76c69f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/forgejo-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/forgejo-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/forgejo-40.png
new file mode 100644
index 000000000..c6bbaa529
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/forgejo-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/forte-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/forte-16-dark.png
new file mode 100644
index 000000000..8ddf1ef3e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/forte-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/forte-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/forte-16.png
new file mode 100644
index 000000000..60ce0ddaa
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/forte-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/forte-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/forte-24-dark.png
new file mode 100644
index 000000000..f925636eb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/forte-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/forte-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/forte-24.png
new file mode 100644
index 000000000..cf87db34f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/forte-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/forte-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/forte-40-dark.png
new file mode 100644
index 000000000..f8ba8eff9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/forte-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/forte-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/forte-40.png
new file mode 100644
index 000000000..9900365d6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/forte-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/freeipa-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/freeipa-16.png
new file mode 100644
index 000000000..3b44d0572
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/freeipa-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/freeipa-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/freeipa-24.png
new file mode 100644
index 000000000..519cdbf57
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/freeipa-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/freeipa-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/freeipa-40.png
new file mode 100644
index 000000000..e3df854c8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/freeipa-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/freshrss-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/freshrss-16.png
new file mode 100644
index 000000000..dfb424044
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/freshrss-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/freshrss-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/freshrss-24.png
new file mode 100644
index 000000000..a95e67487
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/freshrss-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/freshrss-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/freshrss-40.png
new file mode 100644
index 000000000..cafc6fe02
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/freshrss-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/friendica-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/friendica-16.png
new file mode 100644
index 000000000..71aacd274
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/friendica-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/friendica-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/friendica-24.png
new file mode 100644
index 000000000..af6151c8f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/friendica-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/friendica-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/friendica-40.png
new file mode 100644
index 000000000..5497aee36
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/friendica-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/frigate-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/frigate-16-dark.png
new file mode 100644
index 000000000..02837415e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/frigate-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/frigate-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/frigate-16.png
new file mode 100644
index 000000000..faf6b8594
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/frigate-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/frigate-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/frigate-24-dark.png
new file mode 100644
index 000000000..d7cda0db0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/frigate-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/frigate-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/frigate-24.png
new file mode 100644
index 000000000..9f74e0e45
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/frigate-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/frigate-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/frigate-40-dark.png
new file mode 100644
index 000000000..a95b0c506
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/frigate-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/frigate-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/frigate-40.png
new file mode 100644
index 000000000..2cb1d264f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/frigate-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/funkwhale-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/funkwhale-16-dark.png
new file mode 100644
index 000000000..38c033cc5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/funkwhale-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/funkwhale-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/funkwhale-16.png
new file mode 100644
index 000000000..721e8816d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/funkwhale-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/funkwhale-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/funkwhale-24-dark.png
new file mode 100644
index 000000000..3b1a33e84
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/funkwhale-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/funkwhale-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/funkwhale-24.png
new file mode 100644
index 000000000..70e2fd6ef
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/funkwhale-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/funkwhale-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/funkwhale-40-dark.png
new file mode 100644
index 000000000..0103ae4dc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/funkwhale-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/funkwhale-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/funkwhale-40.png
new file mode 100644
index 000000000..977412c50
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/funkwhale-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fusionauth-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fusionauth-16-dark.png
new file mode 100644
index 000000000..5f1be500b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fusionauth-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fusionauth-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fusionauth-16.png
new file mode 100644
index 000000000..d76ee0ca1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fusionauth-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fusionauth-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fusionauth-24-dark.png
new file mode 100644
index 000000000..0d648cde9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fusionauth-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fusionauth-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fusionauth-24.png
new file mode 100644
index 000000000..1b1ca4207
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fusionauth-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fusionauth-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fusionauth-40-dark.png
new file mode 100644
index 000000000..2e7901e88
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fusionauth-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/fusionauth-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/fusionauth-40.png
new file mode 100644
index 000000000..eb40303bc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/fusionauth-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/garage-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/garage-16.png
new file mode 100644
index 000000000..296151c36
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/garage-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/garage-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/garage-24.png
new file mode 100644
index 000000000..cf303f446
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/garage-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/garage-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/garage-40.png
new file mode 100644
index 000000000..840e9363f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/garage-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/gatsby-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/gatsby-16.png
new file mode 100644
index 000000000..764b4334d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/gatsby-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/gatsby-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/gatsby-24.png
new file mode 100644
index 000000000..9e03658da
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/gatsby-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/gatsby-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/gatsby-40.png
new file mode 100644
index 000000000..0832814fc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/gatsby-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/gatus-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/gatus-16.png
new file mode 100644
index 000000000..7b9287d5a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/gatus-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/gatus-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/gatus-24.png
new file mode 100644
index 000000000..7ec207529
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/gatus-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/gatus-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/gatus-40.png
new file mode 100644
index 000000000..0434d91cb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/gatus-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ghostfolio-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ghostfolio-16.png
new file mode 100644
index 000000000..72491b513
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ghostfolio-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ghostfolio-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ghostfolio-24.png
new file mode 100644
index 000000000..445f6b7ff
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ghostfolio-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ghostfolio-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ghostfolio-40.png
new file mode 100644
index 000000000..b84a42fe8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ghostfolio-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/gitea-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/gitea-16.png
new file mode 100644
index 000000000..9a1b31613
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/gitea-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/gitea-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/gitea-24.png
new file mode 100644
index 000000000..4205ec5bb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/gitea-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/gitea-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/gitea-40.png
new file mode 100644
index 000000000..e828ab399
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/gitea-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/gitlab-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/gitlab-16.png
new file mode 100644
index 000000000..7b2c0ec05
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/gitlab-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/gitlab-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/gitlab-24.png
new file mode 100644
index 000000000..63ef81d2b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/gitlab-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/gitlab-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/gitlab-40.png
new file mode 100644
index 000000000..0822d6b8b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/gitlab-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/glance-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/glance-16-dark.png
new file mode 100644
index 000000000..0549ef8aa
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/glance-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/glance-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/glance-16.png
new file mode 100644
index 000000000..cbe0a0965
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/glance-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/glance-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/glance-24-dark.png
new file mode 100644
index 000000000..aff4bf081
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/glance-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/glance-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/glance-24.png
new file mode 100644
index 000000000..74dbf646e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/glance-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/glance-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/glance-40-dark.png
new file mode 100644
index 000000000..23c45466d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/glance-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/glance-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/glance-40.png
new file mode 100644
index 000000000..e7bc6a983
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/glance-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/glpi-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/glpi-16.png
new file mode 100644
index 000000000..03501f969
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/glpi-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/glpi-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/glpi-24.png
new file mode 100644
index 000000000..3d38712cf
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/glpi-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/glpi-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/glpi-40.png
new file mode 100644
index 000000000..d32b6ff3d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/glpi-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/gotify-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/gotify-16.png
new file mode 100644
index 000000000..2a1beb8f0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/gotify-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/gotify-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/gotify-24.png
new file mode 100644
index 000000000..32041dcda
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/gotify-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/gotify-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/gotify-40.png
new file mode 100644
index 000000000..e5c61029d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/gotify-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/gotosocial-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/gotosocial-16.png
new file mode 100644
index 000000000..53cedd651
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/gotosocial-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/gotosocial-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/gotosocial-24.png
new file mode 100644
index 000000000..d20938e74
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/gotosocial-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/gotosocial-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/gotosocial-40.png
new file mode 100644
index 000000000..72ce76d34
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/gotosocial-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/grafana-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/grafana-16.png
new file mode 100644
index 000000000..2246a56d6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/grafana-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/grafana-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/grafana-24.png
new file mode 100644
index 000000000..50d0a196e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/grafana-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/grafana-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/grafana-40.png
new file mode 100644
index 000000000..b7a69b4c1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/grafana-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/grav-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/grav-16-dark.png
new file mode 100644
index 000000000..0a7692034
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/grav-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/grav-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/grav-16.png
new file mode 100644
index 000000000..fe67deb38
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/grav-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/grav-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/grav-24-dark.png
new file mode 100644
index 000000000..e5386a27e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/grav-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/grav-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/grav-24.png
new file mode 100644
index 000000000..bc1035cfe
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/grav-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/grav-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/grav-40-dark.png
new file mode 100644
index 000000000..5dde513c0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/grav-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/grav-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/grav-40.png
new file mode 100644
index 000000000..796e368a3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/grav-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/grimoire-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/grimoire-16.png
new file mode 100644
index 000000000..43a0e915e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/grimoire-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/grimoire-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/grimoire-24.png
new file mode 100644
index 000000000..9f4a9217b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/grimoire-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/grimoire-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/grimoire-40.png
new file mode 100644
index 000000000..1ef95c02d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/grimoire-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/grist-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/grist-16.png
new file mode 100644
index 000000000..f2045a181
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/grist-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/grist-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/grist-24.png
new file mode 100644
index 000000000..46b2b659d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/grist-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/grist-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/grist-40.png
new file mode 100644
index 000000000..5fbf3915c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/grist-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/grocy-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/grocy-16.png
new file mode 100644
index 000000000..1489375a2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/grocy-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/grocy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/grocy-24.png
new file mode 100644
index 000000000..aa0d8e413
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/grocy-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/grocy-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/grocy-40.png
new file mode 100644
index 000000000..4c67ef875
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/grocy-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/haproxy-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/haproxy-16.png
new file mode 100644
index 000000000..02532a83a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/haproxy-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/haproxy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/haproxy-24.png
new file mode 100644
index 000000000..26392820c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/haproxy-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/haproxy-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/haproxy-40.png
new file mode 100644
index 000000000..50e1aca5a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/haproxy-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/haptic-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/haptic-16-dark.png
new file mode 100644
index 000000000..cf313bdd1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/haptic-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/haptic-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/haptic-16.png
new file mode 100644
index 000000000..72a8f84ef
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/haptic-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/haptic-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/haptic-24-dark.png
new file mode 100644
index 000000000..adacdb397
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/haptic-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/haptic-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/haptic-24.png
new file mode 100644
index 000000000..15b3030b9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/haptic-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/haptic-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/haptic-40-dark.png
new file mode 100644
index 000000000..c60791779
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/haptic-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/haptic-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/haptic-40.png
new file mode 100644
index 000000000..64b80f4c4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/haptic-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/headscale-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/headscale-16.png
new file mode 100644
index 000000000..cd8850c78
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/headscale-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/headscale-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/headscale-24.png
new file mode 100644
index 000000000..ff26375ee
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/headscale-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/headscale-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/headscale-40.png
new file mode 100644
index 000000000..8db654648
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/headscale-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/healthchecks-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/healthchecks-16-dark.png
new file mode 100644
index 000000000..5bba9f7d8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/healthchecks-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/healthchecks-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/healthchecks-16.png
new file mode 100644
index 000000000..540c18cf1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/healthchecks-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/healthchecks-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/healthchecks-24-dark.png
new file mode 100644
index 000000000..562af1bcd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/healthchecks-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/healthchecks-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/healthchecks-24.png
new file mode 100644
index 000000000..9e88f9dcb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/healthchecks-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/healthchecks-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/healthchecks-40-dark.png
new file mode 100644
index 000000000..c39d1ce48
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/healthchecks-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/healthchecks-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/healthchecks-40.png
new file mode 100644
index 000000000..6febc45a9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/healthchecks-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hedgedoc-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hedgedoc-16.png
new file mode 100644
index 000000000..d6d6e72f6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hedgedoc-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hedgedoc-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hedgedoc-24.png
new file mode 100644
index 000000000..ceff6dda3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hedgedoc-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hedgedoc-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hedgedoc-40.png
new file mode 100644
index 000000000..a12e7465a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hedgedoc-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/heimdall-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/heimdall-16-dark.png
new file mode 100644
index 000000000..2db6c5a65
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/heimdall-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/heimdall-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/heimdall-16.png
new file mode 100644
index 000000000..aa2161da7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/heimdall-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/heimdall-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/heimdall-24-dark.png
new file mode 100644
index 000000000..355aa3399
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/heimdall-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/heimdall-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/heimdall-24.png
new file mode 100644
index 000000000..fb16a08bb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/heimdall-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/heimdall-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/heimdall-40-dark.png
new file mode 100644
index 000000000..cee41ce9a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/heimdall-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/heimdall-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/heimdall-40.png
new file mode 100644
index 000000000..3bfc546a5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/heimdall-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/heyform-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/heyform-16.png
new file mode 100644
index 000000000..8f9e3787c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/heyform-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/heyform-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/heyform-24.png
new file mode 100644
index 000000000..09e63d737
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/heyform-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/heyform-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/heyform-40.png
new file mode 100644
index 000000000..1be0d7cfe
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/heyform-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hivedav-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hivedav-16.png
new file mode 100644
index 000000000..b64fca200
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hivedav-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hivedav-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hivedav-24.png
new file mode 100644
index 000000000..7e5b0d401
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hivedav-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hivedav-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hivedav-40.png
new file mode 100644
index 000000000..776dd7419
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hivedav-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hoarder-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hoarder-16-dark.png
new file mode 100644
index 000000000..66cfe9165
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hoarder-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hoarder-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hoarder-16.png
new file mode 100644
index 000000000..3ff62b332
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hoarder-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hoarder-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hoarder-24-dark.png
new file mode 100644
index 000000000..5eb7aa68a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hoarder-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hoarder-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hoarder-24.png
new file mode 100644
index 000000000..9d086c3d5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hoarder-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hoarder-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hoarder-40-dark.png
new file mode 100644
index 000000000..e63b9de88
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hoarder-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hoarder-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hoarder-40.png
new file mode 100644
index 000000000..588025dde
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hoarder-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hollo-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hollo-16-dark.png
new file mode 100644
index 000000000..96a066178
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hollo-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hollo-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hollo-16.png
new file mode 100644
index 000000000..29d1c254e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hollo-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hollo-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hollo-24-dark.png
new file mode 100644
index 000000000..5072b9456
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hollo-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hollo-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hollo-24.png
new file mode 100644
index 000000000..e7a06a375
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hollo-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hollo-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hollo-40-dark.png
new file mode 100644
index 000000000..cdada3788
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hollo-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hollo-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hollo-40.png
new file mode 100644
index 000000000..666b0edae
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hollo-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/homarr-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/homarr-16.png
new file mode 100644
index 000000000..b3ca15e64
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/homarr-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/homarr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/homarr-24.png
new file mode 100644
index 000000000..3e3931543
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/homarr-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/homarr-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/homarr-40.png
new file mode 100644
index 000000000..340887b2b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/homarr-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/home-assistant-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/home-assistant-16.png
new file mode 100644
index 000000000..a4c8cc7fb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/home-assistant-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/home-assistant-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/home-assistant-24.png
new file mode 100644
index 000000000..c545f0ec9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/home-assistant-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/home-assistant-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/home-assistant-40.png
new file mode 100644
index 000000000..44c145386
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/home-assistant-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/homebox-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/homebox-16.png
new file mode 100644
index 000000000..d1f78698f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/homebox-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/homebox-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/homebox-24.png
new file mode 100644
index 000000000..b3e99469d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/homebox-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/homebox-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/homebox-40.png
new file mode 100644
index 000000000..ca365b5c9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/homebox-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/homebridge-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/homebridge-16-dark.png
new file mode 100644
index 000000000..089735432
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/homebridge-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/homebridge-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/homebridge-16.png
new file mode 100644
index 000000000..a94225585
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/homebridge-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/homebridge-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/homebridge-24-dark.png
new file mode 100644
index 000000000..cb4f9b1cc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/homebridge-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/homebridge-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/homebridge-24.png
new file mode 100644
index 000000000..a0942466d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/homebridge-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/homebridge-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/homebridge-40-dark.png
new file mode 100644
index 000000000..b8730bdc0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/homebridge-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/homebridge-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/homebridge-40.png
new file mode 100644
index 000000000..ae44d37b8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/homebridge-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/homer-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/homer-16.png
new file mode 100644
index 000000000..a136bc7b2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/homer-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/homer-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/homer-24.png
new file mode 100644
index 000000000..63ed6d92d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/homer-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/homer-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/homer-40.png
new file mode 100644
index 000000000..a99d2949a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/homer-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hoppscotch-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hoppscotch-16-dark.png
new file mode 100644
index 000000000..68c4b7ea4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hoppscotch-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hoppscotch-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hoppscotch-16.png
new file mode 100644
index 000000000..c9a1a0088
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hoppscotch-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hoppscotch-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hoppscotch-24-dark.png
new file mode 100644
index 000000000..e2418b893
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hoppscotch-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hoppscotch-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hoppscotch-24.png
new file mode 100644
index 000000000..c1b00aac6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hoppscotch-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hoppscotch-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hoppscotch-40-dark.png
new file mode 100644
index 000000000..99ccaa4a2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hoppscotch-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hoppscotch-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hoppscotch-40.png
new file mode 100644
index 000000000..56d00c6fd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hoppscotch-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hubzilla-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hubzilla-16-dark.png
new file mode 100644
index 000000000..850447cfa
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hubzilla-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hubzilla-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hubzilla-16.png
new file mode 100644
index 000000000..d4dc2a9b0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hubzilla-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hubzilla-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hubzilla-24-dark.png
new file mode 100644
index 000000000..a0d449bc1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hubzilla-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hubzilla-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hubzilla-24.png
new file mode 100644
index 000000000..e5aeb05b5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hubzilla-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hubzilla-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hubzilla-40-dark.png
new file mode 100644
index 000000000..a380fd591
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hubzilla-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hubzilla-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hubzilla-40.png
new file mode 100644
index 000000000..c6746d43c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hubzilla-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/huginn-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/huginn-16.png
new file mode 100644
index 000000000..503e41b78
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/huginn-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/huginn-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/huginn-24.png
new file mode 100644
index 000000000..d773fac80
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/huginn-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/huginn-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/huginn-40.png
new file mode 100644
index 000000000..7dd8a3576
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/huginn-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hugo-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hugo-16.png
new file mode 100644
index 000000000..db7aee945
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hugo-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hugo-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hugo-24.png
new file mode 100644
index 000000000..79b61c59a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hugo-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/hugo-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/hugo-40.png
new file mode 100644
index 000000000..ee7b7836d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/hugo-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/humhub-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/humhub-16.png
new file mode 100644
index 000000000..9e5b21b1a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/humhub-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/humhub-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/humhub-24.png
new file mode 100644
index 000000000..b0ee8fa89
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/humhub-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/humhub-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/humhub-40.png
new file mode 100644
index 000000000..e00a5d50c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/humhub-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/icon-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/icon-16.png
new file mode 100644
index 000000000..cd29bb5b6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/icon-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/icon-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/icon-24.png
new file mode 100644
index 000000000..021d7785e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/icon-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/icon-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/icon-40.png
new file mode 100644
index 000000000..d1191ba6e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/icon-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/immich-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-16.png
new file mode 100644
index 000000000..cc6ff96a1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/immich-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-24.png
new file mode 100644
index 000000000..367555c02
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/immich-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-40.png
new file mode 100644
index 000000000..2539a87af
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/immich-frame-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-frame-16-dark.png
new file mode 100644
index 000000000..c45f9f822
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-frame-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/immich-frame-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-frame-16.png
new file mode 100644
index 000000000..ca7a6e0c9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-frame-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/immich-frame-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-frame-24-dark.png
new file mode 100644
index 000000000..ced052555
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-frame-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/immich-frame-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-frame-24.png
new file mode 100644
index 000000000..0dbdfa376
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-frame-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/immich-frame-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-frame-40-dark.png
new file mode 100644
index 000000000..b5169f7a7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-frame-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/immich-frame-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-frame-40.png
new file mode 100644
index 000000000..cadd35228
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-frame-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/immich-kiosk-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-kiosk-16.png
new file mode 100644
index 000000000..0d3c960bb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-kiosk-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/immich-kiosk-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-kiosk-24.png
new file mode 100644
index 000000000..e49bb158a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-kiosk-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/immich-kiosk-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-kiosk-40.png
new file mode 100644
index 000000000..52b634deb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/immich-kiosk-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/influxdb-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/influxdb-16.png
new file mode 100644
index 000000000..ff8e89457
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/influxdb-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/influxdb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/influxdb-24.png
new file mode 100644
index 000000000..8685068e8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/influxdb-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/influxdb-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/influxdb-40.png
new file mode 100644
index 000000000..556ff1559
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/influxdb-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/inoreader-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/inoreader-16-dark.png
new file mode 100644
index 000000000..1430bbf9c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/inoreader-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/inoreader-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/inoreader-16.png
new file mode 100644
index 000000000..7a7880f23
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/inoreader-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/inoreader-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/inoreader-24-dark.png
new file mode 100644
index 000000000..03794529e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/inoreader-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/inoreader-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/inoreader-24.png
new file mode 100644
index 000000000..0559e36d9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/inoreader-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/inoreader-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/inoreader-40-dark.png
new file mode 100644
index 000000000..041ed5c2b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/inoreader-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/inoreader-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/inoreader-40.png
new file mode 100644
index 000000000..c51fda361
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/inoreader-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/invidious-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/invidious-16.png
new file mode 100644
index 000000000..2fd71bea6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/invidious-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/invidious-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/invidious-24.png
new file mode 100644
index 000000000..c66f98f35
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/invidious-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/invidious-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/invidious-40.png
new file mode 100644
index 000000000..47c379ef6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/invidious-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/invoice-ninja-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/invoice-ninja-16-dark.png
new file mode 100644
index 000000000..50ba9ecb1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/invoice-ninja-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/invoice-ninja-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/invoice-ninja-16.png
new file mode 100644
index 000000000..1ac53fa24
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/invoice-ninja-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/invoice-ninja-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/invoice-ninja-24-dark.png
new file mode 100644
index 000000000..6a6542f97
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/invoice-ninja-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/invoice-ninja-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/invoice-ninja-24.png
new file mode 100644
index 000000000..f6b91a68c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/invoice-ninja-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/invoice-ninja-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/invoice-ninja-40-dark.png
new file mode 100644
index 000000000..9d3dced71
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/invoice-ninja-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/invoice-ninja-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/invoice-ninja-40.png
new file mode 100644
index 000000000..926a0b702
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/invoice-ninja-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/it-tools-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/it-tools-16-dark.png
new file mode 100644
index 000000000..933c60bc5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/it-tools-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/it-tools-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/it-tools-16.png
new file mode 100644
index 000000000..70e7ecdbd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/it-tools-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/it-tools-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/it-tools-24-dark.png
new file mode 100644
index 000000000..deba30713
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/it-tools-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/it-tools-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/it-tools-24.png
new file mode 100644
index 000000000..06bd3b034
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/it-tools-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/it-tools-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/it-tools-40-dark.png
new file mode 100644
index 000000000..af29fcdb5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/it-tools-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/it-tools-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/it-tools-40.png
new file mode 100644
index 000000000..08be53978
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/it-tools-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jackett-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jackett-16-dark.png
new file mode 100644
index 000000000..8f829878b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jackett-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jackett-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jackett-16.png
new file mode 100644
index 000000000..7ec29bb12
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jackett-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jackett-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jackett-24-dark.png
new file mode 100644
index 000000000..304b4bf1b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jackett-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jackett-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jackett-24.png
new file mode 100644
index 000000000..db095510d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jackett-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jackett-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jackett-40-dark.png
new file mode 100644
index 000000000..20b2831dc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jackett-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jackett-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jackett-40.png
new file mode 100644
index 000000000..ef9ae08ad
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jackett-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jekyll-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jekyll-16.png
new file mode 100644
index 000000000..6b88acab6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jekyll-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jekyll-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jekyll-24.png
new file mode 100644
index 000000000..a332625a8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jekyll-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jekyll-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jekyll-40.png
new file mode 100644
index 000000000..c94572610
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jekyll-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jellyfin-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jellyfin-16-dark.png
new file mode 100644
index 000000000..c744c3306
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jellyfin-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jellyfin-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jellyfin-16.png
new file mode 100644
index 000000000..f39f7c34e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jellyfin-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jellyfin-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jellyfin-24-dark.png
new file mode 100644
index 000000000..4eb951264
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jellyfin-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jellyfin-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jellyfin-24.png
new file mode 100644
index 000000000..e2847ca92
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jellyfin-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jellyfin-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jellyfin-40-dark.png
new file mode 100644
index 000000000..aa832cefb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jellyfin-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jellyfin-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jellyfin-40.png
new file mode 100644
index 000000000..6881df45b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jellyfin-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jellyseerr-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jellyseerr-16.png
new file mode 100644
index 000000000..7c3f66534
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jellyseerr-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jellyseerr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jellyseerr-24.png
new file mode 100644
index 000000000..bd6f26a2d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jellyseerr-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jellyseerr-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jellyseerr-40.png
new file mode 100644
index 000000000..d97c21440
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jellyseerr-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jira-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jira-16.png
new file mode 100644
index 000000000..7d800aa2c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jira-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jira-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jira-24.png
new file mode 100644
index 000000000..cb0777c2e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jira-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jira-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jira-40.png
new file mode 100644
index 000000000..925f3567a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jira-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jitsi-meet-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jitsi-meet-16.png
new file mode 100644
index 000000000..727a883ba
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jitsi-meet-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jitsi-meet-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jitsi-meet-24.png
new file mode 100644
index 000000000..cf2c97e1c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jitsi-meet-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jitsi-meet-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jitsi-meet-40.png
new file mode 100644
index 000000000..f3d1277dc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jitsi-meet-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jwt-io-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jwt-io-16-dark.png
new file mode 100644
index 000000000..1bf66db4d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jwt-io-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jwt-io-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jwt-io-16.png
new file mode 100644
index 000000000..ec88a3614
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jwt-io-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jwt-io-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jwt-io-24-dark.png
new file mode 100644
index 000000000..d786c5b77
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jwt-io-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jwt-io-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jwt-io-24.png
new file mode 100644
index 000000000..cecf66d5b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jwt-io-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jwt-io-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jwt-io-40-dark.png
new file mode 100644
index 000000000..00e346914
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jwt-io-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/jwt-io-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/jwt-io-40.png
new file mode 100644
index 000000000..f49c5aa9a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/jwt-io-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kanboard-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kanboard-16-dark.png
new file mode 100644
index 000000000..11ea38c96
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kanboard-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kanboard-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kanboard-16.png
new file mode 100644
index 000000000..740e9abf6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kanboard-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kanboard-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kanboard-24-dark.png
new file mode 100644
index 000000000..a0f2655e1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kanboard-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kanboard-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kanboard-24.png
new file mode 100644
index 000000000..0158fb6f5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kanboard-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kanboard-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kanboard-40-dark.png
new file mode 100644
index 000000000..b5b38a2b0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kanboard-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kanboard-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kanboard-40.png
new file mode 100644
index 000000000..4a8d77165
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kanboard-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kanidm-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kanidm-16.png
new file mode 100644
index 000000000..3fbe3c7f1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kanidm-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kanidm-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kanidm-24.png
new file mode 100644
index 000000000..3f24f55d8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kanidm-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kanidm-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kanidm-40.png
new file mode 100644
index 000000000..00871368b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kanidm-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kapowarr-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kapowarr-16.png
new file mode 100644
index 000000000..968a8f5ff
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kapowarr-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kapowarr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kapowarr-24.png
new file mode 100644
index 000000000..6a979f4b0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kapowarr-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kapowarr-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kapowarr-40.png
new file mode 100644
index 000000000..4e0777acc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kapowarr-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kavita-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kavita-16.png
new file mode 100644
index 000000000..e3ef0a6b9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kavita-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kavita-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kavita-24.png
new file mode 100644
index 000000000..807cb8f7f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kavita-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kavita-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kavita-40.png
new file mode 100644
index 000000000..06ae513d6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kavita-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kbin-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kbin-16.png
new file mode 100644
index 000000000..26e9fb4d5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kbin-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kbin-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kbin-24.png
new file mode 100644
index 000000000..cfedf7280
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kbin-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kbin-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kbin-40.png
new file mode 100644
index 000000000..a9e09775d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kbin-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/keepassxc-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/keepassxc-16.png
new file mode 100644
index 000000000..e63327a1c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/keepassxc-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/keepassxc-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/keepassxc-24.png
new file mode 100644
index 000000000..d0a142295
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/keepassxc-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/keepassxc-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/keepassxc-40.png
new file mode 100644
index 000000000..236d76daf
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/keepassxc-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/keila-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/keila-16.png
new file mode 100644
index 000000000..3bab7f077
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/keila-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/keila-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/keila-24.png
new file mode 100644
index 000000000..b9b52d907
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/keila-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/keila-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/keila-40.png
new file mode 100644
index 000000000..911e14061
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/keila-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kestra-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kestra-16.png
new file mode 100644
index 000000000..cc1a9856d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kestra-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kestra-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kestra-24.png
new file mode 100644
index 000000000..faf5efa40
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kestra-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kestra-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kestra-40.png
new file mode 100644
index 000000000..2c15f97e1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kestra-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/keycloak-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/keycloak-16.png
new file mode 100644
index 000000000..f2213aeb5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/keycloak-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/keycloak-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/keycloak-24.png
new file mode 100644
index 000000000..c83497cee
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/keycloak-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/keycloak-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/keycloak-40.png
new file mode 100644
index 000000000..b3e9492d4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/keycloak-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/komga-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/komga-16.png
new file mode 100644
index 000000000..7576addf2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/komga-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/komga-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/komga-24.png
new file mode 100644
index 000000000..4320b711f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/komga-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/komga-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/komga-40.png
new file mode 100644
index 000000000..f5387dcee
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/komga-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kontoj-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kontoj-16.png
new file mode 100644
index 000000000..902dd46a5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kontoj-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kontoj-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kontoj-24.png
new file mode 100644
index 000000000..d13c8bcd2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kontoj-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kontoj-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kontoj-40.png
new file mode 100644
index 000000000..bbcb22bbd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kontoj-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/krakend-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/krakend-16.png
new file mode 100644
index 000000000..4d03eb7fd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/krakend-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/krakend-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/krakend-24.png
new file mode 100644
index 000000000..2c99f4607
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/krakend-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/krakend-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/krakend-40.png
new file mode 100644
index 000000000..3564e7e00
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/krakend-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kyoo-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kyoo-16-dark.png
new file mode 100644
index 000000000..248db6f77
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kyoo-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kyoo-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kyoo-16.png
new file mode 100644
index 000000000..764b42086
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kyoo-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kyoo-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kyoo-24-dark.png
new file mode 100644
index 000000000..e27ff2c5b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kyoo-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kyoo-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kyoo-24.png
new file mode 100644
index 000000000..ca0057bf2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kyoo-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kyoo-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kyoo-40-dark.png
new file mode 100644
index 000000000..78820f949
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kyoo-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/kyoo-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/kyoo-40.png
new file mode 100644
index 000000000..6d19fa98b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/kyoo-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/lancommander-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/lancommander-16-dark.png
new file mode 100644
index 000000000..b773498fc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/lancommander-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/lancommander-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/lancommander-16.png
new file mode 100644
index 000000000..888e3e305
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/lancommander-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/lancommander-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/lancommander-24-dark.png
new file mode 100644
index 000000000..9e9bb6350
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/lancommander-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/lancommander-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/lancommander-24.png
new file mode 100644
index 000000000..b6f2401d1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/lancommander-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/lancommander-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/lancommander-40-dark.png
new file mode 100644
index 000000000..087d29f73
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/lancommander-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/lancommander-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/lancommander-40.png
new file mode 100644
index 000000000..6010c1b7f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/lancommander-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/leantime-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/leantime-16.png
new file mode 100644
index 000000000..aea50c6aa
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/leantime-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/leantime-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/leantime-24.png
new file mode 100644
index 000000000..05f67686d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/leantime-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/leantime-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/leantime-40.png
new file mode 100644
index 000000000..e941a69f3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/leantime-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/lets-encrypt-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/lets-encrypt-16-dark.png
new file mode 100644
index 000000000..2597177d6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/lets-encrypt-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/lets-encrypt-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/lets-encrypt-16.png
new file mode 100644
index 000000000..455e47e7d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/lets-encrypt-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/lets-encrypt-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/lets-encrypt-24-dark.png
new file mode 100644
index 000000000..b4c5db754
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/lets-encrypt-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/lets-encrypt-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/lets-encrypt-24.png
new file mode 100644
index 000000000..2711905bd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/lets-encrypt-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/lets-encrypt-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/lets-encrypt-40-dark.png
new file mode 100644
index 000000000..f10dc7d00
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/lets-encrypt-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/lets-encrypt-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/lets-encrypt-40.png
new file mode 100644
index 000000000..f8cd7c9c9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/lets-encrypt-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/librespeed-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/librespeed-16.png
new file mode 100644
index 000000000..44bbbef34
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/librespeed-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/librespeed-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/librespeed-24.png
new file mode 100644
index 000000000..082552c6b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/librespeed-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/librespeed-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/librespeed-40.png
new file mode 100644
index 000000000..d5dc24bee
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/librespeed-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/librum-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/librum-16.png
new file mode 100644
index 000000000..89149bc59
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/librum-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/librum-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/librum-24.png
new file mode 100644
index 000000000..9b3351ca6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/librum-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/librum-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/librum-40.png
new file mode 100644
index 000000000..be1e1757b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/librum-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/lidarr-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/lidarr-16.png
new file mode 100644
index 000000000..be52f2041
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/lidarr-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/lidarr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/lidarr-24.png
new file mode 100644
index 000000000..f7a580be1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/lidarr-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/lidarr-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/lidarr-40.png
new file mode 100644
index 000000000..cd76849c8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/lidarr-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/limesurvey-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/limesurvey-16.png
new file mode 100644
index 000000000..d12d13e3b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/limesurvey-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/limesurvey-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/limesurvey-24.png
new file mode 100644
index 000000000..13508b5f1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/limesurvey-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/limesurvey-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/limesurvey-40.png
new file mode 100644
index 000000000..5e7c89a3c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/limesurvey-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linkace-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linkace-16-dark.png
new file mode 100644
index 000000000..1f6b0ee6b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linkace-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linkace-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linkace-16.png
new file mode 100644
index 000000000..1dfb95ccb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linkace-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linkace-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linkace-24-dark.png
new file mode 100644
index 000000000..5510209f4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linkace-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linkace-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linkace-24.png
new file mode 100644
index 000000000..df6fb4baa
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linkace-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linkace-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linkace-40-dark.png
new file mode 100644
index 000000000..864e70d90
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linkace-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linkace-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linkace-40.png
new file mode 100644
index 000000000..17cfe8c93
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linkace-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linkding-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linkding-16.png
new file mode 100644
index 000000000..962cd91aa
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linkding-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linkding-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linkding-24.png
new file mode 100644
index 000000000..3019b2184
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linkding-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linkding-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linkding-40.png
new file mode 100644
index 000000000..bf7c47e3a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linkding-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linkedin-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linkedin-16-dark.png
new file mode 100644
index 000000000..60d501f96
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linkedin-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linkedin-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linkedin-16.png
new file mode 100644
index 000000000..08dcf9984
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linkedin-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linkedin-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linkedin-24-dark.png
new file mode 100644
index 000000000..092eb82ed
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linkedin-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linkedin-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linkedin-24.png
new file mode 100644
index 000000000..aaa9403dd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linkedin-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linkedin-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linkedin-40-dark.png
new file mode 100644
index 000000000..e72f4b602
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linkedin-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linkedin-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linkedin-40.png
new file mode 100644
index 000000000..1bcdd3131
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linkedin-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linkstack-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linkstack-16.png
new file mode 100644
index 000000000..4e12f4681
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linkstack-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linkstack-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linkstack-24.png
new file mode 100644
index 000000000..4c05cffc6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linkstack-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linkstack-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linkstack-40.png
new file mode 100644
index 000000000..d333ac281
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linkstack-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linuxserver-io-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linuxserver-io-16.png
new file mode 100644
index 000000000..918c85197
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linuxserver-io-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linuxserver-io-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linuxserver-io-24.png
new file mode 100644
index 000000000..9f8390dfd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linuxserver-io-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/linuxserver-io-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/linuxserver-io-40.png
new file mode 100644
index 000000000..06a260aa8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/linuxserver-io-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/listmonk-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/listmonk-16.png
new file mode 100644
index 000000000..9d5fa7bf6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/listmonk-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/listmonk-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/listmonk-24.png
new file mode 100644
index 000000000..3970fc4a0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/listmonk-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/listmonk-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/listmonk-40.png
new file mode 100644
index 000000000..869b6939f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/listmonk-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/lodestone-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/lodestone-16.png
new file mode 100644
index 000000000..400435d72
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/lodestone-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/lodestone-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/lodestone-24.png
new file mode 100644
index 000000000..293e75eb8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/lodestone-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/lodestone-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/lodestone-40.png
new file mode 100644
index 000000000..cefa7f219
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/lodestone-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/logseq-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/logseq-16.png
new file mode 100644
index 000000000..47df2896c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/logseq-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/logseq-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/logseq-24.png
new file mode 100644
index 000000000..08b27ebd1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/logseq-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/logseq-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/logseq-40.png
new file mode 100644
index 000000000..de903413a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/logseq-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/logto-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/logto-16.png
new file mode 100644
index 000000000..058f988b4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/logto-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/logto-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/logto-24.png
new file mode 100644
index 000000000..0ec063480
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/logto-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/logto-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/logto-40.png
new file mode 100644
index 000000000..d328b1172
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/logto-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/loki-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/loki-16.png
new file mode 100644
index 000000000..008cc74ce
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/loki-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/loki-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/loki-24.png
new file mode 100644
index 000000000..602fb02e3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/loki-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/loki-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/loki-40.png
new file mode 100644
index 000000000..be1fd370b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/loki-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mail-in-a-box-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mail-in-a-box-16.png
new file mode 100644
index 000000000..ddd4202f6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mail-in-a-box-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mail-in-a-box-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mail-in-a-box-24.png
new file mode 100644
index 000000000..4508fc03b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mail-in-a-box-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mail-in-a-box-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mail-in-a-box-40.png
new file mode 100644
index 000000000..3a38e6bad
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mail-in-a-box-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mailcow-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mailcow-16.png
new file mode 100644
index 000000000..99e42249d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mailcow-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mailcow-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mailcow-24.png
new file mode 100644
index 000000000..9acc2fdd5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mailcow-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mailcow-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mailcow-40.png
new file mode 100644
index 000000000..3dfe1fde6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mailcow-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mailjet-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mailjet-16-dark.png
new file mode 100644
index 000000000..82b24ae62
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mailjet-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mailjet-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mailjet-16.png
new file mode 100644
index 000000000..b8162193c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mailjet-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mailjet-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mailjet-24-dark.png
new file mode 100644
index 000000000..838a5b4f2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mailjet-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mailjet-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mailjet-24.png
new file mode 100644
index 000000000..825a0ab94
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mailjet-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mailjet-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mailjet-40-dark.png
new file mode 100644
index 000000000..12a68c0a0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mailjet-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mailjet-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mailjet-40.png
new file mode 100644
index 000000000..5b6b365da
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mailjet-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/manyfold-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/manyfold-16.png
new file mode 100644
index 000000000..da7448cec
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/manyfold-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/manyfold-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/manyfold-24.png
new file mode 100644
index 000000000..44ab9a46b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/manyfold-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/manyfold-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/manyfold-40.png
new file mode 100644
index 000000000..538796e16
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/manyfold-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mariadb-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mariadb-16.png
new file mode 100644
index 000000000..42ae1b177
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mariadb-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mariadb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mariadb-24.png
new file mode 100644
index 000000000..7e3094376
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mariadb-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mariadb-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mariadb-40.png
new file mode 100644
index 000000000..3cc03f6eb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mariadb-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mastodon-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mastodon-16.png
new file mode 100644
index 000000000..ca6e8ccd5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mastodon-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mastodon-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mastodon-24.png
new file mode 100644
index 000000000..656605256
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mastodon-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mastodon-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mastodon-40.png
new file mode 100644
index 000000000..15078d9ad
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mastodon-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/matomo-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/matomo-16.png
new file mode 100644
index 000000000..6ed05d247
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/matomo-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/matomo-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/matomo-24.png
new file mode 100644
index 000000000..3fc792cf1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/matomo-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/matomo-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/matomo-40.png
new file mode 100644
index 000000000..5e4f2602f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/matomo-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/matrix-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/matrix-16-dark.png
new file mode 100644
index 000000000..0264b8abb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/matrix-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/matrix-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/matrix-16.png
new file mode 100644
index 000000000..ecbc8e7c6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/matrix-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/matrix-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/matrix-24-dark.png
new file mode 100644
index 000000000..5f18cb9c7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/matrix-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/matrix-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/matrix-24.png
new file mode 100644
index 000000000..26ee0d420
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/matrix-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/matrix-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/matrix-40-dark.png
new file mode 100644
index 000000000..6a080b26a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/matrix-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/matrix-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/matrix-40.png
new file mode 100644
index 000000000..63aa0824c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/matrix-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mattermost-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mattermost-16-dark.png
new file mode 100644
index 000000000..e97020240
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mattermost-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mattermost-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mattermost-16.png
new file mode 100644
index 000000000..64f2efb08
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mattermost-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mattermost-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mattermost-24-dark.png
new file mode 100644
index 000000000..da9953c94
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mattermost-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mattermost-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mattermost-24.png
new file mode 100644
index 000000000..c0d4bbd39
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mattermost-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mattermost-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mattermost-40-dark.png
new file mode 100644
index 000000000..d8b38a256
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mattermost-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mattermost-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mattermost-40.png
new file mode 100644
index 000000000..61b2bd973
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mattermost-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mautic-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mautic-16-dark.png
new file mode 100644
index 000000000..e7d8bafc2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mautic-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mautic-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mautic-16.png
new file mode 100644
index 000000000..f05d119f5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mautic-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mautic-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mautic-24-dark.png
new file mode 100644
index 000000000..6675c7db8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mautic-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mautic-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mautic-24.png
new file mode 100644
index 000000000..2c7a8b963
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mautic-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mautic-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mautic-40-dark.png
new file mode 100644
index 000000000..aeff0f00b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mautic-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mautic-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mautic-40.png
new file mode 100644
index 000000000..24de18f4c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mautic-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/maybe-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/maybe-16.png
new file mode 100644
index 000000000..c58d06cb6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/maybe-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/maybe-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/maybe-24.png
new file mode 100644
index 000000000..eb21fa8d5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/maybe-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/maybe-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/maybe-40.png
new file mode 100644
index 000000000..51317cc60
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/maybe-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mbin-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mbin-16.png
new file mode 100644
index 000000000..f10968b6c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mbin-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mbin-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mbin-24.png
new file mode 100644
index 000000000..2a095d89b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mbin-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mbin-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mbin-40.png
new file mode 100644
index 000000000..c94f67022
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mbin-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mealie-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mealie-16-dark.png
new file mode 100644
index 000000000..9c3372914
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mealie-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mealie-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mealie-16.png
new file mode 100644
index 000000000..d0019e2ac
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mealie-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mealie-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mealie-24-dark.png
new file mode 100644
index 000000000..6cc4f7540
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mealie-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mealie-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mealie-24.png
new file mode 100644
index 000000000..390e71d65
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mealie-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mealie-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mealie-40-dark.png
new file mode 100644
index 000000000..558787e92
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mealie-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mealie-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mealie-40.png
new file mode 100644
index 000000000..a9c44f883
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mealie-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/medama-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/medama-16.png
new file mode 100644
index 000000000..3fa99988e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/medama-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/medama-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/medama-24.png
new file mode 100644
index 000000000..5d6687707
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/medama-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/medama-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/medama-40.png
new file mode 100644
index 000000000..694934e84
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/medama-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mediux-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mediux-16-dark.png
new file mode 100644
index 000000000..408276759
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mediux-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mediux-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mediux-16.png
new file mode 100644
index 000000000..123f1f62a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mediux-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mediux-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mediux-24-dark.png
new file mode 100644
index 000000000..f7d056426
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mediux-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mediux-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mediux-24.png
new file mode 100644
index 000000000..ff2fcc1a9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mediux-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mediux-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mediux-40-dark.png
new file mode 100644
index 000000000..2dee89f05
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mediux-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mediux-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mediux-40.png
new file mode 100644
index 000000000..e04b5bb86
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mediux-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/medusa-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/medusa-16-dark.png
new file mode 100644
index 000000000..9a300b6ab
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/medusa-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/medusa-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/medusa-16.png
new file mode 100644
index 000000000..a6c5c8167
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/medusa-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/medusa-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/medusa-24-dark.png
new file mode 100644
index 000000000..a6efbf736
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/medusa-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/medusa-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/medusa-24.png
new file mode 100644
index 000000000..879c1d4d8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/medusa-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/medusa-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/medusa-40-dark.png
new file mode 100644
index 000000000..0102d5580
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/medusa-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/medusa-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/medusa-40.png
new file mode 100644
index 000000000..418af8841
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/medusa-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/meilisearch-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/meilisearch-16-dark.png
new file mode 100644
index 000000000..b638c5a37
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/meilisearch-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/meilisearch-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/meilisearch-16.png
new file mode 100644
index 000000000..3d662657d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/meilisearch-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/meilisearch-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/meilisearch-24-dark.png
new file mode 100644
index 000000000..0ce2df219
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/meilisearch-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/meilisearch-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/meilisearch-24.png
new file mode 100644
index 000000000..7abe06d95
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/meilisearch-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/meilisearch-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/meilisearch-40-dark.png
new file mode 100644
index 000000000..212fa19de
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/meilisearch-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/meilisearch-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/meilisearch-40.png
new file mode 100644
index 000000000..66c0e17b2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/meilisearch-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/memories-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/memories-16-dark.png
new file mode 100644
index 000000000..266910194
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/memories-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/memories-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/memories-16.png
new file mode 100644
index 000000000..059faa99b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/memories-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/memories-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/memories-24-dark.png
new file mode 100644
index 000000000..3a68372aa
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/memories-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/memories-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/memories-24.png
new file mode 100644
index 000000000..bb7c65a65
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/memories-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/memories-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/memories-40-dark.png
new file mode 100644
index 000000000..e46ce5018
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/memories-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/memories-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/memories-40.png
new file mode 100644
index 000000000..0ffb7cb39
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/memories-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mergeable-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mergeable-16.png
new file mode 100644
index 000000000..f074de378
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mergeable-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mergeable-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mergeable-24.png
new file mode 100644
index 000000000..fa850fd0f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mergeable-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mergeable-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mergeable-40.png
new file mode 100644
index 000000000..70180559a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mergeable-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/meshping-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/meshping-16-dark.png
new file mode 100644
index 000000000..edcd7d6f3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/meshping-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/meshping-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/meshping-16.png
new file mode 100644
index 000000000..380d15ac0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/meshping-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/meshping-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/meshping-24-dark.png
new file mode 100644
index 000000000..1fdc6164b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/meshping-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/meshping-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/meshping-24.png
new file mode 100644
index 000000000..e32e99939
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/meshping-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/meshping-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/meshping-40-dark.png
new file mode 100644
index 000000000..a641e15f0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/meshping-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/meshping-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/meshping-40.png
new file mode 100644
index 000000000..a71c93a46
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/meshping-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/metabase-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/metabase-16.png
new file mode 100644
index 000000000..806591a47
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/metabase-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/metabase-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/metabase-24.png
new file mode 100644
index 000000000..0dd31c30f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/metabase-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/metabase-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/metabase-40.png
new file mode 100644
index 000000000..48da78f94
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/metabase-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/metube-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/metube-16.png
new file mode 100644
index 000000000..343f67487
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/metube-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/metube-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/metube-24.png
new file mode 100644
index 000000000..cd47fc5c9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/metube-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/metube-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/metube-40.png
new file mode 100644
index 000000000..c718fb101
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/metube-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/minecraft-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/minecraft-16.png
new file mode 100644
index 000000000..55baba1c1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/minecraft-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/minecraft-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/minecraft-24.png
new file mode 100644
index 000000000..36020911b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/minecraft-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/minecraft-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/minecraft-40.png
new file mode 100644
index 000000000..68e4569cf
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/minecraft-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/miniflux-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/miniflux-16-dark.png
new file mode 100644
index 000000000..966e2b368
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/miniflux-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/miniflux-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/miniflux-16.png
new file mode 100644
index 000000000..1d190b726
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/miniflux-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/miniflux-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/miniflux-24-dark.png
new file mode 100644
index 000000000..20e5fad1c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/miniflux-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/miniflux-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/miniflux-24.png
new file mode 100644
index 000000000..abcaa57b5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/miniflux-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/miniflux-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/miniflux-40-dark.png
new file mode 100644
index 000000000..8fac03fa6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/miniflux-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/miniflux-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/miniflux-40.png
new file mode 100644
index 000000000..c50359b57
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/miniflux-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/minio-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/minio-16-dark.png
new file mode 100644
index 000000000..a9971ab52
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/minio-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/minio-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/minio-16.png
new file mode 100644
index 000000000..734dac5e7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/minio-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/minio-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/minio-24-dark.png
new file mode 100644
index 000000000..1fd3558d3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/minio-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/minio-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/minio-24.png
new file mode 100644
index 000000000..920edba6c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/minio-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/minio-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/minio-40-dark.png
new file mode 100644
index 000000000..3ba655037
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/minio-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/minio-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/minio-40.png
new file mode 100644
index 000000000..54dbf2245
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/minio-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mirotalk-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mirotalk-16.png
new file mode 100644
index 000000000..6ec874114
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mirotalk-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mirotalk-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mirotalk-24.png
new file mode 100644
index 000000000..205d27096
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mirotalk-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mirotalk-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mirotalk-40.png
new file mode 100644
index 000000000..bc0da8da9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mirotalk-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/misskey-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/misskey-16-dark.png
new file mode 100644
index 000000000..f7f53dce6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/misskey-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/misskey-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/misskey-16.png
new file mode 100644
index 000000000..5306306ad
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/misskey-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/misskey-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/misskey-24-dark.png
new file mode 100644
index 000000000..334aa5bdb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/misskey-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/misskey-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/misskey-24.png
new file mode 100644
index 000000000..c8a0ac22d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/misskey-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/misskey-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/misskey-40-dark.png
new file mode 100644
index 000000000..0701fb109
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/misskey-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/misskey-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/misskey-40.png
new file mode 100644
index 000000000..030ae7630
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/misskey-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mitra-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mitra-16-dark.png
new file mode 100644
index 000000000..c49fcc11e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mitra-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mitra-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mitra-16.png
new file mode 100644
index 000000000..f11f69a40
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mitra-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mitra-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mitra-24-dark.png
new file mode 100644
index 000000000..c9fe99150
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mitra-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mitra-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mitra-24.png
new file mode 100644
index 000000000..34ed58185
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mitra-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mitra-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mitra-40-dark.png
new file mode 100644
index 000000000..97f7135f0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mitra-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mitra-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mitra-40.png
new file mode 100644
index 000000000..da09c1eda
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mitra-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mixpost-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mixpost-16.png
new file mode 100644
index 000000000..f5fb364a5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mixpost-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mixpost-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mixpost-24.png
new file mode 100644
index 000000000..8952c3b38
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mixpost-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mixpost-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mixpost-40.png
new file mode 100644
index 000000000..b0880bef2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mixpost-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mobilizon-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mobilizon-16.png
new file mode 100644
index 000000000..df2ee1055
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mobilizon-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mobilizon-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mobilizon-24.png
new file mode 100644
index 000000000..7027b8022
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mobilizon-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mobilizon-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mobilizon-40.png
new file mode 100644
index 000000000..a76d16ffa
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mobilizon-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mongodb-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mongodb-16.png
new file mode 100644
index 000000000..3ba6bf3b2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mongodb-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mongodb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mongodb-24.png
new file mode 100644
index 000000000..b96823697
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mongodb-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mongodb-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mongodb-40.png
new file mode 100644
index 000000000..26248e1b1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mongodb-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/monica-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/monica-16-dark.png
new file mode 100644
index 000000000..56c21a7ef
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/monica-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/monica-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/monica-16.png
new file mode 100644
index 000000000..3a1bfe43a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/monica-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/monica-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/monica-24-dark.png
new file mode 100644
index 000000000..4755b856a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/monica-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/monica-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/monica-24.png
new file mode 100644
index 000000000..133828616
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/monica-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/monica-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/monica-40-dark.png
new file mode 100644
index 000000000..33bd389f5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/monica-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/monica-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/monica-40.png
new file mode 100644
index 000000000..7f3bbf651
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/monica-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mosquitto-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mosquitto-16.png
new file mode 100644
index 000000000..f848148bd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mosquitto-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mosquitto-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mosquitto-24.png
new file mode 100644
index 000000000..1c4fbfc6e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mosquitto-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mosquitto-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mosquitto-40.png
new file mode 100644
index 000000000..59781d58d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mosquitto-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mqtt-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mqtt-16-dark.png
new file mode 100644
index 000000000..de3885484
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mqtt-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mqtt-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mqtt-16.png
new file mode 100644
index 000000000..00887632c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mqtt-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mqtt-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mqtt-24-dark.png
new file mode 100644
index 000000000..9d55eece5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mqtt-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mqtt-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mqtt-24.png
new file mode 100644
index 000000000..0d5073123
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mqtt-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mqtt-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mqtt-40-dark.png
new file mode 100644
index 000000000..be0253100
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mqtt-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mqtt-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mqtt-40.png
new file mode 100644
index 000000000..48994ebe4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mqtt-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mullvad-vpn-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mullvad-vpn-16.png
new file mode 100644
index 000000000..4743d699c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mullvad-vpn-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mullvad-vpn-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mullvad-vpn-24.png
new file mode 100644
index 000000000..afcc50cc3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mullvad-vpn-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mullvad-vpn-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mullvad-vpn-40.png
new file mode 100644
index 000000000..bf88f9a75
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mullvad-vpn-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mumble-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mumble-16.png
new file mode 100644
index 000000000..8939187b0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mumble-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mumble-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mumble-24.png
new file mode 100644
index 000000000..af5d8e175
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mumble-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mumble-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mumble-40.png
new file mode 100644
index 000000000..13afc185f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mumble-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/music-assistant-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/music-assistant-16-dark.png
new file mode 100644
index 000000000..846e9ef3c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/music-assistant-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/music-assistant-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/music-assistant-16.png
new file mode 100644
index 000000000..1494468ad
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/music-assistant-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/music-assistant-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/music-assistant-24-dark.png
new file mode 100644
index 000000000..59b33fe86
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/music-assistant-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/music-assistant-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/music-assistant-24.png
new file mode 100644
index 000000000..a94eaca3c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/music-assistant-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/music-assistant-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/music-assistant-40-dark.png
new file mode 100644
index 000000000..de0671b2a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/music-assistant-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/music-assistant-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/music-assistant-40.png
new file mode 100644
index 000000000..dbc5349d0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/music-assistant-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/myheats-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/myheats-16-dark.png
new file mode 100644
index 000000000..c7240b307
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/myheats-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/myheats-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/myheats-16.png
new file mode 100644
index 000000000..01b655db4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/myheats-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/myheats-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/myheats-24-dark.png
new file mode 100644
index 000000000..2b3fca065
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/myheats-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/myheats-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/myheats-24.png
new file mode 100644
index 000000000..2a072c5fc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/myheats-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/myheats-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/myheats-40-dark.png
new file mode 100644
index 000000000..9c0dde730
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/myheats-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/myheats-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/myheats-40.png
new file mode 100644
index 000000000..167c56ea2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/myheats-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mysql-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mysql-16-dark.png
new file mode 100644
index 000000000..51ec605a1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mysql-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mysql-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mysql-16.png
new file mode 100644
index 000000000..958748004
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mysql-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mysql-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mysql-24-dark.png
new file mode 100644
index 000000000..37c1d06b8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mysql-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mysql-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mysql-24.png
new file mode 100644
index 000000000..4155a4970
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mysql-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mysql-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mysql-40-dark.png
new file mode 100644
index 000000000..f6ae09480
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mysql-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/mysql-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/mysql-40.png
new file mode 100644
index 000000000..173324174
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/mysql-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/n8n-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/n8n-16.png
new file mode 100644
index 000000000..b0a1c641c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/n8n-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/n8n-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/n8n-24.png
new file mode 100644
index 000000000..3a1836e2b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/n8n-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/n8n-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/n8n-40.png
new file mode 100644
index 000000000..538d26cd3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/n8n-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/navidrome-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/navidrome-16.png
new file mode 100644
index 000000000..3808bac24
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/navidrome-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/navidrome-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/navidrome-24.png
new file mode 100644
index 000000000..9bfc42a77
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/navidrome-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/navidrome-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/navidrome-40.png
new file mode 100644
index 000000000..d84b76cd0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/navidrome-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/neko-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/neko-16-dark.png
new file mode 100644
index 000000000..c57b81e3a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/neko-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/neko-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/neko-16.png
new file mode 100644
index 000000000..6e6e90e62
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/neko-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/neko-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/neko-24-dark.png
new file mode 100644
index 000000000..a8dc8c2a0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/neko-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/neko-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/neko-24.png
new file mode 100644
index 000000000..6a7c08c45
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/neko-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/neko-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/neko-40-dark.png
new file mode 100644
index 000000000..78b63ac95
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/neko-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/neko-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/neko-40.png
new file mode 100644
index 000000000..bb715889d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/neko-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/neodb-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/neodb-16.png
new file mode 100644
index 000000000..3a26d16d3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/neodb-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/neodb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/neodb-24.png
new file mode 100644
index 000000000..b637b957c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/neodb-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/neodb-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/neodb-40.png
new file mode 100644
index 000000000..e4d1f26f1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/neodb-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netalertx-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netalertx-16.png
new file mode 100644
index 000000000..7578ce4ee
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netalertx-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netalertx-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netalertx-24.png
new file mode 100644
index 000000000..29f878412
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netalertx-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netalertx-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netalertx-40.png
new file mode 100644
index 000000000..a42164261
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netalertx-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netbird-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netbird-16.png
new file mode 100644
index 000000000..e682692a4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netbird-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netbird-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netbird-24.png
new file mode 100644
index 000000000..11424683c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netbird-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netbird-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netbird-40.png
new file mode 100644
index 000000000..4efdd96e5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netbird-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netboot-xyz-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netboot-xyz-16-dark.png
new file mode 100644
index 000000000..3c97a53a1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netboot-xyz-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netboot-xyz-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netboot-xyz-16.png
new file mode 100644
index 000000000..a2a92beae
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netboot-xyz-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netboot-xyz-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netboot-xyz-24-dark.png
new file mode 100644
index 000000000..bd27ea603
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netboot-xyz-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netboot-xyz-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netboot-xyz-24.png
new file mode 100644
index 000000000..f3b9cc011
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netboot-xyz-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netboot-xyz-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netboot-xyz-40-dark.png
new file mode 100644
index 000000000..a142d1cab
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netboot-xyz-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netboot-xyz-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netboot-xyz-40.png
new file mode 100644
index 000000000..3a370e0a9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netboot-xyz-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netdata-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netdata-16-dark.png
new file mode 100644
index 000000000..a91710c52
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netdata-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netdata-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netdata-16.png
new file mode 100644
index 000000000..270f777fa
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netdata-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netdata-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netdata-24-dark.png
new file mode 100644
index 000000000..4e6d78770
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netdata-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netdata-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netdata-24.png
new file mode 100644
index 000000000..d5a008cd9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netdata-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netdata-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netdata-40-dark.png
new file mode 100644
index 000000000..5c9378444
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netdata-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netdata-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netdata-40.png
new file mode 100644
index 000000000..44fb7ec4e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netdata-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netlify-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netlify-16.png
new file mode 100644
index 000000000..a58c4a753
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netlify-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netlify-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netlify-24.png
new file mode 100644
index 000000000..d7b803ffe
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netlify-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/netlify-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/netlify-40.png
new file mode 100644
index 000000000..cac112a23
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/netlify-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/newsblur-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/newsblur-16.png
new file mode 100644
index 000000000..18c3b9af6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/newsblur-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/newsblur-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/newsblur-24.png
new file mode 100644
index 000000000..68b3f29e2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/newsblur-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/newsblur-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/newsblur-40.png
new file mode 100644
index 000000000..5ebf0a2db
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/newsblur-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-16-dark.png
new file mode 100644
index 000000000..7baf37fc5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-16.png
new file mode 100644
index 000000000..364e8da60
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-24-dark.png
new file mode 100644
index 000000000..dfe732088
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-24.png
new file mode 100644
index 000000000..9167b50cd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-40-dark.png
new file mode 100644
index 000000000..e27241544
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-40.png
new file mode 100644
index 000000000..3cde1c1da
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-news-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-news-16-dark.png
new file mode 100644
index 000000000..1edc33678
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-news-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-news-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-news-16.png
new file mode 100644
index 000000000..e893cdd90
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-news-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-news-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-news-24-dark.png
new file mode 100644
index 000000000..046d87956
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-news-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-news-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-news-24.png
new file mode 100644
index 000000000..015e9e1e4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-news-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-news-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-news-40-dark.png
new file mode 100644
index 000000000..61ff47096
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-news-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-news-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-news-40.png
new file mode 100644
index 000000000..fe50c5c07
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-news-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-social-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-social-16-dark.png
new file mode 100644
index 000000000..14c2325a9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-social-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-social-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-social-16.png
new file mode 100644
index 000000000..394b8e54d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-social-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-social-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-social-24-dark.png
new file mode 100644
index 000000000..fc6aba563
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-social-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-social-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-social-24.png
new file mode 100644
index 000000000..879f4f577
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-social-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-social-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-social-40-dark.png
new file mode 100644
index 000000000..88ec670a1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-social-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-social-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-social-40.png
new file mode 100644
index 000000000..88deec8e2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-social-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-tables-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-tables-16-dark.png
new file mode 100644
index 000000000..ea8a0c2d9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-tables-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-tables-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-tables-16.png
new file mode 100644
index 000000000..511f3617b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-tables-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-tables-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-tables-24-dark.png
new file mode 100644
index 000000000..616d0a4cd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-tables-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-tables-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-tables-24.png
new file mode 100644
index 000000000..811207c1b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-tables-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-tables-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-tables-40-dark.png
new file mode 100644
index 000000000..bb5d885be
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-tables-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-tables-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-tables-40.png
new file mode 100644
index 000000000..5eef46811
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nextcloud-tables-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nginx-proxy-manager-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nginx-proxy-manager-16.png
new file mode 100644
index 000000000..4568e375f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nginx-proxy-manager-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nginx-proxy-manager-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nginx-proxy-manager-24.png
new file mode 100644
index 000000000..48841d692
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nginx-proxy-manager-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nginx-proxy-manager-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nginx-proxy-manager-40.png
new file mode 100644
index 000000000..c40099a69
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nginx-proxy-manager-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nintendo-switch-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nintendo-switch-16-dark.png
new file mode 100644
index 000000000..42ab090b1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nintendo-switch-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nintendo-switch-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nintendo-switch-16.png
new file mode 100644
index 000000000..70d125ba3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nintendo-switch-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nintendo-switch-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nintendo-switch-24-dark.png
new file mode 100644
index 000000000..94c14b3da
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nintendo-switch-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nintendo-switch-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nintendo-switch-24.png
new file mode 100644
index 000000000..270eac8ba
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nintendo-switch-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nintendo-switch-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nintendo-switch-40-dark.png
new file mode 100644
index 000000000..794a8cab1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nintendo-switch-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nintendo-switch-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nintendo-switch-40.png
new file mode 100644
index 000000000..ec3544da4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nintendo-switch-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nocodb-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nocodb-16-dark.png
new file mode 100644
index 000000000..68249d93b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nocodb-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nocodb-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nocodb-16.png
new file mode 100644
index 000000000..ca5e2db17
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nocodb-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nocodb-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nocodb-24-dark.png
new file mode 100644
index 000000000..095badfde
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nocodb-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nocodb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nocodb-24.png
new file mode 100644
index 000000000..fef9dff2b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nocodb-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nocodb-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nocodb-40-dark.png
new file mode 100644
index 000000000..d0ec8f367
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nocodb-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nocodb-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nocodb-40.png
new file mode 100644
index 000000000..b7c27525a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nocodb-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/node-red-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/node-red-16.png
new file mode 100644
index 000000000..96a634e30
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/node-red-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/node-red-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/node-red-24.png
new file mode 100644
index 000000000..c86132dfe
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/node-red-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/node-red-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/node-red-40.png
new file mode 100644
index 000000000..03dc38883
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/node-red-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nodebb-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nodebb-16.png
new file mode 100644
index 000000000..b9b26a147
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nodebb-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nodebb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nodebb-24.png
new file mode 100644
index 000000000..b5784075d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nodebb-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nodebb-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nodebb-40.png
new file mode 100644
index 000000000..6f1582190
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nodebb-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nordvpn-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nordvpn-16-dark.png
new file mode 100644
index 000000000..b8010ab43
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nordvpn-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nordvpn-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nordvpn-16.png
new file mode 100644
index 000000000..08d988682
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nordvpn-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nordvpn-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nordvpn-24-dark.png
new file mode 100644
index 000000000..cafff9375
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nordvpn-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nordvpn-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nordvpn-24.png
new file mode 100644
index 000000000..56d44f911
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nordvpn-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nordvpn-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nordvpn-40-dark.png
new file mode 100644
index 000000000..046ca095f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nordvpn-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/nordvpn-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/nordvpn-40.png
new file mode 100644
index 000000000..3bcc57098
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/nordvpn-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/note-mark-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/note-mark-16.png
new file mode 100644
index 000000000..48cbb0ebc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/note-mark-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/note-mark-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/note-mark-24.png
new file mode 100644
index 000000000..0573893ee
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/note-mark-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/note-mark-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/note-mark-40.png
new file mode 100644
index 000000000..5ff1eacb0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/note-mark-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/notesnook-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/notesnook-16-dark.png
new file mode 100644
index 000000000..e7f2aff30
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/notesnook-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/notesnook-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/notesnook-16.png
new file mode 100644
index 000000000..2cc278c57
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/notesnook-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/notesnook-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/notesnook-24-dark.png
new file mode 100644
index 000000000..55a551ea5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/notesnook-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/notesnook-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/notesnook-24.png
new file mode 100644
index 000000000..2b0aa1f70
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/notesnook-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/notesnook-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/notesnook-40-dark.png
new file mode 100644
index 000000000..636bb14f7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/notesnook-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/notesnook-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/notesnook-40.png
new file mode 100644
index 000000000..13a15076a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/notesnook-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/notion-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/notion-16-dark.png
new file mode 100644
index 000000000..3091d5ff8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/notion-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/notion-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/notion-16.png
new file mode 100644
index 000000000..6b0d9b44e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/notion-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/notion-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/notion-24-dark.png
new file mode 100644
index 000000000..1f8f1161f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/notion-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/notion-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/notion-24.png
new file mode 100644
index 000000000..93cafdea2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/notion-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/notion-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/notion-40-dark.png
new file mode 100644
index 000000000..17b0b8930
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/notion-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/notion-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/notion-40.png
new file mode 100644
index 000000000..c82a8f925
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/notion-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ntfy-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ntfy-16-dark.png
new file mode 100644
index 000000000..208d9726f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ntfy-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ntfy-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ntfy-16.png
new file mode 100644
index 000000000..da97fc6b0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ntfy-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ntfy-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ntfy-24-dark.png
new file mode 100644
index 000000000..f4df7ec29
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ntfy-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ntfy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ntfy-24.png
new file mode 100644
index 000000000..ead0501c7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ntfy-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ntfy-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ntfy-40-dark.png
new file mode 100644
index 000000000..0b4bbb468
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ntfy-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ntfy-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ntfy-40.png
new file mode 100644
index 000000000..1732261c4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ntfy-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/obsidian-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/obsidian-16.png
new file mode 100644
index 000000000..f5bcc95a4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/obsidian-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/obsidian-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/obsidian-24.png
new file mode 100644
index 000000000..56e764707
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/obsidian-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/obsidian-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/obsidian-40.png
new file mode 100644
index 000000000..c2c3d1c2b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/obsidian-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/obtainium-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/obtainium-16.png
new file mode 100644
index 000000000..fa616674d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/obtainium-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/obtainium-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/obtainium-24.png
new file mode 100644
index 000000000..39cefa94f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/obtainium-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/obtainium-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/obtainium-40.png
new file mode 100644
index 000000000..313a86f28
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/obtainium-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/octoprint-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/octoprint-16.png
new file mode 100644
index 000000000..d09f52844
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/octoprint-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/octoprint-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/octoprint-24.png
new file mode 100644
index 000000000..1b9ad27c0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/octoprint-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/octoprint-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/octoprint-40.png
new file mode 100644
index 000000000..7ce879102
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/octoprint-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/olivetin-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/olivetin-16.png
new file mode 100644
index 000000000..0bf3a227a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/olivetin-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/olivetin-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/olivetin-24.png
new file mode 100644
index 000000000..b1e767799
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/olivetin-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/olivetin-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/olivetin-40.png
new file mode 100644
index 000000000..9d24089ac
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/olivetin-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/omada-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/omada-16.png
new file mode 100644
index 000000000..05cc5cade
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/omada-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/omada-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/omada-24.png
new file mode 100644
index 000000000..f9f69b3c8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/omada-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/omada-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/omada-40.png
new file mode 100644
index 000000000..f9d72775e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/omada-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ombi-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ombi-16.png
new file mode 100644
index 000000000..5e4e35fd8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ombi-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ombi-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ombi-24.png
new file mode 100644
index 000000000..db2c031ee
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ombi-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ombi-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ombi-40.png
new file mode 100644
index 000000000..db53f5863
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ombi-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/omnivore-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/omnivore-16.png
new file mode 100644
index 000000000..737739799
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/omnivore-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/omnivore-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/omnivore-24.png
new file mode 100644
index 000000000..27ea85356
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/omnivore-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/omnivore-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/omnivore-40.png
new file mode 100644
index 000000000..cdd183ea1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/omnivore-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/onedev-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/onedev-16-dark.png
new file mode 100644
index 000000000..65e372bc6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/onedev-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/onedev-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/onedev-16.png
new file mode 100644
index 000000000..e2f4f3b79
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/onedev-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/onedev-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/onedev-24-dark.png
new file mode 100644
index 000000000..5edc63b6c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/onedev-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/onedev-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/onedev-24.png
new file mode 100644
index 000000000..7ff592df0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/onedev-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/onedev-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/onedev-40-dark.png
new file mode 100644
index 000000000..8c1def783
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/onedev-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/onedev-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/onedev-40.png
new file mode 100644
index 000000000..962ceaa98
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/onedev-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/oneuptime-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/oneuptime-16-dark.png
new file mode 100644
index 000000000..d0c8f789f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/oneuptime-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/oneuptime-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/oneuptime-16.png
new file mode 100644
index 000000000..b7c949dab
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/oneuptime-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/oneuptime-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/oneuptime-24-dark.png
new file mode 100644
index 000000000..9df3e5c35
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/oneuptime-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/oneuptime-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/oneuptime-24.png
new file mode 100644
index 000000000..ea8f1b421
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/oneuptime-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/oneuptime-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/oneuptime-40-dark.png
new file mode 100644
index 000000000..884b539db
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/oneuptime-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/oneuptime-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/oneuptime-40.png
new file mode 100644
index 000000000..3d13ba89e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/oneuptime-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/open-source-initiative-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/open-source-initiative-16.png
new file mode 100644
index 000000000..96d1406f6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/open-source-initiative-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/open-source-initiative-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/open-source-initiative-24.png
new file mode 100644
index 000000000..c1e2847b5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/open-source-initiative-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/open-source-initiative-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/open-source-initiative-40.png
new file mode 100644
index 000000000..9bd6af966
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/open-source-initiative-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openchangelog-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openchangelog-16-dark.png
new file mode 100644
index 000000000..357529a3e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openchangelog-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openchangelog-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openchangelog-16.png
new file mode 100644
index 000000000..d28af25ff
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openchangelog-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openchangelog-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openchangelog-24-dark.png
new file mode 100644
index 000000000..056c54574
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openchangelog-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openchangelog-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openchangelog-24.png
new file mode 100644
index 000000000..0bec6f2a9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openchangelog-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openchangelog-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openchangelog-40-dark.png
new file mode 100644
index 000000000..7846d1fd2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openchangelog-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openchangelog-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openchangelog-40.png
new file mode 100644
index 000000000..7e54cd126
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openchangelog-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openemr-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openemr-16-dark.png
new file mode 100644
index 000000000..315b76a0c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openemr-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openemr-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openemr-16.png
new file mode 100644
index 000000000..ba02c8f16
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openemr-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openemr-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openemr-24-dark.png
new file mode 100644
index 000000000..3d6f04f13
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openemr-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openemr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openemr-24.png
new file mode 100644
index 000000000..406d7357b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openemr-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openemr-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openemr-40-dark.png
new file mode 100644
index 000000000..fc40a6dcc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openemr-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openemr-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openemr-40.png
new file mode 100644
index 000000000..f1f213223
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openemr-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openldap-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openldap-16.png
new file mode 100644
index 000000000..8272ba4ec
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openldap-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openldap-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openldap-24.png
new file mode 100644
index 000000000..a79934ae9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openldap-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openldap-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openldap-40.png
new file mode 100644
index 000000000..d26aba981
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openldap-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openpanel-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openpanel-16-dark.png
new file mode 100644
index 000000000..71cb09483
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openpanel-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openpanel-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openpanel-16.png
new file mode 100644
index 000000000..b1d334606
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openpanel-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openpanel-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openpanel-24-dark.png
new file mode 100644
index 000000000..472392c7d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openpanel-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openpanel-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openpanel-24.png
new file mode 100644
index 000000000..de3b6a484
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openpanel-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openpanel-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openpanel-40-dark.png
new file mode 100644
index 000000000..459077331
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openpanel-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openpanel-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openpanel-40.png
new file mode 100644
index 000000000..1d1b89dc7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openpanel-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openreads-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openreads-16.png
new file mode 100644
index 000000000..eb7f6a8f8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openreads-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openreads-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openreads-24.png
new file mode 100644
index 000000000..5a5e8083d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openreads-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openreads-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openreads-40.png
new file mode 100644
index 000000000..317bbe8c8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openreads-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openspeedtest-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openspeedtest-16-dark.png
new file mode 100644
index 000000000..9258bfb9c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openspeedtest-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openspeedtest-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openspeedtest-16.png
new file mode 100644
index 000000000..7b6ca78e1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openspeedtest-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openspeedtest-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openspeedtest-24-dark.png
new file mode 100644
index 000000000..ac7663ae4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openspeedtest-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openspeedtest-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openspeedtest-24.png
new file mode 100644
index 000000000..5205ce10f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openspeedtest-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openspeedtest-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openspeedtest-40-dark.png
new file mode 100644
index 000000000..7495aae92
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openspeedtest-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openspeedtest-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openspeedtest-40.png
new file mode 100644
index 000000000..c8800007e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openspeedtest-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/opentalk-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/opentalk-16.png
new file mode 100644
index 000000000..abfdb682c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/opentalk-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/opentalk-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/opentalk-24.png
new file mode 100644
index 000000000..c5dd0f443
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/opentalk-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/opentalk-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/opentalk-40.png
new file mode 100644
index 000000000..713a0e271
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/opentalk-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/opentofu-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/opentofu-16-dark.png
new file mode 100644
index 000000000..48b24b364
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/opentofu-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/opentofu-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/opentofu-16.png
new file mode 100644
index 000000000..a5d285e87
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/opentofu-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/opentofu-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/opentofu-24-dark.png
new file mode 100644
index 000000000..06f363a6c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/opentofu-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/opentofu-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/opentofu-24.png
new file mode 100644
index 000000000..91a1da797
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/opentofu-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/opentofu-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/opentofu-40-dark.png
new file mode 100644
index 000000000..e676e73bc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/opentofu-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/opentofu-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/opentofu-40.png
new file mode 100644
index 000000000..daa48602f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/opentofu-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openvpn-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openvpn-16-dark.png
new file mode 100644
index 000000000..11a082ffe
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openvpn-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openvpn-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openvpn-16.png
new file mode 100644
index 000000000..4c4bb4c88
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openvpn-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openvpn-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openvpn-24-dark.png
new file mode 100644
index 000000000..32e4a2e27
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openvpn-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openvpn-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openvpn-24.png
new file mode 100644
index 000000000..09e236b69
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openvpn-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openvpn-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openvpn-40-dark.png
new file mode 100644
index 000000000..397a0c9be
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openvpn-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openvpn-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openvpn-40.png
new file mode 100644
index 000000000..c60bf6b54
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openvpn-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openwrt-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openwrt-16-dark.png
new file mode 100644
index 000000000..61199ac3d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openwrt-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openwrt-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openwrt-16.png
new file mode 100644
index 000000000..cbd19559e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openwrt-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openwrt-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openwrt-24-dark.png
new file mode 100644
index 000000000..efb208190
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openwrt-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openwrt-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openwrt-24.png
new file mode 100644
index 000000000..1c57de9f5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openwrt-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openwrt-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openwrt-40-dark.png
new file mode 100644
index 000000000..6ef951acc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openwrt-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/openwrt-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/openwrt-40.png
new file mode 100644
index 000000000..9c73cd6af
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/openwrt-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/opnsense-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/opnsense-16.png
new file mode 100644
index 000000000..f7c35a431
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/opnsense-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/opnsense-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/opnsense-24.png
new file mode 100644
index 000000000..b41477ea6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/opnsense-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/opnsense-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/opnsense-40.png
new file mode 100644
index 000000000..63955ccd0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/opnsense-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/outline-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/outline-16.png
new file mode 100644
index 000000000..e00aee2fa
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/outline-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/outline-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/outline-24.png
new file mode 100644
index 000000000..5d284c7f0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/outline-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/outline-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/outline-40.png
new file mode 100644
index 000000000..4d774bf19
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/outline-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/overleaf-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/overleaf-16.png
new file mode 100644
index 000000000..e5458e865
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/overleaf-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/overleaf-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/overleaf-24.png
new file mode 100644
index 000000000..30bb5e57d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/overleaf-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/overleaf-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/overleaf-40.png
new file mode 100644
index 000000000..e9218b63e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/overleaf-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/overseerr-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/overseerr-16.png
new file mode 100644
index 000000000..c7c5cefa8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/overseerr-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/overseerr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/overseerr-24.png
new file mode 100644
index 000000000..7fbe831ca
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/overseerr-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/overseerr-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/overseerr-40.png
new file mode 100644
index 000000000..8bd112d37
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/overseerr-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/owncast-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/owncast-16.png
new file mode 100644
index 000000000..9c103e244
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/owncast-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/owncast-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/owncast-24.png
new file mode 100644
index 000000000..bdf16aa85
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/owncast-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/owncast-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/owncast-40.png
new file mode 100644
index 000000000..a4beb24d1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/owncast-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/owncloud-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/owncloud-16-dark.png
new file mode 100644
index 000000000..e29e7353b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/owncloud-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/owncloud-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/owncloud-16.png
new file mode 100644
index 000000000..4c5d0be10
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/owncloud-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/owncloud-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/owncloud-24-dark.png
new file mode 100644
index 000000000..98063dd67
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/owncloud-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/owncloud-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/owncloud-24.png
new file mode 100644
index 000000000..fbe16b8ef
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/owncloud-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/owncloud-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/owncloud-40-dark.png
new file mode 100644
index 000000000..13752b20a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/owncloud-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/owncloud-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/owncloud-40.png
new file mode 100644
index 000000000..71b673e88
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/owncloud-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/owntone-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/owntone-16.png
new file mode 100644
index 000000000..12d6e78c9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/owntone-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/owntone-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/owntone-24.png
new file mode 100644
index 000000000..d079c7b75
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/owntone-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/owntone-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/owntone-40.png
new file mode 100644
index 000000000..bee69230f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/owntone-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/oxker-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/oxker-16.png
new file mode 100644
index 000000000..c5eee13e6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/oxker-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/oxker-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/oxker-24.png
new file mode 100644
index 000000000..29cd1fc8f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/oxker-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/oxker-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/oxker-40.png
new file mode 100644
index 000000000..9b9e62aac
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/oxker-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/paperless-ngx-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/paperless-ngx-16-dark.png
new file mode 100644
index 000000000..5a995e266
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/paperless-ngx-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/paperless-ngx-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/paperless-ngx-16.png
new file mode 100644
index 000000000..34bf92f89
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/paperless-ngx-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/paperless-ngx-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/paperless-ngx-24-dark.png
new file mode 100644
index 000000000..8a68f6141
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/paperless-ngx-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/paperless-ngx-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/paperless-ngx-24.png
new file mode 100644
index 000000000..ac950e925
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/paperless-ngx-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/paperless-ngx-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/paperless-ngx-40-dark.png
new file mode 100644
index 000000000..5739cfc39
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/paperless-ngx-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/paperless-ngx-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/paperless-ngx-40.png
new file mode 100644
index 000000000..b24e1b747
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/paperless-ngx-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/papermark-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/papermark-16-dark.png
new file mode 100644
index 000000000..44d4746a2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/papermark-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/papermark-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/papermark-16.png
new file mode 100644
index 000000000..d13178a34
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/papermark-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/papermark-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/papermark-24-dark.png
new file mode 100644
index 000000000..4e408a385
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/papermark-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/papermark-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/papermark-24.png
new file mode 100644
index 000000000..96474db74
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/papermark-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/papermark-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/papermark-40-dark.png
new file mode 100644
index 000000000..558566490
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/papermark-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/papermark-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/papermark-40.png
new file mode 100644
index 000000000..4ec03bc3b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/papermark-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/papermerge-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/papermerge-16.png
new file mode 100644
index 000000000..5dc76fdb4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/papermerge-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/papermerge-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/papermerge-24.png
new file mode 100644
index 000000000..8e8618a8a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/papermerge-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/papermerge-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/papermerge-40.png
new file mode 100644
index 000000000..3e101b62b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/papermerge-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/parseable-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/parseable-16.png
new file mode 100644
index 000000000..79d45ba48
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/parseable-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/parseable-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/parseable-24.png
new file mode 100644
index 000000000..7f4469d9f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/parseable-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/parseable-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/parseable-40.png
new file mode 100644
index 000000000..06d8c313f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/parseable-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/passbolt-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/passbolt-16.png
new file mode 100644
index 000000000..f38ca3bcd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/passbolt-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/passbolt-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/passbolt-24.png
new file mode 100644
index 000000000..18d608e8c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/passbolt-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/passbolt-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/passbolt-40.png
new file mode 100644
index 000000000..5cf0a90ea
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/passbolt-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/payload-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/payload-16-dark.png
new file mode 100644
index 000000000..34cebb6a5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/payload-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/payload-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/payload-16.png
new file mode 100644
index 000000000..757071739
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/payload-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/payload-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/payload-24-dark.png
new file mode 100644
index 000000000..a91a0ef96
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/payload-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/payload-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/payload-24.png
new file mode 100644
index 000000000..7db607699
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/payload-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/payload-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/payload-40-dark.png
new file mode 100644
index 000000000..5e1efa455
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/payload-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/payload-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/payload-40.png
new file mode 100644
index 000000000..a7ee233c8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/payload-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pdfding-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pdfding-16-dark.png
new file mode 100644
index 000000000..1a2202dbd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pdfding-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pdfding-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pdfding-16.png
new file mode 100644
index 000000000..849a7d335
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pdfding-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pdfding-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pdfding-24-dark.png
new file mode 100644
index 000000000..85a100180
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pdfding-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pdfding-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pdfding-24.png
new file mode 100644
index 000000000..f360634e4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pdfding-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pdfding-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pdfding-40-dark.png
new file mode 100644
index 000000000..2c634fff9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pdfding-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pdfding-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pdfding-40.png
new file mode 100644
index 000000000..21b90191c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pdfding-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/peanut-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/peanut-16.png
new file mode 100644
index 000000000..5b8fb0398
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/peanut-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/peanut-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/peanut-24.png
new file mode 100644
index 000000000..662117afd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/peanut-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/peanut-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/peanut-40.png
new file mode 100644
index 000000000..d5045cf4e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/peanut-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/peertube-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/peertube-16.png
new file mode 100644
index 000000000..c6764ce2d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/peertube-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/peertube-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/peertube-24.png
new file mode 100644
index 000000000..adeeaa52b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/peertube-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/peertube-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/peertube-40.png
new file mode 100644
index 000000000..05d82aa36
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/peertube-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pelican-panel-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pelican-panel-16.png
new file mode 100644
index 000000000..73fb650a8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pelican-panel-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pelican-panel-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pelican-panel-24.png
new file mode 100644
index 000000000..a2c2ef605
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pelican-panel-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pelican-panel-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pelican-panel-40.png
new file mode 100644
index 000000000..5bb16358a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pelican-panel-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/penpot-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/penpot-16-dark.png
new file mode 100644
index 000000000..a88a25c31
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/penpot-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/penpot-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/penpot-16.png
new file mode 100644
index 000000000..201e43f97
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/penpot-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/penpot-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/penpot-24-dark.png
new file mode 100644
index 000000000..0bea13b46
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/penpot-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/penpot-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/penpot-24.png
new file mode 100644
index 000000000..ed2d4943b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/penpot-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/penpot-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/penpot-40-dark.png
new file mode 100644
index 000000000..f1970544c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/penpot-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/penpot-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/penpot-40.png
new file mode 100644
index 000000000..86c972702
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/penpot-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/peppermint-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/peppermint-16.png
new file mode 100644
index 000000000..c77ab02a5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/peppermint-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/peppermint-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/peppermint-24.png
new file mode 100644
index 000000000..8588dc079
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/peppermint-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/peppermint-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/peppermint-40.png
new file mode 100644
index 000000000..0c0c777b8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/peppermint-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pepperminty-wiki-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pepperminty-wiki-16.png
new file mode 100644
index 000000000..467937f25
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pepperminty-wiki-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pepperminty-wiki-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pepperminty-wiki-24.png
new file mode 100644
index 000000000..79dc2a118
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pepperminty-wiki-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pepperminty-wiki-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pepperminty-wiki-40.png
new file mode 100644
index 000000000..bec35b1e1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pepperminty-wiki-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pfsense-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pfsense-16-dark.png
new file mode 100644
index 000000000..02254615f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pfsense-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pfsense-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pfsense-16.png
new file mode 100644
index 000000000..d2cd93dfc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pfsense-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pfsense-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pfsense-24-dark.png
new file mode 100644
index 000000000..60bfc23cf
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pfsense-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pfsense-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pfsense-24.png
new file mode 100644
index 000000000..2695a8746
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pfsense-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pfsense-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pfsense-40-dark.png
new file mode 100644
index 000000000..1ca73e703
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pfsense-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pfsense-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pfsense-40.png
new file mode 100644
index 000000000..3c121bd52
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pfsense-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pg-back-web-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pg-back-web-16.png
new file mode 100644
index 000000000..b35c35085
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pg-back-web-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pg-back-web-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pg-back-web-24.png
new file mode 100644
index 000000000..a4ee09041
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pg-back-web-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pg-back-web-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pg-back-web-40.png
new file mode 100644
index 000000000..4d1905b69
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pg-back-web-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/photopea-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/photopea-16-dark.png
new file mode 100644
index 000000000..cefc41510
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/photopea-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/photopea-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/photopea-16.png
new file mode 100644
index 000000000..dae25eb8d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/photopea-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/photopea-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/photopea-24-dark.png
new file mode 100644
index 000000000..1e9d59fd3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/photopea-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/photopea-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/photopea-24.png
new file mode 100644
index 000000000..28425361d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/photopea-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/photopea-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/photopea-40-dark.png
new file mode 100644
index 000000000..5764a11a7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/photopea-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/photopea-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/photopea-40.png
new file mode 100644
index 000000000..5bc9d80ea
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/photopea-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/photoprism-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/photoprism-16.png
new file mode 100644
index 000000000..9e25794e8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/photoprism-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/photoprism-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/photoprism-24.png
new file mode 100644
index 000000000..929afd023
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/photoprism-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/photoprism-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/photoprism-40.png
new file mode 100644
index 000000000..d126af59b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/photoprism-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/photoview-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/photoview-16.png
new file mode 100644
index 000000000..877d3f2f9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/photoview-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/photoview-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/photoview-24.png
new file mode 100644
index 000000000..3f2fad0e9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/photoview-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/photoview-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/photoview-40.png
new file mode 100644
index 000000000..5cda9e0d2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/photoview-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pi-hole-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pi-hole-16.png
new file mode 100644
index 000000000..ca2c6d1fa
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pi-hole-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pi-hole-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pi-hole-24.png
new file mode 100644
index 000000000..f62ee54c3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pi-hole-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pi-hole-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pi-hole-40.png
new file mode 100644
index 000000000..95e89c4d8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pi-hole-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pikapods-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pikapods-16-dark.png
new file mode 100644
index 000000000..66fdd3840
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pikapods-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pikapods-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pikapods-16.png
new file mode 100644
index 000000000..bf9893ae7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pikapods-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pikapods-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pikapods-24-dark.png
new file mode 100644
index 000000000..2b1e5866f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pikapods-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pikapods-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pikapods-24.png
new file mode 100644
index 000000000..478b7a0e7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pikapods-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pikapods-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pikapods-40-dark.png
new file mode 100644
index 000000000..9cfdf05aa
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pikapods-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pikapods-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pikapods-40.png
new file mode 100644
index 000000000..f133cee00
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pikapods-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pingvin-share-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pingvin-share-16.png
new file mode 100644
index 000000000..cedbda326
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pingvin-share-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pingvin-share-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pingvin-share-24.png
new file mode 100644
index 000000000..3b0e1d1aa
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pingvin-share-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pingvin-share-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pingvin-share-40.png
new file mode 100644
index 000000000..072cee7b7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pingvin-share-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pinkary-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pinkary-16.png
new file mode 100644
index 000000000..c3fafa851
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pinkary-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pinkary-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pinkary-24.png
new file mode 100644
index 000000000..6cb4fd28a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pinkary-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pinkary-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pinkary-40.png
new file mode 100644
index 000000000..16588f13f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pinkary-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/piwigo-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/piwigo-16.png
new file mode 100644
index 000000000..474e99052
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/piwigo-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/piwigo-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/piwigo-24.png
new file mode 100644
index 000000000..7998e3002
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/piwigo-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/piwigo-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/piwigo-40.png
new file mode 100644
index 000000000..8b1fe2a91
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/piwigo-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pixelfed-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pixelfed-16.png
new file mode 100644
index 000000000..731406148
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pixelfed-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pixelfed-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pixelfed-24.png
new file mode 100644
index 000000000..96a890e5a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pixelfed-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pixelfed-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pixelfed-40.png
new file mode 100644
index 000000000..7492cb87e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pixelfed-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/plane-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/plane-16.png
new file mode 100644
index 000000000..7a1e128e7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/plane-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/plane-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/plane-24.png
new file mode 100644
index 000000000..9e2a05554
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/plane-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/plane-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/plane-40.png
new file mode 100644
index 000000000..bfb1d8b1c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/plane-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/plausible-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/plausible-16.png
new file mode 100644
index 000000000..07dd3dbfd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/plausible-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/plausible-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/plausible-24.png
new file mode 100644
index 000000000..0ede4ecb4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/plausible-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/plausible-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/plausible-40.png
new file mode 100644
index 000000000..faf0ff77a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/plausible-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pleroma-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pleroma-16.png
new file mode 100644
index 000000000..827bc7122
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pleroma-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pleroma-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pleroma-24.png
new file mode 100644
index 000000000..5a05fe073
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pleroma-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pleroma-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pleroma-40.png
new file mode 100644
index 000000000..a8de77ec1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pleroma-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/plex-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/plex-16.png
new file mode 100644
index 000000000..4aed02901
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/plex-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/plex-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/plex-24.png
new file mode 100644
index 000000000..468b74922
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/plex-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/plex-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/plex-40.png
new file mode 100644
index 000000000..fc3162368
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/plex-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/plex-rewind-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/plex-rewind-16.png
new file mode 100644
index 000000000..e8429180b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/plex-rewind-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/plex-rewind-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/plex-rewind-24.png
new file mode 100644
index 000000000..63b7254ec
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/plex-rewind-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/plex-rewind-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/plex-rewind-40.png
new file mode 100644
index 000000000..af9faf3c2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/plex-rewind-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-casts-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-casts-16-dark.png
new file mode 100644
index 000000000..293b2fa0d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-casts-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-casts-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-casts-16.png
new file mode 100644
index 000000000..917369179
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-casts-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-casts-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-casts-24-dark.png
new file mode 100644
index 000000000..613b5ac9e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-casts-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-casts-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-casts-24.png
new file mode 100644
index 000000000..d5c99d48e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-casts-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-casts-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-casts-40-dark.png
new file mode 100644
index 000000000..0c2c227b0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-casts-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-casts-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-casts-40.png
new file mode 100644
index 000000000..c398a871f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-casts-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-id-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-id-16-dark.png
new file mode 100644
index 000000000..9b3d62667
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-id-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-id-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-id-16.png
new file mode 100644
index 000000000..3d5a15074
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-id-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-id-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-id-24-dark.png
new file mode 100644
index 000000000..f49872781
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-id-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-id-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-id-24.png
new file mode 100644
index 000000000..22a950ac5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-id-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-id-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-id-40-dark.png
new file mode 100644
index 000000000..cb7a10a17
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-id-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-id-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-id-40.png
new file mode 100644
index 000000000..3d3f131d4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pocket-id-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/podfetch-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/podfetch-16-dark.png
new file mode 100644
index 000000000..656518572
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/podfetch-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/podfetch-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/podfetch-16.png
new file mode 100644
index 000000000..6afe91cd8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/podfetch-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/podfetch-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/podfetch-24-dark.png
new file mode 100644
index 000000000..520fdfd1b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/podfetch-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/podfetch-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/podfetch-24.png
new file mode 100644
index 000000000..41d50a378
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/podfetch-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/podfetch-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/podfetch-40-dark.png
new file mode 100644
index 000000000..9668e724a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/podfetch-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/podfetch-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/podfetch-40.png
new file mode 100644
index 000000000..b753ea827
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/podfetch-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/podman-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/podman-16.png
new file mode 100644
index 000000000..ce928fb99
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/podman-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/podman-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/podman-24.png
new file mode 100644
index 000000000..8690e9c10
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/podman-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/podman-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/podman-40.png
new file mode 100644
index 000000000..e66deabe2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/podman-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/portainer-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/portainer-16.png
new file mode 100644
index 000000000..0367be238
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/portainer-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/portainer-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/portainer-24.png
new file mode 100644
index 000000000..1877834bb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/portainer-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/portainer-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/portainer-40.png
new file mode 100644
index 000000000..d0ffbf59b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/portainer-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/postal-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/postal-16.png
new file mode 100644
index 000000000..077ecc83c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/postal-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/postal-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/postal-24.png
new file mode 100644
index 000000000..38ef6cc29
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/postal-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/postal-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/postal-40.png
new file mode 100644
index 000000000..9fe7aeeca
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/postal-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/postgresql-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/postgresql-16.png
new file mode 100644
index 000000000..da8ee1662
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/postgresql-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/postgresql-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/postgresql-24.png
new file mode 100644
index 000000000..26a7d131d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/postgresql-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/postgresql-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/postgresql-40.png
new file mode 100644
index 000000000..9730947ba
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/postgresql-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/posthog-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/posthog-16.png
new file mode 100644
index 000000000..6dfd351fc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/posthog-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/posthog-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/posthog-24.png
new file mode 100644
index 000000000..f99df1480
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/posthog-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/posthog-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/posthog-40.png
new file mode 100644
index 000000000..e6440c6c8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/posthog-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/private-internet-access-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/private-internet-access-16.png
new file mode 100644
index 000000000..74d0dfbfc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/private-internet-access-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/private-internet-access-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/private-internet-access-24.png
new file mode 100644
index 000000000..f8f433ccc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/private-internet-access-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/private-internet-access-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/private-internet-access-40.png
new file mode 100644
index 000000000..792d64cbd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/private-internet-access-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/privatebin-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/privatebin-16.png
new file mode 100644
index 000000000..70a217175
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/privatebin-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/privatebin-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/privatebin-24.png
new file mode 100644
index 000000000..59ed79e0e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/privatebin-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/privatebin-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/privatebin-40.png
new file mode 100644
index 000000000..f260a141b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/privatebin-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/projectsend-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/projectsend-16.png
new file mode 100644
index 000000000..f546d4fe2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/projectsend-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/projectsend-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/projectsend-24.png
new file mode 100644
index 000000000..ef76cbea3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/projectsend-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/projectsend-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/projectsend-40.png
new file mode 100644
index 000000000..122c94de0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/projectsend-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/prometheus-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/prometheus-16.png
new file mode 100644
index 000000000..2642c2e7e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/prometheus-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/prometheus-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/prometheus-24.png
new file mode 100644
index 000000000..665e9a931
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/prometheus-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/prometheus-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/prometheus-40.png
new file mode 100644
index 000000000..9823771d8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/prometheus-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/prowlarr-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/prowlarr-16.png
new file mode 100644
index 000000000..6b339cc20
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/prowlarr-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/prowlarr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/prowlarr-24.png
new file mode 100644
index 000000000..2b6ed9e50
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/prowlarr-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/prowlarr-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/prowlarr-40.png
new file mode 100644
index 000000000..870a01f41
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/prowlarr-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/proxmox-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/proxmox-16-dark.png
new file mode 100644
index 000000000..8de525bf3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/proxmox-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/proxmox-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/proxmox-16.png
new file mode 100644
index 000000000..28d4adf3c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/proxmox-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/proxmox-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/proxmox-24-dark.png
new file mode 100644
index 000000000..f61049878
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/proxmox-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/proxmox-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/proxmox-24.png
new file mode 100644
index 000000000..97446c0bc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/proxmox-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/proxmox-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/proxmox-40-dark.png
new file mode 100644
index 000000000..312ac60ac
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/proxmox-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/proxmox-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/proxmox-40.png
new file mode 100644
index 000000000..c08361625
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/proxmox-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pterodactyl-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pterodactyl-16.png
new file mode 100644
index 000000000..a8264ed0f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pterodactyl-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pterodactyl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pterodactyl-24.png
new file mode 100644
index 000000000..1a4a89a90
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pterodactyl-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pterodactyl-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pterodactyl-40.png
new file mode 100644
index 000000000..cb2a2716d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pterodactyl-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pushover-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pushover-16-dark.png
new file mode 100644
index 000000000..afc5147e5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pushover-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pushover-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pushover-16.png
new file mode 100644
index 000000000..ffc9bedfa
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pushover-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pushover-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pushover-24-dark.png
new file mode 100644
index 000000000..f31a90d30
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pushover-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pushover-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pushover-24.png
new file mode 100644
index 000000000..2cfac55d6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pushover-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pushover-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pushover-40-dark.png
new file mode 100644
index 000000000..4a39f28d7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pushover-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pushover-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pushover-40.png
new file mode 100644
index 000000000..89421eb51
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pushover-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pyload-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pyload-16.png
new file mode 100644
index 000000000..42756660a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pyload-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pyload-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pyload-24.png
new file mode 100644
index 000000000..d085114fb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pyload-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/pyload-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/pyload-40.png
new file mode 100644
index 000000000..78720214e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/pyload-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/python-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/python-16-dark.png
new file mode 100644
index 000000000..225b67e6b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/python-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/python-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/python-16.png
new file mode 100644
index 000000000..b579279d8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/python-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/python-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/python-24-dark.png
new file mode 100644
index 000000000..bc773a464
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/python-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/python-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/python-24.png
new file mode 100644
index 000000000..ee975b1a5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/python-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/python-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/python-40-dark.png
new file mode 100644
index 000000000..e499fac02
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/python-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/python-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/python-40.png
new file mode 100644
index 000000000..82484986a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/python-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/qbittorrent-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/qbittorrent-16.png
new file mode 100644
index 000000000..e51c30397
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/qbittorrent-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/qbittorrent-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/qbittorrent-24.png
new file mode 100644
index 000000000..16d7bd4d0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/qbittorrent-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/qbittorrent-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/qbittorrent-40.png
new file mode 100644
index 000000000..56df6ed8a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/qbittorrent-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/quickwit-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/quickwit-16.png
new file mode 100644
index 000000000..306cf5305
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/quickwit-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/quickwit-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/quickwit-24.png
new file mode 100644
index 000000000..47e21bdee
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/quickwit-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/quickwit-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/quickwit-40.png
new file mode 100644
index 000000000..30d5cc589
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/quickwit-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/radarr-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/radarr-16-dark.png
new file mode 100644
index 000000000..c3cca4e98
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/radarr-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/radarr-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/radarr-16.png
new file mode 100644
index 000000000..8114c6741
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/radarr-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/radarr-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/radarr-24-dark.png
new file mode 100644
index 000000000..7d5b41940
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/radarr-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/radarr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/radarr-24.png
new file mode 100644
index 000000000..a9595d22c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/radarr-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/radarr-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/radarr-40-dark.png
new file mode 100644
index 000000000..b470ab097
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/radarr-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/radarr-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/radarr-40.png
new file mode 100644
index 000000000..4338109af
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/radarr-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/radicale-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/radicale-16.png
new file mode 100644
index 000000000..da485b9cd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/radicale-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/radicale-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/radicale-24.png
new file mode 100644
index 000000000..a82039654
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/radicale-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/radicale-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/radicale-40.png
new file mode 100644
index 000000000..d8e68a002
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/radicale-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rallly-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rallly-16-dark.png
new file mode 100644
index 000000000..84ea4374f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rallly-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rallly-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rallly-16.png
new file mode 100644
index 000000000..61cb5fe05
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rallly-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rallly-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rallly-24-dark.png
new file mode 100644
index 000000000..393f83b72
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rallly-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rallly-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rallly-24.png
new file mode 100644
index 000000000..e39f1128a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rallly-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rallly-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rallly-40-dark.png
new file mode 100644
index 000000000..d8b50f6ea
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rallly-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rallly-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rallly-40.png
new file mode 100644
index 000000000..5cdf4587d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rallly-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rancher-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rancher-16-dark.png
new file mode 100644
index 000000000..8334fb90f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rancher-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rancher-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rancher-16.png
new file mode 100644
index 000000000..59f4b6edd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rancher-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rancher-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rancher-24-dark.png
new file mode 100644
index 000000000..34a3108c6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rancher-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rancher-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rancher-24.png
new file mode 100644
index 000000000..fbc1c9799
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rancher-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rancher-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rancher-40-dark.png
new file mode 100644
index 000000000..e9a93d899
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rancher-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rancher-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rancher-40.png
new file mode 100644
index 000000000..a39fb24c9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rancher-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/raspberry-pi-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/raspberry-pi-16.png
new file mode 100644
index 000000000..4532720c4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/raspberry-pi-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/raspberry-pi-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/raspberry-pi-24.png
new file mode 100644
index 000000000..7fbbcc50b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/raspberry-pi-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/raspberry-pi-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/raspberry-pi-40.png
new file mode 100644
index 000000000..e4817a2ae
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/raspberry-pi-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rclone-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rclone-16.png
new file mode 100644
index 000000000..4ed2980f3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rclone-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rclone-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rclone-24.png
new file mode 100644
index 000000000..9dfd8a648
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rclone-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rclone-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rclone-40.png
new file mode 100644
index 000000000..ce37ac0e7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rclone-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/reactive-resume-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/reactive-resume-16-dark.png
new file mode 100644
index 000000000..09aa95318
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/reactive-resume-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/reactive-resume-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/reactive-resume-16.png
new file mode 100644
index 000000000..b9c70113c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/reactive-resume-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/reactive-resume-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/reactive-resume-24-dark.png
new file mode 100644
index 000000000..936901d56
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/reactive-resume-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/reactive-resume-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/reactive-resume-24.png
new file mode 100644
index 000000000..380d25dfe
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/reactive-resume-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/reactive-resume-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/reactive-resume-40-dark.png
new file mode 100644
index 000000000..4a3611b5d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/reactive-resume-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/reactive-resume-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/reactive-resume-40.png
new file mode 100644
index 000000000..fc5479ebc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/reactive-resume-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/readarr-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/readarr-16.png
new file mode 100644
index 000000000..4935c94c0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/readarr-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/readarr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/readarr-24.png
new file mode 100644
index 000000000..20a76869f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/readarr-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/readarr-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/readarr-40.png
new file mode 100644
index 000000000..3e8d87b3e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/readarr-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/readeck-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/readeck-16.png
new file mode 100644
index 000000000..7bb7ace74
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/readeck-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/readeck-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/readeck-24.png
new file mode 100644
index 000000000..051df9ca9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/readeck-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/readeck-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/readeck-40.png
new file mode 100644
index 000000000..a6d6df36b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/readeck-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/receipt-wrangler-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/receipt-wrangler-16.png
new file mode 100644
index 000000000..d1ee31490
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/receipt-wrangler-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/receipt-wrangler-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/receipt-wrangler-24.png
new file mode 100644
index 000000000..22aaa650f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/receipt-wrangler-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/receipt-wrangler-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/receipt-wrangler-40.png
new file mode 100644
index 000000000..9ebee6ba5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/receipt-wrangler-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/recipesage-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/recipesage-16.png
new file mode 100644
index 000000000..cfbde9d62
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/recipesage-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/recipesage-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/recipesage-24.png
new file mode 100644
index 000000000..1c3b43a28
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/recipesage-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/recipesage-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/recipesage-40.png
new file mode 100644
index 000000000..a80672555
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/recipesage-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/redict-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/redict-16.png
new file mode 100644
index 000000000..b60ba31d7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/redict-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/redict-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/redict-24.png
new file mode 100644
index 000000000..9e45bfc73
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/redict-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/redict-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/redict-40.png
new file mode 100644
index 000000000..22d7fd6f6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/redict-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/redlib-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/redlib-16.png
new file mode 100644
index 000000000..9be93e8cd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/redlib-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/redlib-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/redlib-24.png
new file mode 100644
index 000000000..dbe246249
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/redlib-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/redlib-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/redlib-40.png
new file mode 100644
index 000000000..6939eeaff
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/redlib-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/reolink-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/reolink-16-dark.png
new file mode 100644
index 000000000..ffd537b8e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/reolink-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/reolink-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/reolink-16.png
new file mode 100644
index 000000000..cfbfc6fee
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/reolink-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/reolink-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/reolink-24-dark.png
new file mode 100644
index 000000000..9aa36dfba
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/reolink-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/reolink-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/reolink-24.png
new file mode 100644
index 000000000..dd7ed89a5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/reolink-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/reolink-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/reolink-40-dark.png
new file mode 100644
index 000000000..daabe4984
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/reolink-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/reolink-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/reolink-40.png
new file mode 100644
index 000000000..741ceffa6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/reolink-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/requestly-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/requestly-16.png
new file mode 100644
index 000000000..8de53cf90
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/requestly-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/requestly-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/requestly-24.png
new file mode 100644
index 000000000..84125f75b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/requestly-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/requestly-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/requestly-40.png
new file mode 100644
index 000000000..1831485bf
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/requestly-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/restreamer-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/restreamer-16.png
new file mode 100644
index 000000000..3343cbe4d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/restreamer-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/restreamer-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/restreamer-24.png
new file mode 100644
index 000000000..45f510fed
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/restreamer-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/restreamer-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/restreamer-40.png
new file mode 100644
index 000000000..d1ec5bf8a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/restreamer-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rhasspy-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rhasspy-16.png
new file mode 100644
index 000000000..2b4bfc9e8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rhasspy-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rhasspy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rhasspy-24.png
new file mode 100644
index 000000000..2e065ca23
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rhasspy-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rhasspy-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rhasspy-40.png
new file mode 100644
index 000000000..0fdccb949
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rhasspy-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/richy-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/richy-16.png
new file mode 100644
index 000000000..97325a2e3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/richy-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/richy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/richy-24.png
new file mode 100644
index 000000000..5b2b02165
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/richy-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/richy-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/richy-40.png
new file mode 100644
index 000000000..1e19fd01e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/richy-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rocket-chat-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rocket-chat-16.png
new file mode 100644
index 000000000..15601ae83
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rocket-chat-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rocket-chat-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rocket-chat-24.png
new file mode 100644
index 000000000..d1c449cdd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rocket-chat-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rocket-chat-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rocket-chat-40.png
new file mode 100644
index 000000000..1ac596427
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rocket-chat-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/romm-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/romm-16.png
new file mode 100644
index 000000000..667c55d02
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/romm-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/romm-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/romm-24.png
new file mode 100644
index 000000000..f3e20aeda
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/romm-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/romm-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/romm-40.png
new file mode 100644
index 000000000..62825c826
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/romm-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/roundcube-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/roundcube-16.png
new file mode 100644
index 000000000..b1d0012a3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/roundcube-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/roundcube-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/roundcube-24.png
new file mode 100644
index 000000000..d55c2c9cd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/roundcube-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/roundcube-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/roundcube-40.png
new file mode 100644
index 000000000..e04cc63aa
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/roundcube-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rss-bridge-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rss-bridge-16.png
new file mode 100644
index 000000000..41e8ff418
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rss-bridge-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rss-bridge-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rss-bridge-24.png
new file mode 100644
index 000000000..05d02122e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rss-bridge-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rss-bridge-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rss-bridge-40.png
new file mode 100644
index 000000000..d78c1fdf8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rss-bridge-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rss-translator-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rss-translator-16.png
new file mode 100644
index 000000000..f35fc7de9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rss-translator-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rss-translator-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rss-translator-24.png
new file mode 100644
index 000000000..90427a946
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rss-translator-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rss-translator-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rss-translator-40.png
new file mode 100644
index 000000000..c41167bf8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rss-translator-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rundeck-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rundeck-16.png
new file mode 100644
index 000000000..0efc57285
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rundeck-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rundeck-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rundeck-24.png
new file mode 100644
index 000000000..b36cbf83a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rundeck-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/rundeck-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/rundeck-40.png
new file mode 100644
index 000000000..14b53d355
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/rundeck-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/runson-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/runson-16-dark.png
new file mode 100644
index 000000000..d875b18e4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/runson-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/runson-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/runson-16.png
new file mode 100644
index 000000000..16e8a60e2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/runson-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/runson-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/runson-24-dark.png
new file mode 100644
index 000000000..4ffb63e16
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/runson-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/runson-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/runson-24.png
new file mode 100644
index 000000000..a3fcc33ec
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/runson-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/runson-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/runson-40-dark.png
new file mode 100644
index 000000000..6477f94bd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/runson-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/runson-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/runson-40.png
new file mode 100644
index 000000000..205cc7409
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/runson-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/sabnzbd-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/sabnzbd-16.png
new file mode 100644
index 000000000..9ee841673
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/sabnzbd-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/sabnzbd-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/sabnzbd-24.png
new file mode 100644
index 000000000..3fd0d6e40
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/sabnzbd-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/sabnzbd-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/sabnzbd-40.png
new file mode 100644
index 000000000..76b8ef1cb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/sabnzbd-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/saltcorn-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/saltcorn-16.png
new file mode 100644
index 000000000..5d7c27763
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/saltcorn-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/saltcorn-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/saltcorn-24.png
new file mode 100644
index 000000000..b135e2e0c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/saltcorn-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/saltcorn-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/saltcorn-40.png
new file mode 100644
index 000000000..8352019b3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/saltcorn-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/scrutiny-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/scrutiny-16-dark.png
new file mode 100644
index 000000000..8a8427c76
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/scrutiny-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/scrutiny-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/scrutiny-16.png
new file mode 100644
index 000000000..83d230cc1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/scrutiny-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/scrutiny-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/scrutiny-24-dark.png
new file mode 100644
index 000000000..aabb158fd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/scrutiny-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/scrutiny-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/scrutiny-24.png
new file mode 100644
index 000000000..185802df9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/scrutiny-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/scrutiny-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/scrutiny-40-dark.png
new file mode 100644
index 000000000..bb81ca44e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/scrutiny-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/scrutiny-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/scrutiny-40.png
new file mode 100644
index 000000000..33afb61db
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/scrutiny-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/seafile-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/seafile-16.png
new file mode 100644
index 000000000..e5b499bec
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/seafile-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/seafile-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/seafile-24.png
new file mode 100644
index 000000000..4f75be9f5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/seafile-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/seafile-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/seafile-40.png
new file mode 100644
index 000000000..35326a8d5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/seafile-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/secureai-tools-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/secureai-tools-16-dark.png
new file mode 100644
index 000000000..069abfd67
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/secureai-tools-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/secureai-tools-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/secureai-tools-16.png
new file mode 100644
index 000000000..8c2448d08
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/secureai-tools-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/secureai-tools-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/secureai-tools-24-dark.png
new file mode 100644
index 000000000..66132b847
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/secureai-tools-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/secureai-tools-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/secureai-tools-24.png
new file mode 100644
index 000000000..dad1b9f55
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/secureai-tools-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/secureai-tools-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/secureai-tools-40-dark.png
new file mode 100644
index 000000000..60cfb33f6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/secureai-tools-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/secureai-tools-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/secureai-tools-40.png
new file mode 100644
index 000000000..4f09ca9ab
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/secureai-tools-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/seelf-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/seelf-16.png
new file mode 100644
index 000000000..06c36d154
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/seelf-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/seelf-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/seelf-24.png
new file mode 100644
index 000000000..095b970e4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/seelf-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/seelf-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/seelf-40.png
new file mode 100644
index 000000000..55eac81e5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/seelf-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/self-hosted-gateway-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/self-hosted-gateway-16.png
new file mode 100644
index 000000000..7f9690177
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/self-hosted-gateway-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/self-hosted-gateway-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/self-hosted-gateway-24.png
new file mode 100644
index 000000000..3e889948a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/self-hosted-gateway-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/self-hosted-gateway-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/self-hosted-gateway-40.png
new file mode 100644
index 000000000..8f52b48c6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/self-hosted-gateway-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/shaarli-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/shaarli-16.png
new file mode 100644
index 000000000..15f6b61fd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/shaarli-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/shaarli-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/shaarli-24.png
new file mode 100644
index 000000000..c0623e147
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/shaarli-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/shaarli-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/shaarli-40.png
new file mode 100644
index 000000000..affa47ebc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/shaarli-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/shellhub-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/shellhub-16-dark.png
new file mode 100644
index 000000000..27fb3927f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/shellhub-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/shellhub-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/shellhub-16.png
new file mode 100644
index 000000000..4885dd118
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/shellhub-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/shellhub-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/shellhub-24-dark.png
new file mode 100644
index 000000000..20560a3e8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/shellhub-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/shellhub-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/shellhub-24.png
new file mode 100644
index 000000000..98d624dd6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/shellhub-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/shellhub-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/shellhub-40-dark.png
new file mode 100644
index 000000000..942bb4696
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/shellhub-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/shellhub-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/shellhub-40.png
new file mode 100644
index 000000000..c3d14bc3a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/shellhub-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/shlink-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/shlink-16.png
new file mode 100644
index 000000000..80bd7899d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/shlink-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/shlink-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/shlink-24.png
new file mode 100644
index 000000000..31b5fb70c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/shlink-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/shlink-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/shlink-40.png
new file mode 100644
index 000000000..ac985e016
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/shlink-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/shoko-server-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/shoko-server-16-dark.png
new file mode 100644
index 000000000..29ddb1d50
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/shoko-server-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/shoko-server-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/shoko-server-16.png
new file mode 100644
index 000000000..dd3ffd293
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/shoko-server-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/shoko-server-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/shoko-server-24-dark.png
new file mode 100644
index 000000000..3c09a5af3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/shoko-server-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/shoko-server-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/shoko-server-24.png
new file mode 100644
index 000000000..ef704cc5d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/shoko-server-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/shoko-server-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/shoko-server-40-dark.png
new file mode 100644
index 000000000..bec41b823
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/shoko-server-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/shoko-server-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/shoko-server-40.png
new file mode 100644
index 000000000..2ee28a976
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/shoko-server-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/signal-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/signal-16-dark.png
new file mode 100644
index 000000000..3cc697567
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/signal-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/signal-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/signal-16.png
new file mode 100644
index 000000000..ec718d42d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/signal-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/signal-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/signal-24-dark.png
new file mode 100644
index 000000000..6f0950ede
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/signal-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/signal-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/signal-24.png
new file mode 100644
index 000000000..002129e17
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/signal-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/signal-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/signal-40-dark.png
new file mode 100644
index 000000000..376833eb6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/signal-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/signal-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/signal-40.png
new file mode 100644
index 000000000..2374f9871
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/signal-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/simplex-chat-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/simplex-chat-16-dark.png
new file mode 100644
index 000000000..3c34bfb89
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/simplex-chat-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/simplex-chat-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/simplex-chat-16.png
new file mode 100644
index 000000000..aebda27ab
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/simplex-chat-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/simplex-chat-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/simplex-chat-24-dark.png
new file mode 100644
index 000000000..946aa6ff0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/simplex-chat-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/simplex-chat-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/simplex-chat-24.png
new file mode 100644
index 000000000..7ef367de7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/simplex-chat-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/simplex-chat-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/simplex-chat-40-dark.png
new file mode 100644
index 000000000..8ead904a0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/simplex-chat-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/simplex-chat-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/simplex-chat-40.png
new file mode 100644
index 000000000..8ff17de66
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/simplex-chat-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/siyuan-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/siyuan-16-dark.png
new file mode 100644
index 000000000..a3c0bf15d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/siyuan-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/siyuan-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/siyuan-16.png
new file mode 100644
index 000000000..0ccf704e7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/siyuan-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/siyuan-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/siyuan-24-dark.png
new file mode 100644
index 000000000..e0522d530
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/siyuan-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/siyuan-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/siyuan-24.png
new file mode 100644
index 000000000..e169eb78c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/siyuan-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/siyuan-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/siyuan-40-dark.png
new file mode 100644
index 000000000..cf22988a7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/siyuan-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/siyuan-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/siyuan-40.png
new file mode 100644
index 000000000..138d00520
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/siyuan-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/slash-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/slash-16-dark.png
new file mode 100644
index 000000000..d6857fd0d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/slash-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/slash-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/slash-16.png
new file mode 100644
index 000000000..4df25d11b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/slash-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/slash-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/slash-24-dark.png
new file mode 100644
index 000000000..ced34dd38
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/slash-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/slash-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/slash-24.png
new file mode 100644
index 000000000..e889a3a2f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/slash-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/slash-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/slash-40-dark.png
new file mode 100644
index 000000000..8195cc3bd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/slash-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/slash-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/slash-40.png
new file mode 100644
index 000000000..a15dd409c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/slash-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/snikket-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/snikket-16.png
new file mode 100644
index 000000000..e7537180c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/snikket-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/snikket-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/snikket-24.png
new file mode 100644
index 000000000..c4b732c82
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/snikket-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/snikket-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/snikket-40.png
new file mode 100644
index 000000000..ba02d0fb2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/snikket-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/socialhome-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/socialhome-16-dark.png
new file mode 100644
index 000000000..cb366bda8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/socialhome-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/socialhome-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/socialhome-16.png
new file mode 100644
index 000000000..98a48bf1e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/socialhome-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/socialhome-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/socialhome-24-dark.png
new file mode 100644
index 000000000..d07e4d209
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/socialhome-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/socialhome-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/socialhome-24.png
new file mode 100644
index 000000000..208e7f064
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/socialhome-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/socialhome-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/socialhome-40-dark.png
new file mode 100644
index 000000000..2bb681e55
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/socialhome-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/socialhome-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/socialhome-40.png
new file mode 100644
index 000000000..d8fed1757
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/socialhome-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/solidtime-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/solidtime-16-dark.png
new file mode 100644
index 000000000..89e149410
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/solidtime-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/solidtime-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/solidtime-16.png
new file mode 100644
index 000000000..2c1aeaaaf
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/solidtime-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/solidtime-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/solidtime-24-dark.png
new file mode 100644
index 000000000..88a48b571
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/solidtime-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/solidtime-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/solidtime-24.png
new file mode 100644
index 000000000..c5cb9f6e9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/solidtime-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/solidtime-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/solidtime-40-dark.png
new file mode 100644
index 000000000..2931b6772
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/solidtime-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/solidtime-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/solidtime-40.png
new file mode 100644
index 000000000..fecf43d46
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/solidtime-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/sonarqube-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/sonarqube-16.png
new file mode 100644
index 000000000..efcb06dac
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/sonarqube-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/sonarqube-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/sonarqube-24.png
new file mode 100644
index 000000000..204601a40
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/sonarqube-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/sonarqube-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/sonarqube-40.png
new file mode 100644
index 000000000..1e049a04c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/sonarqube-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-16.png
new file mode 100644
index 000000000..39ae1c0be
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-24.png
new file mode 100644
index 000000000..d9fadb5c7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-40.png
new file mode 100644
index 000000000..ca0c46f29
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/sonarr-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/specifically-clementines-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/specifically-clementines-16.png
new file mode 100644
index 000000000..46786dc5f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/specifically-clementines-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/specifically-clementines-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/specifically-clementines-24.png
new file mode 100644
index 000000000..79a4158e2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/specifically-clementines-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/specifically-clementines-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/specifically-clementines-40.png
new file mode 100644
index 000000000..b82c27842
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/specifically-clementines-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/squirrel-servers-manager-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/squirrel-servers-manager-16.png
new file mode 100644
index 000000000..552139a39
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/squirrel-servers-manager-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/squirrel-servers-manager-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/squirrel-servers-manager-24.png
new file mode 100644
index 000000000..6f7a6f09a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/squirrel-servers-manager-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/squirrel-servers-manager-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/squirrel-servers-manager-40.png
new file mode 100644
index 000000000..dfeb848f8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/squirrel-servers-manager-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/sshwifty-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/sshwifty-16.png
new file mode 100644
index 000000000..fd5482f33
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/sshwifty-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/sshwifty-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/sshwifty-24.png
new file mode 100644
index 000000000..0efad5582
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/sshwifty-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/sshwifty-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/sshwifty-40.png
new file mode 100644
index 000000000..cdf8c75ea
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/sshwifty-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/stalwart-mail-server-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/stalwart-mail-server-16.png
new file mode 100644
index 000000000..e49235e47
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/stalwart-mail-server-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/stalwart-mail-server-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/stalwart-mail-server-24.png
new file mode 100644
index 000000000..d518b94e0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/stalwart-mail-server-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/stalwart-mail-server-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/stalwart-mail-server-40.png
new file mode 100644
index 000000000..a1b9d206c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/stalwart-mail-server-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/standard-notes-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/standard-notes-16.png
new file mode 100644
index 000000000..8ca7644a9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/standard-notes-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/standard-notes-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/standard-notes-24.png
new file mode 100644
index 000000000..186e22933
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/standard-notes-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/standard-notes-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/standard-notes-40.png
new file mode 100644
index 000000000..9f1c71a9a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/standard-notes-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/step-ca-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/step-ca-16.png
new file mode 100644
index 000000000..829028714
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/step-ca-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/step-ca-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/step-ca-24.png
new file mode 100644
index 000000000..793384b1b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/step-ca-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/step-ca-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/step-ca-40.png
new file mode 100644
index 000000000..0f79561c0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/step-ca-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/stirling-pdf-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/stirling-pdf-16.png
new file mode 100644
index 000000000..7d970db0e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/stirling-pdf-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/stirling-pdf-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/stirling-pdf-24.png
new file mode 100644
index 000000000..be6ca3524
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/stirling-pdf-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/stirling-pdf-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/stirling-pdf-40.png
new file mode 100644
index 000000000..4e7b03d8a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/stirling-pdf-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/stormkit-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/stormkit-16.png
new file mode 100644
index 000000000..7601b47db
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/stormkit-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/stormkit-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/stormkit-24.png
new file mode 100644
index 000000000..47650c2b8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/stormkit-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/stormkit-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/stormkit-40.png
new file mode 100644
index 000000000..e9f74d8f6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/stormkit-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/subatic-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/subatic-16.png
new file mode 100644
index 000000000..f2ce6d8e6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/subatic-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/subatic-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/subatic-24.png
new file mode 100644
index 000000000..573e0f427
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/subatic-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/subatic-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/subatic-40.png
new file mode 100644
index 000000000..f5d7e3c87
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/subatic-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/supabase-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/supabase-16.png
new file mode 100644
index 000000000..309a6a62b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/supabase-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/supabase-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/supabase-24.png
new file mode 100644
index 000000000..94512f5d5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/supabase-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/supabase-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/supabase-40.png
new file mode 100644
index 000000000..79dfcc60e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/supabase-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/synapse-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/synapse-16-dark.png
new file mode 100644
index 000000000..db7bb9333
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/synapse-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/synapse-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/synapse-16.png
new file mode 100644
index 000000000..9dd765d4a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/synapse-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/synapse-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/synapse-24-dark.png
new file mode 100644
index 000000000..664812b3a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/synapse-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/synapse-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/synapse-24.png
new file mode 100644
index 000000000..17c1aae81
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/synapse-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/synapse-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/synapse-40-dark.png
new file mode 100644
index 000000000..81e5f4976
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/synapse-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/synapse-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/synapse-40.png
new file mode 100644
index 000000000..257346115
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/synapse-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/syncthing-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/syncthing-16.png
new file mode 100644
index 000000000..54a283f76
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/syncthing-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/syncthing-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/syncthing-24.png
new file mode 100644
index 000000000..a5212da89
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/syncthing-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/syncthing-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/syncthing-40.png
new file mode 100644
index 000000000..7e235e668
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/syncthing-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tailscale-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tailscale-16-dark.png
new file mode 100644
index 000000000..4a885718c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tailscale-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tailscale-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tailscale-16.png
new file mode 100644
index 000000000..93d3709b6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tailscale-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tailscale-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tailscale-24-dark.png
new file mode 100644
index 000000000..d95ded1d0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tailscale-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tailscale-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tailscale-24.png
new file mode 100644
index 000000000..25eec3626
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tailscale-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tailscale-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tailscale-40-dark.png
new file mode 100644
index 000000000..8c5d5e5d9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tailscale-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tailscale-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tailscale-40.png
new file mode 100644
index 000000000..e2c22f8d5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tailscale-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tangerine-ui-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tangerine-ui-16.png
new file mode 100644
index 000000000..a7c39bc05
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tangerine-ui-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tangerine-ui-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tangerine-ui-24.png
new file mode 100644
index 000000000..96e82f830
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tangerine-ui-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tangerine-ui-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tangerine-ui-40.png
new file mode 100644
index 000000000..8a9ef1706
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tangerine-ui-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tautulli-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tautulli-16.png
new file mode 100644
index 000000000..efa8c0b66
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tautulli-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tautulli-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tautulli-24.png
new file mode 100644
index 000000000..fbc4add94
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tautulli-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tautulli-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tautulli-40.png
new file mode 100644
index 000000000..999959462
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tautulli-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/telegram-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/telegram-16.png
new file mode 100644
index 000000000..3eadabf64
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/telegram-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/telegram-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/telegram-24.png
new file mode 100644
index 000000000..97b5155ef
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/telegram-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/telegram-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/telegram-40.png
new file mode 100644
index 000000000..ef125fba8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/telegram-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/teleport-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/teleport-16-dark.png
new file mode 100644
index 000000000..03407cda7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/teleport-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/teleport-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/teleport-16.png
new file mode 100644
index 000000000..d948c562d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/teleport-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/teleport-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/teleport-24-dark.png
new file mode 100644
index 000000000..a3f2c121e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/teleport-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/teleport-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/teleport-24.png
new file mode 100644
index 000000000..9306afea9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/teleport-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/teleport-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/teleport-40-dark.png
new file mode 100644
index 000000000..a0b44616f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/teleport-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/teleport-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/teleport-40.png
new file mode 100644
index 000000000..4edc19aa0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/teleport-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/threads-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/threads-16-dark.png
new file mode 100644
index 000000000..0af75e79f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/threads-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/threads-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/threads-16.png
new file mode 100644
index 000000000..a1334b264
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/threads-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/threads-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/threads-24-dark.png
new file mode 100644
index 000000000..5d3f21cb7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/threads-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/threads-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/threads-24.png
new file mode 100644
index 000000000..cf77dca65
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/threads-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/threads-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/threads-40-dark.png
new file mode 100644
index 000000000..a1b84f93c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/threads-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/threads-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/threads-40.png
new file mode 100644
index 000000000..3d521d0d5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/threads-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/thunderbird-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/thunderbird-16-dark.png
new file mode 100644
index 000000000..239ba9c6b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/thunderbird-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/thunderbird-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/thunderbird-16.png
new file mode 100644
index 000000000..b89be371a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/thunderbird-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/thunderbird-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/thunderbird-24-dark.png
new file mode 100644
index 000000000..d16ba069e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/thunderbird-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/thunderbird-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/thunderbird-24.png
new file mode 100644
index 000000000..d08355c17
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/thunderbird-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/thunderbird-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/thunderbird-40-dark.png
new file mode 100644
index 000000000..6d0c47079
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/thunderbird-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/thunderbird-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/thunderbird-40.png
new file mode 100644
index 000000000..e0d25c1a0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/thunderbird-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tiddlywiki-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tiddlywiki-16-dark.png
new file mode 100644
index 000000000..f704bde2d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tiddlywiki-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tiddlywiki-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tiddlywiki-16.png
new file mode 100644
index 000000000..f100569fd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tiddlywiki-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tiddlywiki-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tiddlywiki-24-dark.png
new file mode 100644
index 000000000..a9c7afe87
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tiddlywiki-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tiddlywiki-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tiddlywiki-24.png
new file mode 100644
index 000000000..74a6d8ec6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tiddlywiki-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tiddlywiki-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tiddlywiki-40-dark.png
new file mode 100644
index 000000000..b6d368752
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tiddlywiki-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tiddlywiki-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tiddlywiki-40.png
new file mode 100644
index 000000000..4e5ea6d79
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tiddlywiki-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tmdb-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tmdb-16-dark.png
new file mode 100644
index 000000000..c1509aff6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tmdb-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tmdb-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tmdb-16.png
new file mode 100644
index 000000000..949bb5ea5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tmdb-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tmdb-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tmdb-24-dark.png
new file mode 100644
index 000000000..ce9efc27a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tmdb-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tmdb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tmdb-24.png
new file mode 100644
index 000000000..453cc05e9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tmdb-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tmdb-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tmdb-40-dark.png
new file mode 100644
index 000000000..aebd1b9f2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tmdb-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tmdb-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tmdb-40.png
new file mode 100644
index 000000000..f016aba88
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tmdb-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tooljet-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tooljet-16.png
new file mode 100644
index 000000000..5197521ee
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tooljet-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tooljet-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tooljet-24.png
new file mode 100644
index 000000000..1f9dfede8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tooljet-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tooljet-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tooljet-40.png
new file mode 100644
index 000000000..455682e2e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tooljet-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/touitomamout-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/touitomamout-16.png
new file mode 100644
index 000000000..c7ef826a6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/touitomamout-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/touitomamout-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/touitomamout-24.png
new file mode 100644
index 000000000..8a3af1efa
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/touitomamout-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/touitomamout-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/touitomamout-40.png
new file mode 100644
index 000000000..7789fb43d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/touitomamout-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tp-link-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tp-link-16-dark.png
new file mode 100644
index 000000000..cb760fd3e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tp-link-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tp-link-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tp-link-16.png
new file mode 100644
index 000000000..262975b18
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tp-link-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tp-link-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tp-link-24-dark.png
new file mode 100644
index 000000000..493267954
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tp-link-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tp-link-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tp-link-24.png
new file mode 100644
index 000000000..d32b94b48
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tp-link-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tp-link-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tp-link-40-dark.png
new file mode 100644
index 000000000..2759afc7b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tp-link-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tp-link-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tp-link-40.png
new file mode 100644
index 000000000..cd8dac9ba
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tp-link-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tpdb-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tpdb-16-dark.png
new file mode 100644
index 000000000..414f27bee
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tpdb-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tpdb-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tpdb-16.png
new file mode 100644
index 000000000..4d87f54e9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tpdb-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tpdb-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tpdb-24-dark.png
new file mode 100644
index 000000000..74b68315c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tpdb-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tpdb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tpdb-24.png
new file mode 100644
index 000000000..8f79d7b73
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tpdb-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tpdb-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tpdb-40-dark.png
new file mode 100644
index 000000000..84285ec86
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tpdb-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tpdb-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tpdb-40.png
new file mode 100644
index 000000000..c257fa105
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tpdb-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/traccar-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/traccar-16.png
new file mode 100644
index 000000000..cadb1e63c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/traccar-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/traccar-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/traccar-24.png
new file mode 100644
index 000000000..244299c47
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/traccar-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/traccar-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/traccar-40.png
new file mode 100644
index 000000000..c8988663f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/traccar-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/traefik-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/traefik-16.png
new file mode 100644
index 000000000..4941bfe7d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/traefik-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/traefik-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/traefik-24.png
new file mode 100644
index 000000000..0e3a1e01d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/traefik-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/traefik-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/traefik-40.png
new file mode 100644
index 000000000..d7e65aee5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/traefik-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/transmission-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/transmission-16.png
new file mode 100644
index 000000000..62199d78a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/transmission-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/transmission-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/transmission-24.png
new file mode 100644
index 000000000..9a7eb5670
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/transmission-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/transmission-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/transmission-40.png
new file mode 100644
index 000000000..0eca811b4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/transmission-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/trilium-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/trilium-16.png
new file mode 100644
index 000000000..ce9bb8c00
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/trilium-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/trilium-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/trilium-24.png
new file mode 100644
index 000000000..e17f07a3d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/trilium-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/trilium-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/trilium-40.png
new file mode 100644
index 000000000..abbbe126d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/trilium-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/triliumnext-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/triliumnext-16.png
new file mode 100644
index 000000000..e16d61514
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/triliumnext-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/triliumnext-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/triliumnext-24.png
new file mode 100644
index 000000000..75f211bb3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/triliumnext-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/triliumnext-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/triliumnext-40.png
new file mode 100644
index 000000000..feb39b0d2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/triliumnext-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-core-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-core-16-dark.png
new file mode 100644
index 000000000..8f819d62a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-core-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-core-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-core-16.png
new file mode 100644
index 000000000..555865d2f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-core-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-core-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-core-24-dark.png
new file mode 100644
index 000000000..fa9a5edba
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-core-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-core-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-core-24.png
new file mode 100644
index 000000000..354dbc9bd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-core-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-core-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-core-40-dark.png
new file mode 100644
index 000000000..9714fd92f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-core-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-core-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-core-40.png
new file mode 100644
index 000000000..de877ec3d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-core-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-scale-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-scale-16-dark.png
new file mode 100644
index 000000000..a246afc36
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-scale-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-scale-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-scale-16.png
new file mode 100644
index 000000000..b38514cd2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-scale-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-scale-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-scale-24-dark.png
new file mode 100644
index 000000000..48b736641
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-scale-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-scale-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-scale-24.png
new file mode 100644
index 000000000..821bbdf75
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-scale-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-scale-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-scale-40-dark.png
new file mode 100644
index 000000000..ab94f3535
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-scale-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-scale-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-scale-40.png
new file mode 100644
index 000000000..aaf22ca9f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/truenas-scale-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tubesync-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tubesync-16-dark.png
new file mode 100644
index 000000000..61cd0b3bc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tubesync-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tubesync-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tubesync-16.png
new file mode 100644
index 000000000..d30a8e0ed
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tubesync-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tubesync-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tubesync-24-dark.png
new file mode 100644
index 000000000..59137b8df
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tubesync-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tubesync-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tubesync-24.png
new file mode 100644
index 000000000..92cc37002
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tubesync-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tubesync-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tubesync-40-dark.png
new file mode 100644
index 000000000..78b3cb2cb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tubesync-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tubesync-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tubesync-40.png
new file mode 100644
index 000000000..8128ba53a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tubesync-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tumblr-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tumblr-16-dark.png
new file mode 100644
index 000000000..7256ce314
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tumblr-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tumblr-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tumblr-16.png
new file mode 100644
index 000000000..a82f32cef
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tumblr-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tumblr-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tumblr-24-dark.png
new file mode 100644
index 000000000..cfc274176
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tumblr-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tumblr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tumblr-24.png
new file mode 100644
index 000000000..befcf71b4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tumblr-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tumblr-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tumblr-40-dark.png
new file mode 100644
index 000000000..a0242bbf2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tumblr-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tumblr-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tumblr-40.png
new file mode 100644
index 000000000..cde7c2f2b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tumblr-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tvdb-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tvdb-16-dark.png
new file mode 100644
index 000000000..ac8796379
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tvdb-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tvdb-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tvdb-16.png
new file mode 100644
index 000000000..00b4c108b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tvdb-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tvdb-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tvdb-24-dark.png
new file mode 100644
index 000000000..01c8ac933
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tvdb-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tvdb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tvdb-24.png
new file mode 100644
index 000000000..db92b450b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tvdb-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tvdb-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tvdb-40-dark.png
new file mode 100644
index 000000000..87971b3c2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tvdb-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/tvdb-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/tvdb-40.png
new file mode 100644
index 000000000..e698c7aab
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/tvdb-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ubiquiti-unifi-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ubiquiti-unifi-16-dark.png
new file mode 100644
index 000000000..429f0d1da
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ubiquiti-unifi-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ubiquiti-unifi-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ubiquiti-unifi-16.png
new file mode 100644
index 000000000..b646526ce
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ubiquiti-unifi-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ubiquiti-unifi-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ubiquiti-unifi-24-dark.png
new file mode 100644
index 000000000..8a7b98db8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ubiquiti-unifi-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ubiquiti-unifi-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ubiquiti-unifi-24.png
new file mode 100644
index 000000000..3e9f7c003
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ubiquiti-unifi-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ubiquiti-unifi-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ubiquiti-unifi-40-dark.png
new file mode 100644
index 000000000..97e137c1d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ubiquiti-unifi-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/ubiquiti-unifi-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/ubiquiti-unifi-40.png
new file mode 100644
index 000000000..80687030c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/ubiquiti-unifi-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/umami-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/umami-16-dark.png
new file mode 100644
index 000000000..3ac84d1bf
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/umami-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/umami-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/umami-16.png
new file mode 100644
index 000000000..2140a4372
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/umami-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/umami-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/umami-24-dark.png
new file mode 100644
index 000000000..43110608e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/umami-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/umami-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/umami-24.png
new file mode 100644
index 000000000..1b4d37d52
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/umami-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/umami-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/umami-40-dark.png
new file mode 100644
index 000000000..fc6183bc4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/umami-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/umami-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/umami-40.png
new file mode 100644
index 000000000..e1f58757b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/umami-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/umbrel-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/umbrel-16.png
new file mode 100644
index 000000000..15da48200
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/umbrel-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/umbrel-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/umbrel-24.png
new file mode 100644
index 000000000..7925e32b0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/umbrel-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/umbrel-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/umbrel-40.png
new file mode 100644
index 000000000..290876274
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/umbrel-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/unbound-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/unbound-16.png
new file mode 100644
index 000000000..714e6c3f0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/unbound-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/unbound-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/unbound-24.png
new file mode 100644
index 000000000..9e0679d6d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/unbound-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/unbound-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/unbound-40.png
new file mode 100644
index 000000000..d84fbf21f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/unbound-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/undb-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/undb-16.png
new file mode 100644
index 000000000..e0a90cfff
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/undb-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/undb-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/undb-24.png
new file mode 100644
index 000000000..b0103275c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/undb-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/undb-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/undb-40.png
new file mode 100644
index 000000000..754e8d6bf
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/undb-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/unifi-voucher-site-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/unifi-voucher-site-16.png
new file mode 100644
index 000000000..dbfdc21dc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/unifi-voucher-site-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/unifi-voucher-site-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/unifi-voucher-site-24.png
new file mode 100644
index 000000000..7e961bcb8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/unifi-voucher-site-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/unifi-voucher-site-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/unifi-voucher-site-40.png
new file mode 100644
index 000000000..de80dfa88
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/unifi-voucher-site-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/unraid-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/unraid-16.png
new file mode 100644
index 000000000..42257c163
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/unraid-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/unraid-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/unraid-24.png
new file mode 100644
index 000000000..c59a44a33
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/unraid-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/unraid-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/unraid-40.png
new file mode 100644
index 000000000..6a2eb6a56
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/unraid-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/upsnap-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/upsnap-16.png
new file mode 100644
index 000000000..a81202290
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/upsnap-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/upsnap-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/upsnap-24.png
new file mode 100644
index 000000000..cc37d5d0e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/upsnap-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/upsnap-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/upsnap-40.png
new file mode 100644
index 000000000..4cb0dcffc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/upsnap-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/uptime-kuma-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/uptime-kuma-16.png
new file mode 100644
index 000000000..4c8666323
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/uptime-kuma-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/uptime-kuma-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/uptime-kuma-24.png
new file mode 100644
index 000000000..bdea4353e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/uptime-kuma-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/uptime-kuma-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/uptime-kuma-40.png
new file mode 100644
index 000000000..624900428
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/uptime-kuma-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/valkey-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/valkey-16-dark.png
new file mode 100644
index 000000000..9d91f5c6c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/valkey-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/valkey-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/valkey-16.png
new file mode 100644
index 000000000..d86fe049a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/valkey-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/valkey-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/valkey-24-dark.png
new file mode 100644
index 000000000..65503b5b2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/valkey-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/valkey-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/valkey-24.png
new file mode 100644
index 000000000..49625424a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/valkey-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/valkey-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/valkey-40-dark.png
new file mode 100644
index 000000000..add2532ae
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/valkey-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/valkey-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/valkey-40.png
new file mode 100644
index 000000000..763250ac5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/valkey-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/vaultwarden-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/vaultwarden-16-dark.png
new file mode 100644
index 000000000..85d044dd4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/vaultwarden-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/vaultwarden-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/vaultwarden-16.png
new file mode 100644
index 000000000..ca32f665c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/vaultwarden-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/vaultwarden-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/vaultwarden-24-dark.png
new file mode 100644
index 000000000..69a8f39f0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/vaultwarden-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/vaultwarden-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/vaultwarden-24.png
new file mode 100644
index 000000000..4a0e7dbee
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/vaultwarden-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/vaultwarden-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/vaultwarden-40-dark.png
new file mode 100644
index 000000000..47c79c5f4
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/vaultwarden-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/vaultwarden-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/vaultwarden-40.png
new file mode 100644
index 000000000..a25fbe667
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/vaultwarden-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/vector-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/vector-16.png
new file mode 100644
index 000000000..f60b843f0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/vector-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/vector-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/vector-24.png
new file mode 100644
index 000000000..2ec1ad578
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/vector-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/vector-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/vector-40.png
new file mode 100644
index 000000000..93e67882b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/vector-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/victoriametrics-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/victoriametrics-16-dark.png
new file mode 100644
index 000000000..64d2f5985
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/victoriametrics-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/victoriametrics-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/victoriametrics-16.png
new file mode 100644
index 000000000..f253bed7a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/victoriametrics-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/victoriametrics-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/victoriametrics-24-dark.png
new file mode 100644
index 000000000..d82c396b7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/victoriametrics-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/victoriametrics-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/victoriametrics-24.png
new file mode 100644
index 000000000..d67f26bfc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/victoriametrics-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/victoriametrics-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/victoriametrics-40-dark.png
new file mode 100644
index 000000000..f394b8727
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/victoriametrics-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/victoriametrics-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/victoriametrics-40.png
new file mode 100644
index 000000000..1f8e0bbf8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/victoriametrics-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/vidzy-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/vidzy-16.png
new file mode 100644
index 000000000..d7e497900
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/vidzy-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/vidzy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/vidzy-24.png
new file mode 100644
index 000000000..2c6313064
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/vidzy-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/vidzy-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/vidzy-40.png
new file mode 100644
index 000000000..e7710fc6c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/vidzy-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/vikunja-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/vikunja-16.png
new file mode 100644
index 000000000..024d06ecd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/vikunja-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/vikunja-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/vikunja-24.png
new file mode 100644
index 000000000..0e08de734
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/vikunja-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/vikunja-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/vikunja-40.png
new file mode 100644
index 000000000..7e50088a3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/vikunja-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/viseron-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/viseron-16.png
new file mode 100644
index 000000000..f6930ac9c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/viseron-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/viseron-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/viseron-24.png
new file mode 100644
index 000000000..893c9133b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/viseron-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/viseron-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/viseron-40.png
new file mode 100644
index 000000000..7576f8006
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/viseron-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/voilib-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/voilib-16-dark.png
new file mode 100644
index 000000000..f443d3fcf
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/voilib-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/voilib-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/voilib-16.png
new file mode 100644
index 000000000..b0cf8329c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/voilib-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/voilib-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/voilib-24-dark.png
new file mode 100644
index 000000000..8c204801c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/voilib-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/voilib-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/voilib-24.png
new file mode 100644
index 000000000..950a46407
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/voilib-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/voilib-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/voilib-40-dark.png
new file mode 100644
index 000000000..b359f9315
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/voilib-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/voilib-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/voilib-40.png
new file mode 100644
index 000000000..92fafd105
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/voilib-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/voltaserve-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/voltaserve-16-dark.png
new file mode 100644
index 000000000..793557e16
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/voltaserve-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/voltaserve-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/voltaserve-16.png
new file mode 100644
index 000000000..b32387b53
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/voltaserve-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/voltaserve-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/voltaserve-24-dark.png
new file mode 100644
index 000000000..8256d4f09
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/voltaserve-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/voltaserve-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/voltaserve-24.png
new file mode 100644
index 000000000..191636a02
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/voltaserve-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/voltaserve-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/voltaserve-40-dark.png
new file mode 100644
index 000000000..5aadd3e81
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/voltaserve-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/voltaserve-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/voltaserve-40.png
new file mode 100644
index 000000000..d8f745128
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/voltaserve-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wallabag-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wallabag-16-dark.png
new file mode 100644
index 000000000..05b40f741
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wallabag-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wallabag-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wallabag-16.png
new file mode 100644
index 000000000..5003894f7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wallabag-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wallabag-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wallabag-24-dark.png
new file mode 100644
index 000000000..5d06b42db
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wallabag-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wallabag-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wallabag-24.png
new file mode 100644
index 000000000..85b22c6a8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wallabag-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wallabag-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wallabag-40-dark.png
new file mode 100644
index 000000000..04e801803
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wallabag-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wallabag-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wallabag-40.png
new file mode 100644
index 000000000..920a5f7ec
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wallabag-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wanderer-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wanderer-16-dark.png
new file mode 100644
index 000000000..f38407afa
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wanderer-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wanderer-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wanderer-16.png
new file mode 100644
index 000000000..1fbe4bf59
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wanderer-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wanderer-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wanderer-24-dark.png
new file mode 100644
index 000000000..a55e88ba5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wanderer-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wanderer-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wanderer-24.png
new file mode 100644
index 000000000..48699164c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wanderer-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wanderer-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wanderer-40-dark.png
new file mode 100644
index 000000000..933e3db4d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wanderer-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wanderer-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wanderer-40.png
new file mode 100644
index 000000000..95f543cba
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wanderer-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/webtrees-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/webtrees-16.png
new file mode 100644
index 000000000..96c33fed7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/webtrees-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/webtrees-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/webtrees-24.png
new file mode 100644
index 000000000..ac344bfab
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/webtrees-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/webtrees-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/webtrees-40.png
new file mode 100644
index 000000000..b35c4000b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/webtrees-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wekan-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wekan-16.png
new file mode 100644
index 000000000..041d2de3c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wekan-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wekan-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wekan-24.png
new file mode 100644
index 000000000..05cfa65da
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wekan-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wekan-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wekan-40.png
new file mode 100644
index 000000000..f2904e3e1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wekan-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wger-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wger-16.png
new file mode 100644
index 000000000..4f29b3cb1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wger-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wger-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wger-24.png
new file mode 100644
index 000000000..2a69cec63
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wger-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wger-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wger-40.png
new file mode 100644
index 000000000..663c1e211
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wger-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/whats-up-docker-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/whats-up-docker-16-dark.png
new file mode 100644
index 000000000..d4ae8f77d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/whats-up-docker-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/whats-up-docker-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/whats-up-docker-16.png
new file mode 100644
index 000000000..3911ba32a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/whats-up-docker-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/whats-up-docker-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/whats-up-docker-24-dark.png
new file mode 100644
index 000000000..aaa896514
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/whats-up-docker-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/whats-up-docker-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/whats-up-docker-24.png
new file mode 100644
index 000000000..ef7f572de
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/whats-up-docker-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/whats-up-docker-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/whats-up-docker-40-dark.png
new file mode 100644
index 000000000..d7a3f3a22
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/whats-up-docker-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/whats-up-docker-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/whats-up-docker-40.png
new file mode 100644
index 000000000..c5887edf7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/whats-up-docker-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wiki-js-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wiki-js-16.png
new file mode 100644
index 000000000..6ff6200a1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wiki-js-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wiki-js-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wiki-js-24.png
new file mode 100644
index 000000000..5a8bde56d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wiki-js-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wiki-js-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wiki-js-40.png
new file mode 100644
index 000000000..affe6b543
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wiki-js-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wikidocs-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wikidocs-16.png
new file mode 100644
index 000000000..1878a3a37
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wikidocs-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wikidocs-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wikidocs-24.png
new file mode 100644
index 000000000..469ad6736
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wikidocs-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wikidocs-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wikidocs-40.png
new file mode 100644
index 000000000..4aea05c98
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wikidocs-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wikipedia-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wikipedia-16-dark.png
new file mode 100644
index 000000000..8e9fa64d6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wikipedia-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wikipedia-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wikipedia-16.png
new file mode 100644
index 000000000..fabb35b39
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wikipedia-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wikipedia-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wikipedia-24-dark.png
new file mode 100644
index 000000000..0cb46b270
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wikipedia-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wikipedia-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wikipedia-24.png
new file mode 100644
index 000000000..831fd9637
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wikipedia-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wikipedia-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wikipedia-40-dark.png
new file mode 100644
index 000000000..8e60c2a74
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wikipedia-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wikipedia-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wikipedia-40.png
new file mode 100644
index 000000000..f7e473424
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wikipedia-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/willow-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/willow-16.png
new file mode 100644
index 000000000..f46d5e420
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/willow-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/willow-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/willow-24.png
new file mode 100644
index 000000000..c8fd5d6e7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/willow-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/willow-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/willow-40.png
new file mode 100644
index 000000000..773f918e3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/willow-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/windows-retro-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/windows-retro-16-dark.png
new file mode 100644
index 000000000..d3f45bead
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/windows-retro-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/windows-retro-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/windows-retro-16.png
new file mode 100644
index 000000000..cfeec7e19
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/windows-retro-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/windows-retro-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/windows-retro-24-dark.png
new file mode 100644
index 000000000..261d88c7c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/windows-retro-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/windows-retro-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/windows-retro-24.png
new file mode 100644
index 000000000..77347cfdf
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/windows-retro-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/windows-retro-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/windows-retro-40-dark.png
new file mode 100644
index 000000000..0940427e0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/windows-retro-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/windows-retro-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/windows-retro-40.png
new file mode 100644
index 000000000..752a88219
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/windows-retro-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wireguard-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wireguard-16.png
new file mode 100644
index 000000000..978fbfe8f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wireguard-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wireguard-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wireguard-24.png
new file mode 100644
index 000000000..c245dd738
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wireguard-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wireguard-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wireguard-40.png
new file mode 100644
index 000000000..9fb72c9ee
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wireguard-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wizarr-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wizarr-16.png
new file mode 100644
index 000000000..169daf07e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wizarr-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wizarr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wizarr-24.png
new file mode 100644
index 000000000..49a582b33
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wizarr-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/wizarr-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/wizarr-40.png
new file mode 100644
index 000000000..e7d7cb48e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/wizarr-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/woocommerce-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/woocommerce-16.png
new file mode 100644
index 000000000..d40da84bf
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/woocommerce-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/woocommerce-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/woocommerce-24.png
new file mode 100644
index 000000000..cf2a1179c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/woocommerce-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/woocommerce-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/woocommerce-40.png
new file mode 100644
index 000000000..693bfbee5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/woocommerce-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/worklenz-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/worklenz-16-dark.png
new file mode 100644
index 000000000..0663c598e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/worklenz-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/worklenz-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/worklenz-16.png
new file mode 100644
index 000000000..b18f164e6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/worklenz-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/worklenz-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/worklenz-24-dark.png
new file mode 100644
index 000000000..7185fe80b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/worklenz-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/worklenz-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/worklenz-24.png
new file mode 100644
index 000000000..77c7f7c93
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/worklenz-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/worklenz-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/worklenz-40-dark.png
new file mode 100644
index 000000000..f049e1b9b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/worklenz-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/worklenz-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/worklenz-40.png
new file mode 100644
index 000000000..ddea9b28d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/worklenz-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/writefreely-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/writefreely-16-dark.png
new file mode 100644
index 000000000..2dafa2e92
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/writefreely-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/writefreely-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/writefreely-16.png
new file mode 100644
index 000000000..605392d53
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/writefreely-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/writefreely-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/writefreely-24-dark.png
new file mode 100644
index 000000000..a86e91b2c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/writefreely-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/writefreely-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/writefreely-24.png
new file mode 100644
index 000000000..d34e25e50
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/writefreely-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/writefreely-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/writefreely-40-dark.png
new file mode 100644
index 000000000..2e4251657
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/writefreely-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/writefreely-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/writefreely-40.png
new file mode 100644
index 000000000..3b9f76fc1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/writefreely-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/xbackbone-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/xbackbone-16.png
new file mode 100644
index 000000000..3a889155f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/xbackbone-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/xbackbone-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/xbackbone-24.png
new file mode 100644
index 000000000..184857eaf
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/xbackbone-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/xbackbone-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/xbackbone-40.png
new file mode 100644
index 000000000..a8468c2b6
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/xbackbone-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/xwiki-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/xwiki-16-dark.png
new file mode 100644
index 000000000..4cd302290
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/xwiki-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/xwiki-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/xwiki-16.png
new file mode 100644
index 000000000..8a694e0e3
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/xwiki-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/xwiki-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/xwiki-24-dark.png
new file mode 100644
index 000000000..d9d4424c9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/xwiki-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/xwiki-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/xwiki-24.png
new file mode 100644
index 000000000..41e747eb0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/xwiki-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/xwiki-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/xwiki-40-dark.png
new file mode 100644
index 000000000..53de47d72
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/xwiki-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/xwiki-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/xwiki-40.png
new file mode 100644
index 000000000..98b43d861
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/xwiki-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yacht-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yacht-16-dark.png
new file mode 100644
index 000000000..e496da08b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yacht-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yacht-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yacht-16.png
new file mode 100644
index 000000000..a3828f7f1
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yacht-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yacht-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yacht-24-dark.png
new file mode 100644
index 000000000..5fb72c6d8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yacht-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yacht-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yacht-24.png
new file mode 100644
index 000000000..88bb1f46b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yacht-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yacht-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yacht-40-dark.png
new file mode 100644
index 000000000..db28a25fb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yacht-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yacht-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yacht-40.png
new file mode 100644
index 000000000..5bc1d1650
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yacht-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yamtrack-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yamtrack-16-dark.png
new file mode 100644
index 000000000..371b1af5c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yamtrack-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yamtrack-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yamtrack-16.png
new file mode 100644
index 000000000..7b0582e9f
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yamtrack-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yamtrack-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yamtrack-24-dark.png
new file mode 100644
index 000000000..67658ccff
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yamtrack-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yamtrack-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yamtrack-24.png
new file mode 100644
index 000000000..43e7103ea
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yamtrack-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yamtrack-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yamtrack-40-dark.png
new file mode 100644
index 000000000..d06d0be5c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yamtrack-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yamtrack-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yamtrack-40.png
new file mode 100644
index 000000000..b1d7d33e7
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yamtrack-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yarr-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yarr-16-dark.png
new file mode 100644
index 000000000..df6bd983e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yarr-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yarr-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yarr-16.png
new file mode 100644
index 000000000..724b94496
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yarr-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yarr-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yarr-24-dark.png
new file mode 100644
index 000000000..645f46970
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yarr-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yarr-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yarr-24.png
new file mode 100644
index 000000000..d0ecd6949
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yarr-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yarr-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yarr-40-dark.png
new file mode 100644
index 000000000..9104e6874
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yarr-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yarr-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yarr-40.png
new file mode 100644
index 000000000..1b3674695
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yarr-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/your-spotify-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/your-spotify-16.png
new file mode 100644
index 000000000..f2c573aa8
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/your-spotify-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/your-spotify-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/your-spotify-24.png
new file mode 100644
index 000000000..130252fcc
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/your-spotify-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/your-spotify-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/your-spotify-40.png
new file mode 100644
index 000000000..516ae3bd9
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/your-spotify-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yourls-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yourls-16.png
new file mode 100644
index 000000000..8c8951c44
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yourls-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yourls-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yourls-24.png
new file mode 100644
index 000000000..644be2bae
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yourls-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/yourls-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/yourls-40.png
new file mode 100644
index 000000000..b277e7dbd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/yourls-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/youtube-dl-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/youtube-dl-16.png
new file mode 100644
index 000000000..c031f3882
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/youtube-dl-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/youtube-dl-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/youtube-dl-24.png
new file mode 100644
index 000000000..1ead1383a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/youtube-dl-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/youtube-dl-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/youtube-dl-40.png
new file mode 100644
index 000000000..74b2518a2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/youtube-dl-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zabbix-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zabbix-16.png
new file mode 100644
index 000000000..8b4c46748
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zabbix-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zabbix-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zabbix-24.png
new file mode 100644
index 000000000..6be4aef62
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zabbix-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zabbix-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zabbix-40.png
new file mode 100644
index 000000000..f753b3b53
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zabbix-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zammad-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zammad-16.png
new file mode 100644
index 000000000..e1fd3ae74
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zammad-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zammad-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zammad-24.png
new file mode 100644
index 000000000..1e00189a5
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zammad-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zammad-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zammad-40.png
new file mode 100644
index 000000000..452017946
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zammad-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zigbee2mqtt-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zigbee2mqtt-16.png
new file mode 100644
index 000000000..95d79ef92
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zigbee2mqtt-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zigbee2mqtt-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zigbee2mqtt-24.png
new file mode 100644
index 000000000..0b172df43
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zigbee2mqtt-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zigbee2mqtt-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zigbee2mqtt-40.png
new file mode 100644
index 000000000..0fc41234b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zigbee2mqtt-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zipcaptions-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zipcaptions-16-dark.png
new file mode 100644
index 000000000..91cc10a1b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zipcaptions-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zipcaptions-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zipcaptions-16.png
new file mode 100644
index 000000000..117f3e076
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zipcaptions-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zipcaptions-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zipcaptions-24-dark.png
new file mode 100644
index 000000000..307f3c50a
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zipcaptions-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zipcaptions-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zipcaptions-24.png
new file mode 100644
index 000000000..7f74033fd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zipcaptions-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zipcaptions-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zipcaptions-40-dark.png
new file mode 100644
index 000000000..c9178d3c2
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zipcaptions-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zipcaptions-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zipcaptions-40.png
new file mode 100644
index 000000000..1ef884416
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zipcaptions-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zitadel-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zitadel-16-dark.png
new file mode 100644
index 000000000..24f1a1481
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zitadel-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zitadel-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zitadel-16.png
new file mode 100644
index 000000000..7ae3f565d
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zitadel-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zitadel-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zitadel-24-dark.png
new file mode 100644
index 000000000..526a4d21c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zitadel-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zitadel-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zitadel-24.png
new file mode 100644
index 000000000..3c786cf66
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zitadel-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zitadel-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zitadel-40-dark.png
new file mode 100644
index 000000000..b28a2fd4b
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zitadel-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zitadel-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zitadel-40.png
new file mode 100644
index 000000000..84a0a51eb
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zitadel-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zoraxy-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zoraxy-16-dark.png
new file mode 100644
index 000000000..380e7c919
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zoraxy-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zoraxy-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zoraxy-16.png
new file mode 100644
index 000000000..1f1fbf3df
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zoraxy-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zoraxy-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zoraxy-24-dark.png
new file mode 100644
index 000000000..b2025ef74
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zoraxy-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zoraxy-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zoraxy-24.png
new file mode 100644
index 000000000..e0ac0c80c
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zoraxy-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zoraxy-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zoraxy-40-dark.png
new file mode 100644
index 000000000..c0226e6cd
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zoraxy-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zoraxy-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zoraxy-40.png
new file mode 100644
index 000000000..8ef8fce36
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zoraxy-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-16-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-16-dark.png
new file mode 100644
index 000000000..421197378
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-16-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-16.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-16.png
new file mode 100644
index 000000000..18338a712
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-16.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-24-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-24-dark.png
new file mode 100644
index 000000000..ffe7ad7a0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-24-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-24.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-24.png
new file mode 100644
index 000000000..a32e52ed0
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-24.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-40-dark.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-40-dark.png
new file mode 100644
index 000000000..caa8e1179
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-40-dark.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-40.png b/app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-40.png
new file mode 100644
index 000000000..f2dc1079e
Binary files /dev/null and b/app/src/main/resources/io/xpipe/app/resources/img/system/zwave-js-ui-40.png differ
diff --git a/app/src/main/resources/io/xpipe/app/resources/misc/vault_empty.md b/app/src/main/resources/io/xpipe/app/resources/misc/vault_empty.md
index 8db34b601..f30f74891 100644
--- a/app/src/main/resources/io/xpipe/app/resources/misc/vault_empty.md
+++ b/app/src/main/resources/io/xpipe/app/resources/misc/vault_empty.md
@@ -9,7 +9,7 @@ See below on how to do this.
By default, no categories are set to shared so that you have explicit control on what connections to commit.
To have your connections of a category put inside your git repository,
-you need to click on the `⚙️` icon (when hovering over the category)
+you either need to right-click the category or click on the `⚙️` icon when hovering over the category
in your `Connections` tab under the category overview on the left side.
Then click on `Add to git repository` to sync the category and connections to your git repository.
This will add all shareable connections to the git repository.
diff --git a/app/src/main/resources/io/xpipe/app/resources/style/color-box.css b/app/src/main/resources/io/xpipe/app/resources/style/color-box.css
index b7db6da5a..dad290e7e 100644
--- a/app/src/main/resources/io/xpipe/app/resources/style/color-box.css
+++ b/app/src/main/resources/io/xpipe/app/resources/style/color-box.css
@@ -34,13 +34,13 @@
.root:pretty:light .color-box.blue {
- -fx-background-color: linear-gradient(from 100% 0% to 0% 100%, rgb(130, 130, 250, 0.15) 40%, rgb(57, 57, 200, 0.15) 50%, rgb(137, 137, 250, 0.15) 100%);
- -fx-border-color: rgba(80, 100, 150, 0.3);
+ -fx-background-color: linear-gradient(from 100% 0% to 0% 100%, rgb(170, 130, 250, 0.08) 40%, rgb(87, 57, 200, 0.08) 50%, rgb(167, 137, 250, 0.08) 100%);
+ -fx-border-color: rgba(80, 100, 150, 0.6);
}
.root:performance:light .color-box.blue {
- -fx-background-color: rgb(130, 130, 250, 0.15);
- -fx-border-color: rgba(80, 100, 150, 0.3);
+ -fx-background-color: rgb(130, 130, 250, 0.08);
+ -fx-border-color: rgba(80, 100, 150, 0.6);
}
.root:light .color-box.blue > .separator .line {
@@ -48,7 +48,7 @@
}
.root:pretty:dark .color-box.blue {
- -fx-background-color: linear-gradient(from 100% 0% to 0% 100%, rgb(30, 30, 80, 0.8) 40%, rgb(27, 27, 65, 0.8) 50%, rgb(37, 37, 100, 0.8) 100%);
+ -fx-background-color: linear-gradient(from 100% 0% to 0% 100%, rgb(30, 30, 80, 0.8) 40%, rgb(27, 27, 65, 0.8) 50%, rgb(50, 37, 100, 0.8) 100%);
-fx-border-color: rgba(80, 100, 150, 0.7);
}
@@ -63,13 +63,13 @@
.root:pretty:light .color-box.red {
- -fx-background-color: linear-gradient(from 100% 0% to 0% 100%, rgb(220, 100, 100, 0.15) 40%, rgb(205, 50, 50, 0.15) 50%, rgb(200, 90, 90, 0.15) 100%);
- -fx-border-color: rgba(150, 100, 80, 0.4);
+ -fx-background-color: linear-gradient(from 100% 0% to 0% 100%, rgb(250, 100, 100, 0.06) 40%, rgb(245, 50, 50, 0.06) 50%, rgb(240, 90, 90, 0.06) 100%);
+ -fx-border-color: rgba(150, 100, 80, 0.6);
}
.root:performance:light .color-box.red {
- -fx-background-color: rgb(220, 100, 100, 0.15);
- -fx-border-color: rgba(150, 100, 80, 0.4);
+ -fx-background-color: rgb(250, 100, 100, 0.06);
+ -fx-border-color: rgba(150, 100, 80, 0.6);
}
.root:light .color-box.red > .separator .line {
@@ -77,7 +77,7 @@
}
.root:pretty:dark .color-box.red {
- -fx-background-color: linear-gradient(from 100% 0% to 0% 100%, rgb(80, 30, 30, 0.4) 40%, rgb(65, 27, 27, 0.4) 50%, rgb(100, 37, 37, 0.4) 100%);
+ -fx-background-color: linear-gradient(from 100% 0% to 0% 100%, rgb(80, 30, 40, 0.4) 40%, rgb(65, 30, 43, 0.4) 50%, rgb(100, 37, 57, 0.4) 100%);
-fx-border-color: rgba(150, 100, 80, 0.4);
}
@@ -92,13 +92,13 @@
.root:pretty:light .color-box.yellow {
- -fx-background-color: linear-gradient(from 100% 0% to 0% 100%, rgb(180, 180, 30, 0.2) 40%, rgb(135, 135, 27, 0.2) 50%, rgb(200, 200, 37, 0.2) 100%);
- -fx-border-color: rgba(170, 170, 80, 0.3);
+ -fx-background-color: linear-gradient(from 100% 0% to 0% 100%, rgb(180, 180, 30, 0.15) 40%, rgb(135, 135, 27, 0.15) 50%, rgb(200, 200, 37, 0.15) 100%);
+ -fx-border-color: rgba(170, 170, 80, 0.7);
}
.root:performance:light .color-box.yellow {
- -fx-background-color: rgb(180, 180, 30, 0.2);
- -fx-border-color: rgba(170, 170, 80, 0.3);
+ -fx-background-color: rgb(180, 180, 30, 0.15);
+ -fx-border-color: rgba(170, 170, 80, 0.7);
}
.root:light .color-box.yellow > .separator .line {
@@ -106,7 +106,7 @@
}
.root:pretty:dark .color-box.yellow {
- -fx-background-color: linear-gradient(from 100% 0% to 0% 100%, rgb(80, 80, 30, 0.4) 40%, rgb(65, 65, 27, 0.4) 50%, rgb(100, 100, 37, 0.4) 100%);
+ -fx-background-color: linear-gradient(from 100% 0% to 0% 100%, rgb(80, 80, 60, 0.4) 40%, rgb(65, 65, 57, 0.4) 50%, rgb(100, 100, 67, 0.4) 100%);
-fx-border-color: rgba(150, 150, 80, 0.4);
}
@@ -122,12 +122,12 @@
.root:pretty:light .color-box.green {
-fx-background-color: linear-gradient(from 100% 0% to 0% 100%, rgb(30, 180, 30, 0.1) 40%, rgb(20, 120, 20, 0.15) 50%, rgb(37, 200, 37, 0.1) 100%);
- -fx-border-color: rgba(100, 150, 80, 0.2);
+ -fx-border-color: rgba(100, 150, 80, 0.6);
}
.root:performance:light .color-box.green {
-fx-background-color: rgb(30, 180, 30, 0.1);
- -fx-border-color: rgba(100, 150, 80, 0.2);
+ -fx-border-color: rgba(100, 150, 80, 0.6);
}
.root:light .color-box.green > .separator .line {
@@ -135,7 +135,7 @@
}
.root:pretty:dark .color-box.green {
- -fx-background-color: linear-gradient(from 100% 0% to 0% 100%, rgb(30, 80, 30, 0.3) 40%, rgb(20, 60, 20, 0.3) 50%, rgb(37, 100, 37, 0.3) 100%);
+ -fx-background-color: linear-gradient(from 100% 0% to 0% 100%, rgb(30, 80, 60, 0.3) 40%, rgb(20, 60, 50, 0.3) 50%, rgb(37, 100, 57, 0.3) 100%);
-fx-border-color: rgba(100, 190, 80, 0.3);
}
diff --git a/app/src/main/resources/io/xpipe/app/resources/style/popup-menu.css b/app/src/main/resources/io/xpipe/app/resources/style/popup-menu.css
index 23fce6774..8a8f614f2 100644
--- a/app/src/main/resources/io/xpipe/app/resources/style/popup-menu.css
+++ b/app/src/main/resources/io/xpipe/app/resources/style/popup-menu.css
@@ -62,3 +62,9 @@
-fx-background-radius: 0;
-fx-border-radius: 0;
}
+
+.root:performance .context-menu {
+ -fx-effect: NONE;
+ -fx-background-radius: 0;
+ -fx-border-radius: 0;
+}
diff --git a/app/src/main/resources/io/xpipe/app/resources/style/prefs.css b/app/src/main/resources/io/xpipe/app/resources/style/prefs.css
index f00863e4c..a7c05eab0 100644
--- a/app/src/main/resources/io/xpipe/app/resources/style/prefs.css
+++ b/app/src/main/resources/io/xpipe/app/resources/style/prefs.css
@@ -6,6 +6,7 @@
.prefs-container .options-comp .description {
-fx-padding: 0.5em 0 0.5em 0;
+ -fx-opacity: 0.9;
}
.prefs-container > .title-header.first {
diff --git a/app/src/main/resources/io/xpipe/app/resources/style/store-entry-comp.css b/app/src/main/resources/io/xpipe/app/resources/style/store-entry-comp.css
index 5710d3738..196adcb76 100644
--- a/app/src/main/resources/io/xpipe/app/resources/style/store-entry-comp.css
+++ b/app/src/main/resources/io/xpipe/app/resources/style/store-entry-comp.css
@@ -21,16 +21,26 @@
-fx-text-fill: #ee4829;
}
-.store-entry-grid:incomplete .name {
- -fx-text-fill: #ee4829;
+.root:dark .store-entry-grid:incomplete .name {
+ -fx-text-fill: #b2271a;
+}
+
+.root:light .store-entry-grid:incomplete .name {
+ -fx-text-fill: #851908;
}
.store-entry-grid:incomplete .icon {
-fx-opacity: 0.5;
}
-.store-entry-grid .icon {
+.store-entry-grid .icon > .background {
+ -fx-background-radius: 5px;
-fx-background-color: -color-bg-overlay;
+ -fx-opacity: 0.5;
+}
+
+.store-entry-grid .icon:hover {
+ -fx-background-color: -color-bg-inset;
-fx-background-radius: 5px;
}
@@ -43,7 +53,7 @@
}
.store-entry-grid.dense {
- -fx-padding: 1px 6px 1px 6px;
+ -fx-padding: 0px 6px 0px 6px;
}
/* Entry */
@@ -102,7 +112,7 @@
}
.store-entry-section-comp > .children-content {
- -fx-padding: 5px 0 5px 25px;
+ -fx-padding: 5px 0 0 25px;
}
.store-entry-section-comp > .separator .line {
@@ -127,6 +137,20 @@
-fx-background-radius: 4 0 0 4;
}
+.store-entry-section-comp:last:sub:expanded {
+ -fx-border-width: 1 0 0 1;
+ -fx-background-radius: 4 0 0 0;
+ -fx-border-radius: 4 0 0 0;
+}
+
+.store-entry-section-comp:last:sub {
+ -fx-padding: 0 0 3 0;
+}
+
+.store-entry-section-comp:last:sub:expanded {
+ -fx-padding: 0;
+}
+
.root.nord .store-entry-section-comp {
-fx-border-radius: 0;
-fx-background-radius: 0;
diff --git a/app/src/main/resources/io/xpipe/app/resources/style/style.css b/app/src/main/resources/io/xpipe/app/resources/style/style.css
index b157aa3bc..ae8e1e256 100644
--- a/app/src/main/resources/io/xpipe/app/resources/style/style.css
+++ b/app/src/main/resources/io/xpipe/app/resources/style/style.css
@@ -97,10 +97,14 @@
-fx-padding: 0.7em 1px 1em 1em;
}
-* {
+.root:windows .text {
-fx-font-smoothing-type: gray;
}
+.root:linux .text {
+ -fx-font-smoothing-type: lcd;
+}
+
.radio-button {
-fx-background-color: transparent;
}
@@ -124,3 +128,23 @@
.root:dark .loading-comp {
-fx-background-color: rgba(0, 0, 0, 0.5);
}
+
+.icon-browser {
+ -fx-border-color: transparent;
+ -color-cell-border: transparent;
+}
+
+.icon-browser .column-header-background {
+ -fx-max-height: 0;
+ -fx-pref-height: 0;
+ -fx-min-height: 0;
+}
+
+.icon-browser .table-row-cell {
+ -fx-cell-size: 80px;
+}
+
+.icon-browser .table-row-cell .icon-label {
+ -fx-padding: 15 0;
+ -fx-cursor: hand;
+}
diff --git a/beacon/src/main/java/io/xpipe/beacon/api/TerminalWaitExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/TerminalWaitExchange.java
index 95bbf126f..71d9dcd76 100644
--- a/beacon/src/main/java/io/xpipe/beacon/api/TerminalWaitExchange.java
+++ b/beacon/src/main/java/io/xpipe/beacon/api/TerminalWaitExchange.java
@@ -22,6 +22,8 @@ public class TerminalWaitExchange extends BeaconInterface buildEnvironmentVariables(ShellControl sc) throws Exception {
LinkedHashMap map = new LinkedHashMap<>();
for (var e : environmentVariables.entrySet()) {
var v = e.getValue().evaluate(sc);
@@ -267,6 +262,16 @@ public class CommandBuilder {
map.put(e.getKey(), v);
}
}
+ return map;
+ }
+
+ public String buildFull(ShellControl sc) throws Exception {
+ if (sc == null) {
+ return buildSimple();
+ }
+
+ var s = buildBase(sc);
+ Map map = buildEnvironmentVariables(sc);
return sc.getShellDialect().assembleCommand(s, map);
}
diff --git a/core/src/main/java/io/xpipe/core/process/ProcessControl.java b/core/src/main/java/io/xpipe/core/process/ProcessControl.java
index c8a054d8c..ef489093d 100644
--- a/core/src/main/java/io/xpipe/core/process/ProcessControl.java
+++ b/core/src/main/java/io/xpipe/core/process/ProcessControl.java
@@ -34,6 +34,8 @@ public interface ProcessControl extends AutoCloseable {
@Override
void close() throws Exception;
+ void shutdown() throws Exception;
+
void kill();
ProcessControl start() throws Exception;
diff --git a/core/src/main/java/io/xpipe/core/process/ProcessOutputException.java b/core/src/main/java/io/xpipe/core/process/ProcessOutputException.java
index 171aa9271..04ab32725 100644
--- a/core/src/main/java/io/xpipe/core/process/ProcessOutputException.java
+++ b/core/src/main/java/io/xpipe/core/process/ProcessOutputException.java
@@ -29,6 +29,12 @@ public class ProcessOutputException extends Exception {
return new ProcessOutputException(message, ex.getExitCode(), ex.getOutput());
}
+ public static ProcessOutputException withSuffix(String customSuffix, ProcessOutputException ex) {
+ var messagePrefix = ex.getOutput() != null && !ex.getOutput().isBlank() ? ex.getOutput() + "\n" : "";
+ var message = messagePrefix + customSuffix;
+ return new ProcessOutputException(message, ex.getExitCode(), ex.getOutput());
+ }
+
public static ProcessOutputException of(long exitCode, String... messages) {
var combinedError = Arrays.stream(messages)
.filter(s -> s != null && !s.isBlank())
diff --git a/core/src/main/java/io/xpipe/core/process/ShellDumbMode.java b/core/src/main/java/io/xpipe/core/process/ShellDumbMode.java
index 6733570dd..d1df401bd 100644
--- a/core/src/main/java/io/xpipe/core/process/ShellDumbMode.java
+++ b/core/src/main/java/io/xpipe/core/process/ShellDumbMode.java
@@ -19,6 +19,8 @@ public interface ShellDumbMode {
return function.prepareWithoutInitCommand();
}
+ default void prepareInlineShellSwitch(ShellControl shellControl) throws Exception {}
+
default void prepareDumbInit(ShellControl shellControl) throws Exception {}
default void prepareDumbExit(ShellControl shellControl) throws IOException {
diff --git a/core/src/main/java/io/xpipe/core/process/ShellEnvironmentStoreState.java b/core/src/main/java/io/xpipe/core/process/ShellEnvironmentStoreState.java
index d24991292..dd43f6fd7 100644
--- a/core/src/main/java/io/xpipe/core/process/ShellEnvironmentStoreState.java
+++ b/core/src/main/java/io/xpipe/core/process/ShellEnvironmentStoreState.java
@@ -21,6 +21,8 @@ public class ShellEnvironmentStoreState extends ShellStoreState {
var n = (ShellEnvironmentStoreState) newer;
var b = toBuilder();
mergeBuilder(n, b);
- return b.shellName(useNewer(shellName, n.shellName)).setDefault(useNewer(setDefault,n.setDefault)).build();
+ return b.shellName(useNewer(shellName, n.shellName))
+ .setDefault(useNewer(setDefault, n.setDefault))
+ .build();
}
}
diff --git a/core/src/main/java/io/xpipe/core/process/ShellOpenFunction.java b/core/src/main/java/io/xpipe/core/process/ShellOpenFunction.java
index 07a4b6de3..88f0aa110 100644
--- a/core/src/main/java/io/xpipe/core/process/ShellOpenFunction.java
+++ b/core/src/main/java/io/xpipe/core/process/ShellOpenFunction.java
@@ -18,21 +18,7 @@ public interface ShellOpenFunction {
};
}
- static ShellOpenFunction of(String b) {
- return new ShellOpenFunction() {
- @Override
- public CommandBuilder prepareWithoutInitCommand() {
- return CommandBuilder.of().add(b);
- }
-
- @Override
- public CommandBuilder prepareWithInitCommand(@NonNull String command) {
- return CommandBuilder.of().add(command);
- }
- };
- }
-
- static ShellOpenFunction of(CommandBuilder b) {
+ static ShellOpenFunction of(CommandBuilder b, boolean append) {
return new ShellOpenFunction() {
@Override
public CommandBuilder prepareWithoutInitCommand() {
@@ -41,7 +27,7 @@ public interface ShellOpenFunction {
@Override
public CommandBuilder prepareWithInitCommand(@NonNull String command) {
- return CommandBuilder.ofString(command);
+ return CommandBuilder.ofFunction(sc -> (append ? b.buildFull(sc) + " " : "") + command);
}
};
}
diff --git a/core/src/main/java/io/xpipe/core/store/FileSystem.java b/core/src/main/java/io/xpipe/core/store/FileSystem.java
index ff03d074e..5e227d5f3 100644
--- a/core/src/main/java/io/xpipe/core/store/FileSystem.java
+++ b/core/src/main/java/io/xpipe/core/store/FileSystem.java
@@ -56,7 +56,7 @@ public interface FileSystem extends Closeable, AutoCloseable {
try {
var list = new ArrayList();
list.add(fileEntry);
- list.addAll(listFilesRecursively(fileEntry.getPath().toString()));
+ list.addAll(listFilesRecursively(fileEntry.getPath()));
return list.stream();
} catch (Exception e) {
throw new RuntimeException(e);
diff --git a/core/src/main/java/io/xpipe/core/store/ShellStore.java b/core/src/main/java/io/xpipe/core/store/ShellStore.java
index b64ad2bbf..2292586b4 100644
--- a/core/src/main/java/io/xpipe/core/store/ShellStore.java
+++ b/core/src/main/java/io/xpipe/core/store/ShellStore.java
@@ -1,28 +1,33 @@
package io.xpipe.core.store;
-import io.xpipe.core.process.ProcessControl;
import io.xpipe.core.process.ShellControl;
-public interface ShellStore extends DataStore, FileSystemStore, ValidatableStore {
+public interface ShellStore extends DataStore, FileSystemStore, ValidatableStore {
@Override
default FileSystem createFileSystem() {
return new ConnectionFileSystem(control());
}
- default ProcessControl prepareLaunchCommand() {
- return control();
+ ShellControl parentControl();
+
+ ShellControl control(ShellControl parent);
+
+ default ShellControl control() {
+ return control(parentControl());
}
- ShellControl control();
-
@Override
- default void validate() throws Exception {
- var c = control();
+ default ShellValidationContext validate(ShellValidationContext context) throws Exception {
+ var c = control(context.get());
if (!isInStorage()) {
c.withoutLicenseCheck();
}
+ return new ShellValidationContext(c.start());
+ }
- try (ShellControl pc = c.start()) {}
+ @Override
+ default ShellValidationContext createContext() throws Exception {
+ return new ShellValidationContext(parentControl().start());
}
}
diff --git a/core/src/main/java/io/xpipe/core/store/ShellValidationContext.java b/core/src/main/java/io/xpipe/core/store/ShellValidationContext.java
new file mode 100644
index 000000000..0357c497e
--- /dev/null
+++ b/core/src/main/java/io/xpipe/core/store/ShellValidationContext.java
@@ -0,0 +1,24 @@
+package io.xpipe.core.store;
+
+import io.xpipe.core.process.ShellControl;
+
+import lombok.Value;
+
+@Value
+public class ShellValidationContext implements ValidationContext {
+
+ ShellControl shellControl;
+
+ @Override
+ public ShellControl get() {
+ return shellControl;
+ }
+
+ @Override
+ public void close() {
+ try {
+ shellControl.shutdown();
+ } catch (Exception ignored) {
+ }
+ }
+}
diff --git a/core/src/main/java/io/xpipe/core/store/ValidatableStore.java b/core/src/main/java/io/xpipe/core/store/ValidatableStore.java
index f8519de81..3fcde2c13 100644
--- a/core/src/main/java/io/xpipe/core/store/ValidatableStore.java
+++ b/core/src/main/java/io/xpipe/core/store/ValidatableStore.java
@@ -1,6 +1,6 @@
package io.xpipe.core.store;
-public interface ValidatableStore extends DataStore {
+public interface ValidatableStore> extends DataStore {
/**
* Performs a validation of this data store.
@@ -18,5 +18,7 @@ public interface ValidatableStore extends DataStore {
*
* @throws Exception if any part of the validation went wrong
*/
- default void validate() throws Exception {}
+ T validate(T context) throws Exception;
+
+ T createContext() throws Exception;
}
diff --git a/core/src/main/java/io/xpipe/core/store/ValidationContext.java b/core/src/main/java/io/xpipe/core/store/ValidationContext.java
new file mode 100644
index 000000000..690ab48b4
--- /dev/null
+++ b/core/src/main/java/io/xpipe/core/store/ValidationContext.java
@@ -0,0 +1,8 @@
+package io.xpipe.core.store;
+
+public interface ValidationContext {
+
+ T get();
+
+ void close();
+}
diff --git a/core/src/main/java/io/xpipe/core/util/CoreJacksonModule.java b/core/src/main/java/io/xpipe/core/util/CoreJacksonModule.java
index 68f0c63a5..5791bd6cc 100644
--- a/core/src/main/java/io/xpipe/core/util/CoreJacksonModule.java
+++ b/core/src/main/java/io/xpipe/core/util/CoreJacksonModule.java
@@ -1,13 +1,5 @@
package io.xpipe.core.util;
-import com.fasterxml.jackson.annotation.JsonIdentityInfo;
-import com.fasterxml.jackson.annotation.ObjectIdGenerators;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.*;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.jsontype.NamedType;
-import com.fasterxml.jackson.databind.module.SimpleModule;
import io.xpipe.core.dialog.BaseQueryElement;
import io.xpipe.core.dialog.BusyElement;
import io.xpipe.core.dialog.ChoiceElement;
@@ -18,6 +10,15 @@ import io.xpipe.core.process.ShellDialects;
import io.xpipe.core.store.FilePath;
import io.xpipe.core.store.StorePath;
+import com.fasterxml.jackson.annotation.JsonIdentityInfo;
+import com.fasterxml.jackson.annotation.ObjectIdGenerators;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.*;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.jsontype.NamedType;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Path;
diff --git a/dist/build.gradle b/dist/build.gradle
index c09852abb..84eefcea9 100644
--- a/dist/build.gradle
+++ b/dist/build.gradle
@@ -2,7 +2,7 @@
plugins {
id 'org.beryx.jlink' version '3.0.1'
id "org.asciidoctor.jvm.convert" version "4.0.3"
- id 'org.jreleaser' version '1.13.1'
+ id 'org.jreleaser' version '1.14.0'
id("com.netflix.nebula.ospackage") version "11.10.0"
id 'org.gradle.crypto.checksum' version '1.4.0'
id 'signing'
diff --git a/dist/changelogs/12.0.md b/dist/changelogs/12.0.md
new file mode 100644
index 000000000..a4e7f0cd6
--- /dev/null
+++ b/dist/changelogs/12.0.md
@@ -0,0 +1,43 @@
+## Changes
+
+- Add popup to automatically save file with sudo when permissions are denied in file browser
+- You can now restart any ended terminal session by pressing R in the terminal
+- Add support for the windows credential manager as a password manager
+- Reuse existing shell session when adding new connection and searching for available connections
+- Implement support for setting custom icons, thanks to [https://github.com/selfhst/icons](https://github.com/selfhst/icons)
+- Replace deprecated wmic tool interaction on Windows
+- Add button to log in as a different user for RDP tunnel connections
+- Properly terminate all running connections when shutting down
+- Improve color scheme contrast for light themes
+- Improve connection hub styling
+- Rework Windows OS name detection to fix wmic issues
+- Improve script summary display
+- Upgrade to GraalVM 22.0.2
+- There is now a docker image with a web-based desktop environment for XPipe at [https://github.com/xpipe-io/xpipe-webtop](https://github.com/xpipe-io/xpipe-webtop)
+
+## Fixes
+
+- Fix csh, opnsense, pfsense shells being broken
+- Fix VM start/stop actions only being visible when user credentials were supplied
+- Fix tunnels failing to start when the remote login shell was fish
+- Fix dashlane password manager configuration being wrong
+- Fix some shell sessions staying open in the background when closing connection creation dialog
+- Fix SSH bridge not launching on Linux with missing sshd
+- Fix browser transfer progress flickering
+- Fix powershell type not being able to be recognized in certain language modes
+- Fix Cygwin/Msys2/GitForWindows not showing up in connection search sometimes
+- Fix some startup checks not working
+- Fix scrollbar not resetting when changing application tabs
+- Fix file modified dates and color names not being translated
+
+## Git vault improvements
+
+- Add more extensive documentation to the remote git repository settings menu
+- Add restart button to the sync settings menu
+- Improve git failure messages
+- Fix git CLI check not working on macOS due to xcode-select
+- Fix git sync failing when multiple gpg programs were present in PATH
+
+## Product hunt
+
+XPipe will be on ProductHunt on October 22. If you interested, you can follow XPipe at [https://www.producthunt.com/products/xpipe](https://www.producthunt.com/products/xpipe) to get notified.
diff --git a/dist/licenses/commons-lang.properties b/dist/licenses/commons-lang.properties
index 7c09cfa09..9929c584d 100644
--- a/dist/licenses/commons-lang.properties
+++ b/dist/licenses/commons-lang.properties
@@ -1,4 +1,4 @@
name=Commons Lang
-version=3.16.0
+version=3.17.0
license=Apache License 2.0
link=https://commons.apache.org/proper/commons-lang/
\ No newline at end of file
diff --git a/dist/licenses/github-api.properties b/dist/licenses/github-api.properties
index bf80eed48..950dba9c8 100644
--- a/dist/licenses/github-api.properties
+++ b/dist/licenses/github-api.properties
@@ -1,4 +1,4 @@
name=Java API for GitHub
-version=1.324
+version=1.326
license=MIT License
link=https://github.com/hub4j/github-api
\ No newline at end of file
diff --git a/dist/licenses/graalvm.properties b/dist/licenses/graalvm.properties
index 97bb40924..2e077e2f5 100644
--- a/dist/licenses/graalvm.properties
+++ b/dist/licenses/graalvm.properties
@@ -1,4 +1,4 @@
name=GraalVM Community
-version=21.0.1
+version=22.0.2
license=GPL2 with the Classpath Exception
link=https://www.graalvm.org/
\ No newline at end of file
diff --git a/ext/base/src/main/java/io/xpipe/ext/base/action/BrowseStoreAction.java b/ext/base/src/main/java/io/xpipe/ext/base/action/BrowseStoreAction.java
index 2e8625895..fa9f641f3 100644
--- a/ext/base/src/main/java/io/xpipe/ext/base/action/BrowseStoreAction.java
+++ b/ext/base/src/main/java/io/xpipe/ext/base/action/BrowseStoreAction.java
@@ -55,7 +55,8 @@ public class BrowseStoreAction implements ActionProvider {
@Override
public void execute() {
- DataStoreEntryRef replacement = ProcessControlProvider.get().replace(entry.ref());
+ DataStoreEntryRef replacement =
+ ProcessControlProvider.get().replace(entry.ref());
BrowserSessionModel.DEFAULT.openFileSystemAsync(replacement, null, new SimpleBooleanProperty());
AppLayoutModel.get().selectBrowser();
}
diff --git a/ext/base/src/main/java/io/xpipe/ext/base/action/ChangeStoreIconAction.java b/ext/base/src/main/java/io/xpipe/ext/base/action/ChangeStoreIconAction.java
new file mode 100644
index 000000000..e2b91c526
--- /dev/null
+++ b/ext/base/src/main/java/io/xpipe/ext/base/action/ChangeStoreIconAction.java
@@ -0,0 +1,60 @@
+package io.xpipe.ext.base.action;
+
+import io.xpipe.app.comp.store.StoreIconChoiceDialogComp;
+import io.xpipe.app.core.AppI18n;
+import io.xpipe.app.ext.ActionProvider;
+import io.xpipe.app.storage.DataStoreEntry;
+import io.xpipe.app.storage.DataStoreEntryRef;
+import io.xpipe.core.store.DataStore;
+
+import javafx.application.Platform;
+import javafx.beans.value.ObservableValue;
+
+import lombok.Value;
+
+public class ChangeStoreIconAction implements ActionProvider {
+
+ @Override
+ public LeafDataStoreCallSite> getLeafDataStoreCallSite() {
+ return new LeafDataStoreCallSite<>() {
+
+ @Override
+ public boolean isSystemAction() {
+ return true;
+ }
+
+ @Override
+ public ActionProvider.Action createAction(DataStoreEntryRef store) {
+ return new Action(store.get());
+ }
+
+ @Override
+ public Class getApplicableClass() {
+ return DataStore.class;
+ }
+
+ @Override
+ public ObservableValue getName(DataStoreEntryRef store) {
+ return AppI18n.observable("base.changeIcon");
+ }
+
+ @Override
+ public String getIcon(DataStoreEntryRef store) {
+ return "mdi2t-tooltip-image-outline";
+ }
+ };
+ }
+
+ @Value
+ static class Action implements ActionProvider.Action {
+
+ DataStoreEntry entry;
+
+ @Override
+ public void execute() {
+ Platform.runLater(() -> {
+ StoreIconChoiceDialogComp.show(entry);
+ });
+ }
+ }
+}
diff --git a/ext/base/src/main/java/io/xpipe/ext/base/action/CloneStoreAction.java b/ext/base/src/main/java/io/xpipe/ext/base/action/CloneStoreAction.java
index 6acee407f..53cc4f139 100644
--- a/ext/base/src/main/java/io/xpipe/ext/base/action/CloneStoreAction.java
+++ b/ext/base/src/main/java/io/xpipe/ext/base/action/CloneStoreAction.java
@@ -6,7 +6,9 @@ import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStoreEntry;
import io.xpipe.app.storage.DataStoreEntryRef;
import io.xpipe.core.store.DataStore;
+
import javafx.beans.value.ObservableValue;
+
import lombok.Value;
import java.time.Duration;
diff --git a/ext/base/src/main/java/io/xpipe/ext/base/action/RefreshChildrenStoreAction.java b/ext/base/src/main/java/io/xpipe/ext/base/action/RefreshChildrenStoreAction.java
index f4f21895a..4ee84ef54 100644
--- a/ext/base/src/main/java/io/xpipe/ext/base/action/RefreshChildrenStoreAction.java
+++ b/ext/base/src/main/java/io/xpipe/ext/base/action/RefreshChildrenStoreAction.java
@@ -72,7 +72,7 @@ public class RefreshChildrenStoreAction implements ActionProvider {
@Override
public void execute() {
- DataStorage.get().refreshChildren(store);
+ DataStorage.get().refreshChildren(store, null);
}
}
}
diff --git a/ext/base/src/main/java/io/xpipe/ext/base/action/SampleStoreAction.java b/ext/base/src/main/java/io/xpipe/ext/base/action/SampleStoreAction.java
index 246d73fc7..98038f37e 100644
--- a/ext/base/src/main/java/io/xpipe/ext/base/action/SampleStoreAction.java
+++ b/ext/base/src/main/java/io/xpipe/ext/base/action/SampleStoreAction.java
@@ -2,13 +2,13 @@ package io.xpipe.ext.base.action;
import io.xpipe.app.core.AppI18n;
import io.xpipe.app.ext.ActionProvider;
+import io.xpipe.app.ext.LocalStore;
import io.xpipe.app.storage.DataStoreEntry;
import io.xpipe.app.storage.DataStoreEntryRef;
import io.xpipe.core.process.CommandControl;
import io.xpipe.core.process.ElevationFunction;
import io.xpipe.core.process.ShellControl;
import io.xpipe.core.process.ShellDialects;
-import io.xpipe.app.ext.LocalStore;
import io.xpipe.core.store.ShellStore;
import javafx.beans.value.ObservableValue;
diff --git a/ext/base/src/main/java/io/xpipe/ext/base/action/ScanStoreAction.java b/ext/base/src/main/java/io/xpipe/ext/base/action/ScanStoreAction.java
index 717335ded..3e1a32636 100644
--- a/ext/base/src/main/java/io/xpipe/ext/base/action/ScanStoreAction.java
+++ b/ext/base/src/main/java/io/xpipe/ext/base/action/ScanStoreAction.java
@@ -70,7 +70,7 @@ public class ScanStoreAction implements ActionProvider {
@Override
public void execute() {
if (entry == null || entry.getStore() instanceof ShellStore) {
- ScanAlert.showForShellStore(entry);
+ ScanAlert.showForShellStore(entry, null);
}
}
}
diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenNativeFileDetailsAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenNativeFileDetailsAction.java
index c1e1de19b..1bbebd513 100644
--- a/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenNativeFileDetailsAction.java
+++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/OpenNativeFileDetailsAction.java
@@ -10,8 +10,8 @@ import io.xpipe.core.process.OsType;
import io.xpipe.core.process.ShellControl;
import io.xpipe.core.store.FileKind;
import io.xpipe.core.store.FileNames;
-
import io.xpipe.core.store.FilePath;
+
import javafx.beans.value.ObservableValue;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyCodeCombination;
@@ -59,7 +59,13 @@ public class OpenNativeFileDetailsAction implements LeafAction {
}
var file = new FilePath(e);
- sc.command(CommandBuilder.of().add("xdg-open").addFile(entry.getRawFileEntry().getKind() == FileKind.DIRECTORY ? file : file.getParent())).execute();
+ sc.command(CommandBuilder.of()
+ .add("xdg-open")
+ .addFile(
+ entry.getRawFileEntry().getKind() == FileKind.DIRECTORY
+ ? file
+ : file.getParent()))
+ .execute();
}
case OsType.MacOs macOs -> {
sc.osascriptCommand(String.format(
diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/PredefinedScriptStore.java b/ext/base/src/main/java/io/xpipe/ext/base/script/PredefinedScriptStore.java
index ecda4e865..2a0844e41 100644
--- a/ext/base/src/main/java/io/xpipe/ext/base/script/PredefinedScriptStore.java
+++ b/ext/base/src/main/java/io/xpipe/ext/base/script/PredefinedScriptStore.java
@@ -1,6 +1,6 @@
package io.xpipe.ext.base.script;
-import io.xpipe.app.core.AppResources;
+import io.xpipe.app.resources.AppResources;
import io.xpipe.app.storage.DataStoreEntryRef;
import io.xpipe.core.process.ShellDialects;
diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptQuickEditAction.java b/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptQuickEditAction.java
index a23d8065b..5ffedabcc 100644
--- a/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptQuickEditAction.java
+++ b/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptQuickEditAction.java
@@ -1,11 +1,16 @@
package io.xpipe.ext.base.script;
+import io.xpipe.app.comp.store.StoreCreationComp;
import io.xpipe.app.ext.ActionProvider;
+import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStoreEntryRef;
import io.xpipe.app.util.FileOpener;
import io.xpipe.core.process.OsType;
+
import lombok.Value;
+import java.util.Arrays;
+
public class SimpleScriptQuickEditAction implements ActionProvider {
@Override
public DefaultDataStoreCallSite> getDefaultDataStoreCallSite() {
@@ -29,17 +34,26 @@ public class SimpleScriptQuickEditAction implements ActionProvider {
@Override
public void execute() {
+ var predefined = DataStorage.get()
+ .getStoreCategoryIfPresent(ref.get().getCategoryUuid())
+ .map(category -> category.getUuid().equals(DataStorage.PREDEFINED_SCRIPTS_CATEGORY_UUID))
+ .orElse(false)
+ && Arrays.stream(PredefinedScriptStore.values())
+ .anyMatch(predefinedScriptStore -> predefinedScriptStore
+ .getName()
+ .equals(ref.get().getName()));
+ if (predefined) {
+ StoreCreationComp.showEdit(ref.get());
+ return;
+ }
+
var script = ref.getStore();
var dialect = script.getMinimumDialect();
var ext = dialect.getScriptFileEnding();
var name = OsType.getLocal().makeFileSystemCompatible(ref.get().getName());
- FileOpener.openString(
- name + "." + ext,
- this,
- script.getCommands(),
- (s) -> {
- ref.get().setStoreInternal(script.toBuilder().commands(s).build(), true);
- });
+ FileOpener.openString(name + "." + ext, this, script.getCommands(), (s) -> {
+ ref.get().setStoreInternal(script.toBuilder().commands(s).build(), true);
+ });
}
}
}
diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStoreProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStoreProvider.java
index c04af1825..7d0aa7727 100644
--- a/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStoreProvider.java
+++ b/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStoreProvider.java
@@ -4,7 +4,6 @@ import io.xpipe.app.comp.base.IntegratedTextAreaComp;
import io.xpipe.app.comp.base.ListSelectorComp;
import io.xpipe.app.comp.base.SystemStateComp;
import io.xpipe.app.comp.store.StoreEntryWrapper;
-import io.xpipe.app.comp.store.StoreSection;
import io.xpipe.app.comp.store.StoreViewState;
import io.xpipe.app.core.AppExtensionManager;
import io.xpipe.app.core.AppI18n;
@@ -16,6 +15,7 @@ import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.fxcomps.impl.DataStoreChoiceComp;
import io.xpipe.app.fxcomps.impl.DataStoreListChoiceComp;
import io.xpipe.app.storage.DataStoreEntry;
+import io.xpipe.app.util.DataStoreFormatter;
import io.xpipe.app.util.MarkdownBuilder;
import io.xpipe.app.util.OptionsBuilder;
import io.xpipe.app.util.Validator;
@@ -27,8 +27,6 @@ import javafx.beans.binding.Bindings;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleListProperty;
import javafx.beans.property.SimpleObjectProperty;
-import javafx.beans.property.SimpleStringProperty;
-import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import lombok.SneakyThrows;
@@ -37,6 +35,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
+import java.util.stream.Stream;
public class SimpleScriptStoreProvider implements EnabledParentStoreProvider, DataStoreProvider {
@@ -210,13 +209,29 @@ public class SimpleScriptStoreProvider implements EnabledParentStoreProvider, Da
}
@Override
- public ObservableValue informationString(StoreSection section) {
- SimpleScriptStore scriptStore =
- section.getWrapper().getEntry().getStore().asNeeded();
- return new SimpleStringProperty((scriptStore.getMinimumDialect() != null
- ? scriptStore.getMinimumDialect().getDisplayName() + " "
- : "")
- + " snippet");
+ public boolean alwaysShowSummary() {
+ return true;
+ }
+
+ @Override
+ public String summaryString(StoreEntryWrapper wrapper) {
+ SimpleScriptStore st = wrapper.getEntry().getStore().asNeeded();
+ var init = st.isInitScript() ? AppI18n.get("init") : null;
+ var file = st.isRunnableScript() ? AppI18n.get("file") : null;
+ var shell = st.isRunnableScript() ? AppI18n.get("shell") : null;
+ var runnable = st.isRunnableScript() ? AppI18n.get("hub") : null;
+ var type = st.getMinimumDialect() != null
+ ? st.getMinimumDialect().getDisplayName() + " " + AppI18n.get("script")
+ : null;
+ var suffix = String.join(
+ " / ",
+ Stream.of(init, shell, file, runnable).filter(s -> s != null).toList());
+ if (!suffix.isEmpty()) {
+ suffix = "(" + suffix + ")";
+ } else {
+ suffix = null;
+ }
+ return DataStoreFormatter.join(type, suffix);
}
@SneakyThrows
diff --git a/ext/base/src/main/java/io/xpipe/ext/base/service/CustomServiceStoreProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/service/CustomServiceStoreProvider.java
index 52663e15b..06898e330 100644
--- a/ext/base/src/main/java/io/xpipe/ext/base/service/CustomServiceStoreProvider.java
+++ b/ext/base/src/main/java/io/xpipe/ext/base/service/CustomServiceStoreProvider.java
@@ -8,6 +8,7 @@ import io.xpipe.app.storage.DataStoreEntry;
import io.xpipe.app.util.OptionsBuilder;
import io.xpipe.core.store.DataStore;
import io.xpipe.core.store.NetworkTunnelStore;
+
import javafx.beans.property.Property;
import javafx.beans.property.SimpleObjectProperty;
diff --git a/ext/base/src/main/java/io/xpipe/ext/base/service/FixedServiceGroupStore.java b/ext/base/src/main/java/io/xpipe/ext/base/service/FixedServiceGroupStore.java
index 5b787873d..dc7c193b2 100644
--- a/ext/base/src/main/java/io/xpipe/ext/base/service/FixedServiceGroupStore.java
+++ b/ext/base/src/main/java/io/xpipe/ext/base/service/FixedServiceGroupStore.java
@@ -1,11 +1,11 @@
package io.xpipe.ext.base.service;
-import io.xpipe.app.storage.DataStoreEntry;
import io.xpipe.app.storage.DataStoreEntryRef;
import io.xpipe.app.util.FixedHierarchyStore;
import io.xpipe.app.util.Validators;
import io.xpipe.core.store.DataStore;
import io.xpipe.core.store.FixedChildStore;
+import io.xpipe.core.store.ValidationContext;
import com.fasterxml.jackson.annotation.JsonTypeName;
import lombok.AccessLevel;
@@ -22,7 +22,7 @@ import java.util.List;
@Jacksonized
@JsonTypeName("fixedServiceGroup")
public class FixedServiceGroupStore extends AbstractServiceGroupStore
- implements DataStore, FixedHierarchyStore {
+ implements DataStore, FixedHierarchyStore> {
@Override
public void checkComplete() throws Throwable {
@@ -32,9 +32,14 @@ public class FixedServiceGroupStore extends AbstractServiceGroupStore> listChildren(DataStoreEntry self)
+ public List extends DataStoreEntryRef extends FixedChildStore>> listChildren(ValidationContext> context)
throws Exception {
return (List extends DataStoreEntryRef extends FixedChildStore>>)
getParent().getStore().createFixedServices();
}
+
+ @Override
+ public ValidationContext> createContext() throws Exception {
+ return null;
+ }
}
diff --git a/ext/base/src/main/java/io/xpipe/ext/base/store/ShellStoreProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/store/ShellStoreProvider.java
index aa6dabf78..b88abc82e 100644
--- a/ext/base/src/main/java/io/xpipe/ext/base/store/ShellStoreProvider.java
+++ b/ext/base/src/main/java/io/xpipe/ext/base/store/ShellStoreProvider.java
@@ -10,10 +10,12 @@ import io.xpipe.app.ext.DataStoreProvider;
import io.xpipe.app.ext.DataStoreUsageCategory;
import io.xpipe.app.ext.ProcessControlProvider;
import io.xpipe.app.fxcomps.Comp;
+import io.xpipe.app.resources.SystemIcons;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStoreEntry;
import io.xpipe.app.util.DataStoreFormatter;
import io.xpipe.app.util.TerminalLauncher;
+import io.xpipe.core.process.ShellStoreState;
import io.xpipe.core.store.ShellStore;
import io.xpipe.ext.base.script.ScriptStore;
@@ -29,11 +31,21 @@ public interface ShellStoreProvider extends DataStoreProvider {
public void execute() throws Exception {
var replacement = ProcessControlProvider.get().replace(entry.ref());
ShellStore store = replacement.getStore().asNeeded();
+ var control = ScriptStore.controlWithDefaultScripts(store.control());
+ control.onInit(sc -> {
+ if (entry.getStorePersistentState() instanceof ShellStoreState shellStoreState
+ && shellStoreState.getShellDialect() == null) {
+ var found = SystemIcons.detectForSystem(sc);
+ if (found.isPresent()) {
+ entry.setIcon(found.get().getIconName(), false);
+ }
+ }
+ });
TerminalLauncher.open(
replacement.get(),
DataStorage.get().getStoreEntryDisplayName(replacement.get()),
null,
- ScriptStore.controlWithDefaultScripts(store.control()));
+ control);
}
};
}
diff --git a/ext/base/src/main/java/io/xpipe/ext/base/store/StorePauseAction.java b/ext/base/src/main/java/io/xpipe/ext/base/store/StorePauseAction.java
index 55c67c1c6..44fea90de 100644
--- a/ext/base/src/main/java/io/xpipe/ext/base/store/StorePauseAction.java
+++ b/ext/base/src/main/java/io/xpipe/ext/base/store/StorePauseAction.java
@@ -33,6 +33,11 @@ public class StorePauseAction implements ActionProvider {
public String getIcon(DataStoreEntryRef store) {
return "mdi2p-pause";
}
+
+ @Override
+ public boolean requiresValidStore() {
+ return false;
+ }
};
}
diff --git a/ext/base/src/main/java/io/xpipe/ext/base/store/StoreStartAction.java b/ext/base/src/main/java/io/xpipe/ext/base/store/StoreStartAction.java
index 27afbe50e..8e5dcac28 100644
--- a/ext/base/src/main/java/io/xpipe/ext/base/store/StoreStartAction.java
+++ b/ext/base/src/main/java/io/xpipe/ext/base/store/StoreStartAction.java
@@ -33,6 +33,11 @@ public class StoreStartAction implements ActionProvider {
public String getIcon(DataStoreEntryRef store) {
return "mdi2p-play";
}
+
+ @Override
+ public boolean requiresValidStore() {
+ return false;
+ }
};
}
diff --git a/ext/base/src/main/java/io/xpipe/ext/base/store/StoreStopAction.java b/ext/base/src/main/java/io/xpipe/ext/base/store/StoreStopAction.java
index 899ea1d78..cd259b679 100644
--- a/ext/base/src/main/java/io/xpipe/ext/base/store/StoreStopAction.java
+++ b/ext/base/src/main/java/io/xpipe/ext/base/store/StoreStopAction.java
@@ -33,6 +33,11 @@ public class StoreStopAction implements ActionProvider {
public String getIcon(DataStoreEntryRef store) {
return "mdi2s-stop";
}
+
+ @Override
+ public boolean requiresValidStore() {
+ return false;
+ }
};
}
diff --git a/ext/base/src/main/java/module-info.java b/ext/base/src/main/java/module-info.java
index 43142af89..ba7da5d20 100644
--- a/ext/base/src/main/java/module-info.java
+++ b/ext/base/src/main/java/module-info.java
@@ -77,7 +77,8 @@ open module io.xpipe.ext.base {
XPipeUrlAction,
EditStoreAction,
BrowseStoreAction,
- ScanStoreAction;
+ ScanStoreAction,
+ ChangeStoreIconAction;
provides DataStoreProvider with
FixedServiceGroupStoreProvider,
CustomServiceGroupStoreProvider,
diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopApplication_icon-80-dark.png b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopApplication_icon-80-dark.png
new file mode 100644
index 000000000..c10aa3b03
Binary files /dev/null and b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopApplication_icon-80-dark.png differ
diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopApplication_icon-80.png b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopApplication_icon-80.png
new file mode 100644
index 000000000..c10aa3b03
Binary files /dev/null and b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopApplication_icon-80.png differ
diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopCommand_icon-80-dark.png b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopCommand_icon-80-dark.png
new file mode 100644
index 000000000..dd631fa6c
Binary files /dev/null and b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopCommand_icon-80-dark.png differ
diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopCommand_icon-80.png b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopCommand_icon-80.png
new file mode 100644
index 000000000..dd631fa6c
Binary files /dev/null and b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopCommand_icon-80.png differ
diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopEnvironment_icon-80-dark.png b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopEnvironment_icon-80-dark.png
new file mode 100644
index 000000000..e438850da
Binary files /dev/null and b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopEnvironment_icon-80-dark.png differ
diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopEnvironment_icon-80.png b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopEnvironment_icon-80.png
new file mode 100644
index 000000000..e438850da
Binary files /dev/null and b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopEnvironment_icon-80.png differ
diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/serviceGroup_icon-80-dark.png b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/serviceGroup_icon-80-dark.png
new file mode 100644
index 000000000..4a3c70ac1
Binary files /dev/null and b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/serviceGroup_icon-80-dark.png differ
diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/serviceGroup_icon-80.png b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/serviceGroup_icon-80.png
new file mode 100644
index 000000000..3e8ffa615
Binary files /dev/null and b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/serviceGroup_icon-80.png differ
diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/service_icon-80-dark.png b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/service_icon-80-dark.png
new file mode 100644
index 000000000..951d7b0cb
Binary files /dev/null and b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/service_icon-80-dark.png differ
diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/service_icon-80.png b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/service_icon-80.png
new file mode 100644
index 000000000..951d7b0cb
Binary files /dev/null and b/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/service_icon-80.png differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 1ed247ec1..79eb9d003 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopApplication_icon-dark.svg b/img/base/desktopApplication_icon-dark.svg
similarity index 100%
rename from ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopApplication_icon-dark.svg
rename to img/base/desktopApplication_icon-dark.svg
diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopApplication_icon.svg b/img/base/desktopApplication_icon.svg
similarity index 100%
rename from ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopApplication_icon.svg
rename to img/base/desktopApplication_icon.svg
diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopCommand_icon-dark.svg b/img/base/desktopCommand_icon-dark.svg
similarity index 100%
rename from ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopCommand_icon-dark.svg
rename to img/base/desktopCommand_icon-dark.svg
diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopCommand_icon.svg b/img/base/desktopCommand_icon.svg
similarity index 100%
rename from ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopCommand_icon.svg
rename to img/base/desktopCommand_icon.svg
diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopEnvironment_icon-dark.svg b/img/base/desktopEnvironment_icon-dark.svg
similarity index 100%
rename from ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopEnvironment_icon-dark.svg
rename to img/base/desktopEnvironment_icon-dark.svg
diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopEnvironment_icon.svg b/img/base/desktopEnvironment_icon.svg
similarity index 100%
rename from ext/base/src/main/resources/io/xpipe/ext/base/resources/img/desktopEnvironment_icon.svg
rename to img/base/desktopEnvironment_icon.svg
diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/serviceGroup_icon-dark.svg b/img/base/serviceGroup_icon-dark.svg
similarity index 100%
rename from ext/base/src/main/resources/io/xpipe/ext/base/resources/img/serviceGroup_icon-dark.svg
rename to img/base/serviceGroup_icon-dark.svg
diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/serviceGroup_icon.svg b/img/base/serviceGroup_icon.svg
similarity index 100%
rename from ext/base/src/main/resources/io/xpipe/ext/base/resources/img/serviceGroup_icon.svg
rename to img/base/serviceGroup_icon.svg
diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/service_icon-dark.svg b/img/base/service_icon-dark.svg
similarity index 100%
rename from ext/base/src/main/resources/io/xpipe/ext/base/resources/img/service_icon-dark.svg
rename to img/base/service_icon-dark.svg
diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/img/service_icon.svg b/img/base/service_icon.svg
similarity index 100%
rename from ext/base/src/main/resources/io/xpipe/ext/base/resources/img/service_icon.svg
rename to img/base/service_icon.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/default_file.svg b/img/browser/default_file.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/default_file.svg
rename to img/browser/default_file.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/default_folder.svg b/img/browser/default_folder.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/default_folder.svg
rename to img/browser/default_folder.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/default_folder_opened.svg b/img/browser/default_folder_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/default_folder_opened.svg
rename to img/browser/default_folder_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/default_root_folder.svg b/img/browser/default_root_folder.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/default_root_folder.svg
rename to img/browser/default_root_folder.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/default_root_folder_opened.svg b/img/browser/default_root_folder_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/default_root_folder_opened.svg
rename to img/browser/default_root_folder_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_access.svg b/img/browser/file_type_access.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_access.svg
rename to img/browser/file_type_access.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_access2.svg b/img/browser/file_type_access2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_access2.svg
rename to img/browser/file_type_access2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_actionscript.svg b/img/browser/file_type_actionscript.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_actionscript.svg
rename to img/browser/file_type_actionscript.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_actionscript2.svg b/img/browser/file_type_actionscript2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_actionscript2.svg
rename to img/browser/file_type_actionscript2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ada.svg b/img/browser/file_type_ada.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ada.svg
rename to img/browser/file_type_ada.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_advpl.svg b/img/browser/file_type_advpl.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_advpl.svg
rename to img/browser/file_type_advpl.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_affectscript.svg b/img/browser/file_type_affectscript.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_affectscript.svg
rename to img/browser/file_type_affectscript.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_affinitydesigner.svg b/img/browser/file_type_affinitydesigner.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_affinitydesigner.svg
rename to img/browser/file_type_affinitydesigner.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_affinityphoto.svg b/img/browser/file_type_affinityphoto.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_affinityphoto.svg
rename to img/browser/file_type_affinityphoto.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_affinitypublisher.svg b/img/browser/file_type_affinitypublisher.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_affinitypublisher.svg
rename to img/browser/file_type_affinitypublisher.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ai.svg b/img/browser/file_type_ai.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ai.svg
rename to img/browser/file_type_ai.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ai2.svg b/img/browser/file_type_ai2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ai2.svg
rename to img/browser/file_type_ai2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_al.svg b/img/browser/file_type_al.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_al.svg
rename to img/browser/file_type_al.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_al_dal.svg b/img/browser/file_type_al_dal.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_al_dal.svg
rename to img/browser/file_type_al_dal.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_allcontributors.svg b/img/browser/file_type_allcontributors.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_allcontributors.svg
rename to img/browser/file_type_allcontributors.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_angular.svg b/img/browser/file_type_angular.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_angular.svg
rename to img/browser/file_type_angular.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ansible.svg b/img/browser/file_type_ansible.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ansible.svg
rename to img/browser/file_type_ansible.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_antlr.svg b/img/browser/file_type_antlr.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_antlr.svg
rename to img/browser/file_type_antlr.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_anyscript.svg b/img/browser/file_type_anyscript.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_anyscript.svg
rename to img/browser/file_type_anyscript.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_apache.svg b/img/browser/file_type_apache.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_apache.svg
rename to img/browser/file_type_apache.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_apex.svg b/img/browser/file_type_apex.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_apex.svg
rename to img/browser/file_type_apex.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_api_extractor.svg b/img/browser/file_type_api_extractor.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_api_extractor.svg
rename to img/browser/file_type_api_extractor.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_apib.svg b/img/browser/file_type_apib.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_apib.svg
rename to img/browser/file_type_apib.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_apib2.svg b/img/browser/file_type_apib2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_apib2.svg
rename to img/browser/file_type_apib2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_apl.svg b/img/browser/file_type_apl.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_apl.svg
rename to img/browser/file_type_apl.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_applescript.svg b/img/browser/file_type_applescript.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_applescript.svg
rename to img/browser/file_type_applescript.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_appscript.svg b/img/browser/file_type_appscript.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_appscript.svg
rename to img/browser/file_type_appscript.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_appsemble.svg b/img/browser/file_type_appsemble.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_appsemble.svg
rename to img/browser/file_type_appsemble.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_appveyor.svg b/img/browser/file_type_appveyor.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_appveyor.svg
rename to img/browser/file_type_appveyor.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_arduino.svg b/img/browser/file_type_arduino.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_arduino.svg
rename to img/browser/file_type_arduino.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_asciidoc.svg b/img/browser/file_type_asciidoc.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_asciidoc.svg
rename to img/browser/file_type_asciidoc.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_asp.svg b/img/browser/file_type_asp.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_asp.svg
rename to img/browser/file_type_asp.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_aspx.svg b/img/browser/file_type_aspx.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_aspx.svg
rename to img/browser/file_type_aspx.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_assembly.svg b/img/browser/file_type_assembly.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_assembly.svg
rename to img/browser/file_type_assembly.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_astro.svg b/img/browser/file_type_astro.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_astro.svg
rename to img/browser/file_type_astro.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_astroconfig.svg b/img/browser/file_type_astroconfig.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_astroconfig.svg
rename to img/browser/file_type_astroconfig.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ats.svg b/img/browser/file_type_ats.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ats.svg
rename to img/browser/file_type_ats.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_audio.svg b/img/browser/file_type_audio.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_audio.svg
rename to img/browser/file_type_audio.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_aurelia.svg b/img/browser/file_type_aurelia.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_aurelia.svg
rename to img/browser/file_type_aurelia.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_autohotkey.svg b/img/browser/file_type_autohotkey.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_autohotkey.svg
rename to img/browser/file_type_autohotkey.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_autoit.svg b/img/browser/file_type_autoit.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_autoit.svg
rename to img/browser/file_type_autoit.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_avif.svg b/img/browser/file_type_avif.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_avif.svg
rename to img/browser/file_type_avif.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_avro.svg b/img/browser/file_type_avro.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_avro.svg
rename to img/browser/file_type_avro.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_awk.svg b/img/browser/file_type_awk.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_awk.svg
rename to img/browser/file_type_awk.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_aws.svg b/img/browser/file_type_aws.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_aws.svg
rename to img/browser/file_type_aws.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_azure.svg b/img/browser/file_type_azure.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_azure.svg
rename to img/browser/file_type_azure.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_azurepipelines.svg b/img/browser/file_type_azurepipelines.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_azurepipelines.svg
rename to img/browser/file_type_azurepipelines.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_babel.svg b/img/browser/file_type_babel.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_babel.svg
rename to img/browser/file_type_babel.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_babel2.svg b/img/browser/file_type_babel2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_babel2.svg
rename to img/browser/file_type_babel2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ballerina.svg b/img/browser/file_type_ballerina.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ballerina.svg
rename to img/browser/file_type_ballerina.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bat.svg b/img/browser/file_type_bat.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bat.svg
rename to img/browser/file_type_bat.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bats.svg b/img/browser/file_type_bats.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bats.svg
rename to img/browser/file_type_bats.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bazaar.svg b/img/browser/file_type_bazaar.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bazaar.svg
rename to img/browser/file_type_bazaar.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bazel.svg b/img/browser/file_type_bazel.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bazel.svg
rename to img/browser/file_type_bazel.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bazel_ignore.svg b/img/browser/file_type_bazel_ignore.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bazel_ignore.svg
rename to img/browser/file_type_bazel_ignore.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bazel_version.svg b/img/browser/file_type_bazel_version.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bazel_version.svg
rename to img/browser/file_type_bazel_version.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_befunge.svg b/img/browser/file_type_befunge.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_befunge.svg
rename to img/browser/file_type_befunge.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bicep.svg b/img/browser/file_type_bicep.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bicep.svg
rename to img/browser/file_type_bicep.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_biml.svg b/img/browser/file_type_biml.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_biml.svg
rename to img/browser/file_type_biml.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_binary.svg b/img/browser/file_type_binary.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_binary.svg
rename to img/browser/file_type_binary.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bitbucketpipeline.svg b/img/browser/file_type_bitbucketpipeline.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bitbucketpipeline.svg
rename to img/browser/file_type_bitbucketpipeline.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bithound.svg b/img/browser/file_type_bithound.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bithound.svg
rename to img/browser/file_type_bithound.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_blade.svg b/img/browser/file_type_blade.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_blade.svg
rename to img/browser/file_type_blade.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_blitzbasic.svg b/img/browser/file_type_blitzbasic.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_blitzbasic.svg
rename to img/browser/file_type_blitzbasic.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bolt.svg b/img/browser/file_type_bolt.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bolt.svg
rename to img/browser/file_type_bolt.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bosque.svg b/img/browser/file_type_bosque.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bosque.svg
rename to img/browser/file_type_bosque.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bower.svg b/img/browser/file_type_bower.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bower.svg
rename to img/browser/file_type_bower.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bower2.svg b/img/browser/file_type_bower2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bower2.svg
rename to img/browser/file_type_bower2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_browserslist.svg b/img/browser/file_type_browserslist.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_browserslist.svg
rename to img/browser/file_type_browserslist.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_buckbuild.svg b/img/browser/file_type_buckbuild.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_buckbuild.svg
rename to img/browser/file_type_buckbuild.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bun.svg b/img/browser/file_type_bun.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bun.svg
rename to img/browser/file_type_bun.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bundler.svg b/img/browser/file_type_bundler.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bundler.svg
rename to img/browser/file_type_bundler.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bunfig.svg b/img/browser/file_type_bunfig.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_bunfig.svg
rename to img/browser/file_type_bunfig.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_c.svg b/img/browser/file_type_c.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_c.svg
rename to img/browser/file_type_c.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_c2.svg b/img/browser/file_type_c2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_c2.svg
rename to img/browser/file_type_c2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_c3.svg b/img/browser/file_type_c3.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_c3.svg
rename to img/browser/file_type_c3.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_c_al.svg b/img/browser/file_type_c_al.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_c_al.svg
rename to img/browser/file_type_c_al.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cabal.svg b/img/browser/file_type_cabal.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cabal.svg
rename to img/browser/file_type_cabal.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_caddy.svg b/img/browser/file_type_caddy.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_caddy.svg
rename to img/browser/file_type_caddy.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cake.svg b/img/browser/file_type_cake.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cake.svg
rename to img/browser/file_type_cake.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cakephp.svg b/img/browser/file_type_cakephp.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cakephp.svg
rename to img/browser/file_type_cakephp.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_capacitor.svg b/img/browser/file_type_capacitor.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_capacitor.svg
rename to img/browser/file_type_capacitor.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cargo.svg b/img/browser/file_type_cargo.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cargo.svg
rename to img/browser/file_type_cargo.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_casc.svg b/img/browser/file_type_casc.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_casc.svg
rename to img/browser/file_type_casc.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cddl.svg b/img/browser/file_type_cddl.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cddl.svg
rename to img/browser/file_type_cddl.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cert.svg b/img/browser/file_type_cert.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cert.svg
rename to img/browser/file_type_cert.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ceylon.svg b/img/browser/file_type_ceylon.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ceylon.svg
rename to img/browser/file_type_ceylon.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cf.svg b/img/browser/file_type_cf.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cf.svg
rename to img/browser/file_type_cf.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cf2.svg b/img/browser/file_type_cf2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cf2.svg
rename to img/browser/file_type_cf2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cfc.svg b/img/browser/file_type_cfc.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cfc.svg
rename to img/browser/file_type_cfc.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cfc2.svg b/img/browser/file_type_cfc2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cfc2.svg
rename to img/browser/file_type_cfc2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cfm.svg b/img/browser/file_type_cfm.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cfm.svg
rename to img/browser/file_type_cfm.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cfm2.svg b/img/browser/file_type_cfm2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cfm2.svg
rename to img/browser/file_type_cfm2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cheader.svg b/img/browser/file_type_cheader.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cheader.svg
rename to img/browser/file_type_cheader.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_chef.svg b/img/browser/file_type_chef.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_chef.svg
rename to img/browser/file_type_chef.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_chef_cookbook.svg b/img/browser/file_type_chef_cookbook.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_chef_cookbook.svg
rename to img/browser/file_type_chef_cookbook.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_circleci.svg b/img/browser/file_type_circleci.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_circleci.svg
rename to img/browser/file_type_circleci.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_class.svg b/img/browser/file_type_class.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_class.svg
rename to img/browser/file_type_class.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_clojure.svg b/img/browser/file_type_clojure.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_clojure.svg
rename to img/browser/file_type_clojure.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_clojurescript.svg b/img/browser/file_type_clojurescript.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_clojurescript.svg
rename to img/browser/file_type_clojurescript.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cloudfoundry.svg b/img/browser/file_type_cloudfoundry.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cloudfoundry.svg
rename to img/browser/file_type_cloudfoundry.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cmake.svg b/img/browser/file_type_cmake.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cmake.svg
rename to img/browser/file_type_cmake.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cobol.svg b/img/browser/file_type_cobol.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cobol.svg
rename to img/browser/file_type_cobol.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codacy.svg b/img/browser/file_type_codacy.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codacy.svg
rename to img/browser/file_type_codacy.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codeclimate.svg b/img/browser/file_type_codeclimate.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codeclimate.svg
rename to img/browser/file_type_codeclimate.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codecov.svg b/img/browser/file_type_codecov.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codecov.svg
rename to img/browser/file_type_codecov.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codekit.svg b/img/browser/file_type_codekit.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codekit.svg
rename to img/browser/file_type_codekit.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codeowners.svg b/img/browser/file_type_codeowners.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codeowners.svg
rename to img/browser/file_type_codeowners.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codeql.svg b/img/browser/file_type_codeql.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_codeql.svg
rename to img/browser/file_type_codeql.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_coffeelint.svg b/img/browser/file_type_coffeelint.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_coffeelint.svg
rename to img/browser/file_type_coffeelint.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_coffeescript.svg b/img/browser/file_type_coffeescript.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_coffeescript.svg
rename to img/browser/file_type_coffeescript.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_commitizen.svg b/img/browser/file_type_commitizen.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_commitizen.svg
rename to img/browser/file_type_commitizen.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_commitlint.svg b/img/browser/file_type_commitlint.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_commitlint.svg
rename to img/browser/file_type_commitlint.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_compass.svg b/img/browser/file_type_compass.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_compass.svg
rename to img/browser/file_type_compass.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_composer.svg b/img/browser/file_type_composer.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_composer.svg
rename to img/browser/file_type_composer.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_conan.svg b/img/browser/file_type_conan.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_conan.svg
rename to img/browser/file_type_conan.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_conda.svg b/img/browser/file_type_conda.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_conda.svg
rename to img/browser/file_type_conda.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_config.svg b/img/browser/file_type_config.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_config.svg
rename to img/browser/file_type_config.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_confluence.svg b/img/browser/file_type_confluence.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_confluence.svg
rename to img/browser/file_type_confluence.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_coveralls.svg b/img/browser/file_type_coveralls.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_coveralls.svg
rename to img/browser/file_type_coveralls.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cpp.svg b/img/browser/file_type_cpp.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cpp.svg
rename to img/browser/file_type_cpp.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cpp2.svg b/img/browser/file_type_cpp2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cpp2.svg
rename to img/browser/file_type_cpp2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cpp3.svg b/img/browser/file_type_cpp3.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cpp3.svg
rename to img/browser/file_type_cpp3.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cppheader.svg b/img/browser/file_type_cppheader.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cppheader.svg
rename to img/browser/file_type_cppheader.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_crowdin.svg b/img/browser/file_type_crowdin.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_crowdin.svg
rename to img/browser/file_type_crowdin.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_crystal.svg b/img/browser/file_type_crystal.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_crystal.svg
rename to img/browser/file_type_crystal.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_csharp.svg b/img/browser/file_type_csharp.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_csharp.svg
rename to img/browser/file_type_csharp.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_csharp2.svg b/img/browser/file_type_csharp2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_csharp2.svg
rename to img/browser/file_type_csharp2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cspell.svg b/img/browser/file_type_cspell.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cspell.svg
rename to img/browser/file_type_cspell.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_csproj.svg b/img/browser/file_type_csproj.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_csproj.svg
rename to img/browser/file_type_csproj.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_css.svg b/img/browser/file_type_css.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_css.svg
rename to img/browser/file_type_css.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_csscomb.svg b/img/browser/file_type_csscomb.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_csscomb.svg
rename to img/browser/file_type_csscomb.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_csslint.svg b/img/browser/file_type_csslint.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_csslint.svg
rename to img/browser/file_type_csslint.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cssmap.svg b/img/browser/file_type_cssmap.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cssmap.svg
rename to img/browser/file_type_cssmap.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cucumber.svg b/img/browser/file_type_cucumber.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cucumber.svg
rename to img/browser/file_type_cucumber.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cuda.svg b/img/browser/file_type_cuda.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cuda.svg
rename to img/browser/file_type_cuda.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cvs.svg b/img/browser/file_type_cvs.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cvs.svg
rename to img/browser/file_type_cvs.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cypress.svg b/img/browser/file_type_cypress.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cypress.svg
rename to img/browser/file_type_cypress.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cypress_spec.svg b/img/browser/file_type_cypress_spec.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cypress_spec.svg
rename to img/browser/file_type_cypress_spec.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cython.svg b/img/browser/file_type_cython.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_cython.svg
rename to img/browser/file_type_cython.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dal.svg b/img/browser/file_type_dal.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dal.svg
rename to img/browser/file_type_dal.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_darcs.svg b/img/browser/file_type_darcs.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_darcs.svg
rename to img/browser/file_type_darcs.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dartlang.svg b/img/browser/file_type_dartlang.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dartlang.svg
rename to img/browser/file_type_dartlang.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dartlang_generated.svg b/img/browser/file_type_dartlang_generated.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dartlang_generated.svg
rename to img/browser/file_type_dartlang_generated.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dartlang_ignore.svg b/img/browser/file_type_dartlang_ignore.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dartlang_ignore.svg
rename to img/browser/file_type_dartlang_ignore.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_datadog.svg b/img/browser/file_type_datadog.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_datadog.svg
rename to img/browser/file_type_datadog.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_db.svg b/img/browser/file_type_db.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_db.svg
rename to img/browser/file_type_db.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_delphi.svg b/img/browser/file_type_delphi.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_delphi.svg
rename to img/browser/file_type_delphi.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_deno.svg b/img/browser/file_type_deno.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_deno.svg
rename to img/browser/file_type_deno.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dependabot.svg b/img/browser/file_type_dependabot.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dependabot.svg
rename to img/browser/file_type_dependabot.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dependencies.svg b/img/browser/file_type_dependencies.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dependencies.svg
rename to img/browser/file_type_dependencies.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_devcontainer.svg b/img/browser/file_type_devcontainer.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_devcontainer.svg
rename to img/browser/file_type_devcontainer.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dhall.svg b/img/browser/file_type_dhall.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dhall.svg
rename to img/browser/file_type_dhall.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_diff.svg b/img/browser/file_type_diff.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_diff.svg
rename to img/browser/file_type_diff.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_django.svg b/img/browser/file_type_django.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_django.svg
rename to img/browser/file_type_django.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dlang.svg b/img/browser/file_type_dlang.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dlang.svg
rename to img/browser/file_type_dlang.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_docker.svg b/img/browser/file_type_docker.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_docker.svg
rename to img/browser/file_type_docker.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_docker2.svg b/img/browser/file_type_docker2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_docker2.svg
rename to img/browser/file_type_docker2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dockertest.svg b/img/browser/file_type_dockertest.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dockertest.svg
rename to img/browser/file_type_dockertest.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dockertest2.svg b/img/browser/file_type_dockertest2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dockertest2.svg
rename to img/browser/file_type_dockertest2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_docpad.svg b/img/browser/file_type_docpad.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_docpad.svg
rename to img/browser/file_type_docpad.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_docz.svg b/img/browser/file_type_docz.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_docz.svg
rename to img/browser/file_type_docz.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dojo.svg b/img/browser/file_type_dojo.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dojo.svg
rename to img/browser/file_type_dojo.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_doppler.svg b/img/browser/file_type_doppler.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_doppler.svg
rename to img/browser/file_type_doppler.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dotjs.svg b/img/browser/file_type_dotjs.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dotjs.svg
rename to img/browser/file_type_dotjs.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_doxygen.svg b/img/browser/file_type_doxygen.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_doxygen.svg
rename to img/browser/file_type_doxygen.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_drawio.svg b/img/browser/file_type_drawio.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_drawio.svg
rename to img/browser/file_type_drawio.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_drone.svg b/img/browser/file_type_drone.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_drone.svg
rename to img/browser/file_type_drone.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_drools.svg b/img/browser/file_type_drools.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_drools.svg
rename to img/browser/file_type_drools.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dustjs.svg b/img/browser/file_type_dustjs.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dustjs.svg
rename to img/browser/file_type_dustjs.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dvc.svg b/img/browser/file_type_dvc.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dvc.svg
rename to img/browser/file_type_dvc.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dylan.svg b/img/browser/file_type_dylan.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_dylan.svg
rename to img/browser/file_type_dylan.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_earthly.svg b/img/browser/file_type_earthly.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_earthly.svg
rename to img/browser/file_type_earthly.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eas-metadata.svg b/img/browser/file_type_eas-metadata.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eas-metadata.svg
rename to img/browser/file_type_eas-metadata.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_edge.svg b/img/browser/file_type_edge.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_edge.svg
rename to img/browser/file_type_edge.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_edge2.svg b/img/browser/file_type_edge2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_edge2.svg
rename to img/browser/file_type_edge2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_editorconfig.svg b/img/browser/file_type_editorconfig.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_editorconfig.svg
rename to img/browser/file_type_editorconfig.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eex.svg b/img/browser/file_type_eex.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eex.svg
rename to img/browser/file_type_eex.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ejs.svg b/img/browser/file_type_ejs.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ejs.svg
rename to img/browser/file_type_ejs.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_elastic.svg b/img/browser/file_type_elastic.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_elastic.svg
rename to img/browser/file_type_elastic.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_elasticbeanstalk.svg b/img/browser/file_type_elasticbeanstalk.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_elasticbeanstalk.svg
rename to img/browser/file_type_elasticbeanstalk.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eleventy.svg b/img/browser/file_type_eleventy.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eleventy.svg
rename to img/browser/file_type_eleventy.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eleventy2.svg b/img/browser/file_type_eleventy2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eleventy2.svg
rename to img/browser/file_type_eleventy2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_elixir.svg b/img/browser/file_type_elixir.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_elixir.svg
rename to img/browser/file_type_elixir.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_elm.svg b/img/browser/file_type_elm.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_elm.svg
rename to img/browser/file_type_elm.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_elm2.svg b/img/browser/file_type_elm2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_elm2.svg
rename to img/browser/file_type_elm2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_emacs.svg b/img/browser/file_type_emacs.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_emacs.svg
rename to img/browser/file_type_emacs.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ember.svg b/img/browser/file_type_ember.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ember.svg
rename to img/browser/file_type_ember.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ensime.svg b/img/browser/file_type_ensime.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ensime.svg
rename to img/browser/file_type_ensime.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eps.svg b/img/browser/file_type_eps.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eps.svg
rename to img/browser/file_type_eps.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_erb.svg b/img/browser/file_type_erb.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_erb.svg
rename to img/browser/file_type_erb.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_erlang.svg b/img/browser/file_type_erlang.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_erlang.svg
rename to img/browser/file_type_erlang.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_erlang2.svg b/img/browser/file_type_erlang2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_erlang2.svg
rename to img/browser/file_type_erlang2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_esbuild.svg b/img/browser/file_type_esbuild.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_esbuild.svg
rename to img/browser/file_type_esbuild.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eslint.svg b/img/browser/file_type_eslint.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eslint.svg
rename to img/browser/file_type_eslint.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eslint2.svg b/img/browser/file_type_eslint2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_eslint2.svg
rename to img/browser/file_type_eslint2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_esphome.svg b/img/browser/file_type_esphome.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_esphome.svg
rename to img/browser/file_type_esphome.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_excel.svg b/img/browser/file_type_excel.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_excel.svg
rename to img/browser/file_type_excel.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_excel2.svg b/img/browser/file_type_excel2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_excel2.svg
rename to img/browser/file_type_excel2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_expo.svg b/img/browser/file_type_expo.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_expo.svg
rename to img/browser/file_type_expo.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_falcon.svg b/img/browser/file_type_falcon.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_falcon.svg
rename to img/browser/file_type_falcon.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fantasticon.svg b/img/browser/file_type_fantasticon.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fantasticon.svg
rename to img/browser/file_type_fantasticon.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fauna.svg b/img/browser/file_type_fauna.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fauna.svg
rename to img/browser/file_type_fauna.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_favicon.svg b/img/browser/file_type_favicon.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_favicon.svg
rename to img/browser/file_type_favicon.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fbx.svg b/img/browser/file_type_fbx.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fbx.svg
rename to img/browser/file_type_fbx.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_firebase.svg b/img/browser/file_type_firebase.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_firebase.svg
rename to img/browser/file_type_firebase.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_firebasehosting.svg b/img/browser/file_type_firebasehosting.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_firebasehosting.svg
rename to img/browser/file_type_firebasehosting.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_firestore.svg b/img/browser/file_type_firestore.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_firestore.svg
rename to img/browser/file_type_firestore.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fitbit.svg b/img/browser/file_type_fitbit.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fitbit.svg
rename to img/browser/file_type_fitbit.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fla.svg b/img/browser/file_type_fla.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fla.svg
rename to img/browser/file_type_fla.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_flareact.svg b/img/browser/file_type_flareact.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_flareact.svg
rename to img/browser/file_type_flareact.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_flash.svg b/img/browser/file_type_flash.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_flash.svg
rename to img/browser/file_type_flash.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_floobits.svg b/img/browser/file_type_floobits.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_floobits.svg
rename to img/browser/file_type_floobits.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_flow.svg b/img/browser/file_type_flow.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_flow.svg
rename to img/browser/file_type_flow.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_flutter.svg b/img/browser/file_type_flutter.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_flutter.svg
rename to img/browser/file_type_flutter.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_flutter_package.svg b/img/browser/file_type_flutter_package.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_flutter_package.svg
rename to img/browser/file_type_flutter_package.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_font.svg b/img/browser/file_type_font.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_font.svg
rename to img/browser/file_type_font.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_formkit.svg b/img/browser/file_type_formkit.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_formkit.svg
rename to img/browser/file_type_formkit.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fortran.svg b/img/browser/file_type_fortran.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fortran.svg
rename to img/browser/file_type_fortran.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fossa.svg b/img/browser/file_type_fossa.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fossa.svg
rename to img/browser/file_type_fossa.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fossil.svg b/img/browser/file_type_fossil.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fossil.svg
rename to img/browser/file_type_fossil.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_freemarker.svg b/img/browser/file_type_freemarker.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_freemarker.svg
rename to img/browser/file_type_freemarker.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fsharp.svg b/img/browser/file_type_fsharp.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fsharp.svg
rename to img/browser/file_type_fsharp.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fsharp2.svg b/img/browser/file_type_fsharp2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fsharp2.svg
rename to img/browser/file_type_fsharp2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fsproj.svg b/img/browser/file_type_fsproj.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fsproj.svg
rename to img/browser/file_type_fsproj.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fthtml.svg b/img/browser/file_type_fthtml.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fthtml.svg
rename to img/browser/file_type_fthtml.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_funding.svg b/img/browser/file_type_funding.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_funding.svg
rename to img/browser/file_type_funding.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fusebox.svg b/img/browser/file_type_fusebox.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_fusebox.svg
rename to img/browser/file_type_fusebox.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_galen.svg b/img/browser/file_type_galen.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_galen.svg
rename to img/browser/file_type_galen.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_galen2.svg b/img/browser/file_type_galen2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_galen2.svg
rename to img/browser/file_type_galen2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gamemaker.svg b/img/browser/file_type_gamemaker.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gamemaker.svg
rename to img/browser/file_type_gamemaker.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gamemaker2.svg b/img/browser/file_type_gamemaker2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gamemaker2.svg
rename to img/browser/file_type_gamemaker2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gamemaker81.svg b/img/browser/file_type_gamemaker81.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gamemaker81.svg
rename to img/browser/file_type_gamemaker81.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gatsby.svg b/img/browser/file_type_gatsby.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gatsby.svg
rename to img/browser/file_type_gatsby.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gcloud.svg b/img/browser/file_type_gcloud.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gcloud.svg
rename to img/browser/file_type_gcloud.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gcode.svg b/img/browser/file_type_gcode.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gcode.svg
rename to img/browser/file_type_gcode.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gdscript.svg b/img/browser/file_type_gdscript.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gdscript.svg
rename to img/browser/file_type_gdscript.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_genstat.svg b/img/browser/file_type_genstat.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_genstat.svg
rename to img/browser/file_type_genstat.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_git.svg b/img/browser/file_type_git.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_git.svg
rename to img/browser/file_type_git.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_git2.svg b/img/browser/file_type_git2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_git2.svg
rename to img/browser/file_type_git2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gitlab.svg b/img/browser/file_type_gitlab.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gitlab.svg
rename to img/browser/file_type_gitlab.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gitpod.svg b/img/browser/file_type_gitpod.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gitpod.svg
rename to img/browser/file_type_gitpod.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_glide.svg b/img/browser/file_type_glide.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_glide.svg
rename to img/browser/file_type_glide.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_glitter.svg b/img/browser/file_type_glitter.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_glitter.svg
rename to img/browser/file_type_glitter.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_glsl.svg b/img/browser/file_type_glsl.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_glsl.svg
rename to img/browser/file_type_glsl.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_glyphs.svg b/img/browser/file_type_glyphs.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_glyphs.svg
rename to img/browser/file_type_glyphs.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gnu.svg b/img/browser/file_type_gnu.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gnu.svg
rename to img/browser/file_type_gnu.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gnuplot.svg b/img/browser/file_type_gnuplot.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gnuplot.svg
rename to img/browser/file_type_gnuplot.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go.svg b/img/browser/file_type_go.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go.svg
rename to img/browser/file_type_go.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_aqua.svg b/img/browser/file_type_go_aqua.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_aqua.svg
rename to img/browser/file_type_go_aqua.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_black.svg b/img/browser/file_type_go_black.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_black.svg
rename to img/browser/file_type_go_black.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_fuchsia.svg b/img/browser/file_type_go_fuchsia.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_fuchsia.svg
rename to img/browser/file_type_go_fuchsia.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_gopher.svg b/img/browser/file_type_go_gopher.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_gopher.svg
rename to img/browser/file_type_go_gopher.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_lightblue.svg b/img/browser/file_type_go_lightblue.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_lightblue.svg
rename to img/browser/file_type_go_lightblue.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_package.svg b/img/browser/file_type_go_package.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_package.svg
rename to img/browser/file_type_go_package.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_white.svg b/img/browser/file_type_go_white.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_white.svg
rename to img/browser/file_type_go_white.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_work.svg b/img/browser/file_type_go_work.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_work.svg
rename to img/browser/file_type_go_work.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_yellow.svg b/img/browser/file_type_go_yellow.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_go_yellow.svg
rename to img/browser/file_type_go_yellow.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_goctl.svg b/img/browser/file_type_goctl.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_goctl.svg
rename to img/browser/file_type_goctl.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_godot.svg b/img/browser/file_type_godot.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_godot.svg
rename to img/browser/file_type_godot.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gradle.svg b/img/browser/file_type_gradle.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gradle.svg
rename to img/browser/file_type_gradle.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gradle2.svg b/img/browser/file_type_gradle2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gradle2.svg
rename to img/browser/file_type_gradle2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_graphql.svg b/img/browser/file_type_graphql.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_graphql.svg
rename to img/browser/file_type_graphql.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_graphql_config.svg b/img/browser/file_type_graphql_config.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_graphql_config.svg
rename to img/browser/file_type_graphql_config.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_graphviz.svg b/img/browser/file_type_graphviz.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_graphviz.svg
rename to img/browser/file_type_graphviz.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_greenkeeper.svg b/img/browser/file_type_greenkeeper.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_greenkeeper.svg
rename to img/browser/file_type_greenkeeper.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gridsome.svg b/img/browser/file_type_gridsome.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gridsome.svg
rename to img/browser/file_type_gridsome.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_groovy.svg b/img/browser/file_type_groovy.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_groovy.svg
rename to img/browser/file_type_groovy.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_groovy2.svg b/img/browser/file_type_groovy2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_groovy2.svg
rename to img/browser/file_type_groovy2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_grunt.svg b/img/browser/file_type_grunt.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_grunt.svg
rename to img/browser/file_type_grunt.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gulp.svg b/img/browser/file_type_gulp.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_gulp.svg
rename to img/browser/file_type_gulp.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haml.svg b/img/browser/file_type_haml.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haml.svg
rename to img/browser/file_type_haml.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_handlebars.svg b/img/browser/file_type_handlebars.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_handlebars.svg
rename to img/browser/file_type_handlebars.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_handlebars2.svg b/img/browser/file_type_handlebars2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_handlebars2.svg
rename to img/browser/file_type_handlebars2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_harbour.svg b/img/browser/file_type_harbour.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_harbour.svg
rename to img/browser/file_type_harbour.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hardhat.svg b/img/browser/file_type_hardhat.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hardhat.svg
rename to img/browser/file_type_hardhat.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hashicorp.svg b/img/browser/file_type_hashicorp.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hashicorp.svg
rename to img/browser/file_type_hashicorp.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haskell.svg b/img/browser/file_type_haskell.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haskell.svg
rename to img/browser/file_type_haskell.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haskell2.svg b/img/browser/file_type_haskell2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haskell2.svg
rename to img/browser/file_type_haskell2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haxe.svg b/img/browser/file_type_haxe.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haxe.svg
rename to img/browser/file_type_haxe.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haxecheckstyle.svg b/img/browser/file_type_haxecheckstyle.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haxecheckstyle.svg
rename to img/browser/file_type_haxecheckstyle.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haxedevelop.svg b/img/browser/file_type_haxedevelop.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_haxedevelop.svg
rename to img/browser/file_type_haxedevelop.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_helix.svg b/img/browser/file_type_helix.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_helix.svg
rename to img/browser/file_type_helix.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_helm.svg b/img/browser/file_type_helm.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_helm.svg
rename to img/browser/file_type_helm.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hjson.svg b/img/browser/file_type_hjson.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hjson.svg
rename to img/browser/file_type_hjson.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hlsl.svg b/img/browser/file_type_hlsl.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hlsl.svg
rename to img/browser/file_type_hlsl.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_homeassistant.svg b/img/browser/file_type_homeassistant.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_homeassistant.svg
rename to img/browser/file_type_homeassistant.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_horusec.svg b/img/browser/file_type_horusec.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_horusec.svg
rename to img/browser/file_type_horusec.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_host.svg b/img/browser/file_type_host.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_host.svg
rename to img/browser/file_type_host.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_html.svg b/img/browser/file_type_html.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_html.svg
rename to img/browser/file_type_html.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_htmlhint.svg b/img/browser/file_type_htmlhint.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_htmlhint.svg
rename to img/browser/file_type_htmlhint.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_http.svg b/img/browser/file_type_http.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_http.svg
rename to img/browser/file_type_http.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hunspell.svg b/img/browser/file_type_hunspell.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hunspell.svg
rename to img/browser/file_type_hunspell.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_husky.svg b/img/browser/file_type_husky.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_husky.svg
rename to img/browser/file_type_husky.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hy.svg b/img/browser/file_type_hy.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hy.svg
rename to img/browser/file_type_hy.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hygen.svg b/img/browser/file_type_hygen.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hygen.svg
rename to img/browser/file_type_hygen.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hypr.svg b/img/browser/file_type_hypr.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_hypr.svg
rename to img/browser/file_type_hypr.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_icl.svg b/img/browser/file_type_icl.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_icl.svg
rename to img/browser/file_type_icl.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_idris.svg b/img/browser/file_type_idris.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_idris.svg
rename to img/browser/file_type_idris.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_idrisbin.svg b/img/browser/file_type_idrisbin.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_idrisbin.svg
rename to img/browser/file_type_idrisbin.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_idrispkg.svg b/img/browser/file_type_idrispkg.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_idrispkg.svg
rename to img/browser/file_type_idrispkg.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_image.svg b/img/browser/file_type_image.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_image.svg
rename to img/browser/file_type_image.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_imba.svg b/img/browser/file_type_imba.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_imba.svg
rename to img/browser/file_type_imba.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_inc.svg b/img/browser/file_type_inc.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_inc.svg
rename to img/browser/file_type_inc.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_infopath.svg b/img/browser/file_type_infopath.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_infopath.svg
rename to img/browser/file_type_infopath.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_informix.svg b/img/browser/file_type_informix.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_informix.svg
rename to img/browser/file_type_informix.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ini.svg b/img/browser/file_type_ini.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ini.svg
rename to img/browser/file_type_ini.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ink.svg b/img/browser/file_type_ink.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ink.svg
rename to img/browser/file_type_ink.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_innosetup.svg b/img/browser/file_type_innosetup.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_innosetup.svg
rename to img/browser/file_type_innosetup.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_io.svg b/img/browser/file_type_io.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_io.svg
rename to img/browser/file_type_io.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_iodine.svg b/img/browser/file_type_iodine.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_iodine.svg
rename to img/browser/file_type_iodine.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ionic.svg b/img/browser/file_type_ionic.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ionic.svg
rename to img/browser/file_type_ionic.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jake.svg b/img/browser/file_type_jake.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jake.svg
rename to img/browser/file_type_jake.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_janet.svg b/img/browser/file_type_janet.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_janet.svg
rename to img/browser/file_type_janet.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jar.svg b/img/browser/file_type_jar.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jar.svg
rename to img/browser/file_type_jar.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jasmine.svg b/img/browser/file_type_jasmine.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jasmine.svg
rename to img/browser/file_type_jasmine.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_java.svg b/img/browser/file_type_java.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_java.svg
rename to img/browser/file_type_java.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jbuilder.svg b/img/browser/file_type_jbuilder.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jbuilder.svg
rename to img/browser/file_type_jbuilder.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jekyll.svg b/img/browser/file_type_jekyll.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jekyll.svg
rename to img/browser/file_type_jekyll.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jenkins.svg b/img/browser/file_type_jenkins.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jenkins.svg
rename to img/browser/file_type_jenkins.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jest.svg b/img/browser/file_type_jest.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jest.svg
rename to img/browser/file_type_jest.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jest_snapshot.svg b/img/browser/file_type_jest_snapshot.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jest_snapshot.svg
rename to img/browser/file_type_jest_snapshot.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jinja.svg b/img/browser/file_type_jinja.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jinja.svg
rename to img/browser/file_type_jinja.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jpm.svg b/img/browser/file_type_jpm.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jpm.svg
rename to img/browser/file_type_jpm.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_js.svg b/img/browser/file_type_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_js.svg
rename to img/browser/file_type_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_js_official.svg b/img/browser/file_type_js_official.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_js_official.svg
rename to img/browser/file_type_js_official.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsbeautify.svg b/img/browser/file_type_jsbeautify.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsbeautify.svg
rename to img/browser/file_type_jsbeautify.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsconfig.svg b/img/browser/file_type_jsconfig.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsconfig.svg
rename to img/browser/file_type_jsconfig.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jscpd.svg b/img/browser/file_type_jscpd.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jscpd.svg
rename to img/browser/file_type_jscpd.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jshint.svg b/img/browser/file_type_jshint.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jshint.svg
rename to img/browser/file_type_jshint.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsmap.svg b/img/browser/file_type_jsmap.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsmap.svg
rename to img/browser/file_type_jsmap.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_json.svg b/img/browser/file_type_json.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_json.svg
rename to img/browser/file_type_json.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_json2.svg b/img/browser/file_type_json2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_json2.svg
rename to img/browser/file_type_json2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_json5.svg b/img/browser/file_type_json5.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_json5.svg
rename to img/browser/file_type_json5.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_json_official.svg b/img/browser/file_type_json_official.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_json_official.svg
rename to img/browser/file_type_json_official.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsonld.svg b/img/browser/file_type_jsonld.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsonld.svg
rename to img/browser/file_type_jsonld.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsonnet.svg b/img/browser/file_type_jsonnet.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsonnet.svg
rename to img/browser/file_type_jsonnet.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsp.svg b/img/browser/file_type_jsp.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jsp.svg
rename to img/browser/file_type_jsp.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jss.svg b/img/browser/file_type_jss.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jss.svg
rename to img/browser/file_type_jss.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_julia.svg b/img/browser/file_type_julia.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_julia.svg
rename to img/browser/file_type_julia.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_julia2.svg b/img/browser/file_type_julia2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_julia2.svg
rename to img/browser/file_type_julia2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jupyter.svg b/img/browser/file_type_jupyter.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_jupyter.svg
rename to img/browser/file_type_jupyter.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_k.svg b/img/browser/file_type_k.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_k.svg
rename to img/browser/file_type_k.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_karma.svg b/img/browser/file_type_karma.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_karma.svg
rename to img/browser/file_type_karma.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_key.svg b/img/browser/file_type_key.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_key.svg
rename to img/browser/file_type_key.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kitchenci.svg b/img/browser/file_type_kitchenci.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kitchenci.svg
rename to img/browser/file_type_kitchenci.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kite.svg b/img/browser/file_type_kite.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kite.svg
rename to img/browser/file_type_kite.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kivy.svg b/img/browser/file_type_kivy.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kivy.svg
rename to img/browser/file_type_kivy.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kos.svg b/img/browser/file_type_kos.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kos.svg
rename to img/browser/file_type_kos.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kotlin.svg b/img/browser/file_type_kotlin.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kotlin.svg
rename to img/browser/file_type_kotlin.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kusto.svg b/img/browser/file_type_kusto.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_kusto.svg
rename to img/browser/file_type_kusto.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_latino.svg b/img/browser/file_type_latino.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_latino.svg
rename to img/browser/file_type_latino.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_layout.svg b/img/browser/file_type_layout.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_layout.svg
rename to img/browser/file_type_layout.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lerna.svg b/img/browser/file_type_lerna.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lerna.svg
rename to img/browser/file_type_lerna.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_less.svg b/img/browser/file_type_less.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_less.svg
rename to img/browser/file_type_less.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lex.svg b/img/browser/file_type_lex.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lex.svg
rename to img/browser/file_type_lex.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_license.svg b/img/browser/file_type_license.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_license.svg
rename to img/browser/file_type_license.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_licensebat.svg b/img/browser/file_type_licensebat.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_licensebat.svg
rename to img/browser/file_type_licensebat.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_actionscript2.svg b/img/browser/file_type_light_actionscript2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_actionscript2.svg
rename to img/browser/file_type_light_actionscript2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_ada.svg b/img/browser/file_type_light_ada.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_ada.svg
rename to img/browser/file_type_light_ada.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_apl.svg b/img/browser/file_type_light_apl.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_apl.svg
rename to img/browser/file_type_light_apl.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_babel.svg b/img/browser/file_type_light_babel.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_babel.svg
rename to img/browser/file_type_light_babel.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_babel2.svg b/img/browser/file_type_light_babel2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_babel2.svg
rename to img/browser/file_type_light_babel2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_cabal.svg b/img/browser/file_type_light_cabal.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_cabal.svg
rename to img/browser/file_type_light_cabal.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_circleci.svg b/img/browser/file_type_light_circleci.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_circleci.svg
rename to img/browser/file_type_light_circleci.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_cloudfoundry.svg b/img/browser/file_type_light_cloudfoundry.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_cloudfoundry.svg
rename to img/browser/file_type_light_cloudfoundry.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_codacy.svg b/img/browser/file_type_light_codacy.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_codacy.svg
rename to img/browser/file_type_light_codacy.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_codeclimate.svg b/img/browser/file_type_light_codeclimate.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_codeclimate.svg
rename to img/browser/file_type_light_codeclimate.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_codeowners.svg b/img/browser/file_type_light_codeowners.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_codeowners.svg
rename to img/browser/file_type_light_codeowners.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_config.svg b/img/browser/file_type_light_config.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_config.svg
rename to img/browser/file_type_light_config.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_crystal.svg b/img/browser/file_type_light_crystal.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_crystal.svg
rename to img/browser/file_type_light_crystal.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_cypress.svg b/img/browser/file_type_light_cypress.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_cypress.svg
rename to img/browser/file_type_light_cypress.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_cypress_spec.svg b/img/browser/file_type_light_cypress_spec.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_cypress_spec.svg
rename to img/browser/file_type_light_cypress_spec.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_db.svg b/img/browser/file_type_light_db.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_db.svg
rename to img/browser/file_type_light_db.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_deno.svg b/img/browser/file_type_light_deno.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_deno.svg
rename to img/browser/file_type_light_deno.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_dhall.svg b/img/browser/file_type_light_dhall.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_dhall.svg
rename to img/browser/file_type_light_dhall.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_docpad.svg b/img/browser/file_type_light_docpad.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_docpad.svg
rename to img/browser/file_type_light_docpad.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_drone.svg b/img/browser/file_type_light_drone.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_drone.svg
rename to img/browser/file_type_light_drone.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_eas-metadata.svg b/img/browser/file_type_light_eas-metadata.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_eas-metadata.svg
rename to img/browser/file_type_light_eas-metadata.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_eleventy.svg b/img/browser/file_type_light_eleventy.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_eleventy.svg
rename to img/browser/file_type_light_eleventy.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_eleventy2.svg b/img/browser/file_type_light_eleventy2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_eleventy2.svg
rename to img/browser/file_type_light_eleventy2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_esphome.svg b/img/browser/file_type_light_esphome.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_esphome.svg
rename to img/browser/file_type_light_esphome.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_expo.svg b/img/browser/file_type_light_expo.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_expo.svg
rename to img/browser/file_type_light_expo.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_firebasehosting.svg b/img/browser/file_type_light_firebasehosting.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_firebasehosting.svg
rename to img/browser/file_type_light_firebasehosting.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_fla.svg b/img/browser/file_type_light_fla.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_fla.svg
rename to img/browser/file_type_light_fla.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_font.svg b/img/browser/file_type_light_font.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_font.svg
rename to img/browser/file_type_light_font.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_gamemaker2.svg b/img/browser/file_type_light_gamemaker2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_gamemaker2.svg
rename to img/browser/file_type_light_gamemaker2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_gradle.svg b/img/browser/file_type_light_gradle.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_gradle.svg
rename to img/browser/file_type_light_gradle.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_hashicorp.svg b/img/browser/file_type_light_hashicorp.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_hashicorp.svg
rename to img/browser/file_type_light_hashicorp.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_hjson.svg b/img/browser/file_type_light_hjson.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_hjson.svg
rename to img/browser/file_type_light_hjson.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_ini.svg b/img/browser/file_type_light_ini.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_ini.svg
rename to img/browser/file_type_light_ini.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_io.svg b/img/browser/file_type_light_io.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_io.svg
rename to img/browser/file_type_light_io.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_js.svg b/img/browser/file_type_light_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_js.svg
rename to img/browser/file_type_light_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_jsconfig.svg b/img/browser/file_type_light_jsconfig.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_jsconfig.svg
rename to img/browser/file_type_light_jsconfig.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_jsmap.svg b/img/browser/file_type_light_jsmap.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_jsmap.svg
rename to img/browser/file_type_light_jsmap.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_json.svg b/img/browser/file_type_light_json.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_json.svg
rename to img/browser/file_type_light_json.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_json5.svg b/img/browser/file_type_light_json5.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_json5.svg
rename to img/browser/file_type_light_json5.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_jsonld.svg b/img/browser/file_type_light_jsonld.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_jsonld.svg
rename to img/browser/file_type_light_jsonld.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_kite.svg b/img/browser/file_type_light_kite.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_kite.svg
rename to img/browser/file_type_light_kite.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_lerna.svg b/img/browser/file_type_light_lerna.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_lerna.svg
rename to img/browser/file_type_light_lerna.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_mailing.svg b/img/browser/file_type_light_mailing.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_mailing.svg
rename to img/browser/file_type_light_mailing.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_mdx.svg b/img/browser/file_type_light_mdx.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_mdx.svg
rename to img/browser/file_type_light_mdx.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_mlang.svg b/img/browser/file_type_light_mlang.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_mlang.svg
rename to img/browser/file_type_light_mlang.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_mustache.svg b/img/browser/file_type_light_mustache.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_mustache.svg
rename to img/browser/file_type_light_mustache.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_next.svg b/img/browser/file_type_light_next.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_next.svg
rename to img/browser/file_type_light_next.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_nim.svg b/img/browser/file_type_light_nim.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_nim.svg
rename to img/browser/file_type_light_nim.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_nx.svg b/img/browser/file_type_light_nx.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_nx.svg
rename to img/browser/file_type_light_nx.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_objidconfig.svg b/img/browser/file_type_light_objidconfig.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_objidconfig.svg
rename to img/browser/file_type_light_objidconfig.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_openHAB.svg b/img/browser/file_type_light_openHAB.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_openHAB.svg
rename to img/browser/file_type_light_openHAB.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_pcl.svg b/img/browser/file_type_light_pcl.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_pcl.svg
rename to img/browser/file_type_light_pcl.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_pnpm.svg b/img/browser/file_type_light_pnpm.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_pnpm.svg
rename to img/browser/file_type_light_pnpm.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_prettier.svg b/img/browser/file_type_light_prettier.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_prettier.svg
rename to img/browser/file_type_light_prettier.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_prisma.svg b/img/browser/file_type_light_prisma.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_prisma.svg
rename to img/browser/file_type_light_prisma.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_purescript.svg b/img/browser/file_type_light_purescript.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_purescript.svg
rename to img/browser/file_type_light_purescript.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_quasar.svg b/img/browser/file_type_light_quasar.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_quasar.svg
rename to img/browser/file_type_light_quasar.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_razzle.svg b/img/browser/file_type_light_razzle.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_razzle.svg
rename to img/browser/file_type_light_razzle.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_rehype.svg b/img/browser/file_type_light_rehype.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_rehype.svg
rename to img/browser/file_type_light_rehype.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_remark.svg b/img/browser/file_type_light_remark.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_remark.svg
rename to img/browser/file_type_light_remark.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_replit.svg b/img/browser/file_type_light_replit.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_replit.svg
rename to img/browser/file_type_light_replit.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_retext.svg b/img/browser/file_type_light_retext.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_retext.svg
rename to img/browser/file_type_light_retext.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_rome.svg b/img/browser/file_type_light_rome.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_rome.svg
rename to img/browser/file_type_light_rome.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_rubocop.svg b/img/browser/file_type_light_rubocop.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_rubocop.svg
rename to img/browser/file_type_light_rubocop.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_rust.svg b/img/browser/file_type_light_rust.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_rust.svg
rename to img/browser/file_type_light_rust.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_rust_toolchain.svg b/img/browser/file_type_light_rust_toolchain.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_rust_toolchain.svg
rename to img/browser/file_type_light_rust_toolchain.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_shaderlab.svg b/img/browser/file_type_light_shaderlab.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_shaderlab.svg
rename to img/browser/file_type_light_shaderlab.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_solidity.svg b/img/browser/file_type_light_solidity.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_solidity.svg
rename to img/browser/file_type_light_solidity.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_stylelint.svg b/img/browser/file_type_light_stylelint.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_stylelint.svg
rename to img/browser/file_type_light_stylelint.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_stylus.svg b/img/browser/file_type_light_stylus.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_stylus.svg
rename to img/browser/file_type_light_stylus.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_symfony.svg b/img/browser/file_type_light_symfony.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_symfony.svg
rename to img/browser/file_type_light_symfony.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_systemd.svg b/img/browser/file_type_light_systemd.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_systemd.svg
rename to img/browser/file_type_light_systemd.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_systemverilog.svg b/img/browser/file_type_light_systemverilog.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_systemverilog.svg
rename to img/browser/file_type_light_systemverilog.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_testcafe.svg b/img/browser/file_type_light_testcafe.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_testcafe.svg
rename to img/browser/file_type_light_testcafe.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_testjs.svg b/img/browser/file_type_light_testjs.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_testjs.svg
rename to img/browser/file_type_light_testjs.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_tex.svg b/img/browser/file_type_light_tex.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_tex.svg
rename to img/browser/file_type_light_tex.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_todo.svg b/img/browser/file_type_light_todo.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_todo.svg
rename to img/browser/file_type_light_todo.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_toit.svg b/img/browser/file_type_light_toit.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_toit.svg
rename to img/browser/file_type_light_toit.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_toml.svg b/img/browser/file_type_light_toml.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_toml.svg
rename to img/browser/file_type_light_toml.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_tree.svg b/img/browser/file_type_light_tree.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_tree.svg
rename to img/browser/file_type_light_tree.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_turbo.svg b/img/browser/file_type_light_turbo.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_turbo.svg
rename to img/browser/file_type_light_turbo.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_unibeautify.svg b/img/browser/file_type_light_unibeautify.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_unibeautify.svg
rename to img/browser/file_type_light_unibeautify.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_vash.svg b/img/browser/file_type_light_vash.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_vash.svg
rename to img/browser/file_type_light_vash.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_vsix.svg b/img/browser/file_type_light_vsix.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_vsix.svg
rename to img/browser/file_type_light_vsix.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_vsixmanifest.svg b/img/browser/file_type_light_vsixmanifest.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_vsixmanifest.svg
rename to img/browser/file_type_light_vsixmanifest.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_xfl.svg b/img/browser/file_type_light_xfl.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_xfl.svg
rename to img/browser/file_type_light_xfl.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_yaml.svg b/img/browser/file_type_light_yaml.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_yaml.svg
rename to img/browser/file_type_light_yaml.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_zeit.svg b/img/browser/file_type_light_zeit.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_light_zeit.svg
rename to img/browser/file_type_light_zeit.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lighthouse.svg b/img/browser/file_type_lighthouse.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lighthouse.svg
rename to img/browser/file_type_lighthouse.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lilypond.svg b/img/browser/file_type_lilypond.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lilypond.svg
rename to img/browser/file_type_lilypond.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lime.svg b/img/browser/file_type_lime.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lime.svg
rename to img/browser/file_type_lime.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lintstagedrc.svg b/img/browser/file_type_lintstagedrc.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lintstagedrc.svg
rename to img/browser/file_type_lintstagedrc.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_liquid.svg b/img/browser/file_type_liquid.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_liquid.svg
rename to img/browser/file_type_liquid.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lisp.svg b/img/browser/file_type_lisp.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lisp.svg
rename to img/browser/file_type_lisp.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_livescript.svg b/img/browser/file_type_livescript.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_livescript.svg
rename to img/browser/file_type_livescript.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lnk.svg b/img/browser/file_type_lnk.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lnk.svg
rename to img/browser/file_type_lnk.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_locale.svg b/img/browser/file_type_locale.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_locale.svg
rename to img/browser/file_type_locale.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_log.svg b/img/browser/file_type_log.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_log.svg
rename to img/browser/file_type_log.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lolcode.svg b/img/browser/file_type_lolcode.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lolcode.svg
rename to img/browser/file_type_lolcode.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lsl.svg b/img/browser/file_type_lsl.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lsl.svg
rename to img/browser/file_type_lsl.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lua.svg b/img/browser/file_type_lua.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lua.svg
rename to img/browser/file_type_lua.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_luau.svg b/img/browser/file_type_luau.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_luau.svg
rename to img/browser/file_type_luau.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lync.svg b/img/browser/file_type_lync.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_lync.svg
rename to img/browser/file_type_lync.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mailing.svg b/img/browser/file_type_mailing.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mailing.svg
rename to img/browser/file_type_mailing.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_manifest.svg b/img/browser/file_type_manifest.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_manifest.svg
rename to img/browser/file_type_manifest.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_manifest_bak.svg b/img/browser/file_type_manifest_bak.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_manifest_bak.svg
rename to img/browser/file_type_manifest_bak.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_manifest_skip.svg b/img/browser/file_type_manifest_skip.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_manifest_skip.svg
rename to img/browser/file_type_manifest_skip.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_map.svg b/img/browser/file_type_map.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_map.svg
rename to img/browser/file_type_map.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mariadb.svg b/img/browser/file_type_mariadb.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mariadb.svg
rename to img/browser/file_type_mariadb.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_markdown.svg b/img/browser/file_type_markdown.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_markdown.svg
rename to img/browser/file_type_markdown.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_markdownlint.svg b/img/browser/file_type_markdownlint.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_markdownlint.svg
rename to img/browser/file_type_markdownlint.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_markdownlint_ignore.svg b/img/browser/file_type_markdownlint_ignore.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_markdownlint_ignore.svg
rename to img/browser/file_type_markdownlint_ignore.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_marko.svg b/img/browser/file_type_marko.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_marko.svg
rename to img/browser/file_type_marko.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_markojs.svg b/img/browser/file_type_markojs.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_markojs.svg
rename to img/browser/file_type_markojs.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_master-co.svg b/img/browser/file_type_master-co.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_master-co.svg
rename to img/browser/file_type_master-co.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_matlab.svg b/img/browser/file_type_matlab.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_matlab.svg
rename to img/browser/file_type_matlab.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_maven.svg b/img/browser/file_type_maven.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_maven.svg
rename to img/browser/file_type_maven.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_maxscript.svg b/img/browser/file_type_maxscript.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_maxscript.svg
rename to img/browser/file_type_maxscript.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_maya.svg b/img/browser/file_type_maya.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_maya.svg
rename to img/browser/file_type_maya.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mdx.svg b/img/browser/file_type_mdx.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mdx.svg
rename to img/browser/file_type_mdx.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mediawiki.svg b/img/browser/file_type_mediawiki.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mediawiki.svg
rename to img/browser/file_type_mediawiki.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mercurial.svg b/img/browser/file_type_mercurial.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mercurial.svg
rename to img/browser/file_type_mercurial.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_meson.svg b/img/browser/file_type_meson.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_meson.svg
rename to img/browser/file_type_meson.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_meteor.svg b/img/browser/file_type_meteor.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_meteor.svg
rename to img/browser/file_type_meteor.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mjml.svg b/img/browser/file_type_mjml.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mjml.svg
rename to img/browser/file_type_mjml.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mlang.svg b/img/browser/file_type_mlang.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mlang.svg
rename to img/browser/file_type_mlang.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mocha.svg b/img/browser/file_type_mocha.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mocha.svg
rename to img/browser/file_type_mocha.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_modernizr.svg b/img/browser/file_type_modernizr.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_modernizr.svg
rename to img/browser/file_type_modernizr.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mojolicious.svg b/img/browser/file_type_mojolicious.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mojolicious.svg
rename to img/browser/file_type_mojolicious.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_moleculer.svg b/img/browser/file_type_moleculer.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_moleculer.svg
rename to img/browser/file_type_moleculer.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mondoo.svg b/img/browser/file_type_mondoo.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mondoo.svg
rename to img/browser/file_type_mondoo.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mongo.svg b/img/browser/file_type_mongo.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mongo.svg
rename to img/browser/file_type_mongo.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_monotone.svg b/img/browser/file_type_monotone.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_monotone.svg
rename to img/browser/file_type_monotone.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_motif.svg b/img/browser/file_type_motif.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_motif.svg
rename to img/browser/file_type_motif.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mson.svg b/img/browser/file_type_mson.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mson.svg
rename to img/browser/file_type_mson.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mustache.svg b/img/browser/file_type_mustache.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mustache.svg
rename to img/browser/file_type_mustache.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mysql.svg b/img/browser/file_type_mysql.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_mysql.svg
rename to img/browser/file_type_mysql.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ndst.svg b/img/browser/file_type_ndst.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ndst.svg
rename to img/browser/file_type_ndst.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nearly.svg b/img/browser/file_type_nearly.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nearly.svg
rename to img/browser/file_type_nearly.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_adapter_js.svg b/img/browser/file_type_nest_adapter_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_adapter_js.svg
rename to img/browser/file_type_nest_adapter_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_adapter_ts.svg b/img/browser/file_type_nest_adapter_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_adapter_ts.svg
rename to img/browser/file_type_nest_adapter_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_controller_js.svg b/img/browser/file_type_nest_controller_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_controller_js.svg
rename to img/browser/file_type_nest_controller_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_controller_ts.svg b/img/browser/file_type_nest_controller_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_controller_ts.svg
rename to img/browser/file_type_nest_controller_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_decorator_js.svg b/img/browser/file_type_nest_decorator_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_decorator_js.svg
rename to img/browser/file_type_nest_decorator_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_decorator_ts.svg b/img/browser/file_type_nest_decorator_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_decorator_ts.svg
rename to img/browser/file_type_nest_decorator_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_filter_js.svg b/img/browser/file_type_nest_filter_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_filter_js.svg
rename to img/browser/file_type_nest_filter_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_filter_ts.svg b/img/browser/file_type_nest_filter_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_filter_ts.svg
rename to img/browser/file_type_nest_filter_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_gateway_js.svg b/img/browser/file_type_nest_gateway_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_gateway_js.svg
rename to img/browser/file_type_nest_gateway_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_gateway_ts.svg b/img/browser/file_type_nest_gateway_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_gateway_ts.svg
rename to img/browser/file_type_nest_gateway_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_guard_js.svg b/img/browser/file_type_nest_guard_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_guard_js.svg
rename to img/browser/file_type_nest_guard_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_guard_ts.svg b/img/browser/file_type_nest_guard_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_guard_ts.svg
rename to img/browser/file_type_nest_guard_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_interceptor_js.svg b/img/browser/file_type_nest_interceptor_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_interceptor_js.svg
rename to img/browser/file_type_nest_interceptor_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_interceptor_ts.svg b/img/browser/file_type_nest_interceptor_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_interceptor_ts.svg
rename to img/browser/file_type_nest_interceptor_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_middleware_js.svg b/img/browser/file_type_nest_middleware_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_middleware_js.svg
rename to img/browser/file_type_nest_middleware_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_middleware_ts.svg b/img/browser/file_type_nest_middleware_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_middleware_ts.svg
rename to img/browser/file_type_nest_middleware_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_module_js.svg b/img/browser/file_type_nest_module_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_module_js.svg
rename to img/browser/file_type_nest_module_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_module_ts.svg b/img/browser/file_type_nest_module_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_module_ts.svg
rename to img/browser/file_type_nest_module_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_pipe_js.svg b/img/browser/file_type_nest_pipe_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_pipe_js.svg
rename to img/browser/file_type_nest_pipe_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_pipe_ts.svg b/img/browser/file_type_nest_pipe_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_pipe_ts.svg
rename to img/browser/file_type_nest_pipe_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_service_js.svg b/img/browser/file_type_nest_service_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_service_js.svg
rename to img/browser/file_type_nest_service_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_service_ts.svg b/img/browser/file_type_nest_service_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nest_service_ts.svg
rename to img/browser/file_type_nest_service_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nestjs.svg b/img/browser/file_type_nestjs.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nestjs.svg
rename to img/browser/file_type_nestjs.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_netlify.svg b/img/browser/file_type_netlify.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_netlify.svg
rename to img/browser/file_type_netlify.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_next.svg b/img/browser/file_type_next.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_next.svg
rename to img/browser/file_type_next.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_css.svg b/img/browser/file_type_ng_component_css.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_css.svg
rename to img/browser/file_type_ng_component_css.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_dart.svg b/img/browser/file_type_ng_component_dart.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_dart.svg
rename to img/browser/file_type_ng_component_dart.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_html.svg b/img/browser/file_type_ng_component_html.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_html.svg
rename to img/browser/file_type_ng_component_html.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_js.svg b/img/browser/file_type_ng_component_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_js.svg
rename to img/browser/file_type_ng_component_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_js2.svg b/img/browser/file_type_ng_component_js2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_js2.svg
rename to img/browser/file_type_ng_component_js2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_less.svg b/img/browser/file_type_ng_component_less.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_less.svg
rename to img/browser/file_type_ng_component_less.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_sass.svg b/img/browser/file_type_ng_component_sass.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_sass.svg
rename to img/browser/file_type_ng_component_sass.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_scss.svg b/img/browser/file_type_ng_component_scss.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_scss.svg
rename to img/browser/file_type_ng_component_scss.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_ts.svg b/img/browser/file_type_ng_component_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_ts.svg
rename to img/browser/file_type_ng_component_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_ts2.svg b/img/browser/file_type_ng_component_ts2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_component_ts2.svg
rename to img/browser/file_type_ng_component_ts2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_controller_js.svg b/img/browser/file_type_ng_controller_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_controller_js.svg
rename to img/browser/file_type_ng_controller_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_controller_ts.svg b/img/browser/file_type_ng_controller_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_controller_ts.svg
rename to img/browser/file_type_ng_controller_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_directive_dart.svg b/img/browser/file_type_ng_directive_dart.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_directive_dart.svg
rename to img/browser/file_type_ng_directive_dart.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_directive_js.svg b/img/browser/file_type_ng_directive_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_directive_js.svg
rename to img/browser/file_type_ng_directive_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_directive_js2.svg b/img/browser/file_type_ng_directive_js2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_directive_js2.svg
rename to img/browser/file_type_ng_directive_js2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_directive_ts.svg b/img/browser/file_type_ng_directive_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_directive_ts.svg
rename to img/browser/file_type_ng_directive_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_directive_ts2.svg b/img/browser/file_type_ng_directive_ts2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_directive_ts2.svg
rename to img/browser/file_type_ng_directive_ts2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_guard_dart.svg b/img/browser/file_type_ng_guard_dart.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_guard_dart.svg
rename to img/browser/file_type_ng_guard_dart.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_guard_js.svg b/img/browser/file_type_ng_guard_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_guard_js.svg
rename to img/browser/file_type_ng_guard_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_guard_ts.svg b/img/browser/file_type_ng_guard_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_guard_ts.svg
rename to img/browser/file_type_ng_guard_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_interceptor_dart.svg b/img/browser/file_type_ng_interceptor_dart.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_interceptor_dart.svg
rename to img/browser/file_type_ng_interceptor_dart.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_interceptor_js.svg b/img/browser/file_type_ng_interceptor_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_interceptor_js.svg
rename to img/browser/file_type_ng_interceptor_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_interceptor_ts.svg b/img/browser/file_type_ng_interceptor_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_interceptor_ts.svg
rename to img/browser/file_type_ng_interceptor_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_module_dart.svg b/img/browser/file_type_ng_module_dart.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_module_dart.svg
rename to img/browser/file_type_ng_module_dart.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_module_js.svg b/img/browser/file_type_ng_module_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_module_js.svg
rename to img/browser/file_type_ng_module_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_module_js2.svg b/img/browser/file_type_ng_module_js2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_module_js2.svg
rename to img/browser/file_type_ng_module_js2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_module_ts.svg b/img/browser/file_type_ng_module_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_module_ts.svg
rename to img/browser/file_type_ng_module_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_module_ts2.svg b/img/browser/file_type_ng_module_ts2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_module_ts2.svg
rename to img/browser/file_type_ng_module_ts2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_pipe_dart.svg b/img/browser/file_type_ng_pipe_dart.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_pipe_dart.svg
rename to img/browser/file_type_ng_pipe_dart.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_pipe_js.svg b/img/browser/file_type_ng_pipe_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_pipe_js.svg
rename to img/browser/file_type_ng_pipe_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_pipe_js2.svg b/img/browser/file_type_ng_pipe_js2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_pipe_js2.svg
rename to img/browser/file_type_ng_pipe_js2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_pipe_ts.svg b/img/browser/file_type_ng_pipe_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_pipe_ts.svg
rename to img/browser/file_type_ng_pipe_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_pipe_ts2.svg b/img/browser/file_type_ng_pipe_ts2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_pipe_ts2.svg
rename to img/browser/file_type_ng_pipe_ts2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_routing_dart.svg b/img/browser/file_type_ng_routing_dart.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_routing_dart.svg
rename to img/browser/file_type_ng_routing_dart.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_routing_js.svg b/img/browser/file_type_ng_routing_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_routing_js.svg
rename to img/browser/file_type_ng_routing_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_routing_js2.svg b/img/browser/file_type_ng_routing_js2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_routing_js2.svg
rename to img/browser/file_type_ng_routing_js2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_routing_ts.svg b/img/browser/file_type_ng_routing_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_routing_ts.svg
rename to img/browser/file_type_ng_routing_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_routing_ts2.svg b/img/browser/file_type_ng_routing_ts2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_routing_ts2.svg
rename to img/browser/file_type_ng_routing_ts2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_service_dart.svg b/img/browser/file_type_ng_service_dart.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_service_dart.svg
rename to img/browser/file_type_ng_service_dart.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_service_js.svg b/img/browser/file_type_ng_service_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_service_js.svg
rename to img/browser/file_type_ng_service_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_service_js2.svg b/img/browser/file_type_ng_service_js2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_service_js2.svg
rename to img/browser/file_type_ng_service_js2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_service_ts.svg b/img/browser/file_type_ng_service_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_service_ts.svg
rename to img/browser/file_type_ng_service_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_service_ts2.svg b/img/browser/file_type_ng_service_ts2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_service_ts2.svg
rename to img/browser/file_type_ng_service_ts2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_smart_component_dart.svg b/img/browser/file_type_ng_smart_component_dart.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_smart_component_dart.svg
rename to img/browser/file_type_ng_smart_component_dart.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_smart_component_js.svg b/img/browser/file_type_ng_smart_component_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_smart_component_js.svg
rename to img/browser/file_type_ng_smart_component_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_smart_component_js2.svg b/img/browser/file_type_ng_smart_component_js2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_smart_component_js2.svg
rename to img/browser/file_type_ng_smart_component_js2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_smart_component_ts.svg b/img/browser/file_type_ng_smart_component_ts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_smart_component_ts.svg
rename to img/browser/file_type_ng_smart_component_ts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_smart_component_ts2.svg b/img/browser/file_type_ng_smart_component_ts2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_smart_component_ts2.svg
rename to img/browser/file_type_ng_smart_component_ts2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_tailwind.svg b/img/browser/file_type_ng_tailwind.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ng_tailwind.svg
rename to img/browser/file_type_ng_tailwind.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nginx.svg b/img/browser/file_type_nginx.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nginx.svg
rename to img/browser/file_type_nginx.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nim.svg b/img/browser/file_type_nim.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nim.svg
rename to img/browser/file_type_nim.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nimble.svg b/img/browser/file_type_nimble.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nimble.svg
rename to img/browser/file_type_nimble.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ninja.svg b/img/browser/file_type_ninja.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ninja.svg
rename to img/browser/file_type_ninja.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nix.svg b/img/browser/file_type_nix.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nix.svg
rename to img/browser/file_type_nix.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_njsproj.svg b/img/browser/file_type_njsproj.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_njsproj.svg
rename to img/browser/file_type_njsproj.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_noc.svg b/img/browser/file_type_noc.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_noc.svg
rename to img/browser/file_type_noc.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_node.svg b/img/browser/file_type_node.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_node.svg
rename to img/browser/file_type_node.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_node2.svg b/img/browser/file_type_node2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_node2.svg
rename to img/browser/file_type_node2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nodemon.svg b/img/browser/file_type_nodemon.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nodemon.svg
rename to img/browser/file_type_nodemon.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_npm.svg b/img/browser/file_type_npm.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_npm.svg
rename to img/browser/file_type_npm.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nsi.svg b/img/browser/file_type_nsi.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nsi.svg
rename to img/browser/file_type_nsi.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nsri-integrity.svg b/img/browser/file_type_nsri-integrity.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nsri-integrity.svg
rename to img/browser/file_type_nsri-integrity.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nsri.svg b/img/browser/file_type_nsri.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nsri.svg
rename to img/browser/file_type_nsri.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nuget.svg b/img/browser/file_type_nuget.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nuget.svg
rename to img/browser/file_type_nuget.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_numpy.svg b/img/browser/file_type_numpy.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_numpy.svg
rename to img/browser/file_type_numpy.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nunjucks.svg b/img/browser/file_type_nunjucks.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nunjucks.svg
rename to img/browser/file_type_nunjucks.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nuxt.svg b/img/browser/file_type_nuxt.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nuxt.svg
rename to img/browser/file_type_nuxt.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nx.svg b/img/browser/file_type_nx.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nx.svg
rename to img/browser/file_type_nx.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nyc.svg b/img/browser/file_type_nyc.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_nyc.svg
rename to img/browser/file_type_nyc.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_objectivec.svg b/img/browser/file_type_objectivec.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_objectivec.svg
rename to img/browser/file_type_objectivec.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_objectivecpp.svg b/img/browser/file_type_objectivecpp.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_objectivecpp.svg
rename to img/browser/file_type_objectivecpp.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_objidconfig.svg b/img/browser/file_type_objidconfig.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_objidconfig.svg
rename to img/browser/file_type_objidconfig.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ocaml.svg b/img/browser/file_type_ocaml.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ocaml.svg
rename to img/browser/file_type_ocaml.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ogone.svg b/img/browser/file_type_ogone.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ogone.svg
rename to img/browser/file_type_ogone.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_onenote.svg b/img/browser/file_type_onenote.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_onenote.svg
rename to img/browser/file_type_onenote.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_openHAB.svg b/img/browser/file_type_openHAB.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_openHAB.svg
rename to img/browser/file_type_openHAB.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_opencl.svg b/img/browser/file_type_opencl.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_opencl.svg
rename to img/browser/file_type_opencl.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_openscad.svg b/img/browser/file_type_openscad.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_openscad.svg
rename to img/browser/file_type_openscad.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_org.svg b/img/browser/file_type_org.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_org.svg
rename to img/browser/file_type_org.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_outlook.svg b/img/browser/file_type_outlook.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_outlook.svg
rename to img/browser/file_type_outlook.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ovpn.svg b/img/browser/file_type_ovpn.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ovpn.svg
rename to img/browser/file_type_ovpn.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_package.svg b/img/browser/file_type_package.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_package.svg
rename to img/browser/file_type_package.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_paket.svg b/img/browser/file_type_paket.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_paket.svg
rename to img/browser/file_type_paket.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_patch.svg b/img/browser/file_type_patch.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_patch.svg
rename to img/browser/file_type_patch.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pcl.svg b/img/browser/file_type_pcl.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pcl.svg
rename to img/browser/file_type_pcl.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pddl.svg b/img/browser/file_type_pddl.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pddl.svg
rename to img/browser/file_type_pddl.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pddl_happenings.svg b/img/browser/file_type_pddl_happenings.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pddl_happenings.svg
rename to img/browser/file_type_pddl_happenings.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pddl_plan.svg b/img/browser/file_type_pddl_plan.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pddl_plan.svg
rename to img/browser/file_type_pddl_plan.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pdf.svg b/img/browser/file_type_pdf.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pdf.svg
rename to img/browser/file_type_pdf.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pdf2.svg b/img/browser/file_type_pdf2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pdf2.svg
rename to img/browser/file_type_pdf2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_peeky.svg b/img/browser/file_type_peeky.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_peeky.svg
rename to img/browser/file_type_peeky.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_perl.svg b/img/browser/file_type_perl.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_perl.svg
rename to img/browser/file_type_perl.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_perl2.svg b/img/browser/file_type_perl2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_perl2.svg
rename to img/browser/file_type_perl2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_perl6.svg b/img/browser/file_type_perl6.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_perl6.svg
rename to img/browser/file_type_perl6.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pgsql.svg b/img/browser/file_type_pgsql.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pgsql.svg
rename to img/browser/file_type_pgsql.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_photoshop.svg b/img/browser/file_type_photoshop.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_photoshop.svg
rename to img/browser/file_type_photoshop.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_photoshop2.svg b/img/browser/file_type_photoshop2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_photoshop2.svg
rename to img/browser/file_type_photoshop2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_php.svg b/img/browser/file_type_php.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_php.svg
rename to img/browser/file_type_php.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_php2.svg b/img/browser/file_type_php2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_php2.svg
rename to img/browser/file_type_php2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_php3.svg b/img/browser/file_type_php3.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_php3.svg
rename to img/browser/file_type_php3.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_phpcsfixer.svg b/img/browser/file_type_phpcsfixer.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_phpcsfixer.svg
rename to img/browser/file_type_phpcsfixer.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_phpstan.svg b/img/browser/file_type_phpstan.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_phpstan.svg
rename to img/browser/file_type_phpstan.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_phpunit.svg b/img/browser/file_type_phpunit.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_phpunit.svg
rename to img/browser/file_type_phpunit.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_phraseapp.svg b/img/browser/file_type_phraseapp.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_phraseapp.svg
rename to img/browser/file_type_phraseapp.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pine.svg b/img/browser/file_type_pine.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pine.svg
rename to img/browser/file_type_pine.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pip.svg b/img/browser/file_type_pip.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pip.svg
rename to img/browser/file_type_pip.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pipeline.svg b/img/browser/file_type_pipeline.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pipeline.svg
rename to img/browser/file_type_pipeline.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plantuml.svg b/img/browser/file_type_plantuml.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plantuml.svg
rename to img/browser/file_type_plantuml.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_platformio.svg b/img/browser/file_type_platformio.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_platformio.svg
rename to img/browser/file_type_platformio.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_playwright.svg b/img/browser/file_type_playwright.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_playwright.svg
rename to img/browser/file_type_playwright.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plsql.svg b/img/browser/file_type_plsql.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plsql.svg
rename to img/browser/file_type_plsql.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plsql_package.svg b/img/browser/file_type_plsql_package.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plsql_package.svg
rename to img/browser/file_type_plsql_package.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plsql_package_body.svg b/img/browser/file_type_plsql_package_body.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plsql_package_body.svg
rename to img/browser/file_type_plsql_package_body.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plsql_package_header.svg b/img/browser/file_type_plsql_package_header.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plsql_package_header.svg
rename to img/browser/file_type_plsql_package_header.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plsql_package_spec.svg b/img/browser/file_type_plsql_package_spec.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_plsql_package_spec.svg
rename to img/browser/file_type_plsql_package_spec.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pm2.svg b/img/browser/file_type_pm2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pm2.svg
rename to img/browser/file_type_pm2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pnpm.svg b/img/browser/file_type_pnpm.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pnpm.svg
rename to img/browser/file_type_pnpm.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_poedit.svg b/img/browser/file_type_poedit.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_poedit.svg
rename to img/browser/file_type_poedit.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_poetry.svg b/img/browser/file_type_poetry.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_poetry.svg
rename to img/browser/file_type_poetry.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_polymer.svg b/img/browser/file_type_polymer.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_polymer.svg
rename to img/browser/file_type_polymer.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pony.svg b/img/browser/file_type_pony.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pony.svg
rename to img/browser/file_type_pony.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_postcss.svg b/img/browser/file_type_postcss.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_postcss.svg
rename to img/browser/file_type_postcss.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_postcssconfig.svg b/img/browser/file_type_postcssconfig.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_postcssconfig.svg
rename to img/browser/file_type_postcssconfig.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powerpoint.svg b/img/browser/file_type_powerpoint.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powerpoint.svg
rename to img/browser/file_type_powerpoint.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powerpoint2.svg b/img/browser/file_type_powerpoint2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powerpoint2.svg
rename to img/browser/file_type_powerpoint2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell.svg b/img/browser/file_type_powershell.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell.svg
rename to img/browser/file_type_powershell.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell2.svg b/img/browser/file_type_powershell2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell2.svg
rename to img/browser/file_type_powershell2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_format.svg b/img/browser/file_type_powershell_format.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_format.svg
rename to img/browser/file_type_powershell_format.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_psd.svg b/img/browser/file_type_powershell_psd.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_psd.svg
rename to img/browser/file_type_powershell_psd.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_psd2.svg b/img/browser/file_type_powershell_psd2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_psd2.svg
rename to img/browser/file_type_powershell_psd2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_psm.svg b/img/browser/file_type_powershell_psm.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_psm.svg
rename to img/browser/file_type_powershell_psm.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_psm2.svg b/img/browser/file_type_powershell_psm2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_psm2.svg
rename to img/browser/file_type_powershell_psm2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_types.svg b/img/browser/file_type_powershell_types.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_powershell_types.svg
rename to img/browser/file_type_powershell_types.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_preact.svg b/img/browser/file_type_preact.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_preact.svg
rename to img/browser/file_type_preact.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_precommit.svg b/img/browser/file_type_precommit.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_precommit.svg
rename to img/browser/file_type_precommit.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_prettier.svg b/img/browser/file_type_prettier.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_prettier.svg
rename to img/browser/file_type_prettier.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_prisma.svg b/img/browser/file_type_prisma.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_prisma.svg
rename to img/browser/file_type_prisma.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_processinglang.svg b/img/browser/file_type_processinglang.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_processinglang.svg
rename to img/browser/file_type_processinglang.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_procfile.svg b/img/browser/file_type_procfile.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_procfile.svg
rename to img/browser/file_type_procfile.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_progress.svg b/img/browser/file_type_progress.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_progress.svg
rename to img/browser/file_type_progress.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_prolog.svg b/img/browser/file_type_prolog.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_prolog.svg
rename to img/browser/file_type_prolog.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_prometheus.svg b/img/browser/file_type_prometheus.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_prometheus.svg
rename to img/browser/file_type_prometheus.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_protobuf.svg b/img/browser/file_type_protobuf.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_protobuf.svg
rename to img/browser/file_type_protobuf.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_protractor.svg b/img/browser/file_type_protractor.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_protractor.svg
rename to img/browser/file_type_protractor.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_publisher.svg b/img/browser/file_type_publisher.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_publisher.svg
rename to img/browser/file_type_publisher.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pug.svg b/img/browser/file_type_pug.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pug.svg
rename to img/browser/file_type_pug.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pulumi.svg b/img/browser/file_type_pulumi.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pulumi.svg
rename to img/browser/file_type_pulumi.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_puppet.svg b/img/browser/file_type_puppet.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_puppet.svg
rename to img/browser/file_type_puppet.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_purescript.svg b/img/browser/file_type_purescript.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_purescript.svg
rename to img/browser/file_type_purescript.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pyret.svg b/img/browser/file_type_pyret.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pyret.svg
rename to img/browser/file_type_pyret.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_python.svg b/img/browser/file_type_python.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_python.svg
rename to img/browser/file_type_python.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pythowo.svg b/img/browser/file_type_pythowo.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pythowo.svg
rename to img/browser/file_type_pythowo.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pytyped.svg b/img/browser/file_type_pytyped.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pytyped.svg
rename to img/browser/file_type_pytyped.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pyup.svg b/img/browser/file_type_pyup.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_pyup.svg
rename to img/browser/file_type_pyup.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_q.svg b/img/browser/file_type_q.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_q.svg
rename to img/browser/file_type_q.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_qbs.svg b/img/browser/file_type_qbs.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_qbs.svg
rename to img/browser/file_type_qbs.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_qlikview.svg b/img/browser/file_type_qlikview.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_qlikview.svg
rename to img/browser/file_type_qlikview.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_qml.svg b/img/browser/file_type_qml.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_qml.svg
rename to img/browser/file_type_qml.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_qmldir.svg b/img/browser/file_type_qmldir.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_qmldir.svg
rename to img/browser/file_type_qmldir.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_qsharp.svg b/img/browser/file_type_qsharp.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_qsharp.svg
rename to img/browser/file_type_qsharp.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_quasar.svg b/img/browser/file_type_quasar.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_quasar.svg
rename to img/browser/file_type_quasar.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_r.svg b/img/browser/file_type_r.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_r.svg
rename to img/browser/file_type_r.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_racket.svg b/img/browser/file_type_racket.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_racket.svg
rename to img/browser/file_type_racket.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rails.svg b/img/browser/file_type_rails.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rails.svg
rename to img/browser/file_type_rails.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rake.svg b/img/browser/file_type_rake.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rake.svg
rename to img/browser/file_type_rake.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_raml.svg b/img/browser/file_type_raml.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_raml.svg
rename to img/browser/file_type_raml.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_razor.svg b/img/browser/file_type_razor.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_razor.svg
rename to img/browser/file_type_razor.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_razzle.svg b/img/browser/file_type_razzle.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_razzle.svg
rename to img/browser/file_type_razzle.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_reactjs.svg b/img/browser/file_type_reactjs.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_reactjs.svg
rename to img/browser/file_type_reactjs.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_reacttemplate.svg b/img/browser/file_type_reacttemplate.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_reacttemplate.svg
rename to img/browser/file_type_reacttemplate.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_reactts.svg b/img/browser/file_type_reactts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_reactts.svg
rename to img/browser/file_type_reactts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_reason.svg b/img/browser/file_type_reason.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_reason.svg
rename to img/browser/file_type_reason.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_red.svg b/img/browser/file_type_red.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_red.svg
rename to img/browser/file_type_red.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_registry.svg b/img/browser/file_type_registry.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_registry.svg
rename to img/browser/file_type_registry.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rego.svg b/img/browser/file_type_rego.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rego.svg
rename to img/browser/file_type_rego.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rehype.svg b/img/browser/file_type_rehype.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rehype.svg
rename to img/browser/file_type_rehype.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_remark.svg b/img/browser/file_type_remark.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_remark.svg
rename to img/browser/file_type_remark.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_renovate.svg b/img/browser/file_type_renovate.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_renovate.svg
rename to img/browser/file_type_renovate.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_replit.svg b/img/browser/file_type_replit.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_replit.svg
rename to img/browser/file_type_replit.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rescript.svg b/img/browser/file_type_rescript.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rescript.svg
rename to img/browser/file_type_rescript.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rest.svg b/img/browser/file_type_rest.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rest.svg
rename to img/browser/file_type_rest.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_retext.svg b/img/browser/file_type_retext.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_retext.svg
rename to img/browser/file_type_retext.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rexx.svg b/img/browser/file_type_rexx.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rexx.svg
rename to img/browser/file_type_rexx.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_riot.svg b/img/browser/file_type_riot.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_riot.svg
rename to img/browser/file_type_riot.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rmd.svg b/img/browser/file_type_rmd.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rmd.svg
rename to img/browser/file_type_rmd.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_robotframework.svg b/img/browser/file_type_robotframework.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_robotframework.svg
rename to img/browser/file_type_robotframework.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_robots.svg b/img/browser/file_type_robots.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_robots.svg
rename to img/browser/file_type_robots.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rollup.svg b/img/browser/file_type_rollup.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rollup.svg
rename to img/browser/file_type_rollup.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rome.svg b/img/browser/file_type_rome.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rome.svg
rename to img/browser/file_type_rome.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ron.svg b/img/browser/file_type_ron.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ron.svg
rename to img/browser/file_type_ron.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rproj.svg b/img/browser/file_type_rproj.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rproj.svg
rename to img/browser/file_type_rproj.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rspec.svg b/img/browser/file_type_rspec.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rspec.svg
rename to img/browser/file_type_rspec.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rubocop.svg b/img/browser/file_type_rubocop.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rubocop.svg
rename to img/browser/file_type_rubocop.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ruby.svg b/img/browser/file_type_ruby.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ruby.svg
rename to img/browser/file_type_ruby.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rust.svg b/img/browser/file_type_rust.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rust.svg
rename to img/browser/file_type_rust.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rust_toolchain.svg b/img/browser/file_type_rust_toolchain.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_rust_toolchain.svg
rename to img/browser/file_type_rust_toolchain.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sails.svg b/img/browser/file_type_sails.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sails.svg
rename to img/browser/file_type_sails.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_saltstack.svg b/img/browser/file_type_saltstack.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_saltstack.svg
rename to img/browser/file_type_saltstack.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_san.svg b/img/browser/file_type_san.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_san.svg
rename to img/browser/file_type_san.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sapphire_framework_cli.svg b/img/browser/file_type_sapphire_framework_cli.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sapphire_framework_cli.svg
rename to img/browser/file_type_sapphire_framework_cli.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sas.svg b/img/browser/file_type_sas.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sas.svg
rename to img/browser/file_type_sas.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sass.svg b/img/browser/file_type_sass.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sass.svg
rename to img/browser/file_type_sass.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sbt.svg b/img/browser/file_type_sbt.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sbt.svg
rename to img/browser/file_type_sbt.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_scala.svg b/img/browser/file_type_scala.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_scala.svg
rename to img/browser/file_type_scala.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_scilab.svg b/img/browser/file_type_scilab.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_scilab.svg
rename to img/browser/file_type_scilab.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_script.svg b/img/browser/file_type_script.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_script.svg
rename to img/browser/file_type_script.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_scss.svg b/img/browser/file_type_scss.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_scss.svg
rename to img/browser/file_type_scss.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_scss2.svg b/img/browser/file_type_scss2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_scss2.svg
rename to img/browser/file_type_scss2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sdlang.svg b/img/browser/file_type_sdlang.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sdlang.svg
rename to img/browser/file_type_sdlang.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sentry.svg b/img/browser/file_type_sentry.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sentry.svg
rename to img/browser/file_type_sentry.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sequelize.svg b/img/browser/file_type_sequelize.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sequelize.svg
rename to img/browser/file_type_sequelize.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_serverless.svg b/img/browser/file_type_serverless.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_serverless.svg
rename to img/browser/file_type_serverless.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_shaderlab.svg b/img/browser/file_type_shaderlab.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_shaderlab.svg
rename to img/browser/file_type_shaderlab.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_shell.svg b/img/browser/file_type_shell.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_shell.svg
rename to img/browser/file_type_shell.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_shellcheck.svg b/img/browser/file_type_shellcheck.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_shellcheck.svg
rename to img/browser/file_type_shellcheck.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_shuttle.svg b/img/browser/file_type_shuttle.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_shuttle.svg
rename to img/browser/file_type_shuttle.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_silverstripe.svg b/img/browser/file_type_silverstripe.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_silverstripe.svg
rename to img/browser/file_type_silverstripe.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_siyuan.svg b/img/browser/file_type_siyuan.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_siyuan.svg
rename to img/browser/file_type_siyuan.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sketch.svg b/img/browser/file_type_sketch.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sketch.svg
rename to img/browser/file_type_sketch.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_skipper.svg b/img/browser/file_type_skipper.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_skipper.svg
rename to img/browser/file_type_skipper.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_slang.svg b/img/browser/file_type_slang.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_slang.svg
rename to img/browser/file_type_slang.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_slashup.svg b/img/browser/file_type_slashup.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_slashup.svg
rename to img/browser/file_type_slashup.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_slice.svg b/img/browser/file_type_slice.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_slice.svg
rename to img/browser/file_type_slice.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_slim.svg b/img/browser/file_type_slim.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_slim.svg
rename to img/browser/file_type_slim.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sln.svg b/img/browser/file_type_sln.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sln.svg
rename to img/browser/file_type_sln.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sln2.svg b/img/browser/file_type_sln2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sln2.svg
rename to img/browser/file_type_sln2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_smarty.svg b/img/browser/file_type_smarty.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_smarty.svg
rename to img/browser/file_type_smarty.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_snapcraft.svg b/img/browser/file_type_snapcraft.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_snapcraft.svg
rename to img/browser/file_type_snapcraft.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_snort.svg b/img/browser/file_type_snort.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_snort.svg
rename to img/browser/file_type_snort.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_snyk.svg b/img/browser/file_type_snyk.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_snyk.svg
rename to img/browser/file_type_snyk.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_solidarity.svg b/img/browser/file_type_solidarity.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_solidarity.svg
rename to img/browser/file_type_solidarity.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_solidity.svg b/img/browser/file_type_solidity.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_solidity.svg
rename to img/browser/file_type_solidity.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_source.svg b/img/browser/file_type_source.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_source.svg
rename to img/browser/file_type_source.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_spacengine.svg b/img/browser/file_type_spacengine.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_spacengine.svg
rename to img/browser/file_type_spacengine.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sparql.svg b/img/browser/file_type_sparql.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sparql.svg
rename to img/browser/file_type_sparql.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sqf.svg b/img/browser/file_type_sqf.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sqf.svg
rename to img/browser/file_type_sqf.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sql.svg b/img/browser/file_type_sql.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sql.svg
rename to img/browser/file_type_sql.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sqlite.svg b/img/browser/file_type_sqlite.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sqlite.svg
rename to img/browser/file_type_sqlite.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_squirrel.svg b/img/browser/file_type_squirrel.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_squirrel.svg
rename to img/browser/file_type_squirrel.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sss.svg b/img/browser/file_type_sss.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_sss.svg
rename to img/browser/file_type_sss.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stan.svg b/img/browser/file_type_stan.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stan.svg
rename to img/browser/file_type_stan.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stata.svg b/img/browser/file_type_stata.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stata.svg
rename to img/browser/file_type_stata.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stencil.svg b/img/browser/file_type_stencil.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stencil.svg
rename to img/browser/file_type_stencil.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_storyboard.svg b/img/browser/file_type_storyboard.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_storyboard.svg
rename to img/browser/file_type_storyboard.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_storybook.svg b/img/browser/file_type_storybook.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_storybook.svg
rename to img/browser/file_type_storybook.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stryker.svg b/img/browser/file_type_stryker.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stryker.svg
rename to img/browser/file_type_stryker.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stylable.svg b/img/browser/file_type_stylable.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stylable.svg
rename to img/browser/file_type_stylable.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_style.svg b/img/browser/file_type_style.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_style.svg
rename to img/browser/file_type_style.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_styled.svg b/img/browser/file_type_styled.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_styled.svg
rename to img/browser/file_type_styled.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stylelint.svg b/img/browser/file_type_stylelint.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stylelint.svg
rename to img/browser/file_type_stylelint.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stylish_haskell.svg b/img/browser/file_type_stylish_haskell.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stylish_haskell.svg
rename to img/browser/file_type_stylish_haskell.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stylus.svg b/img/browser/file_type_stylus.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_stylus.svg
rename to img/browser/file_type_stylus.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_subversion.svg b/img/browser/file_type_subversion.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_subversion.svg
rename to img/browser/file_type_subversion.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_svelte.svg b/img/browser/file_type_svelte.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_svelte.svg
rename to img/browser/file_type_svelte.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_svg.svg b/img/browser/file_type_svg.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_svg.svg
rename to img/browser/file_type_svg.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_swagger.svg b/img/browser/file_type_swagger.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_swagger.svg
rename to img/browser/file_type_swagger.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_swift.svg b/img/browser/file_type_swift.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_swift.svg
rename to img/browser/file_type_swift.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_swig.svg b/img/browser/file_type_swig.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_swig.svg
rename to img/browser/file_type_swig.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_symfony.svg b/img/browser/file_type_symfony.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_symfony.svg
rename to img/browser/file_type_symfony.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_systemd.svg b/img/browser/file_type_systemd.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_systemd.svg
rename to img/browser/file_type_systemd.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_systemverilog.svg b/img/browser/file_type_systemverilog.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_systemverilog.svg
rename to img/browser/file_type_systemverilog.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_t4tt.svg b/img/browser/file_type_t4tt.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_t4tt.svg
rename to img/browser/file_type_t4tt.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tailwind.svg b/img/browser/file_type_tailwind.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tailwind.svg
rename to img/browser/file_type_tailwind.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tauri.svg b/img/browser/file_type_tauri.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tauri.svg
rename to img/browser/file_type_tauri.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tcl.svg b/img/browser/file_type_tcl.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tcl.svg
rename to img/browser/file_type_tcl.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_teal.svg b/img/browser/file_type_teal.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_teal.svg
rename to img/browser/file_type_teal.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tera.svg b/img/browser/file_type_tera.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tera.svg
rename to img/browser/file_type_tera.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_terraform.svg b/img/browser/file_type_terraform.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_terraform.svg
rename to img/browser/file_type_terraform.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_test.svg b/img/browser/file_type_test.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_test.svg
rename to img/browser/file_type_test.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_testcafe.svg b/img/browser/file_type_testcafe.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_testcafe.svg
rename to img/browser/file_type_testcafe.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_testjs.svg b/img/browser/file_type_testjs.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_testjs.svg
rename to img/browser/file_type_testjs.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_testts.svg b/img/browser/file_type_testts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_testts.svg
rename to img/browser/file_type_testts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tex.svg b/img/browser/file_type_tex.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tex.svg
rename to img/browser/file_type_tex.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_text.svg b/img/browser/file_type_text.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_text.svg
rename to img/browser/file_type_text.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_textile.svg b/img/browser/file_type_textile.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_textile.svg
rename to img/browser/file_type_textile.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tfs.svg b/img/browser/file_type_tfs.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tfs.svg
rename to img/browser/file_type_tfs.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tiltfile.svg b/img/browser/file_type_tiltfile.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tiltfile.svg
rename to img/browser/file_type_tiltfile.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_todo.svg b/img/browser/file_type_todo.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_todo.svg
rename to img/browser/file_type_todo.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_toit.svg b/img/browser/file_type_toit.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_toit.svg
rename to img/browser/file_type_toit.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_toml.svg b/img/browser/file_type_toml.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_toml.svg
rename to img/browser/file_type_toml.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tox.svg b/img/browser/file_type_tox.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tox.svg
rename to img/browser/file_type_tox.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_travis.svg b/img/browser/file_type_travis.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_travis.svg
rename to img/browser/file_type_travis.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tree.svg b/img/browser/file_type_tree.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tree.svg
rename to img/browser/file_type_tree.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tres.svg b/img/browser/file_type_tres.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tres.svg
rename to img/browser/file_type_tres.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_truffle.svg b/img/browser/file_type_truffle.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_truffle.svg
rename to img/browser/file_type_truffle.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_trunk.svg b/img/browser/file_type_trunk.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_trunk.svg
rename to img/browser/file_type_trunk.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tscn.svg b/img/browser/file_type_tscn.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tscn.svg
rename to img/browser/file_type_tscn.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tsconfig.svg b/img/browser/file_type_tsconfig.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tsconfig.svg
rename to img/browser/file_type_tsconfig.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tsconfig_official.svg b/img/browser/file_type_tsconfig_official.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tsconfig_official.svg
rename to img/browser/file_type_tsconfig_official.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tslint.svg b/img/browser/file_type_tslint.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tslint.svg
rename to img/browser/file_type_tslint.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tt.svg b/img/browser/file_type_tt.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tt.svg
rename to img/browser/file_type_tt.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ttcn.svg b/img/browser/file_type_ttcn.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_ttcn.svg
rename to img/browser/file_type_ttcn.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tuc.svg b/img/browser/file_type_tuc.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_tuc.svg
rename to img/browser/file_type_tuc.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_turbo.svg b/img/browser/file_type_turbo.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_turbo.svg
rename to img/browser/file_type_turbo.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_twig.svg b/img/browser/file_type_twig.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_twig.svg
rename to img/browser/file_type_twig.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typedoc.svg b/img/browser/file_type_typedoc.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typedoc.svg
rename to img/browser/file_type_typedoc.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typescript.svg b/img/browser/file_type_typescript.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typescript.svg
rename to img/browser/file_type_typescript.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typescript_official.svg b/img/browser/file_type_typescript_official.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typescript_official.svg
rename to img/browser/file_type_typescript_official.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typescriptdef.svg b/img/browser/file_type_typescriptdef.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typescriptdef.svg
rename to img/browser/file_type_typescriptdef.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typescriptdef_official.svg b/img/browser/file_type_typescriptdef_official.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typescriptdef_official.svg
rename to img/browser/file_type_typescriptdef_official.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typo3.svg b/img/browser/file_type_typo3.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_typo3.svg
rename to img/browser/file_type_typo3.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_unibeautify.svg b/img/browser/file_type_unibeautify.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_unibeautify.svg
rename to img/browser/file_type_unibeautify.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_unison.svg b/img/browser/file_type_unison.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_unison.svg
rename to img/browser/file_type_unison.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_unlicense.svg b/img/browser/file_type_unlicense.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_unlicense.svg
rename to img/browser/file_type_unlicense.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vagrant.svg b/img/browser/file_type_vagrant.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vagrant.svg
rename to img/browser/file_type_vagrant.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vala.svg b/img/browser/file_type_vala.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vala.svg
rename to img/browser/file_type_vala.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vanilla_extract.svg b/img/browser/file_type_vanilla_extract.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vanilla_extract.svg
rename to img/browser/file_type_vanilla_extract.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vapi.svg b/img/browser/file_type_vapi.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vapi.svg
rename to img/browser/file_type_vapi.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vapor.svg b/img/browser/file_type_vapor.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vapor.svg
rename to img/browser/file_type_vapor.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vash.svg b/img/browser/file_type_vash.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vash.svg
rename to img/browser/file_type_vash.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vb.svg b/img/browser/file_type_vb.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vb.svg
rename to img/browser/file_type_vb.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vba.svg b/img/browser/file_type_vba.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vba.svg
rename to img/browser/file_type_vba.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vbhtml.svg b/img/browser/file_type_vbhtml.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vbhtml.svg
rename to img/browser/file_type_vbhtml.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vbproj.svg b/img/browser/file_type_vbproj.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vbproj.svg
rename to img/browser/file_type_vbproj.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vcxproj.svg b/img/browser/file_type_vcxproj.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vcxproj.svg
rename to img/browser/file_type_vcxproj.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_velocity.svg b/img/browser/file_type_velocity.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_velocity.svg
rename to img/browser/file_type_velocity.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_verilog.svg b/img/browser/file_type_verilog.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_verilog.svg
rename to img/browser/file_type_verilog.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vhdl.svg b/img/browser/file_type_vhdl.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vhdl.svg
rename to img/browser/file_type_vhdl.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_video.svg b/img/browser/file_type_video.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_video.svg
rename to img/browser/file_type_video.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_view.svg b/img/browser/file_type_view.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_view.svg
rename to img/browser/file_type_view.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vim.svg b/img/browser/file_type_vim.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vim.svg
rename to img/browser/file_type_vim.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vite.svg b/img/browser/file_type_vite.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vite.svg
rename to img/browser/file_type_vite.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vitest.svg b/img/browser/file_type_vitest.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vitest.svg
rename to img/browser/file_type_vitest.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vlang.svg b/img/browser/file_type_vlang.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vlang.svg
rename to img/browser/file_type_vlang.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_volt.svg b/img/browser/file_type_volt.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_volt.svg
rename to img/browser/file_type_volt.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vscode-insiders.svg b/img/browser/file_type_vscode-insiders.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vscode-insiders.svg
rename to img/browser/file_type_vscode-insiders.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vscode.svg b/img/browser/file_type_vscode.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vscode.svg
rename to img/browser/file_type_vscode.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vscode2.svg b/img/browser/file_type_vscode2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vscode2.svg
rename to img/browser/file_type_vscode2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vscode3.svg b/img/browser/file_type_vscode3.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vscode3.svg
rename to img/browser/file_type_vscode3.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vsix.svg b/img/browser/file_type_vsix.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vsix.svg
rename to img/browser/file_type_vsix.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vsixmanifest.svg b/img/browser/file_type_vsixmanifest.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vsixmanifest.svg
rename to img/browser/file_type_vsixmanifest.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vue.svg b/img/browser/file_type_vue.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vue.svg
rename to img/browser/file_type_vue.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vueconfig.svg b/img/browser/file_type_vueconfig.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_vueconfig.svg
rename to img/browser/file_type_vueconfig.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wallaby.svg b/img/browser/file_type_wallaby.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wallaby.svg
rename to img/browser/file_type_wallaby.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wally.svg b/img/browser/file_type_wally.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wally.svg
rename to img/browser/file_type_wally.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wasm.svg b/img/browser/file_type_wasm.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wasm.svg
rename to img/browser/file_type_wasm.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_watchmanconfig.svg b/img/browser/file_type_watchmanconfig.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_watchmanconfig.svg
rename to img/browser/file_type_watchmanconfig.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_webpack.svg b/img/browser/file_type_webpack.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_webpack.svg
rename to img/browser/file_type_webpack.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wenyan.svg b/img/browser/file_type_wenyan.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wenyan.svg
rename to img/browser/file_type_wenyan.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wercker.svg b/img/browser/file_type_wercker.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wercker.svg
rename to img/browser/file_type_wercker.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wgsl.svg b/img/browser/file_type_wgsl.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wgsl.svg
rename to img/browser/file_type_wgsl.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wikitext.svg b/img/browser/file_type_wikitext.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wikitext.svg
rename to img/browser/file_type_wikitext.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_windi.svg b/img/browser/file_type_windi.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_windi.svg
rename to img/browser/file_type_windi.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wolfram.svg b/img/browser/file_type_wolfram.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wolfram.svg
rename to img/browser/file_type_wolfram.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_word.svg b/img/browser/file_type_word.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_word.svg
rename to img/browser/file_type_word.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_word2.svg b/img/browser/file_type_word2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_word2.svg
rename to img/browser/file_type_word2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wpml.svg b/img/browser/file_type_wpml.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wpml.svg
rename to img/browser/file_type_wpml.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wurst.svg b/img/browser/file_type_wurst.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wurst.svg
rename to img/browser/file_type_wurst.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wxml.svg b/img/browser/file_type_wxml.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wxml.svg
rename to img/browser/file_type_wxml.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wxss.svg b/img/browser/file_type_wxss.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_wxss.svg
rename to img/browser/file_type_wxss.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xcode.svg b/img/browser/file_type_xcode.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xcode.svg
rename to img/browser/file_type_xcode.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xfl.svg b/img/browser/file_type_xfl.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xfl.svg
rename to img/browser/file_type_xfl.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xib.svg b/img/browser/file_type_xib.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xib.svg
rename to img/browser/file_type_xib.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xliff.svg b/img/browser/file_type_xliff.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xliff.svg
rename to img/browser/file_type_xliff.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xmake.svg b/img/browser/file_type_xmake.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xmake.svg
rename to img/browser/file_type_xmake.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xml.svg b/img/browser/file_type_xml.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xml.svg
rename to img/browser/file_type_xml.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xquery.svg b/img/browser/file_type_xquery.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xquery.svg
rename to img/browser/file_type_xquery.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xsl.svg b/img/browser/file_type_xsl.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_xsl.svg
rename to img/browser/file_type_xsl.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yacc.svg b/img/browser/file_type_yacc.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yacc.svg
rename to img/browser/file_type_yacc.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yaml.svg b/img/browser/file_type_yaml.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yaml.svg
rename to img/browser/file_type_yaml.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yamllint.svg b/img/browser/file_type_yamllint.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yamllint.svg
rename to img/browser/file_type_yamllint.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yandex.svg b/img/browser/file_type_yandex.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yandex.svg
rename to img/browser/file_type_yandex.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yang.svg b/img/browser/file_type_yang.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yang.svg
rename to img/browser/file_type_yang.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yarn.svg b/img/browser/file_type_yarn.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yarn.svg
rename to img/browser/file_type_yarn.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yeoman.svg b/img/browser/file_type_yeoman.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_yeoman.svg
rename to img/browser/file_type_yeoman.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_zeit.svg b/img/browser/file_type_zeit.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_zeit.svg
rename to img/browser/file_type_zeit.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_zig.svg b/img/browser/file_type_zig.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_zig.svg
rename to img/browser/file_type_zig.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_zip.svg b/img/browser/file_type_zip.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_zip.svg
rename to img/browser/file_type_zip.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_zip2.svg b/img/browser/file_type_zip2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/file_type_zip2.svg
rename to img/browser/file_type_zip2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_android.svg b/img/browser/folder_type_android.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_android.svg
rename to img/browser/folder_type_android.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_android_opened.svg b/img/browser/folder_type_android_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_android_opened.svg
rename to img/browser/folder_type_android_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_api.svg b/img/browser/folder_type_api.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_api.svg
rename to img/browser/folder_type_api.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_api_opened.svg b/img/browser/folder_type_api_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_api_opened.svg
rename to img/browser/folder_type_api_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_app.svg b/img/browser/folder_type_app.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_app.svg
rename to img/browser/folder_type_app.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_app_opened.svg b/img/browser/folder_type_app_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_app_opened.svg
rename to img/browser/folder_type_app_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_arangodb.svg b/img/browser/folder_type_arangodb.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_arangodb.svg
rename to img/browser/folder_type_arangodb.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_arangodb_opened.svg b/img/browser/folder_type_arangodb_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_arangodb_opened.svg
rename to img/browser/folder_type_arangodb_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_asset.svg b/img/browser/folder_type_asset.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_asset.svg
rename to img/browser/folder_type_asset.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_asset_opened.svg b/img/browser/folder_type_asset_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_asset_opened.svg
rename to img/browser/folder_type_asset_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_audio.svg b/img/browser/folder_type_audio.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_audio.svg
rename to img/browser/folder_type_audio.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_audio_opened.svg b/img/browser/folder_type_audio_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_audio_opened.svg
rename to img/browser/folder_type_audio_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_aurelia.svg b/img/browser/folder_type_aurelia.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_aurelia.svg
rename to img/browser/folder_type_aurelia.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_aurelia_opened.svg b/img/browser/folder_type_aurelia_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_aurelia_opened.svg
rename to img/browser/folder_type_aurelia_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_aws.svg b/img/browser/folder_type_aws.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_aws.svg
rename to img/browser/folder_type_aws.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_aws_opened.svg b/img/browser/folder_type_aws_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_aws_opened.svg
rename to img/browser/folder_type_aws_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_azure.svg b/img/browser/folder_type_azure.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_azure.svg
rename to img/browser/folder_type_azure.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_azure_opened.svg b/img/browser/folder_type_azure_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_azure_opened.svg
rename to img/browser/folder_type_azure_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_azurepipelines.svg b/img/browser/folder_type_azurepipelines.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_azurepipelines.svg
rename to img/browser/folder_type_azurepipelines.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_azurepipelines_opened.svg b/img/browser/folder_type_azurepipelines_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_azurepipelines_opened.svg
rename to img/browser/folder_type_azurepipelines_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_binary.svg b/img/browser/folder_type_binary.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_binary.svg
rename to img/browser/folder_type_binary.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_binary_opened.svg b/img/browser/folder_type_binary_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_binary_opened.svg
rename to img/browser/folder_type_binary_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bloc.svg b/img/browser/folder_type_bloc.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bloc.svg
rename to img/browser/folder_type_bloc.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bloc_opened.svg b/img/browser/folder_type_bloc_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bloc_opened.svg
rename to img/browser/folder_type_bloc_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_blueprint.svg b/img/browser/folder_type_blueprint.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_blueprint.svg
rename to img/browser/folder_type_blueprint.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_blueprint_opened.svg b/img/browser/folder_type_blueprint_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_blueprint_opened.svg
rename to img/browser/folder_type_blueprint_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bot.svg b/img/browser/folder_type_bot.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bot.svg
rename to img/browser/folder_type_bot.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bot_opened.svg b/img/browser/folder_type_bot_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bot_opened.svg
rename to img/browser/folder_type_bot_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bower.svg b/img/browser/folder_type_bower.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bower.svg
rename to img/browser/folder_type_bower.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bower_opened.svg b/img/browser/folder_type_bower_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_bower_opened.svg
rename to img/browser/folder_type_bower_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_buildkite.svg b/img/browser/folder_type_buildkite.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_buildkite.svg
rename to img/browser/folder_type_buildkite.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_buildkite_opened.svg b/img/browser/folder_type_buildkite_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_buildkite_opened.svg
rename to img/browser/folder_type_buildkite_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cake.svg b/img/browser/folder_type_cake.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cake.svg
rename to img/browser/folder_type_cake.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cake_opened.svg b/img/browser/folder_type_cake_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cake_opened.svg
rename to img/browser/folder_type_cake_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_certificate.svg b/img/browser/folder_type_certificate.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_certificate.svg
rename to img/browser/folder_type_certificate.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_certificate_opened.svg b/img/browser/folder_type_certificate_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_certificate_opened.svg
rename to img/browser/folder_type_certificate_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_chef.svg b/img/browser/folder_type_chef.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_chef.svg
rename to img/browser/folder_type_chef.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_chef_opened.svg b/img/browser/folder_type_chef_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_chef_opened.svg
rename to img/browser/folder_type_chef_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_circleci.svg b/img/browser/folder_type_circleci.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_circleci.svg
rename to img/browser/folder_type_circleci.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_circleci_opened.svg b/img/browser/folder_type_circleci_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_circleci_opened.svg
rename to img/browser/folder_type_circleci_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cli.svg b/img/browser/folder_type_cli.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cli.svg
rename to img/browser/folder_type_cli.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cli_opened.svg b/img/browser/folder_type_cli_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cli_opened.svg
rename to img/browser/folder_type_cli_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_client.svg b/img/browser/folder_type_client.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_client.svg
rename to img/browser/folder_type_client.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_client_opened.svg b/img/browser/folder_type_client_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_client_opened.svg
rename to img/browser/folder_type_client_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cmake.svg b/img/browser/folder_type_cmake.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cmake.svg
rename to img/browser/folder_type_cmake.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cmake_opened.svg b/img/browser/folder_type_cmake_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cmake_opened.svg
rename to img/browser/folder_type_cmake_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_common.svg b/img/browser/folder_type_common.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_common.svg
rename to img/browser/folder_type_common.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_common_opened.svg b/img/browser/folder_type_common_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_common_opened.svg
rename to img/browser/folder_type_common_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_component.svg b/img/browser/folder_type_component.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_component.svg
rename to img/browser/folder_type_component.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_component_opened.svg b/img/browser/folder_type_component_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_component_opened.svg
rename to img/browser/folder_type_component_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_composer.svg b/img/browser/folder_type_composer.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_composer.svg
rename to img/browser/folder_type_composer.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_composer_opened.svg b/img/browser/folder_type_composer_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_composer_opened.svg
rename to img/browser/folder_type_composer_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_config.svg b/img/browser/folder_type_config.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_config.svg
rename to img/browser/folder_type_config.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_config_opened.svg b/img/browser/folder_type_config_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_config_opened.svg
rename to img/browser/folder_type_config_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_controller.svg b/img/browser/folder_type_controller.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_controller.svg
rename to img/browser/folder_type_controller.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_controller_opened.svg b/img/browser/folder_type_controller_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_controller_opened.svg
rename to img/browser/folder_type_controller_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_coverage.svg b/img/browser/folder_type_coverage.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_coverage.svg
rename to img/browser/folder_type_coverage.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_coverage_opened.svg b/img/browser/folder_type_coverage_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_coverage_opened.svg
rename to img/browser/folder_type_coverage_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_css.svg b/img/browser/folder_type_css.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_css.svg
rename to img/browser/folder_type_css.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_css_opened.svg b/img/browser/folder_type_css_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_css_opened.svg
rename to img/browser/folder_type_css_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cubit.svg b/img/browser/folder_type_cubit.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cubit.svg
rename to img/browser/folder_type_cubit.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cubit_opened.svg b/img/browser/folder_type_cubit_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cubit_opened.svg
rename to img/browser/folder_type_cubit_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cypress.svg b/img/browser/folder_type_cypress.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cypress.svg
rename to img/browser/folder_type_cypress.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cypress_opened.svg b/img/browser/folder_type_cypress_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_cypress_opened.svg
rename to img/browser/folder_type_cypress_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dapr.svg b/img/browser/folder_type_dapr.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dapr.svg
rename to img/browser/folder_type_dapr.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dapr_opened.svg b/img/browser/folder_type_dapr_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dapr_opened.svg
rename to img/browser/folder_type_dapr_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_datadog.svg b/img/browser/folder_type_datadog.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_datadog.svg
rename to img/browser/folder_type_datadog.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_datadog_opened.svg b/img/browser/folder_type_datadog_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_datadog_opened.svg
rename to img/browser/folder_type_datadog_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_db.svg b/img/browser/folder_type_db.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_db.svg
rename to img/browser/folder_type_db.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_db_opened.svg b/img/browser/folder_type_db_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_db_opened.svg
rename to img/browser/folder_type_db_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_debian.svg b/img/browser/folder_type_debian.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_debian.svg
rename to img/browser/folder_type_debian.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_debian_opened.svg b/img/browser/folder_type_debian_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_debian_opened.svg
rename to img/browser/folder_type_debian_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dependabot.svg b/img/browser/folder_type_dependabot.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dependabot.svg
rename to img/browser/folder_type_dependabot.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dependabot_opened.svg b/img/browser/folder_type_dependabot_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dependabot_opened.svg
rename to img/browser/folder_type_dependabot_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_devcontainer.svg b/img/browser/folder_type_devcontainer.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_devcontainer.svg
rename to img/browser/folder_type_devcontainer.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_devcontainer_opened.svg b/img/browser/folder_type_devcontainer_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_devcontainer_opened.svg
rename to img/browser/folder_type_devcontainer_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dist.svg b/img/browser/folder_type_dist.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dist.svg
rename to img/browser/folder_type_dist.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dist_opened.svg b/img/browser/folder_type_dist_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_dist_opened.svg
rename to img/browser/folder_type_dist_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_docker.svg b/img/browser/folder_type_docker.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_docker.svg
rename to img/browser/folder_type_docker.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_docker_opened.svg b/img/browser/folder_type_docker_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_docker_opened.svg
rename to img/browser/folder_type_docker_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_docs.svg b/img/browser/folder_type_docs.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_docs.svg
rename to img/browser/folder_type_docs.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_docs_opened.svg b/img/browser/folder_type_docs_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_docs_opened.svg
rename to img/browser/folder_type_docs_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_e2e.svg b/img/browser/folder_type_e2e.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_e2e.svg
rename to img/browser/folder_type_e2e.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_e2e_opened.svg b/img/browser/folder_type_e2e_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_e2e_opened.svg
rename to img/browser/folder_type_e2e_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_elasticbeanstalk.svg b/img/browser/folder_type_elasticbeanstalk.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_elasticbeanstalk.svg
rename to img/browser/folder_type_elasticbeanstalk.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_elasticbeanstalk_opened.svg b/img/browser/folder_type_elasticbeanstalk_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_elasticbeanstalk_opened.svg
rename to img/browser/folder_type_elasticbeanstalk_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_electron.svg b/img/browser/folder_type_electron.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_electron.svg
rename to img/browser/folder_type_electron.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_electron_opened.svg b/img/browser/folder_type_electron_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_electron_opened.svg
rename to img/browser/folder_type_electron_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_expo.svg b/img/browser/folder_type_expo.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_expo.svg
rename to img/browser/folder_type_expo.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_expo_opened.svg b/img/browser/folder_type_expo_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_expo_opened.svg
rename to img/browser/folder_type_expo_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_favicon.svg b/img/browser/folder_type_favicon.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_favicon.svg
rename to img/browser/folder_type_favicon.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_favicon_opened.svg b/img/browser/folder_type_favicon_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_favicon_opened.svg
rename to img/browser/folder_type_favicon_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_flow.svg b/img/browser/folder_type_flow.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_flow.svg
rename to img/browser/folder_type_flow.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_flow_opened.svg b/img/browser/folder_type_flow_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_flow_opened.svg
rename to img/browser/folder_type_flow_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_fonts.svg b/img/browser/folder_type_fonts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_fonts.svg
rename to img/browser/folder_type_fonts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_fonts_opened.svg b/img/browser/folder_type_fonts_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_fonts_opened.svg
rename to img/browser/folder_type_fonts_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gcp.svg b/img/browser/folder_type_gcp.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gcp.svg
rename to img/browser/folder_type_gcp.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gcp_opened.svg b/img/browser/folder_type_gcp_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gcp_opened.svg
rename to img/browser/folder_type_gcp_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_git.svg b/img/browser/folder_type_git.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_git.svg
rename to img/browser/folder_type_git.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_git_opened.svg b/img/browser/folder_type_git_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_git_opened.svg
rename to img/browser/folder_type_git_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_github.svg b/img/browser/folder_type_github.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_github.svg
rename to img/browser/folder_type_github.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_github_opened.svg b/img/browser/folder_type_github_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_github_opened.svg
rename to img/browser/folder_type_github_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gitlab.svg b/img/browser/folder_type_gitlab.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gitlab.svg
rename to img/browser/folder_type_gitlab.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gitlab_opened.svg b/img/browser/folder_type_gitlab_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gitlab_opened.svg
rename to img/browser/folder_type_gitlab_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gradle.svg b/img/browser/folder_type_gradle.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gradle.svg
rename to img/browser/folder_type_gradle.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gradle_opened.svg b/img/browser/folder_type_gradle_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gradle_opened.svg
rename to img/browser/folder_type_gradle_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_graphql.svg b/img/browser/folder_type_graphql.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_graphql.svg
rename to img/browser/folder_type_graphql.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_graphql_opened.svg b/img/browser/folder_type_graphql_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_graphql_opened.svg
rename to img/browser/folder_type_graphql_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_grunt.svg b/img/browser/folder_type_grunt.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_grunt.svg
rename to img/browser/folder_type_grunt.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_grunt_opened.svg b/img/browser/folder_type_grunt_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_grunt_opened.svg
rename to img/browser/folder_type_grunt_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gulp.svg b/img/browser/folder_type_gulp.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gulp.svg
rename to img/browser/folder_type_gulp.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gulp_opened.svg b/img/browser/folder_type_gulp_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_gulp_opened.svg
rename to img/browser/folder_type_gulp_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_haxelib.svg b/img/browser/folder_type_haxelib.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_haxelib.svg
rename to img/browser/folder_type_haxelib.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_haxelib_opened.svg b/img/browser/folder_type_haxelib_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_haxelib_opened.svg
rename to img/browser/folder_type_haxelib_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_helper.svg b/img/browser/folder_type_helper.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_helper.svg
rename to img/browser/folder_type_helper.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_helper_opened.svg b/img/browser/folder_type_helper_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_helper_opened.svg
rename to img/browser/folder_type_helper_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_hook.svg b/img/browser/folder_type_hook.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_hook.svg
rename to img/browser/folder_type_hook.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_hook_opened.svg b/img/browser/folder_type_hook_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_hook_opened.svg
rename to img/browser/folder_type_hook_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_husky.svg b/img/browser/folder_type_husky.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_husky.svg
rename to img/browser/folder_type_husky.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_husky_opened.svg b/img/browser/folder_type_husky_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_husky_opened.svg
rename to img/browser/folder_type_husky_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_idea.svg b/img/browser/folder_type_idea.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_idea.svg
rename to img/browser/folder_type_idea.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_idea_opened.svg b/img/browser/folder_type_idea_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_idea_opened.svg
rename to img/browser/folder_type_idea_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_images.svg b/img/browser/folder_type_images.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_images.svg
rename to img/browser/folder_type_images.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_images_opened.svg b/img/browser/folder_type_images_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_images_opened.svg
rename to img/browser/folder_type_images_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_include.svg b/img/browser/folder_type_include.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_include.svg
rename to img/browser/folder_type_include.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_include_opened.svg b/img/browser/folder_type_include_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_include_opened.svg
rename to img/browser/folder_type_include_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_interfaces.svg b/img/browser/folder_type_interfaces.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_interfaces.svg
rename to img/browser/folder_type_interfaces.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_interfaces_opened.svg b/img/browser/folder_type_interfaces_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_interfaces_opened.svg
rename to img/browser/folder_type_interfaces_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_ios.svg b/img/browser/folder_type_ios.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_ios.svg
rename to img/browser/folder_type_ios.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_ios_opened.svg b/img/browser/folder_type_ios_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_ios_opened.svg
rename to img/browser/folder_type_ios_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_js.svg b/img/browser/folder_type_js.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_js.svg
rename to img/browser/folder_type_js.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_js_opened.svg b/img/browser/folder_type_js_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_js_opened.svg
rename to img/browser/folder_type_js_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_json.svg b/img/browser/folder_type_json.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_json.svg
rename to img/browser/folder_type_json.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_json_official.svg b/img/browser/folder_type_json_official.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_json_official.svg
rename to img/browser/folder_type_json_official.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_json_official_opened.svg b/img/browser/folder_type_json_official_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_json_official_opened.svg
rename to img/browser/folder_type_json_official_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_json_opened.svg b/img/browser/folder_type_json_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_json_opened.svg
rename to img/browser/folder_type_json_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_kubernetes.svg b/img/browser/folder_type_kubernetes.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_kubernetes.svg
rename to img/browser/folder_type_kubernetes.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_kubernetes_opened.svg b/img/browser/folder_type_kubernetes_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_kubernetes_opened.svg
rename to img/browser/folder_type_kubernetes_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_less.svg b/img/browser/folder_type_less.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_less.svg
rename to img/browser/folder_type_less.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_less_opened.svg b/img/browser/folder_type_less_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_less_opened.svg
rename to img/browser/folder_type_less_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_library.svg b/img/browser/folder_type_library.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_library.svg
rename to img/browser/folder_type_library.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_library_opened.svg b/img/browser/folder_type_library_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_library_opened.svg
rename to img/browser/folder_type_library_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_cypress.svg b/img/browser/folder_type_light_cypress.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_cypress.svg
rename to img/browser/folder_type_light_cypress.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_cypress_opened.svg b/img/browser/folder_type_light_cypress_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_cypress_opened.svg
rename to img/browser/folder_type_light_cypress_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_electron.svg b/img/browser/folder_type_light_electron.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_electron.svg
rename to img/browser/folder_type_light_electron.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_electron_opened.svg b/img/browser/folder_type_light_electron_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_electron_opened.svg
rename to img/browser/folder_type_light_electron_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_expo.svg b/img/browser/folder_type_light_expo.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_expo.svg
rename to img/browser/folder_type_light_expo.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_expo_opened.svg b/img/browser/folder_type_light_expo_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_expo_opened.svg
rename to img/browser/folder_type_light_expo_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_fonts.svg b/img/browser/folder_type_light_fonts.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_fonts.svg
rename to img/browser/folder_type_light_fonts.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_fonts_opened.svg b/img/browser/folder_type_light_fonts_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_fonts_opened.svg
rename to img/browser/folder_type_light_fonts_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_gradle.svg b/img/browser/folder_type_light_gradle.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_gradle.svg
rename to img/browser/folder_type_light_gradle.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_gradle_opened.svg b/img/browser/folder_type_light_gradle_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_gradle_opened.svg
rename to img/browser/folder_type_light_gradle_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_meteor.svg b/img/browser/folder_type_light_meteor.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_meteor.svg
rename to img/browser/folder_type_light_meteor.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_meteor_opened.svg b/img/browser/folder_type_light_meteor_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_meteor_opened.svg
rename to img/browser/folder_type_light_meteor_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_mysql.svg b/img/browser/folder_type_light_mysql.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_mysql.svg
rename to img/browser/folder_type_light_mysql.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_mysql_opened.svg b/img/browser/folder_type_light_mysql_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_mysql_opened.svg
rename to img/browser/folder_type_light_mysql_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_node.svg b/img/browser/folder_type_light_node.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_node.svg
rename to img/browser/folder_type_light_node.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_node_opened.svg b/img/browser/folder_type_light_node_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_node_opened.svg
rename to img/browser/folder_type_light_node_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_redux.svg b/img/browser/folder_type_light_redux.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_redux.svg
rename to img/browser/folder_type_light_redux.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_redux_opened.svg b/img/browser/folder_type_light_redux_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_redux_opened.svg
rename to img/browser/folder_type_light_redux_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_sass.svg b/img/browser/folder_type_light_sass.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_sass.svg
rename to img/browser/folder_type_light_sass.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_sass_opened.svg b/img/browser/folder_type_light_sass_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_light_sass_opened.svg
rename to img/browser/folder_type_light_sass_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_linux.svg b/img/browser/folder_type_linux.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_linux.svg
rename to img/browser/folder_type_linux.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_linux_opened.svg b/img/browser/folder_type_linux_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_linux_opened.svg
rename to img/browser/folder_type_linux_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_locale.svg b/img/browser/folder_type_locale.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_locale.svg
rename to img/browser/folder_type_locale.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_locale_opened.svg b/img/browser/folder_type_locale_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_locale_opened.svg
rename to img/browser/folder_type_locale_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_log.svg b/img/browser/folder_type_log.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_log.svg
rename to img/browser/folder_type_log.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_log_opened.svg b/img/browser/folder_type_log_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_log_opened.svg
rename to img/browser/folder_type_log_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_macos.svg b/img/browser/folder_type_macos.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_macos.svg
rename to img/browser/folder_type_macos.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_macos_opened.svg b/img/browser/folder_type_macos_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_macos_opened.svg
rename to img/browser/folder_type_macos_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mariadb.svg b/img/browser/folder_type_mariadb.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mariadb.svg
rename to img/browser/folder_type_mariadb.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mariadb_opened.svg b/img/browser/folder_type_mariadb_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mariadb_opened.svg
rename to img/browser/folder_type_mariadb_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_maven.svg b/img/browser/folder_type_maven.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_maven.svg
rename to img/browser/folder_type_maven.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_maven_opened.svg b/img/browser/folder_type_maven_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_maven_opened.svg
rename to img/browser/folder_type_maven_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_memcached.svg b/img/browser/folder_type_memcached.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_memcached.svg
rename to img/browser/folder_type_memcached.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_memcached_opened.svg b/img/browser/folder_type_memcached_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_memcached_opened.svg
rename to img/browser/folder_type_memcached_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_meteor.svg b/img/browser/folder_type_meteor.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_meteor.svg
rename to img/browser/folder_type_meteor.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_meteor_opened.svg b/img/browser/folder_type_meteor_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_meteor_opened.svg
rename to img/browser/folder_type_meteor_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_middleware.svg b/img/browser/folder_type_middleware.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_middleware.svg
rename to img/browser/folder_type_middleware.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_middleware_opened.svg b/img/browser/folder_type_middleware_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_middleware_opened.svg
rename to img/browser/folder_type_middleware_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_minikube.svg b/img/browser/folder_type_minikube.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_minikube.svg
rename to img/browser/folder_type_minikube.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_minikube_opened.svg b/img/browser/folder_type_minikube_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_minikube_opened.svg
rename to img/browser/folder_type_minikube_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mjml.svg b/img/browser/folder_type_mjml.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mjml.svg
rename to img/browser/folder_type_mjml.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mjml_opened.svg b/img/browser/folder_type_mjml_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mjml_opened.svg
rename to img/browser/folder_type_mjml_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mock.svg b/img/browser/folder_type_mock.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mock.svg
rename to img/browser/folder_type_mock.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mock_opened.svg b/img/browser/folder_type_mock_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mock_opened.svg
rename to img/browser/folder_type_mock_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_model.svg b/img/browser/folder_type_model.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_model.svg
rename to img/browser/folder_type_model.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_model_opened.svg b/img/browser/folder_type_model_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_model_opened.svg
rename to img/browser/folder_type_model_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_module.svg b/img/browser/folder_type_module.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_module.svg
rename to img/browser/folder_type_module.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_module_opened.svg b/img/browser/folder_type_module_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_module_opened.svg
rename to img/browser/folder_type_module_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mongodb.svg b/img/browser/folder_type_mongodb.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mongodb.svg
rename to img/browser/folder_type_mongodb.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mongodb_opened.svg b/img/browser/folder_type_mongodb_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mongodb_opened.svg
rename to img/browser/folder_type_mongodb_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mysql.svg b/img/browser/folder_type_mysql.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mysql.svg
rename to img/browser/folder_type_mysql.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mysql_opened.svg b/img/browser/folder_type_mysql_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_mysql_opened.svg
rename to img/browser/folder_type_mysql_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_next.svg b/img/browser/folder_type_next.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_next.svg
rename to img/browser/folder_type_next.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_next_opened.svg b/img/browser/folder_type_next_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_next_opened.svg
rename to img/browser/folder_type_next_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nginx.svg b/img/browser/folder_type_nginx.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nginx.svg
rename to img/browser/folder_type_nginx.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nginx_opened.svg b/img/browser/folder_type_nginx_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nginx_opened.svg
rename to img/browser/folder_type_nginx_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nix.svg b/img/browser/folder_type_nix.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nix.svg
rename to img/browser/folder_type_nix.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nix_opened.svg b/img/browser/folder_type_nix_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nix_opened.svg
rename to img/browser/folder_type_nix_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_node.svg b/img/browser/folder_type_node.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_node.svg
rename to img/browser/folder_type_node.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_node_opened.svg b/img/browser/folder_type_node_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_node_opened.svg
rename to img/browser/folder_type_node_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_notification.svg b/img/browser/folder_type_notification.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_notification.svg
rename to img/browser/folder_type_notification.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_notification_opened.svg b/img/browser/folder_type_notification_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_notification_opened.svg
rename to img/browser/folder_type_notification_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nuget.svg b/img/browser/folder_type_nuget.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nuget.svg
rename to img/browser/folder_type_nuget.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nuget_opened.svg b/img/browser/folder_type_nuget_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nuget_opened.svg
rename to img/browser/folder_type_nuget_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nuxt.svg b/img/browser/folder_type_nuxt.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nuxt.svg
rename to img/browser/folder_type_nuxt.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nuxt_opened.svg b/img/browser/folder_type_nuxt_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_nuxt_opened.svg
rename to img/browser/folder_type_nuxt_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_package.svg b/img/browser/folder_type_package.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_package.svg
rename to img/browser/folder_type_package.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_package_opened.svg b/img/browser/folder_type_package_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_package_opened.svg
rename to img/browser/folder_type_package_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_paket.svg b/img/browser/folder_type_paket.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_paket.svg
rename to img/browser/folder_type_paket.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_paket_opened.svg b/img/browser/folder_type_paket_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_paket_opened.svg
rename to img/browser/folder_type_paket_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_php.svg b/img/browser/folder_type_php.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_php.svg
rename to img/browser/folder_type_php.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_php_opened.svg b/img/browser/folder_type_php_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_php_opened.svg
rename to img/browser/folder_type_php_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_platformio.svg b/img/browser/folder_type_platformio.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_platformio.svg
rename to img/browser/folder_type_platformio.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_platformio_opened.svg b/img/browser/folder_type_platformio_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_platformio_opened.svg
rename to img/browser/folder_type_platformio_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_plugin.svg b/img/browser/folder_type_plugin.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_plugin.svg
rename to img/browser/folder_type_plugin.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_plugin_opened.svg b/img/browser/folder_type_plugin_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_plugin_opened.svg
rename to img/browser/folder_type_plugin_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_prisma.svg b/img/browser/folder_type_prisma.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_prisma.svg
rename to img/browser/folder_type_prisma.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_prisma_opened.svg b/img/browser/folder_type_prisma_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_prisma_opened.svg
rename to img/browser/folder_type_prisma_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_private.svg b/img/browser/folder_type_private.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_private.svg
rename to img/browser/folder_type_private.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_private_opened.svg b/img/browser/folder_type_private_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_private_opened.svg
rename to img/browser/folder_type_private_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_public.svg b/img/browser/folder_type_public.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_public.svg
rename to img/browser/folder_type_public.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_public_opened.svg b/img/browser/folder_type_public_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_public_opened.svg
rename to img/browser/folder_type_public_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_python.svg b/img/browser/folder_type_python.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_python.svg
rename to img/browser/folder_type_python.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_python_opened.svg b/img/browser/folder_type_python_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_python_opened.svg
rename to img/browser/folder_type_python_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_ravendb.svg b/img/browser/folder_type_ravendb.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_ravendb.svg
rename to img/browser/folder_type_ravendb.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_ravendb_opened.svg b/img/browser/folder_type_ravendb_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_ravendb_opened.svg
rename to img/browser/folder_type_ravendb_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_redis.svg b/img/browser/folder_type_redis.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_redis.svg
rename to img/browser/folder_type_redis.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_redis_opened.svg b/img/browser/folder_type_redis_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_redis_opened.svg
rename to img/browser/folder_type_redis_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_redux.svg b/img/browser/folder_type_redux.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_redux.svg
rename to img/browser/folder_type_redux.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_redux_opened.svg b/img/browser/folder_type_redux_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_redux_opened.svg
rename to img/browser/folder_type_redux_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_route.svg b/img/browser/folder_type_route.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_route.svg
rename to img/browser/folder_type_route.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_route_opened.svg b/img/browser/folder_type_route_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_route_opened.svg
rename to img/browser/folder_type_route_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_sass.svg b/img/browser/folder_type_sass.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_sass.svg
rename to img/browser/folder_type_sass.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_sass_opened.svg b/img/browser/folder_type_sass_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_sass_opened.svg
rename to img/browser/folder_type_sass_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_script.svg b/img/browser/folder_type_script.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_script.svg
rename to img/browser/folder_type_script.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_script_opened.svg b/img/browser/folder_type_script_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_script_opened.svg
rename to img/browser/folder_type_script_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_server.svg b/img/browser/folder_type_server.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_server.svg
rename to img/browser/folder_type_server.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_server_opened.svg b/img/browser/folder_type_server_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_server_opened.svg
rename to img/browser/folder_type_server_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_services.svg b/img/browser/folder_type_services.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_services.svg
rename to img/browser/folder_type_services.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_services_opened.svg b/img/browser/folder_type_services_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_services_opened.svg
rename to img/browser/folder_type_services_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_shared.svg b/img/browser/folder_type_shared.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_shared.svg
rename to img/browser/folder_type_shared.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_shared_opened.svg b/img/browser/folder_type_shared_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_shared_opened.svg
rename to img/browser/folder_type_shared_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_src.svg b/img/browser/folder_type_src.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_src.svg
rename to img/browser/folder_type_src.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_src_opened.svg b/img/browser/folder_type_src_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_src_opened.svg
rename to img/browser/folder_type_src_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_sso.svg b/img/browser/folder_type_sso.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_sso.svg
rename to img/browser/folder_type_sso.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_sso_opened.svg b/img/browser/folder_type_sso_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_sso_opened.svg
rename to img/browser/folder_type_sso_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_story.svg b/img/browser/folder_type_story.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_story.svg
rename to img/browser/folder_type_story.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_story_opened.svg b/img/browser/folder_type_story_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_story_opened.svg
rename to img/browser/folder_type_story_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_style.svg b/img/browser/folder_type_style.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_style.svg
rename to img/browser/folder_type_style.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_style_opened.svg b/img/browser/folder_type_style_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_style_opened.svg
rename to img/browser/folder_type_style_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_tauri.svg b/img/browser/folder_type_tauri.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_tauri.svg
rename to img/browser/folder_type_tauri.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_tauri_opened.svg b/img/browser/folder_type_tauri_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_tauri_opened.svg
rename to img/browser/folder_type_tauri_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_temp.svg b/img/browser/folder_type_temp.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_temp.svg
rename to img/browser/folder_type_temp.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_temp_opened.svg b/img/browser/folder_type_temp_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_temp_opened.svg
rename to img/browser/folder_type_temp_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_template.svg b/img/browser/folder_type_template.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_template.svg
rename to img/browser/folder_type_template.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_template_opened.svg b/img/browser/folder_type_template_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_template_opened.svg
rename to img/browser/folder_type_template_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_test.svg b/img/browser/folder_type_test.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_test.svg
rename to img/browser/folder_type_test.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_test_opened.svg b/img/browser/folder_type_test_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_test_opened.svg
rename to img/browser/folder_type_test_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_theme.svg b/img/browser/folder_type_theme.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_theme.svg
rename to img/browser/folder_type_theme.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_theme_opened.svg b/img/browser/folder_type_theme_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_theme_opened.svg
rename to img/browser/folder_type_theme_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_tools.svg b/img/browser/folder_type_tools.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_tools.svg
rename to img/browser/folder_type_tools.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_tools_opened.svg b/img/browser/folder_type_tools_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_tools_opened.svg
rename to img/browser/folder_type_tools_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_travis.svg b/img/browser/folder_type_travis.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_travis.svg
rename to img/browser/folder_type_travis.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_travis_opened.svg b/img/browser/folder_type_travis_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_travis_opened.svg
rename to img/browser/folder_type_travis_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_trunk.svg b/img/browser/folder_type_trunk.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_trunk.svg
rename to img/browser/folder_type_trunk.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_trunk_opened.svg b/img/browser/folder_type_trunk_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_trunk_opened.svg
rename to img/browser/folder_type_trunk_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typescript.svg b/img/browser/folder_type_typescript.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typescript.svg
rename to img/browser/folder_type_typescript.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typescript_opened.svg b/img/browser/folder_type_typescript_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typescript_opened.svg
rename to img/browser/folder_type_typescript_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typings.svg b/img/browser/folder_type_typings.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typings.svg
rename to img/browser/folder_type_typings.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typings2.svg b/img/browser/folder_type_typings2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typings2.svg
rename to img/browser/folder_type_typings2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typings2_opened.svg b/img/browser/folder_type_typings2_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typings2_opened.svg
rename to img/browser/folder_type_typings2_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typings_opened.svg b/img/browser/folder_type_typings_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_typings_opened.svg
rename to img/browser/folder_type_typings_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vagrant.svg b/img/browser/folder_type_vagrant.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vagrant.svg
rename to img/browser/folder_type_vagrant.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vagrant_opened.svg b/img/browser/folder_type_vagrant_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vagrant_opened.svg
rename to img/browser/folder_type_vagrant_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_video.svg b/img/browser/folder_type_video.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_video.svg
rename to img/browser/folder_type_video.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_video_opened.svg b/img/browser/folder_type_video_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_video_opened.svg
rename to img/browser/folder_type_video_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_view.svg b/img/browser/folder_type_view.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_view.svg
rename to img/browser/folder_type_view.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_view_opened.svg b/img/browser/folder_type_view_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_view_opened.svg
rename to img/browser/folder_type_view_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vs.svg b/img/browser/folder_type_vs.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vs.svg
rename to img/browser/folder_type_vs.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vs2.svg b/img/browser/folder_type_vs2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vs2.svg
rename to img/browser/folder_type_vs2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vs2_opened.svg b/img/browser/folder_type_vs2_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vs2_opened.svg
rename to img/browser/folder_type_vs2_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vs_opened.svg b/img/browser/folder_type_vs_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vs_opened.svg
rename to img/browser/folder_type_vs_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode.svg b/img/browser/folder_type_vscode.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode.svg
rename to img/browser/folder_type_vscode.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode2.svg b/img/browser/folder_type_vscode2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode2.svg
rename to img/browser/folder_type_vscode2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode2_opened.svg b/img/browser/folder_type_vscode2_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode2_opened.svg
rename to img/browser/folder_type_vscode2_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode3.svg b/img/browser/folder_type_vscode3.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode3.svg
rename to img/browser/folder_type_vscode3.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode3_opened.svg b/img/browser/folder_type_vscode3_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode3_opened.svg
rename to img/browser/folder_type_vscode3_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_opened.svg b/img/browser/folder_type_vscode_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_opened.svg
rename to img/browser/folder_type_vscode_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test.svg b/img/browser/folder_type_vscode_test.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test.svg
rename to img/browser/folder_type_vscode_test.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test2.svg b/img/browser/folder_type_vscode_test2.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test2.svg
rename to img/browser/folder_type_vscode_test2.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test2_opened.svg b/img/browser/folder_type_vscode_test2_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test2_opened.svg
rename to img/browser/folder_type_vscode_test2_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test3.svg b/img/browser/folder_type_vscode_test3.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test3.svg
rename to img/browser/folder_type_vscode_test3.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test3_opened.svg b/img/browser/folder_type_vscode_test3_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test3_opened.svg
rename to img/browser/folder_type_vscode_test3_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test_opened.svg b/img/browser/folder_type_vscode_test_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_vscode_test_opened.svg
rename to img/browser/folder_type_vscode_test_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_webpack.svg b/img/browser/folder_type_webpack.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_webpack.svg
rename to img/browser/folder_type_webpack.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_webpack_opened.svg b/img/browser/folder_type_webpack_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_webpack_opened.svg
rename to img/browser/folder_type_webpack_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_windows.svg b/img/browser/folder_type_windows.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_windows.svg
rename to img/browser/folder_type_windows.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_windows_opened.svg b/img/browser/folder_type_windows_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_windows_opened.svg
rename to img/browser/folder_type_windows_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_www.svg b/img/browser/folder_type_www.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_www.svg
rename to img/browser/folder_type_www.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_www_opened.svg b/img/browser/folder_type_www_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_www_opened.svg
rename to img/browser/folder_type_www_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_yarn.svg b/img/browser/folder_type_yarn.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_yarn.svg
rename to img/browser/folder_type_yarn.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_yarn_opened.svg b/img/browser/folder_type_yarn_opened.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/browser_icons/folder_type_yarn_opened.svg
rename to img/browser/folder_type_yarn_opened.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/alma.svg b/img/os/alma.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/alma.svg
rename to img/os/alma.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/alpine.svg b/img/os/alpine.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/alpine.svg
rename to img/os/alpine.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/amazon.svg b/img/os/amazon.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/amazon.svg
rename to img/os/amazon.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/arch.svg b/img/os/arch.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/arch.svg
rename to img/os/arch.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/centos.svg b/img/os/centos.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/centos.svg
rename to img/os/centos.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/debian.svg b/img/os/debian.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/debian.svg
rename to img/os/debian.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/elementary-dark.svg b/img/os/elementary-dark.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/elementary-dark.svg
rename to img/os/elementary-dark.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/elementary.svg b/img/os/elementary.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/elementary.svg
rename to img/os/elementary.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/endeavour-dark.svg b/img/os/endeavour-dark.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/endeavour-dark.svg
rename to img/os/endeavour-dark.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/endeavour.svg b/img/os/endeavour.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/endeavour.svg
rename to img/os/endeavour.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/fedora.svg b/img/os/fedora.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/fedora.svg
rename to img/os/fedora.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/freebsd.svg b/img/os/freebsd.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/freebsd.svg
rename to img/os/freebsd.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/garuda.svg b/img/os/garuda.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/garuda.svg
rename to img/os/garuda.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/gentoo.svg b/img/os/gentoo.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/gentoo.svg
rename to img/os/gentoo.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/kali.svg b/img/os/kali.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/kali.svg
rename to img/os/kali.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/kubuntu.svg b/img/os/kubuntu.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/kubuntu.svg
rename to img/os/kubuntu.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/linux.svg b/img/os/linux.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/linux.svg
rename to img/os/linux.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/macos-dark.svg b/img/os/macos-dark.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/macos-dark.svg
rename to img/os/macos-dark.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/macos.svg b/img/os/macos.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/macos.svg
rename to img/os/macos.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/manjaro.svg b/img/os/manjaro.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/manjaro.svg
rename to img/os/manjaro.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/mint.svg b/img/os/mint.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/mint.svg
rename to img/os/mint.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/netbsd.svg b/img/os/netbsd.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/netbsd.svg
rename to img/os/netbsd.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/nixos.svg b/img/os/nixos.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/nixos.svg
rename to img/os/nixos.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/openbsd.svg b/img/os/openbsd.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/openbsd.svg
rename to img/os/openbsd.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/pop.svg b/img/os/pop.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/pop.svg
rename to img/os/pop.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/redhat.svg b/img/os/redhat.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/redhat.svg
rename to img/os/redhat.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/rocky.svg b/img/os/rocky.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/rocky.svg
rename to img/os/rocky.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/suse.svg b/img/os/suse.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/suse.svg
rename to img/os/suse.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/ubuntu.svg b/img/os/ubuntu.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/ubuntu.svg
rename to img/os/ubuntu.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/windows.svg b/img/os/windows.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/windows.svg
rename to img/os/windows.svg
diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/zorin.svg b/img/os/zorin.svg
similarity index 100%
rename from app/src/main/resources/io/xpipe/app/resources/img/os/zorin.svg
rename to img/os/zorin.svg
diff --git a/img/proc/bash_icon.svg b/img/proc/bash_icon.svg
new file mode 100644
index 000000000..31b39c4a9
--- /dev/null
+++ b/img/proc/bash_icon.svg
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/cmd_icon-dark.svg b/img/proc/cmd_icon-dark.svg
new file mode 100644
index 000000000..c43fbc7d5
--- /dev/null
+++ b/img/proc/cmd_icon-dark.svg
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/cmd_icon.svg b/img/proc/cmd_icon.svg
new file mode 100644
index 000000000..e29a85763
--- /dev/null
+++ b/img/proc/cmd_icon.svg
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/command_icon-dark.svg b/img/proc/command_icon-dark.svg
new file mode 100644
index 000000000..5630e60f7
--- /dev/null
+++ b/img/proc/command_icon-dark.svg
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/command_icon.svg b/img/proc/command_icon.svg
new file mode 100644
index 000000000..deb03c1d1
--- /dev/null
+++ b/img/proc/command_icon.svg
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/cygwin_icon-dark.svg b/img/proc/cygwin_icon-dark.svg
new file mode 100644
index 000000000..c6acda1bf
--- /dev/null
+++ b/img/proc/cygwin_icon-dark.svg
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/cygwin_icon.svg b/img/proc/cygwin_icon.svg
new file mode 100644
index 000000000..bae8677da
--- /dev/null
+++ b/img/proc/cygwin_icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/img/proc/defaultShell_icon-dark.svg b/img/proc/defaultShell_icon-dark.svg
new file mode 100644
index 000000000..213b707b7
--- /dev/null
+++ b/img/proc/defaultShell_icon-dark.svg
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/defaultShell_icon.svg b/img/proc/defaultShell_icon.svg
new file mode 100644
index 000000000..6bdf56c0d
--- /dev/null
+++ b/img/proc/defaultShell_icon.svg
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/docker_icon.svg b/img/proc/docker_icon.svg
new file mode 100644
index 000000000..e68a6613a
--- /dev/null
+++ b/img/proc/docker_icon.svg
@@ -0,0 +1 @@
+Docker
\ No newline at end of file
diff --git a/img/proc/fish_icon-dark.svg b/img/proc/fish_icon-dark.svg
new file mode 100644
index 000000000..e6b9c0f9a
--- /dev/null
+++ b/img/proc/fish_icon-dark.svg
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/fish_icon.svg b/img/proc/fish_icon.svg
new file mode 100644
index 000000000..04cc42f55
--- /dev/null
+++ b/img/proc/fish_icon.svg
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/gitForWindows_icon.svg b/img/proc/gitForWindows_icon.svg
new file mode 100644
index 000000000..e7201a75f
--- /dev/null
+++ b/img/proc/gitForWindows_icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/proc/hyperv_icon.svg b/img/proc/hyperv_icon.svg
new file mode 100644
index 000000000..931fc1853
--- /dev/null
+++ b/img/proc/hyperv_icon.svg
@@ -0,0 +1,43 @@
+
+
+
+
diff --git a/img/proc/k8sCluster_icon.svg b/img/proc/k8sCluster_icon.svg
new file mode 100644
index 000000000..568e15cab
--- /dev/null
+++ b/img/proc/k8sCluster_icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/proc/k8sContainer_icon.svg b/img/proc/k8sContainer_icon.svg
new file mode 100644
index 000000000..231c21c9e
--- /dev/null
+++ b/img/proc/k8sContainer_icon.svg
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/k8sNode_icon.svg b/img/proc/k8sNode_icon.svg
new file mode 100644
index 000000000..b7bfe3266
--- /dev/null
+++ b/img/proc/k8sNode_icon.svg
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+ node
+
+
+
diff --git a/img/proc/k8sPod_icon.svg b/img/proc/k8sPod_icon.svg
new file mode 100644
index 000000000..f88d2dbca
--- /dev/null
+++ b/img/proc/k8sPod_icon.svg
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/lxd_icon.svg b/img/proc/lxd_icon.svg
new file mode 100644
index 000000000..b7fa97d34
--- /dev/null
+++ b/img/proc/lxd_icon.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/img/proc/msys2_icon-dark.svg b/img/proc/msys2_icon-dark.svg
new file mode 100644
index 000000000..df8bcedfc
--- /dev/null
+++ b/img/proc/msys2_icon-dark.svg
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/msys2_icon.svg b/img/proc/msys2_icon.svg
new file mode 100644
index 000000000..6f7e483ab
--- /dev/null
+++ b/img/proc/msys2_icon.svg
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/podman_icon.svg b/img/proc/podman_icon.svg
new file mode 100644
index 000000000..4b0af515f
--- /dev/null
+++ b/img/proc/podman_icon.svg
@@ -0,0 +1 @@
+
diff --git a/img/proc/powershell_logo.svg b/img/proc/powershell_logo.svg
new file mode 100644
index 000000000..ec01c8cb5
--- /dev/null
+++ b/img/proc/powershell_logo.svg
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/img/proc/proxmoxContainer_icon-dark.svg b/img/proc/proxmoxContainer_icon-dark.svg
new file mode 100644
index 000000000..7d1eb0797
--- /dev/null
+++ b/img/proc/proxmoxContainer_icon-dark.svg
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/proxmoxContainer_icon.svg b/img/proc/proxmoxContainer_icon.svg
new file mode 100644
index 000000000..5c3e103d0
--- /dev/null
+++ b/img/proc/proxmoxContainer_icon.svg
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/proxmoxVm_icon-dark.svg b/img/proc/proxmoxVm_icon-dark.svg
new file mode 100644
index 000000000..7d1eb0797
--- /dev/null
+++ b/img/proc/proxmoxVm_icon-dark.svg
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/proxmoxVm_icon.svg b/img/proc/proxmoxVm_icon.svg
new file mode 100644
index 000000000..5c3e103d0
--- /dev/null
+++ b/img/proc/proxmoxVm_icon.svg
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/proxmox_icon-dark.svg b/img/proc/proxmox_icon-dark.svg
new file mode 100644
index 000000000..7d1eb0797
--- /dev/null
+++ b/img/proc/proxmox_icon-dark.svg
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/proxmox_icon.svg b/img/proc/proxmox_icon.svg
new file mode 100644
index 000000000..5c3e103d0
--- /dev/null
+++ b/img/proc/proxmox_icon.svg
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/pwsh_logo.png b/img/proc/pwsh_logo.png
new file mode 100644
index 000000000..915568f38
Binary files /dev/null and b/img/proc/pwsh_logo.png differ
diff --git a/img/proc/rdpFile_icon-dark.svg b/img/proc/rdpFile_icon-dark.svg
new file mode 100644
index 000000000..460ca5dca
--- /dev/null
+++ b/img/proc/rdpFile_icon-dark.svg
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+ ssh draft
+
+
+
+ ssh draft
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/rdpFile_icon.svg b/img/proc/rdpFile_icon.svg
new file mode 100644
index 000000000..deadd4709
--- /dev/null
+++ b/img/proc/rdpFile_icon.svg
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+ ssh draft
+
+
+
+ ssh draft
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/rdp_icon-dark.svg b/img/proc/rdp_icon-dark.svg
new file mode 100644
index 000000000..e3731006c
--- /dev/null
+++ b/img/proc/rdp_icon-dark.svg
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+ ssh draft
+
+
+
+ ssh draft
+
+
+
+
+
+
+
diff --git a/img/proc/rdp_icon.svg b/img/proc/rdp_icon.svg
new file mode 100644
index 000000000..3a680defe
--- /dev/null
+++ b/img/proc/rdp_icon.svg
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+ ssh draft
+
+
+
+ ssh draft
+
+
+
+
+
+
+
diff --git a/img/proc/serial_icon-dark.svg b/img/proc/serial_icon-dark.svg
new file mode 100644
index 000000000..9b9e16008
--- /dev/null
+++ b/img/proc/serial_icon-dark.svg
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+ ssh draft
+
+
+
+ ssh draft
+
+
+
+
+
+
+
diff --git a/img/proc/serial_icon.svg b/img/proc/serial_icon.svg
new file mode 100644
index 000000000..d0422dd18
--- /dev/null
+++ b/img/proc/serial_icon.svg
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+ ssh draft
+
+
+
+ ssh draft
+
+
+
+
+
+
+
diff --git a/img/proc/shBsd_icon-dark.svg b/img/proc/shBsd_icon-dark.svg
new file mode 100644
index 000000000..0f7d54491
--- /dev/null
+++ b/img/proc/shBsd_icon-dark.svg
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+ sh draft
+
+
+ $ >
+
+
+
+ sh draft
+
+
+
+
diff --git a/img/proc/shBsd_icon.svg b/img/proc/shBsd_icon.svg
new file mode 100644
index 000000000..183e7997f
--- /dev/null
+++ b/img/proc/shBsd_icon.svg
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+ sh draft
+
+
+ $ >
+
+
+
+ sh draft
+
+
+
+
diff --git a/img/proc/sh_icon-dark.svg b/img/proc/sh_icon-dark.svg
new file mode 100644
index 000000000..0f7d54491
--- /dev/null
+++ b/img/proc/sh_icon-dark.svg
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+ sh draft
+
+
+ $ >
+
+
+
+ sh draft
+
+
+
+
diff --git a/img/proc/sh_icon.svg b/img/proc/sh_icon.svg
new file mode 100644
index 000000000..183e7997f
--- /dev/null
+++ b/img/proc/sh_icon.svg
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+ sh draft
+
+
+ $ >
+
+
+
+ sh draft
+
+
+
+
diff --git a/img/proc/shellCommand_icon-dark.svg b/img/proc/shellCommand_icon-dark.svg
new file mode 100644
index 000000000..213b707b7
--- /dev/null
+++ b/img/proc/shellCommand_icon-dark.svg
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/shellCommand_icon.svg b/img/proc/shellCommand_icon.svg
new file mode 100644
index 000000000..6bdf56c0d
--- /dev/null
+++ b/img/proc/shellCommand_icon.svg
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/shellEnvironmentGroup_icon-dark.svg b/img/proc/shellEnvironmentGroup_icon-dark.svg
new file mode 100644
index 000000000..a35a2e490
--- /dev/null
+++ b/img/proc/shellEnvironmentGroup_icon-dark.svg
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+ shell environment v2
+
+
+
+
+
+
+ shell environment v2
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/shellEnvironmentGroup_icon.svg b/img/proc/shellEnvironmentGroup_icon.svg
new file mode 100644
index 000000000..a66c0cc74
--- /dev/null
+++ b/img/proc/shellEnvironmentGroup_icon.svg
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+ shell environment v2
+
+
+
+
+
+
+ shell environment v2
+
+
+
+
diff --git a/img/proc/shellEnvironment_icon-dark.svg b/img/proc/shellEnvironment_icon-dark.svg
new file mode 100644
index 000000000..a35a2e490
--- /dev/null
+++ b/img/proc/shellEnvironment_icon-dark.svg
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+ shell environment v2
+
+
+
+
+
+
+ shell environment v2
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/shellEnvironment_icon.svg b/img/proc/shellEnvironment_icon.svg
new file mode 100644
index 000000000..a66c0cc74
--- /dev/null
+++ b/img/proc/shellEnvironment_icon.svg
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+ shell environment v2
+
+
+
+
+
+
+ shell environment v2
+
+
+
+
diff --git a/img/proc/sshConfig_icon-dark.svg b/img/proc/sshConfig_icon-dark.svg
new file mode 100644
index 000000000..d0e8fe19f
--- /dev/null
+++ b/img/proc/sshConfig_icon-dark.svg
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+ ssh draft
+
+
+
+
+
+
+
+
+
+ ssh draft
+
+
+
+
+
+
diff --git a/img/proc/sshConfig_icon.svg b/img/proc/sshConfig_icon.svg
new file mode 100644
index 000000000..34f830ad2
--- /dev/null
+++ b/img/proc/sshConfig_icon.svg
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+ ssh draft
+
+
+
+
+
+
+
+
+
+ ssh draft
+
+
+
+
+
+
diff --git a/img/proc/sshDynamicTunnel_icon-dark.svg b/img/proc/sshDynamicTunnel_icon-dark.svg
new file mode 100644
index 000000000..161ae6b11
--- /dev/null
+++ b/img/proc/sshDynamicTunnel_icon-dark.svg
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/sshDynamicTunnel_icon.svg b/img/proc/sshDynamicTunnel_icon.svg
new file mode 100644
index 000000000..e370d3b04
--- /dev/null
+++ b/img/proc/sshDynamicTunnel_icon.svg
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/sshLocalTunnel_icon-dark.svg b/img/proc/sshLocalTunnel_icon-dark.svg
new file mode 100644
index 000000000..ffabb8f2e
--- /dev/null
+++ b/img/proc/sshLocalTunnel_icon-dark.svg
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/sshLocalTunnel_icon.svg b/img/proc/sshLocalTunnel_icon.svg
new file mode 100644
index 000000000..6d2736686
--- /dev/null
+++ b/img/proc/sshLocalTunnel_icon.svg
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/sshRemoteTunnel_icon-dark.svg b/img/proc/sshRemoteTunnel_icon-dark.svg
new file mode 100644
index 000000000..9ebcd6ac8
--- /dev/null
+++ b/img/proc/sshRemoteTunnel_icon-dark.svg
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/sshRemoteTunnel_icon.svg b/img/proc/sshRemoteTunnel_icon.svg
new file mode 100644
index 000000000..83845f6a8
--- /dev/null
+++ b/img/proc/sshRemoteTunnel_icon.svg
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/sshTunnelGroup_icon-dark.svg b/img/proc/sshTunnelGroup_icon-dark.svg
new file mode 100644
index 000000000..343fbbac7
--- /dev/null
+++ b/img/proc/sshTunnelGroup_icon-dark.svg
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+ ssh tunnel category
+
+
+
+
+ ssh tunnel category
+
+
+
+
diff --git a/img/proc/sshTunnelGroup_icon.svg b/img/proc/sshTunnelGroup_icon.svg
new file mode 100644
index 000000000..1daa2eb3d
--- /dev/null
+++ b/img/proc/sshTunnelGroup_icon.svg
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+ ssh tunnel category
+
+
+
+
+ ssh tunnel category
+
+
+
+
diff --git a/img/proc/ssh_icon-dark.svg b/img/proc/ssh_icon-dark.svg
new file mode 100644
index 000000000..81c46dfb8
--- /dev/null
+++ b/img/proc/ssh_icon-dark.svg
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+ ssh draft
+
+
+
+
+
+
+
+
+
+ ssh draft
+
+
+
+
diff --git a/img/proc/ssh_icon.svg b/img/proc/ssh_icon.svg
new file mode 100644
index 000000000..da1ac6824
--- /dev/null
+++ b/img/proc/ssh_icon.svg
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+ ssh draft
+
+
+
+
+
+
+
+
+
+ ssh draft
+
+
+
+
diff --git a/img/proc/teleport_icon.png b/img/proc/teleport_icon.png
new file mode 100644
index 000000000..692777e94
Binary files /dev/null and b/img/proc/teleport_icon.png differ
diff --git a/img/proc/vmware_fusion_icon.png b/img/proc/vmware_fusion_icon.png
new file mode 100644
index 000000000..bbffbc8d2
Binary files /dev/null and b/img/proc/vmware_fusion_icon.png differ
diff --git a/img/proc/vmware_player_icon.png b/img/proc/vmware_player_icon.png
new file mode 100644
index 000000000..f6f965af2
Binary files /dev/null and b/img/proc/vmware_player_icon.png differ
diff --git a/img/proc/vmware_workstation_icon.svg b/img/proc/vmware_workstation_icon.svg
new file mode 100644
index 000000000..d8f7cce90
--- /dev/null
+++ b/img/proc/vmware_workstation_icon.svg
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/img/proc/vnc_icon-dark.svg b/img/proc/vnc_icon-dark.svg
new file mode 100644
index 000000000..2958b7196
--- /dev/null
+++ b/img/proc/vnc_icon-dark.svg
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/vnc_icon.svg b/img/proc/vnc_icon.svg
new file mode 100644
index 000000000..7838b6763
--- /dev/null
+++ b/img/proc/vnc_icon.svg
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/proc/wsl_icon.svg b/img/proc/wsl_icon.svg
new file mode 100644
index 000000000..a172ca97f
--- /dev/null
+++ b/img/proc/wsl_icon.svg
@@ -0,0 +1,3409 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/img/proc/zsh_icon-dark.svg b/img/proc/zsh_icon-dark.svg
new file mode 100644
index 000000000..bd41216fe
--- /dev/null
+++ b/img/proc/zsh_icon-dark.svg
@@ -0,0 +1,111 @@
+
+
+
+
+ Z shell vertical colour logo
+ Unix shell
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Z shell vertical colour logo
+
+
+
+
diff --git a/img/proc/zsh_icon.svg b/img/proc/zsh_icon.svg
new file mode 100644
index 000000000..6a37206fc
--- /dev/null
+++ b/img/proc/zsh_icon.svg
@@ -0,0 +1,106 @@
+
+
+
+
+ Z shell vertical colour logo
+ Unix shell
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Z shell vertical colour logo
+
+
+
+
diff --git a/img/system/2fauth-light.svg b/img/system/2fauth-light.svg
new file mode 100644
index 000000000..82b2699dd
--- /dev/null
+++ b/img/system/2fauth-light.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/2fauth.svg b/img/system/2fauth.svg
new file mode 100644
index 000000000..b3dee99ad
--- /dev/null
+++ b/img/system/2fauth.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/activepieces.svg b/img/system/activepieces.svg
new file mode 100644
index 000000000..40cd9d014
--- /dev/null
+++ b/img/system/activepieces.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
diff --git a/img/system/actual-budget.svg b/img/system/actual-budget.svg
new file mode 100644
index 000000000..eef666a28
--- /dev/null
+++ b/img/system/actual-budget.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/adguard-home.svg b/img/system/adguard-home.svg
new file mode 100644
index 000000000..0d08ce8d1
--- /dev/null
+++ b/img/system/adguard-home.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/adminer-light.svg b/img/system/adminer-light.svg
new file mode 100644
index 000000000..ba61f10b7
--- /dev/null
+++ b/img/system/adminer-light.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/adminer.svg b/img/system/adminer.svg
new file mode 100644
index 000000000..4e4735103
--- /dev/null
+++ b/img/system/adminer.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/affine-light.svg b/img/system/affine-light.svg
new file mode 100644
index 000000000..a398e8fa9
--- /dev/null
+++ b/img/system/affine-light.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/affine.svg b/img/system/affine.svg
new file mode 100644
index 000000000..a3f8ead25
--- /dev/null
+++ b/img/system/affine.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/img/system/airtable.svg b/img/system/airtable.svg
new file mode 100644
index 000000000..2f0d4e63d
--- /dev/null
+++ b/img/system/airtable.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/akkoma-light.svg b/img/system/akkoma-light.svg
new file mode 100644
index 000000000..8d76c5e3b
--- /dev/null
+++ b/img/system/akkoma-light.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/akkoma.svg b/img/system/akkoma.svg
new file mode 100644
index 000000000..4e8b1f868
--- /dev/null
+++ b/img/system/akkoma.svg
@@ -0,0 +1,8 @@
+
+
+ Akkoma logo [2 color]
+
+
+
+
+
\ No newline at end of file
diff --git a/img/system/alist.svg b/img/system/alist.svg
new file mode 100644
index 000000000..74e65df5b
--- /dev/null
+++ b/img/system/alist.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/anonaddy.svg b/img/system/anonaddy.svg
new file mode 100644
index 000000000..3690d2d80
--- /dev/null
+++ b/img/system/anonaddy.svg
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/ansible-light.svg b/img/system/ansible-light.svg
new file mode 100644
index 000000000..f4f274e4c
--- /dev/null
+++ b/img/system/ansible-light.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/ansible.svg b/img/system/ansible.svg
new file mode 100644
index 000000000..071cd2fc4
--- /dev/null
+++ b/img/system/ansible.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/apache-answer.svg b/img/system/apache-answer.svg
new file mode 100644
index 000000000..62cdcf85a
--- /dev/null
+++ b/img/system/apache-answer.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
diff --git a/img/system/appflowy.svg b/img/system/appflowy.svg
new file mode 100644
index 000000000..6e4747eac
--- /dev/null
+++ b/img/system/appflowy.svg
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/appwrite.svg b/img/system/appwrite.svg
new file mode 100644
index 000000000..9b8149363
--- /dev/null
+++ b/img/system/appwrite.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/ara-records-ansible.svg b/img/system/ara-records-ansible.svg
new file mode 100644
index 000000000..f655649ff
--- /dev/null
+++ b/img/system/ara-records-ansible.svg
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/argo-cd.svg b/img/system/argo-cd.svg
new file mode 100644
index 000000000..7b794c3be
--- /dev/null
+++ b/img/system/argo-cd.svg
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/asciinema.svg b/img/system/asciinema.svg
new file mode 100644
index 000000000..89c4cdd12
--- /dev/null
+++ b/img/system/asciinema.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/atuin-light.svg b/img/system/atuin-light.svg
new file mode 100644
index 000000000..d4657d344
--- /dev/null
+++ b/img/system/atuin-light.svg
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/atuin.svg b/img/system/atuin.svg
new file mode 100644
index 000000000..f7965cdb6
--- /dev/null
+++ b/img/system/atuin.svg
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/audacity-light.svg b/img/system/audacity-light.svg
new file mode 100644
index 000000000..3528fb444
--- /dev/null
+++ b/img/system/audacity-light.svg
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/audacity.svg b/img/system/audacity.svg
new file mode 100644
index 000000000..69014c3cb
--- /dev/null
+++ b/img/system/audacity.svg
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/audiobookshelf.svg b/img/system/audiobookshelf.svg
new file mode 100644
index 000000000..27678022c
--- /dev/null
+++ b/img/system/audiobookshelf.svg
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/authelia-light.svg b/img/system/authelia-light.svg
new file mode 100644
index 000000000..2275f96a8
--- /dev/null
+++ b/img/system/authelia-light.svg
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/authelia.svg b/img/system/authelia.svg
new file mode 100644
index 000000000..2a7242b96
--- /dev/null
+++ b/img/system/authelia.svg
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/authentik.svg b/img/system/authentik.svg
new file mode 100644
index 000000000..d243bb760
--- /dev/null
+++ b/img/system/authentik.svg
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/authman.svg b/img/system/authman.svg
new file mode 100644
index 000000000..084350d3c
--- /dev/null
+++ b/img/system/authman.svg
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/autobrr.svg b/img/system/autobrr.svg
new file mode 100644
index 000000000..fadd088da
--- /dev/null
+++ b/img/system/autobrr.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
diff --git a/img/system/automad-light.svg b/img/system/automad-light.svg
new file mode 100644
index 000000000..23c29ff93
--- /dev/null
+++ b/img/system/automad-light.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/automad.svg b/img/system/automad.svg
new file mode 100644
index 000000000..3a0a82a60
--- /dev/null
+++ b/img/system/automad.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/azuracast.svg b/img/system/azuracast.svg
new file mode 100644
index 000000000..13ee74dc1
--- /dev/null
+++ b/img/system/azuracast.svg
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/backblaze-light.svg b/img/system/backblaze-light.svg
new file mode 100644
index 000000000..498aec27f
--- /dev/null
+++ b/img/system/backblaze-light.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/img/system/backblaze.svg b/img/system/backblaze.svg
new file mode 100644
index 000000000..10e586f5a
--- /dev/null
+++ b/img/system/backblaze.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/backrest-light.svg b/img/system/backrest-light.svg
new file mode 100644
index 000000000..68cea61df
--- /dev/null
+++ b/img/system/backrest-light.svg
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/backrest.svg b/img/system/backrest.svg
new file mode 100644
index 000000000..8316f9d48
--- /dev/null
+++ b/img/system/backrest.svg
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/bar-assistant.svg b/img/system/bar-assistant.svg
new file mode 100644
index 000000000..2dcaca7ee
--- /dev/null
+++ b/img/system/bar-assistant.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/baserow-light.svg b/img/system/baserow-light.svg
new file mode 100644
index 000000000..1b85c3993
--- /dev/null
+++ b/img/system/baserow-light.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/baserow.svg b/img/system/baserow.svg
new file mode 100644
index 000000000..4557d7dff
--- /dev/null
+++ b/img/system/baserow.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/bigbluebutton.svg b/img/system/bigbluebutton.svg
new file mode 100644
index 000000000..e745cfa13
--- /dev/null
+++ b/img/system/bigbluebutton.svg
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/bigcapital.svg b/img/system/bigcapital.svg
new file mode 100644
index 000000000..f15c5f7ad
--- /dev/null
+++ b/img/system/bigcapital.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/bitwarden.svg b/img/system/bitwarden.svg
new file mode 100644
index 000000000..e3d76606d
--- /dev/null
+++ b/img/system/bitwarden.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
diff --git a/img/system/blocky.svg b/img/system/blocky.svg
new file mode 100644
index 000000000..8f095d689
--- /dev/null
+++ b/img/system/blocky.svg
@@ -0,0 +1,233 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/bluesky-light.svg b/img/system/bluesky-light.svg
new file mode 100644
index 000000000..47df9093b
--- /dev/null
+++ b/img/system/bluesky-light.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/bluesky.svg b/img/system/bluesky.svg
new file mode 100644
index 000000000..3b833271d
--- /dev/null
+++ b/img/system/bluesky.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/booklogr.svg b/img/system/booklogr.svg
new file mode 100644
index 000000000..5ecd371ee
--- /dev/null
+++ b/img/system/booklogr.svg
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/bookstack.svg b/img/system/bookstack.svg
new file mode 100644
index 000000000..4d7b325dd
--- /dev/null
+++ b/img/system/bookstack.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/borg.svg b/img/system/borg.svg
new file mode 100644
index 000000000..67a53c710
--- /dev/null
+++ b/img/system/borg.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
diff --git a/img/system/borgmatic-light.svg b/img/system/borgmatic-light.svg
new file mode 100644
index 000000000..84fcf97fe
--- /dev/null
+++ b/img/system/borgmatic-light.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/borgmatic.svg b/img/system/borgmatic.svg
new file mode 100644
index 000000000..e8fdc508f
--- /dev/null
+++ b/img/system/borgmatic.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/budgetbee.svg b/img/system/budgetbee.svg
new file mode 100644
index 000000000..ce82ceb0f
--- /dev/null
+++ b/img/system/budgetbee.svg
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/budibase.svg b/img/system/budibase.svg
new file mode 100644
index 000000000..3c61f39f7
--- /dev/null
+++ b/img/system/budibase.svg
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/bunkerweb-light.svg b/img/system/bunkerweb-light.svg
new file mode 100644
index 000000000..c34a51f55
--- /dev/null
+++ b/img/system/bunkerweb-light.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
diff --git a/img/system/bunkerweb.svg b/img/system/bunkerweb.svg
new file mode 100644
index 000000000..19dec98e6
--- /dev/null
+++ b/img/system/bunkerweb.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
diff --git a/img/system/caddy.svg b/img/system/caddy.svg
new file mode 100644
index 000000000..2ccc69925
--- /dev/null
+++ b/img/system/caddy.svg
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/cal-com-light.svg b/img/system/cal-com-light.svg
new file mode 100644
index 000000000..36a0620f9
--- /dev/null
+++ b/img/system/cal-com-light.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/cal-com.svg b/img/system/cal-com.svg
new file mode 100644
index 000000000..6878b0293
--- /dev/null
+++ b/img/system/cal-com.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/calibre-web.svg b/img/system/calibre-web.svg
new file mode 100644
index 000000000..e5454574b
--- /dev/null
+++ b/img/system/calibre-web.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/calibre.svg b/img/system/calibre.svg
new file mode 100644
index 000000000..94ee1de6f
--- /dev/null
+++ b/img/system/calibre.svg
@@ -0,0 +1,225 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/castopod.svg b/img/system/castopod.svg
new file mode 100644
index 000000000..ae289c0c3
--- /dev/null
+++ b/img/system/castopod.svg
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/changedetection-light.svg b/img/system/changedetection-light.svg
new file mode 100644
index 000000000..07d74955d
--- /dev/null
+++ b/img/system/changedetection-light.svg
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/changedetection.svg b/img/system/changedetection.svg
new file mode 100644
index 000000000..42d43b642
--- /dev/null
+++ b/img/system/changedetection.svg
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/channels-dvr.svg b/img/system/channels-dvr.svg
new file mode 100644
index 000000000..c5d184b97
--- /dev/null
+++ b/img/system/channels-dvr.svg
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/chevereto.svg b/img/system/chevereto.svg
new file mode 100644
index 000000000..165b2e00f
--- /dev/null
+++ b/img/system/chevereto.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
diff --git a/img/system/chirpy.svg b/img/system/chirpy.svg
new file mode 100644
index 000000000..84387d70b
--- /dev/null
+++ b/img/system/chirpy.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/img/system/chromium.svg b/img/system/chromium.svg
new file mode 100644
index 000000000..0d28f497a
--- /dev/null
+++ b/img/system/chromium.svg
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/clickhouse.svg b/img/system/clickhouse.svg
new file mode 100644
index 000000000..4de550a3a
--- /dev/null
+++ b/img/system/clickhouse.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/cloudbeaver.svg b/img/system/cloudbeaver.svg
new file mode 100644
index 000000000..fd6327300
--- /dev/null
+++ b/img/system/cloudbeaver.svg
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/cloudflare.svg b/img/system/cloudflare.svg
new file mode 100644
index 000000000..792335a77
--- /dev/null
+++ b/img/system/cloudflare.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/cockpit-light.svg b/img/system/cockpit-light.svg
new file mode 100644
index 000000000..34ad1d629
--- /dev/null
+++ b/img/system/cockpit-light.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/cockpit.svg b/img/system/cockpit.svg
new file mode 100644
index 000000000..037aa66eb
--- /dev/null
+++ b/img/system/cockpit.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
diff --git a/img/system/codeberg.svg b/img/system/codeberg.svg
new file mode 100644
index 000000000..66fb4ac5a
--- /dev/null
+++ b/img/system/codeberg.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/coder-light.svg b/img/system/coder-light.svg
new file mode 100644
index 000000000..b445204a5
--- /dev/null
+++ b/img/system/coder-light.svg
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/coder.svg b/img/system/coder.svg
new file mode 100644
index 000000000..5dd5efab0
--- /dev/null
+++ b/img/system/coder.svg
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/commafeed-light.svg b/img/system/commafeed-light.svg
new file mode 100644
index 000000000..f28a8cfec
--- /dev/null
+++ b/img/system/commafeed-light.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/commafeed.svg b/img/system/commafeed.svg
new file mode 100644
index 000000000..9e253ecea
--- /dev/null
+++ b/img/system/commafeed.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/commento-light.svg b/img/system/commento-light.svg
new file mode 100644
index 000000000..ebb441fef
--- /dev/null
+++ b/img/system/commento-light.svg
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/commento.svg b/img/system/commento.svg
new file mode 100644
index 000000000..782b37bb3
--- /dev/null
+++ b/img/system/commento.svg
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/compreface.svg b/img/system/compreface.svg
new file mode 100644
index 000000000..a0953ee49
--- /dev/null
+++ b/img/system/compreface.svg
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/confluence.svg b/img/system/confluence.svg
new file mode 100644
index 000000000..0925c8071
--- /dev/null
+++ b/img/system/confluence.svg
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/converse-light.svg b/img/system/converse-light.svg
new file mode 100644
index 000000000..21f580cb8
--- /dev/null
+++ b/img/system/converse-light.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/converse.svg b/img/system/converse.svg
new file mode 100644
index 000000000..364f98f8d
--- /dev/null
+++ b/img/system/converse.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/couchdb-light.svg b/img/system/couchdb-light.svg
new file mode 100644
index 000000000..06267ec6c
--- /dev/null
+++ b/img/system/couchdb-light.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/couchdb.svg b/img/system/couchdb.svg
new file mode 100644
index 000000000..38e32f217
--- /dev/null
+++ b/img/system/couchdb.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/counter-analytics.svg b/img/system/counter-analytics.svg
new file mode 100644
index 000000000..d762358ef
--- /dev/null
+++ b/img/system/counter-analytics.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/crowdsec.svg b/img/system/crowdsec.svg
new file mode 100644
index 000000000..0a20c3c2b
--- /dev/null
+++ b/img/system/crowdsec.svg
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/cryptpad.svg b/img/system/cryptpad.svg
new file mode 100644
index 000000000..2d1d4790d
--- /dev/null
+++ b/img/system/cryptpad.svg
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/ctfreak.svg b/img/system/ctfreak.svg
new file mode 100644
index 000000000..976431378
--- /dev/null
+++ b/img/system/ctfreak.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/cyberchef.svg b/img/system/cyberchef.svg
new file mode 100644
index 000000000..a3a227925
--- /dev/null
+++ b/img/system/cyberchef.svg
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/czkawka.svg b/img/system/czkawka.svg
new file mode 100644
index 000000000..4ac926669
--- /dev/null
+++ b/img/system/czkawka.svg
@@ -0,0 +1,180 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/dalibo-light.svg b/img/system/dalibo-light.svg
new file mode 100644
index 000000000..88d05ad7f
--- /dev/null
+++ b/img/system/dalibo-light.svg
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/dalibo.svg b/img/system/dalibo.svg
new file mode 100644
index 000000000..797c10f91
--- /dev/null
+++ b/img/system/dalibo.svg
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/davical.svg b/img/system/davical.svg
new file mode 100644
index 000000000..9f6a65a4d
--- /dev/null
+++ b/img/system/davical.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/ddclient.svg b/img/system/ddclient.svg
new file mode 100644
index 000000000..98d30983e
--- /dev/null
+++ b/img/system/ddclient.svg
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/ddns-updater.svg b/img/system/ddns-updater.svg
new file mode 100644
index 000000000..4db68319b
--- /dev/null
+++ b/img/system/ddns-updater.svg
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DNS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/defguard.svg b/img/system/defguard.svg
new file mode 100644
index 000000000..2d417b58f
--- /dev/null
+++ b/img/system/defguard.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/deluge.svg b/img/system/deluge.svg
new file mode 100644
index 000000000..fb66e1ae7
--- /dev/null
+++ b/img/system/deluge.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/digitalocean-light.svg b/img/system/digitalocean-light.svg
new file mode 100644
index 000000000..a2e4499a7
--- /dev/null
+++ b/img/system/digitalocean-light.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/digitalocean.svg b/img/system/digitalocean.svg
new file mode 100644
index 000000000..c4088acfb
--- /dev/null
+++ b/img/system/digitalocean.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/dillinger-light.svg b/img/system/dillinger-light.svg
new file mode 100644
index 000000000..88d5e6b95
--- /dev/null
+++ b/img/system/dillinger-light.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/img/system/dillinger.svg b/img/system/dillinger.svg
new file mode 100644
index 000000000..e1fb5a785
--- /dev/null
+++ b/img/system/dillinger.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/img/system/docassemble-light.svg b/img/system/docassemble-light.svg
new file mode 100644
index 000000000..f66ed4a3b
--- /dev/null
+++ b/img/system/docassemble-light.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/docassemble.svg b/img/system/docassemble.svg
new file mode 100644
index 000000000..2e761d0a1
--- /dev/null
+++ b/img/system/docassemble.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/docker-light.svg b/img/system/docker-light.svg
new file mode 100644
index 000000000..ec1dca7ab
--- /dev/null
+++ b/img/system/docker-light.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/img/system/docker-volume-backup.svg b/img/system/docker-volume-backup.svg
new file mode 100644
index 000000000..1df6b72ac
--- /dev/null
+++ b/img/system/docker-volume-backup.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/docker.svg b/img/system/docker.svg
new file mode 100644
index 000000000..281a110d7
--- /dev/null
+++ b/img/system/docker.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/img/system/dockge.svg b/img/system/dockge.svg
new file mode 100644
index 000000000..b8e2df26b
--- /dev/null
+++ b/img/system/dockge.svg
@@ -0,0 +1,14 @@
+
+
+
+Created with Fabric.js 5.3.0
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/img/system/docspell.svg b/img/system/docspell.svg
new file mode 100644
index 000000000..a895c3523
--- /dev/null
+++ b/img/system/docspell.svg
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/docusaurus.svg b/img/system/docusaurus.svg
new file mode 100644
index 000000000..1a6e63603
--- /dev/null
+++ b/img/system/docusaurus.svg
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/docuseal.svg b/img/system/docuseal.svg
new file mode 100644
index 000000000..87ffe772b
--- /dev/null
+++ b/img/system/docuseal.svg
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/dokemon.svg b/img/system/dokemon.svg
new file mode 100644
index 000000000..f4968a241
--- /dev/null
+++ b/img/system/dokemon.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/dokuwiki.svg b/img/system/dokuwiki.svg
new file mode 100644
index 000000000..c8c4ab6b8
--- /dev/null
+++ b/img/system/dokuwiki.svg
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/double-take.svg b/img/system/double-take.svg
new file mode 100644
index 000000000..ce67543c2
--- /dev/null
+++ b/img/system/double-take.svg
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/dovecot.svg b/img/system/dovecot.svg
new file mode 100644
index 000000000..d0273678c
--- /dev/null
+++ b/img/system/dovecot.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/img/system/dozzle-light.svg b/img/system/dozzle-light.svg
new file mode 100644
index 000000000..f5a90b56f
--- /dev/null
+++ b/img/system/dozzle-light.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/dozzle.svg b/img/system/dozzle.svg
new file mode 100644
index 000000000..9c819bd61
--- /dev/null
+++ b/img/system/dozzle.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/draw-io.svg b/img/system/draw-io.svg
new file mode 100644
index 000000000..feac11d9c
--- /dev/null
+++ b/img/system/draw-io.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/dropbox-light.svg b/img/system/dropbox-light.svg
new file mode 100644
index 000000000..8f3e6a5a8
--- /dev/null
+++ b/img/system/dropbox-light.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/dropbox.svg b/img/system/dropbox.svg
new file mode 100644
index 000000000..be60733a5
--- /dev/null
+++ b/img/system/dropbox.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/dropout.svg b/img/system/dropout.svg
new file mode 100644
index 000000000..6afb5aa19
--- /dev/null
+++ b/img/system/dropout.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/dub-light.svg b/img/system/dub-light.svg
new file mode 100644
index 000000000..c44d24cd0
--- /dev/null
+++ b/img/system/dub-light.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/img/system/dub.svg b/img/system/dub.svg
new file mode 100644
index 000000000..9fb05b3ad
--- /dev/null
+++ b/img/system/dub.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/img/system/duckdns.svg b/img/system/duckdns.svg
new file mode 100644
index 000000000..8e51d1f46
--- /dev/null
+++ b/img/system/duckdns.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/duplicati.svg b/img/system/duplicati.svg
new file mode 100644
index 000000000..35015810f
--- /dev/null
+++ b/img/system/duplicati.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/element.svg b/img/system/element.svg
new file mode 100644
index 000000000..684cb4d5c
--- /dev/null
+++ b/img/system/element.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/eleventy-light.svg b/img/system/eleventy-light.svg
new file mode 100644
index 000000000..ca4401ce4
--- /dev/null
+++ b/img/system/eleventy-light.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
diff --git a/img/system/eleventy.svg b/img/system/eleventy.svg
new file mode 100644
index 000000000..1ab448b3c
--- /dev/null
+++ b/img/system/eleventy.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
diff --git a/img/system/emby.svg b/img/system/emby.svg
new file mode 100644
index 000000000..b2ebebaac
--- /dev/null
+++ b/img/system/emby.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/endless-light.svg b/img/system/endless-light.svg
new file mode 100644
index 000000000..251380d76
--- /dev/null
+++ b/img/system/endless-light.svg
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/endless.svg b/img/system/endless.svg
new file mode 100644
index 000000000..febc8b5c7
--- /dev/null
+++ b/img/system/endless.svg
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/endurain.svg b/img/system/endurain.svg
new file mode 100644
index 000000000..8b70b184f
--- /dev/null
+++ b/img/system/endurain.svg
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/esphome-light.svg b/img/system/esphome-light.svg
new file mode 100644
index 000000000..f73c519a6
--- /dev/null
+++ b/img/system/esphome-light.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/esphome.svg b/img/system/esphome.svg
new file mode 100644
index 000000000..a078289e6
--- /dev/null
+++ b/img/system/esphome.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/etesync.svg b/img/system/etesync.svg
new file mode 100644
index 000000000..dd2ee3877
--- /dev/null
+++ b/img/system/etesync.svg
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/excalidraw.svg b/img/system/excalidraw.svg
new file mode 100644
index 000000000..904aea65c
--- /dev/null
+++ b/img/system/excalidraw.svg
@@ -0,0 +1,52 @@
+
+
+
+
+
+
diff --git a/img/system/fasten-health.svg b/img/system/fasten-health.svg
new file mode 100644
index 000000000..06576d367
--- /dev/null
+++ b/img/system/fasten-health.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/fastmail.svg b/img/system/fastmail.svg
new file mode 100644
index 000000000..084db9bf9
--- /dev/null
+++ b/img/system/fastmail.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/feedbase-light.svg b/img/system/feedbase-light.svg
new file mode 100644
index 000000000..c1fa9f55c
--- /dev/null
+++ b/img/system/feedbase-light.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/feedbase.svg b/img/system/feedbase.svg
new file mode 100644
index 000000000..ea6f6f7a5
--- /dev/null
+++ b/img/system/feedbase.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/feedbin-light.svg b/img/system/feedbin-light.svg
new file mode 100644
index 000000000..bbd87486c
--- /dev/null
+++ b/img/system/feedbin-light.svg
@@ -0,0 +1,31 @@
+
+
+
+
+
+
diff --git a/img/system/feedbin.svg b/img/system/feedbin.svg
new file mode 100644
index 000000000..1ac980146
--- /dev/null
+++ b/img/system/feedbin.svg
@@ -0,0 +1,28 @@
+
+
+
+
+
diff --git a/img/system/feedly-light.svg b/img/system/feedly-light.svg
new file mode 100644
index 000000000..3be8a96f5
--- /dev/null
+++ b/img/system/feedly-light.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/feedly.svg b/img/system/feedly.svg
new file mode 100644
index 000000000..3be8a96f5
--- /dev/null
+++ b/img/system/feedly.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/feedlynx.svg b/img/system/feedlynx.svg
new file mode 100644
index 000000000..f5dad458a
--- /dev/null
+++ b/img/system/feedlynx.svg
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/fenrus.svg b/img/system/fenrus.svg
new file mode 100644
index 000000000..a76d27f61
--- /dev/null
+++ b/img/system/fenrus.svg
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/ferdium-light.svg b/img/system/ferdium-light.svg
new file mode 100644
index 000000000..353dc3ef9
--- /dev/null
+++ b/img/system/ferdium-light.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/img/system/ferdium.svg b/img/system/ferdium.svg
new file mode 100644
index 000000000..320b7a802
--- /dev/null
+++ b/img/system/ferdium.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/ferretdb-light.svg b/img/system/ferretdb-light.svg
new file mode 100644
index 000000000..11d74fd49
--- /dev/null
+++ b/img/system/ferretdb-light.svg
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/ferretdb.svg b/img/system/ferretdb.svg
new file mode 100644
index 000000000..7da7f6023
--- /dev/null
+++ b/img/system/ferretdb.svg
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/file-browser.svg b/img/system/file-browser.svg
new file mode 100644
index 000000000..02d516116
--- /dev/null
+++ b/img/system/file-browser.svg
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/fileflows.svg b/img/system/fileflows.svg
new file mode 100644
index 000000000..02d9495b2
--- /dev/null
+++ b/img/system/fileflows.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/filerun-light.svg b/img/system/filerun-light.svg
new file mode 100644
index 000000000..c0c8fc1af
--- /dev/null
+++ b/img/system/filerun-light.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/img/system/filerun.svg b/img/system/filerun.svg
new file mode 100644
index 000000000..5c6da3e9c
--- /dev/null
+++ b/img/system/filerun.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/img/system/filestash.svg b/img/system/filestash.svg
new file mode 100644
index 000000000..4964f925a
--- /dev/null
+++ b/img/system/filestash.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
diff --git a/img/system/firefly-iii.svg b/img/system/firefly-iii.svg
new file mode 100644
index 000000000..ac900e75c
--- /dev/null
+++ b/img/system/firefly-iii.svg
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/fittrackee.svg b/img/system/fittrackee.svg
new file mode 100644
index 000000000..ed6efe0a7
--- /dev/null
+++ b/img/system/fittrackee.svg
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/flaresolverr.svg b/img/system/flaresolverr.svg
new file mode 100644
index 000000000..e923ad7ca
--- /dev/null
+++ b/img/system/flaresolverr.svg
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/flarum.svg b/img/system/flarum.svg
new file mode 100644
index 000000000..77351ea92
--- /dev/null
+++ b/img/system/flarum.svg
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/fluffychat-light.svg b/img/system/fluffychat-light.svg
new file mode 100644
index 000000000..51736bd09
--- /dev/null
+++ b/img/system/fluffychat-light.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
diff --git a/img/system/fluffychat.svg b/img/system/fluffychat.svg
new file mode 100644
index 000000000..b8aa99069
--- /dev/null
+++ b/img/system/fluffychat.svg
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/forgejo.svg b/img/system/forgejo.svg
new file mode 100644
index 000000000..23041a1aa
--- /dev/null
+++ b/img/system/forgejo.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/forte-light.svg b/img/system/forte-light.svg
new file mode 100644
index 000000000..24f4fad91
--- /dev/null
+++ b/img/system/forte-light.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/forte.svg b/img/system/forte.svg
new file mode 100644
index 000000000..56085db4f
--- /dev/null
+++ b/img/system/forte.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/freeipa.svg b/img/system/freeipa.svg
new file mode 100644
index 000000000..3bf117613
--- /dev/null
+++ b/img/system/freeipa.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/freshrss.svg b/img/system/freshrss.svg
new file mode 100644
index 000000000..bc16585c3
--- /dev/null
+++ b/img/system/freshrss.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/friendica.svg b/img/system/friendica.svg
new file mode 100644
index 000000000..087e9ed85
--- /dev/null
+++ b/img/system/friendica.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/frigate-light.svg b/img/system/frigate-light.svg
new file mode 100644
index 000000000..634e8ebc0
--- /dev/null
+++ b/img/system/frigate-light.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
diff --git a/img/system/frigate.svg b/img/system/frigate.svg
new file mode 100644
index 000000000..3f8d0198b
--- /dev/null
+++ b/img/system/frigate.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
diff --git a/img/system/funkwhale-light.svg b/img/system/funkwhale-light.svg
new file mode 100644
index 000000000..aae6ed54e
--- /dev/null
+++ b/img/system/funkwhale-light.svg
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/funkwhale.svg b/img/system/funkwhale.svg
new file mode 100644
index 000000000..1aa0fffbc
--- /dev/null
+++ b/img/system/funkwhale.svg
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/fusionauth-light.svg b/img/system/fusionauth-light.svg
new file mode 100644
index 000000000..13da9c66d
--- /dev/null
+++ b/img/system/fusionauth-light.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/fusionauth.svg b/img/system/fusionauth.svg
new file mode 100644
index 000000000..19548329f
--- /dev/null
+++ b/img/system/fusionauth.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/garage.svg b/img/system/garage.svg
new file mode 100644
index 000000000..b9d1614d1
--- /dev/null
+++ b/img/system/garage.svg
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/gatsby.svg b/img/system/gatsby.svg
new file mode 100644
index 000000000..d10edec3d
--- /dev/null
+++ b/img/system/gatsby.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/gatus.svg b/img/system/gatus.svg
new file mode 100644
index 000000000..f1a3edb3f
--- /dev/null
+++ b/img/system/gatus.svg
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/ghostfolio.svg b/img/system/ghostfolio.svg
new file mode 100644
index 000000000..df11c43da
--- /dev/null
+++ b/img/system/ghostfolio.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/gitea.svg b/img/system/gitea.svg
new file mode 100644
index 000000000..77ac22ae3
--- /dev/null
+++ b/img/system/gitea.svg
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/gitlab.svg b/img/system/gitlab.svg
new file mode 100644
index 000000000..11fafb7f9
--- /dev/null
+++ b/img/system/gitlab.svg
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ H: 2.5 x
+ 1/2 x
+ 1x
+ 1x
+
+ 1x
+
+ 1x
+
+
diff --git a/img/system/glance-light.svg b/img/system/glance-light.svg
new file mode 100644
index 000000000..8529ccab7
--- /dev/null
+++ b/img/system/glance-light.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/img/system/glance.svg b/img/system/glance.svg
new file mode 100644
index 000000000..a1de76910
--- /dev/null
+++ b/img/system/glance.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/glpi.svg b/img/system/glpi.svg
new file mode 100644
index 000000000..163a9c83a
--- /dev/null
+++ b/img/system/glpi.svg
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/gotify.svg b/img/system/gotify.svg
new file mode 100644
index 000000000..860ee4ad3
--- /dev/null
+++ b/img/system/gotify.svg
@@ -0,0 +1,5928 @@
+
+
+
+
+
+
+
+
+
+
+]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/gotosocial.svg b/img/system/gotosocial.svg
new file mode 100644
index 000000000..43c242f29
--- /dev/null
+++ b/img/system/gotosocial.svg
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/grafana.svg b/img/system/grafana.svg
new file mode 100644
index 000000000..13fc68805
--- /dev/null
+++ b/img/system/grafana.svg
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/grav-light.svg b/img/system/grav-light.svg
new file mode 100644
index 000000000..6aab92fdd
--- /dev/null
+++ b/img/system/grav-light.svg
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/grav.svg b/img/system/grav.svg
new file mode 100644
index 000000000..2e491d97a
--- /dev/null
+++ b/img/system/grav.svg
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/grimoire.svg b/img/system/grimoire.svg
new file mode 100644
index 000000000..6a49ad1cb
--- /dev/null
+++ b/img/system/grimoire.svg
@@ -0,0 +1,4489 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/grist.svg b/img/system/grist.svg
new file mode 100644
index 000000000..3c090888b
--- /dev/null
+++ b/img/system/grist.svg
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/grocy.svg b/img/system/grocy.svg
new file mode 100644
index 000000000..2b286e3bd
--- /dev/null
+++ b/img/system/grocy.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/haproxy.svg b/img/system/haproxy.svg
new file mode 100644
index 000000000..159a21fac
--- /dev/null
+++ b/img/system/haproxy.svg
@@ -0,0 +1,189 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/haptic-light.svg b/img/system/haptic-light.svg
new file mode 100644
index 000000000..b2728e6a1
--- /dev/null
+++ b/img/system/haptic-light.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/haptic.svg b/img/system/haptic.svg
new file mode 100644
index 000000000..fa1f426eb
--- /dev/null
+++ b/img/system/haptic.svg
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/headscale.svg b/img/system/headscale.svg
new file mode 100644
index 000000000..eec6cdb0e
--- /dev/null
+++ b/img/system/headscale.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/healthchecks-light.svg b/img/system/healthchecks-light.svg
new file mode 100644
index 000000000..4b66c5b68
--- /dev/null
+++ b/img/system/healthchecks-light.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/healthchecks.svg b/img/system/healthchecks.svg
new file mode 100644
index 000000000..66d2b5bec
--- /dev/null
+++ b/img/system/healthchecks.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/hedgedoc.svg b/img/system/hedgedoc.svg
new file mode 100644
index 000000000..ce6aafe3a
--- /dev/null
+++ b/img/system/hedgedoc.svg
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/heimdall-light.svg b/img/system/heimdall-light.svg
new file mode 100644
index 000000000..01024e795
--- /dev/null
+++ b/img/system/heimdall-light.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/heimdall.svg b/img/system/heimdall.svg
new file mode 100644
index 000000000..517e387d2
--- /dev/null
+++ b/img/system/heimdall.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/heyform.svg b/img/system/heyform.svg
new file mode 100644
index 000000000..45b822567
--- /dev/null
+++ b/img/system/heyform.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/hivedav.svg b/img/system/hivedav.svg
new file mode 100644
index 000000000..1c1525e2e
--- /dev/null
+++ b/img/system/hivedav.svg
@@ -0,0 +1,228 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/hoarder-light.svg b/img/system/hoarder-light.svg
new file mode 100644
index 000000000..b9bb8e1df
--- /dev/null
+++ b/img/system/hoarder-light.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/hoarder.svg b/img/system/hoarder.svg
new file mode 100644
index 000000000..2bbedbd01
--- /dev/null
+++ b/img/system/hoarder.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
diff --git a/img/system/hollo-light.svg b/img/system/hollo-light.svg
new file mode 100644
index 000000000..ab7eb9260
--- /dev/null
+++ b/img/system/hollo-light.svg
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/hollo.svg b/img/system/hollo.svg
new file mode 100644
index 000000000..cf80b011f
--- /dev/null
+++ b/img/system/hollo.svg
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/homarr.svg b/img/system/homarr.svg
new file mode 100644
index 000000000..ea37c8706
--- /dev/null
+++ b/img/system/homarr.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/home-assistant.svg b/img/system/home-assistant.svg
new file mode 100644
index 000000000..09b2f41c0
--- /dev/null
+++ b/img/system/home-assistant.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/homebox.svg b/img/system/homebox.svg
new file mode 100644
index 000000000..70d1af8ef
--- /dev/null
+++ b/img/system/homebox.svg
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/homebridge-light.svg b/img/system/homebridge-light.svg
new file mode 100644
index 000000000..d690e25a1
--- /dev/null
+++ b/img/system/homebridge-light.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
diff --git a/img/system/homebridge.svg b/img/system/homebridge.svg
new file mode 100644
index 000000000..92450d29e
--- /dev/null
+++ b/img/system/homebridge.svg
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/homer.svg b/img/system/homer.svg
new file mode 100644
index 000000000..6a19de5ec
--- /dev/null
+++ b/img/system/homer.svg
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/hoppscotch-light.svg b/img/system/hoppscotch-light.svg
new file mode 100644
index 000000000..42bf08e39
--- /dev/null
+++ b/img/system/hoppscotch-light.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/hoppscotch.svg b/img/system/hoppscotch.svg
new file mode 100644
index 000000000..a89b391f0
--- /dev/null
+++ b/img/system/hoppscotch.svg
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/hubzilla-light.svg b/img/system/hubzilla-light.svg
new file mode 100644
index 000000000..280b2738c
--- /dev/null
+++ b/img/system/hubzilla-light.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/hubzilla.svg b/img/system/hubzilla.svg
new file mode 100644
index 000000000..acd033f1b
--- /dev/null
+++ b/img/system/hubzilla.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/huginn.svg b/img/system/huginn.svg
new file mode 100644
index 000000000..2218178b6
--- /dev/null
+++ b/img/system/huginn.svg
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/hugo.svg b/img/system/hugo.svg
new file mode 100644
index 000000000..9b516ab93
--- /dev/null
+++ b/img/system/hugo.svg
@@ -0,0 +1,247 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/humhub.svg b/img/system/humhub.svg
new file mode 100644
index 000000000..e15045b77
--- /dev/null
+++ b/img/system/humhub.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/icon.svg b/img/system/icon.svg
new file mode 100644
index 000000000..71946ade8
--- /dev/null
+++ b/img/system/icon.svg
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 文
+
+
diff --git a/img/system/immich-frame-light.svg b/img/system/immich-frame-light.svg
new file mode 100644
index 000000000..984243d16
--- /dev/null
+++ b/img/system/immich-frame-light.svg
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/immich-frame.svg b/img/system/immich-frame.svg
new file mode 100644
index 000000000..1e680cc92
--- /dev/null
+++ b/img/system/immich-frame.svg
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/immich-kiosk.svg b/img/system/immich-kiosk.svg
new file mode 100644
index 000000000..dde59f4ea
--- /dev/null
+++ b/img/system/immich-kiosk.svg
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/immich.svg b/img/system/immich.svg
new file mode 100644
index 000000000..1fbde1c7a
--- /dev/null
+++ b/img/system/immich.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/influxdb.svg b/img/system/influxdb.svg
new file mode 100644
index 000000000..0f214ccdb
--- /dev/null
+++ b/img/system/influxdb.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/inoreader-light.svg b/img/system/inoreader-light.svg
new file mode 100644
index 000000000..5ba595f64
--- /dev/null
+++ b/img/system/inoreader-light.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/inoreader.svg b/img/system/inoreader.svg
new file mode 100644
index 000000000..f7155936f
--- /dev/null
+++ b/img/system/inoreader.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/invidious.svg b/img/system/invidious.svg
new file mode 100644
index 000000000..53f3c262c
--- /dev/null
+++ b/img/system/invidious.svg
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/invoice-ninja-light.svg b/img/system/invoice-ninja-light.svg
new file mode 100644
index 000000000..e3968d782
--- /dev/null
+++ b/img/system/invoice-ninja-light.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/invoice-ninja.svg b/img/system/invoice-ninja.svg
new file mode 100644
index 000000000..23fea4f87
--- /dev/null
+++ b/img/system/invoice-ninja.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/img/system/it-tools-light.svg b/img/system/it-tools-light.svg
new file mode 100644
index 000000000..0a5b20147
--- /dev/null
+++ b/img/system/it-tools-light.svg
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/it-tools.svg b/img/system/it-tools.svg
new file mode 100644
index 000000000..b158f5aa1
--- /dev/null
+++ b/img/system/it-tools.svg
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/jackett-light.svg b/img/system/jackett-light.svg
new file mode 100644
index 000000000..3dd957ee4
--- /dev/null
+++ b/img/system/jackett-light.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/jackett.svg b/img/system/jackett.svg
new file mode 100644
index 000000000..462111843
--- /dev/null
+++ b/img/system/jackett.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/jekyll.svg b/img/system/jekyll.svg
new file mode 100644
index 000000000..bedd4d081
--- /dev/null
+++ b/img/system/jekyll.svg
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/jellyfin-light.svg b/img/system/jellyfin-light.svg
new file mode 100644
index 000000000..16a8edab7
--- /dev/null
+++ b/img/system/jellyfin-light.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/jellyfin.svg b/img/system/jellyfin.svg
new file mode 100644
index 000000000..a6e8cab70
--- /dev/null
+++ b/img/system/jellyfin.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/jellyseerr.svg b/img/system/jellyseerr.svg
new file mode 100644
index 000000000..14a0e18b3
--- /dev/null
+++ b/img/system/jellyseerr.svg
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/jira.svg b/img/system/jira.svg
new file mode 100644
index 000000000..0fb440522
--- /dev/null
+++ b/img/system/jira.svg
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/jitsi-meet.svg b/img/system/jitsi-meet.svg
new file mode 100644
index 000000000..277ac484b
--- /dev/null
+++ b/img/system/jitsi-meet.svg
@@ -0,0 +1,255 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/jwt-io-light.svg b/img/system/jwt-io-light.svg
new file mode 100644
index 000000000..02bfffc55
--- /dev/null
+++ b/img/system/jwt-io-light.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/jwt-io.svg b/img/system/jwt-io.svg
new file mode 100644
index 000000000..a6c4f4fb1
--- /dev/null
+++ b/img/system/jwt-io.svg
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/kanboard-light.svg b/img/system/kanboard-light.svg
new file mode 100644
index 000000000..01b57661a
--- /dev/null
+++ b/img/system/kanboard-light.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/kanboard.svg b/img/system/kanboard.svg
new file mode 100644
index 000000000..fd65cc7c6
--- /dev/null
+++ b/img/system/kanboard.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/kanidm.svg b/img/system/kanidm.svg
new file mode 100644
index 000000000..1f44daaef
--- /dev/null
+++ b/img/system/kanidm.svg
@@ -0,0 +1,229 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PASSPORT
+ AUTHSTRALIA
+ KANIDM
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PASSPORT
+ AUTHSTRALIA
+ KANIDM
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/kapowarr.svg b/img/system/kapowarr.svg
new file mode 100644
index 000000000..73b479e7d
--- /dev/null
+++ b/img/system/kapowarr.svg
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/kavita.svg b/img/system/kavita.svg
new file mode 100644
index 000000000..6b6bda7b3
--- /dev/null
+++ b/img/system/kavita.svg
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/kbin.svg b/img/system/kbin.svg
new file mode 100644
index 000000000..e4f699361
--- /dev/null
+++ b/img/system/kbin.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/keepassxc.svg b/img/system/keepassxc.svg
new file mode 100644
index 000000000..7d58610fa
--- /dev/null
+++ b/img/system/keepassxc.svg
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/keila.svg b/img/system/keila.svg
new file mode 100644
index 000000000..6f67df4b2
--- /dev/null
+++ b/img/system/keila.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/kestra.svg b/img/system/kestra.svg
new file mode 100644
index 000000000..ab1c0e0a3
--- /dev/null
+++ b/img/system/kestra.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/keycloak.svg b/img/system/keycloak.svg
new file mode 100644
index 000000000..634e99209
--- /dev/null
+++ b/img/system/keycloak.svg
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/komga.svg b/img/system/komga.svg
new file mode 100644
index 000000000..5de3eefec
--- /dev/null
+++ b/img/system/komga.svg
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+K
+K
+
diff --git a/img/system/kontoj.svg b/img/system/kontoj.svg
new file mode 100644
index 000000000..192a0d7b0
--- /dev/null
+++ b/img/system/kontoj.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/krakend.svg b/img/system/krakend.svg
new file mode 100644
index 000000000..f06d7d4e2
--- /dev/null
+++ b/img/system/krakend.svg
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/kyoo-light.svg b/img/system/kyoo-light.svg
new file mode 100644
index 000000000..26c17935b
--- /dev/null
+++ b/img/system/kyoo-light.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/kyoo.svg b/img/system/kyoo.svg
new file mode 100644
index 000000000..638172ed8
--- /dev/null
+++ b/img/system/kyoo.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/lancommander-light.svg b/img/system/lancommander-light.svg
new file mode 100644
index 000000000..ff4f355f4
--- /dev/null
+++ b/img/system/lancommander-light.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/lancommander.svg b/img/system/lancommander.svg
new file mode 100644
index 000000000..246a5872d
--- /dev/null
+++ b/img/system/lancommander.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/leantime.svg b/img/system/leantime.svg
new file mode 100644
index 000000000..8ce40b4f3
--- /dev/null
+++ b/img/system/leantime.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/lets-encrypt-light.svg b/img/system/lets-encrypt-light.svg
new file mode 100644
index 000000000..8dd72bb2b
--- /dev/null
+++ b/img/system/lets-encrypt-light.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/lets-encrypt.svg b/img/system/lets-encrypt.svg
new file mode 100644
index 000000000..41a98c300
--- /dev/null
+++ b/img/system/lets-encrypt.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/librespeed.svg b/img/system/librespeed.svg
new file mode 100644
index 000000000..f35f44d68
--- /dev/null
+++ b/img/system/librespeed.svg
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/librum.svg b/img/system/librum.svg
new file mode 100644
index 000000000..f1355eab1
--- /dev/null
+++ b/img/system/librum.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/lidarr.svg b/img/system/lidarr.svg
new file mode 100644
index 000000000..22339eb69
--- /dev/null
+++ b/img/system/lidarr.svg
@@ -0,0 +1,441 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/limesurvey.svg b/img/system/limesurvey.svg
new file mode 100644
index 000000000..7a60b2320
--- /dev/null
+++ b/img/system/limesurvey.svg
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/linkace-light.svg b/img/system/linkace-light.svg
new file mode 100644
index 000000000..ed4415a38
--- /dev/null
+++ b/img/system/linkace-light.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/linkace.svg b/img/system/linkace.svg
new file mode 100644
index 000000000..1392371ed
--- /dev/null
+++ b/img/system/linkace.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/linkding.svg b/img/system/linkding.svg
new file mode 100644
index 000000000..d080d3900
--- /dev/null
+++ b/img/system/linkding.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/linkstack.svg b/img/system/linkstack.svg
new file mode 100644
index 000000000..f00497ec3
--- /dev/null
+++ b/img/system/linkstack.svg
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/linuxserver-io.svg b/img/system/linuxserver-io.svg
new file mode 100644
index 000000000..5fb6acc16
--- /dev/null
+++ b/img/system/linuxserver-io.svg
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/listmonk.svg b/img/system/listmonk.svg
new file mode 100644
index 000000000..eb8eb5da3
--- /dev/null
+++ b/img/system/listmonk.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/lodestone.svg b/img/system/lodestone.svg
new file mode 100644
index 000000000..8f9690941
--- /dev/null
+++ b/img/system/lodestone.svg
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/logseq.svg b/img/system/logseq.svg
new file mode 100644
index 000000000..2f2bf9501
--- /dev/null
+++ b/img/system/logseq.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/logto.svg b/img/system/logto.svg
new file mode 100644
index 000000000..f944ba948
--- /dev/null
+++ b/img/system/logto.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/loki.svg b/img/system/loki.svg
new file mode 100644
index 000000000..5e18f38d7
--- /dev/null
+++ b/img/system/loki.svg
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mail-in-a-box.svg b/img/system/mail-in-a-box.svg
new file mode 100644
index 000000000..c8c85a11b
--- /dev/null
+++ b/img/system/mail-in-a-box.svg
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ RETURN PATH
+ IMAP DNS
+ Mail-in-a-Box
+ SMTP Port 25
+ The Internet
+
+
diff --git a/img/system/mailcow.svg b/img/system/mailcow.svg
new file mode 100644
index 000000000..7f344854e
--- /dev/null
+++ b/img/system/mailcow.svg
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mailjet-light.svg b/img/system/mailjet-light.svg
new file mode 100644
index 000000000..a624de557
--- /dev/null
+++ b/img/system/mailjet-light.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/mailjet.svg b/img/system/mailjet.svg
new file mode 100644
index 000000000..1c6936720
--- /dev/null
+++ b/img/system/mailjet.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/manyfold.svg b/img/system/manyfold.svg
new file mode 100644
index 000000000..501ab6da7
--- /dev/null
+++ b/img/system/manyfold.svg
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mariadb.svg b/img/system/mariadb.svg
new file mode 100644
index 000000000..3d34cf04a
--- /dev/null
+++ b/img/system/mariadb.svg
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mastodon.svg b/img/system/mastodon.svg
new file mode 100644
index 000000000..c18efa80a
--- /dev/null
+++ b/img/system/mastodon.svg
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/matomo.svg b/img/system/matomo.svg
new file mode 100644
index 000000000..6434ed0e4
--- /dev/null
+++ b/img/system/matomo.svg
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/matrix-light.svg b/img/system/matrix-light.svg
new file mode 100644
index 000000000..74086e116
--- /dev/null
+++ b/img/system/matrix-light.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/matrix.svg b/img/system/matrix.svg
new file mode 100644
index 000000000..49c119b62
--- /dev/null
+++ b/img/system/matrix.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mattermost-light.svg b/img/system/mattermost-light.svg
new file mode 100644
index 000000000..1bad23438
--- /dev/null
+++ b/img/system/mattermost-light.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mattermost.svg b/img/system/mattermost.svg
new file mode 100644
index 000000000..951adf123
--- /dev/null
+++ b/img/system/mattermost.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mautic-light.svg b/img/system/mautic-light.svg
new file mode 100644
index 000000000..66c99e026
--- /dev/null
+++ b/img/system/mautic-light.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mautic.svg b/img/system/mautic.svg
new file mode 100644
index 000000000..88e52b5b5
--- /dev/null
+++ b/img/system/mautic.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/maybe.svg b/img/system/maybe.svg
new file mode 100644
index 000000000..b1c02e280
--- /dev/null
+++ b/img/system/maybe.svg
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mbin.svg b/img/system/mbin.svg
new file mode 100644
index 000000000..59a9dc782
--- /dev/null
+++ b/img/system/mbin.svg
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mealie-light.svg b/img/system/mealie-light.svg
new file mode 100644
index 000000000..1d63b8f2d
--- /dev/null
+++ b/img/system/mealie-light.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mealie.svg b/img/system/mealie.svg
new file mode 100644
index 000000000..26ba5dfba
--- /dev/null
+++ b/img/system/mealie.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/medama.svg b/img/system/medama.svg
new file mode 100644
index 000000000..e8b3137d4
--- /dev/null
+++ b/img/system/medama.svg
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mediux-light.svg b/img/system/mediux-light.svg
new file mode 100644
index 000000000..cdaad8302
--- /dev/null
+++ b/img/system/mediux-light.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
diff --git a/img/system/mediux.svg b/img/system/mediux.svg
new file mode 100644
index 000000000..b5b51d54c
--- /dev/null
+++ b/img/system/mediux.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/medusa-light.svg b/img/system/medusa-light.svg
new file mode 100644
index 000000000..87d9de985
--- /dev/null
+++ b/img/system/medusa-light.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/medusa.svg b/img/system/medusa.svg
new file mode 100644
index 000000000..90800d1f7
--- /dev/null
+++ b/img/system/medusa.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/meilisearch-light.svg b/img/system/meilisearch-light.svg
new file mode 100644
index 000000000..83f9e6157
--- /dev/null
+++ b/img/system/meilisearch-light.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/meilisearch.svg b/img/system/meilisearch.svg
new file mode 100644
index 000000000..f22cb0f74
--- /dev/null
+++ b/img/system/meilisearch.svg
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/memories-light.svg b/img/system/memories-light.svg
new file mode 100644
index 000000000..72123a2d3
--- /dev/null
+++ b/img/system/memories-light.svg
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/memories.svg b/img/system/memories.svg
new file mode 100644
index 000000000..78aca3b98
--- /dev/null
+++ b/img/system/memories.svg
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mergeable.svg b/img/system/mergeable.svg
new file mode 100644
index 000000000..975c457a6
--- /dev/null
+++ b/img/system/mergeable.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/meshping-light.svg b/img/system/meshping-light.svg
new file mode 100644
index 000000000..bb5227209
--- /dev/null
+++ b/img/system/meshping-light.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/meshping.svg b/img/system/meshping.svg
new file mode 100644
index 000000000..3c8e7a813
--- /dev/null
+++ b/img/system/meshping.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/img/system/metabase.svg b/img/system/metabase.svg
new file mode 100644
index 000000000..559c56520
--- /dev/null
+++ b/img/system/metabase.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/metube.svg b/img/system/metube.svg
new file mode 100644
index 000000000..dcb18c52e
--- /dev/null
+++ b/img/system/metube.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/minecraft.svg b/img/system/minecraft.svg
new file mode 100644
index 000000000..f11254be4
--- /dev/null
+++ b/img/system/minecraft.svg
@@ -0,0 +1,946 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/miniflux-light.svg b/img/system/miniflux-light.svg
new file mode 100644
index 000000000..571297f24
--- /dev/null
+++ b/img/system/miniflux-light.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
diff --git a/img/system/miniflux.svg b/img/system/miniflux.svg
new file mode 100644
index 000000000..cd3170cfe
--- /dev/null
+++ b/img/system/miniflux.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/img/system/minio-light.svg b/img/system/minio-light.svg
new file mode 100644
index 000000000..3b4115d92
--- /dev/null
+++ b/img/system/minio-light.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/minio.svg b/img/system/minio.svg
new file mode 100644
index 000000000..d8f145099
--- /dev/null
+++ b/img/system/minio.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mirotalk.svg b/img/system/mirotalk.svg
new file mode 100644
index 000000000..998fbc8b0
--- /dev/null
+++ b/img/system/mirotalk.svg
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/misskey-light.svg b/img/system/misskey-light.svg
new file mode 100644
index 000000000..c25e171a3
--- /dev/null
+++ b/img/system/misskey-light.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/misskey.svg b/img/system/misskey.svg
new file mode 100644
index 000000000..19c5f0951
--- /dev/null
+++ b/img/system/misskey.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/img/system/mitra-light.svg b/img/system/mitra-light.svg
new file mode 100644
index 000000000..c36cbd417
--- /dev/null
+++ b/img/system/mitra-light.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mitra.svg b/img/system/mitra.svg
new file mode 100644
index 000000000..2ad88888d
--- /dev/null
+++ b/img/system/mitra.svg
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mixpost.svg b/img/system/mixpost.svg
new file mode 100644
index 000000000..ce5089d85
--- /dev/null
+++ b/img/system/mixpost.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mobilizon.svg b/img/system/mobilizon.svg
new file mode 100644
index 000000000..a9e0bae7e
--- /dev/null
+++ b/img/system/mobilizon.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mongodb.svg b/img/system/mongodb.svg
new file mode 100644
index 000000000..f53c657e3
--- /dev/null
+++ b/img/system/mongodb.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/monica-light.svg b/img/system/monica-light.svg
new file mode 100644
index 000000000..d61379c56
--- /dev/null
+++ b/img/system/monica-light.svg
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/monica.svg b/img/system/monica.svg
new file mode 100644
index 000000000..decd2cc9d
--- /dev/null
+++ b/img/system/monica.svg
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mosquitto.svg b/img/system/mosquitto.svg
new file mode 100644
index 000000000..ed0d651de
--- /dev/null
+++ b/img/system/mosquitto.svg
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/motioneye.svg b/img/system/motioneye.svg
new file mode 100644
index 000000000..6d6444213
--- /dev/null
+++ b/img/system/motioneye.svg
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mqtt-light.svg b/img/system/mqtt-light.svg
new file mode 100644
index 000000000..de887f11f
--- /dev/null
+++ b/img/system/mqtt-light.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/mqtt.svg b/img/system/mqtt.svg
new file mode 100644
index 000000000..4e3c82066
--- /dev/null
+++ b/img/system/mqtt.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/mullvad-vpn.svg b/img/system/mullvad-vpn.svg
new file mode 100644
index 000000000..b5e29466a
--- /dev/null
+++ b/img/system/mullvad-vpn.svg
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mumble.svg b/img/system/mumble.svg
new file mode 100644
index 000000000..8eb1a1b89
--- /dev/null
+++ b/img/system/mumble.svg
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/music-assistant-light.svg b/img/system/music-assistant-light.svg
new file mode 100644
index 000000000..f76122c5f
--- /dev/null
+++ b/img/system/music-assistant-light.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/music-assistant.svg b/img/system/music-assistant.svg
new file mode 100644
index 000000000..377a0e1c0
--- /dev/null
+++ b/img/system/music-assistant.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/myheats-light.svg b/img/system/myheats-light.svg
new file mode 100644
index 000000000..530ca1dab
--- /dev/null
+++ b/img/system/myheats-light.svg
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/myheats.svg b/img/system/myheats.svg
new file mode 100644
index 000000000..0d6cd4b92
--- /dev/null
+++ b/img/system/myheats.svg
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/mysql-light.svg b/img/system/mysql-light.svg
new file mode 100644
index 000000000..96777962d
--- /dev/null
+++ b/img/system/mysql-light.svg
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/mysql.svg b/img/system/mysql.svg
new file mode 100644
index 000000000..62b5f5bf5
--- /dev/null
+++ b/img/system/mysql.svg
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/n8n.svg b/img/system/n8n.svg
new file mode 100644
index 000000000..8ae3e3591
--- /dev/null
+++ b/img/system/n8n.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/navidrome.svg b/img/system/navidrome.svg
new file mode 100644
index 000000000..5b0fe187f
--- /dev/null
+++ b/img/system/navidrome.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/neko-light.svg b/img/system/neko-light.svg
new file mode 100644
index 000000000..e19848049
--- /dev/null
+++ b/img/system/neko-light.svg
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/neko.svg b/img/system/neko.svg
new file mode 100644
index 000000000..23cf1f59d
--- /dev/null
+++ b/img/system/neko.svg
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/neodb.svg b/img/system/neodb.svg
new file mode 100644
index 000000000..2b03dc93d
--- /dev/null
+++ b/img/system/neodb.svg
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/netalertx.svg b/img/system/netalertx.svg
new file mode 100644
index 000000000..0c1c545d4
--- /dev/null
+++ b/img/system/netalertx.svg
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ A
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/netbird.svg b/img/system/netbird.svg
new file mode 100644
index 000000000..e2ceda8bc
--- /dev/null
+++ b/img/system/netbird.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/netboot-xyz-light.svg b/img/system/netboot-xyz-light.svg
new file mode 100644
index 000000000..9c7711174
--- /dev/null
+++ b/img/system/netboot-xyz-light.svg
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/netboot-xyz.svg b/img/system/netboot-xyz.svg
new file mode 100644
index 000000000..db18babdf
--- /dev/null
+++ b/img/system/netboot-xyz.svg
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/netdata-light.svg b/img/system/netdata-light.svg
new file mode 100644
index 000000000..3fa18fa33
--- /dev/null
+++ b/img/system/netdata-light.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/netdata.svg b/img/system/netdata.svg
new file mode 100644
index 000000000..d8e51ab6f
--- /dev/null
+++ b/img/system/netdata.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/netlify.svg b/img/system/netlify.svg
new file mode 100644
index 000000000..759aeb25f
--- /dev/null
+++ b/img/system/netlify.svg
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/newsblur.svg b/img/system/newsblur.svg
new file mode 100644
index 000000000..8556afe97
--- /dev/null
+++ b/img/system/newsblur.svg
@@ -0,0 +1,356 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/nextcloud-light.svg b/img/system/nextcloud-light.svg
new file mode 100644
index 000000000..df6373ef2
--- /dev/null
+++ b/img/system/nextcloud-light.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/nextcloud-news-light.svg b/img/system/nextcloud-news-light.svg
new file mode 100644
index 000000000..7a21d00ee
--- /dev/null
+++ b/img/system/nextcloud-news-light.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/nextcloud-news.svg b/img/system/nextcloud-news.svg
new file mode 100644
index 000000000..481414386
--- /dev/null
+++ b/img/system/nextcloud-news.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/nextcloud-social-light.svg b/img/system/nextcloud-social-light.svg
new file mode 100644
index 000000000..54f44bfb5
--- /dev/null
+++ b/img/system/nextcloud-social-light.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/nextcloud-social.svg b/img/system/nextcloud-social.svg
new file mode 100644
index 000000000..7811c1255
--- /dev/null
+++ b/img/system/nextcloud-social.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/nextcloud-tables-light.svg b/img/system/nextcloud-tables-light.svg
new file mode 100644
index 000000000..d50d5c3be
--- /dev/null
+++ b/img/system/nextcloud-tables-light.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/nextcloud-tables.svg b/img/system/nextcloud-tables.svg
new file mode 100644
index 000000000..40a0886df
--- /dev/null
+++ b/img/system/nextcloud-tables.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/system/nextcloud.svg b/img/system/nextcloud.svg
new file mode 100644
index 000000000..15fb91387
--- /dev/null
+++ b/img/system/nextcloud.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/nginx-proxy-manager.svg b/img/system/nginx-proxy-manager.svg
new file mode 100644
index 000000000..05931486c
--- /dev/null
+++ b/img/system/nginx-proxy-manager.svg
@@ -0,0 +1,151 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/nocodb-light.svg b/img/system/nocodb-light.svg
new file mode 100644
index 000000000..fd37e62e6
--- /dev/null
+++ b/img/system/nocodb-light.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/nocodb.svg b/img/system/nocodb.svg
new file mode 100644
index 000000000..ce8e6f385
--- /dev/null
+++ b/img/system/nocodb.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/node-red.svg b/img/system/node-red.svg
new file mode 100644
index 000000000..b027d3e33
--- /dev/null
+++ b/img/system/node-red.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/nodebb.svg b/img/system/nodebb.svg
new file mode 100644
index 000000000..bc288a72f
--- /dev/null
+++ b/img/system/nodebb.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/nordvpn-light.svg b/img/system/nordvpn-light.svg
new file mode 100644
index 000000000..4f6c49611
--- /dev/null
+++ b/img/system/nordvpn-light.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/nordvpn.svg b/img/system/nordvpn.svg
new file mode 100644
index 000000000..834a4fac0
--- /dev/null
+++ b/img/system/nordvpn.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/note-mark.svg b/img/system/note-mark.svg
new file mode 100644
index 000000000..e7662a4a3
--- /dev/null
+++ b/img/system/note-mark.svg
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/notesnook-light.svg b/img/system/notesnook-light.svg
new file mode 100644
index 000000000..59af76b7b
--- /dev/null
+++ b/img/system/notesnook-light.svg
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/notesnook.svg b/img/system/notesnook.svg
new file mode 100644
index 000000000..ba5e76adf
--- /dev/null
+++ b/img/system/notesnook.svg
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/notion-light.svg b/img/system/notion-light.svg
new file mode 100644
index 000000000..219b00dec
--- /dev/null
+++ b/img/system/notion-light.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/notion.svg b/img/system/notion.svg
new file mode 100644
index 000000000..599e09702
--- /dev/null
+++ b/img/system/notion.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/ntfy-light.svg b/img/system/ntfy-light.svg
new file mode 100644
index 000000000..32311809d
--- /dev/null
+++ b/img/system/ntfy-light.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/ntfy.svg b/img/system/ntfy.svg
new file mode 100644
index 000000000..bb06c69cb
--- /dev/null
+++ b/img/system/ntfy.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/obsidian.svg b/img/system/obsidian.svg
new file mode 100644
index 000000000..3936b03af
--- /dev/null
+++ b/img/system/obsidian.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/obtainium.svg b/img/system/obtainium.svg
new file mode 100644
index 000000000..9e342b926
--- /dev/null
+++ b/img/system/obtainium.svg
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/octoprint.svg b/img/system/octoprint.svg
new file mode 100644
index 000000000..932a079ce
--- /dev/null
+++ b/img/system/octoprint.svg
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/olivetin.svg b/img/system/olivetin.svg
new file mode 100644
index 000000000..0710368a3
--- /dev/null
+++ b/img/system/olivetin.svg
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/omada.svg b/img/system/omada.svg
new file mode 100644
index 000000000..43aad5474
--- /dev/null
+++ b/img/system/omada.svg
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/ombi.svg b/img/system/ombi.svg
new file mode 100644
index 000000000..9a37facf7
--- /dev/null
+++ b/img/system/ombi.svg
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/omnivore.svg b/img/system/omnivore.svg
new file mode 100644
index 000000000..bc9010781
--- /dev/null
+++ b/img/system/omnivore.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/onedev-light.svg b/img/system/onedev-light.svg
new file mode 100644
index 000000000..27a94bb13
--- /dev/null
+++ b/img/system/onedev-light.svg
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/onedev.svg b/img/system/onedev.svg
new file mode 100644
index 000000000..9665a57f9
--- /dev/null
+++ b/img/system/onedev.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/oneuptime-light.svg b/img/system/oneuptime-light.svg
new file mode 100644
index 000000000..a3d30ec36
--- /dev/null
+++ b/img/system/oneuptime-light.svg
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/oneuptime.svg b/img/system/oneuptime.svg
new file mode 100644
index 000000000..e0f39b4f2
--- /dev/null
+++ b/img/system/oneuptime.svg
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/open-source-initiative.svg b/img/system/open-source-initiative.svg
new file mode 100644
index 000000000..f95143e78
--- /dev/null
+++ b/img/system/open-source-initiative.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/openchangelog-light.svg b/img/system/openchangelog-light.svg
new file mode 100644
index 000000000..bc7448c57
--- /dev/null
+++ b/img/system/openchangelog-light.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/openchangelog.svg b/img/system/openchangelog.svg
new file mode 100644
index 000000000..452d5ffd1
--- /dev/null
+++ b/img/system/openchangelog.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/openemr-light.svg b/img/system/openemr-light.svg
new file mode 100644
index 000000000..fc4ea75fc
--- /dev/null
+++ b/img/system/openemr-light.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/openemr.svg b/img/system/openemr.svg
new file mode 100644
index 000000000..d4adc0936
--- /dev/null
+++ b/img/system/openemr.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/openldap.svg b/img/system/openldap.svg
new file mode 100644
index 000000000..6ba93709c
--- /dev/null
+++ b/img/system/openldap.svg
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/openpanel-light.svg b/img/system/openpanel-light.svg
new file mode 100644
index 000000000..d43709492
--- /dev/null
+++ b/img/system/openpanel-light.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/openpanel.svg b/img/system/openpanel.svg
new file mode 100644
index 000000000..11582df9c
--- /dev/null
+++ b/img/system/openpanel.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
diff --git a/img/system/openreads.svg b/img/system/openreads.svg
new file mode 100644
index 000000000..e72fe13ab
--- /dev/null
+++ b/img/system/openreads.svg
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/openspeedtest-light.svg b/img/system/openspeedtest-light.svg
new file mode 100644
index 000000000..12719b0c9
--- /dev/null
+++ b/img/system/openspeedtest-light.svg
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/openspeedtest.svg b/img/system/openspeedtest.svg
new file mode 100644
index 000000000..0fafb4377
--- /dev/null
+++ b/img/system/openspeedtest.svg
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/opentalk.svg b/img/system/opentalk.svg
new file mode 100644
index 000000000..7f8d81eec
--- /dev/null
+++ b/img/system/opentalk.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/opentofu-light.svg b/img/system/opentofu-light.svg
new file mode 100644
index 000000000..125c3d65d
--- /dev/null
+++ b/img/system/opentofu-light.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/opentofu.svg b/img/system/opentofu.svg
new file mode 100644
index 000000000..f5277ec27
--- /dev/null
+++ b/img/system/opentofu.svg
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/openvpn-light.svg b/img/system/openvpn-light.svg
new file mode 100644
index 000000000..6a3f6df64
--- /dev/null
+++ b/img/system/openvpn-light.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/openvpn.svg b/img/system/openvpn.svg
new file mode 100644
index 000000000..2c7cb8f26
--- /dev/null
+++ b/img/system/openvpn.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/openwrt-light.svg b/img/system/openwrt-light.svg
new file mode 100644
index 000000000..9b3430d67
--- /dev/null
+++ b/img/system/openwrt-light.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/openwrt.svg b/img/system/openwrt.svg
new file mode 100644
index 000000000..6d10d4e59
--- /dev/null
+++ b/img/system/openwrt.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/opnsense.svg b/img/system/opnsense.svg
new file mode 100644
index 000000000..e708262e0
--- /dev/null
+++ b/img/system/opnsense.svg
@@ -0,0 +1,272 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/outline.svg b/img/system/outline.svg
new file mode 100644
index 000000000..80eda44a7
--- /dev/null
+++ b/img/system/outline.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/overleaf.svg b/img/system/overleaf.svg
new file mode 100644
index 000000000..3992848ac
--- /dev/null
+++ b/img/system/overleaf.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/overseerr.svg b/img/system/overseerr.svg
new file mode 100644
index 000000000..05c1d1e24
--- /dev/null
+++ b/img/system/overseerr.svg
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/owncast.svg b/img/system/owncast.svg
new file mode 100644
index 000000000..51f56cd5e
--- /dev/null
+++ b/img/system/owncast.svg
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/owncloud-light.svg b/img/system/owncloud-light.svg
new file mode 100644
index 000000000..bd47fc296
--- /dev/null
+++ b/img/system/owncloud-light.svg
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/owncloud.svg b/img/system/owncloud.svg
new file mode 100644
index 000000000..fe66c9f5b
--- /dev/null
+++ b/img/system/owncloud.svg
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/owntone.svg b/img/system/owntone.svg
new file mode 100644
index 000000000..23d734047
--- /dev/null
+++ b/img/system/owntone.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/oxker.svg b/img/system/oxker.svg
new file mode 100644
index 000000000..2d9eaec92
--- /dev/null
+++ b/img/system/oxker.svg
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/paperless-ngx-light.svg b/img/system/paperless-ngx-light.svg
new file mode 100644
index 000000000..fd696a365
--- /dev/null
+++ b/img/system/paperless-ngx-light.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/paperless-ngx.svg b/img/system/paperless-ngx.svg
new file mode 100644
index 000000000..93a2899dc
--- /dev/null
+++ b/img/system/paperless-ngx.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/papermark-light.svg b/img/system/papermark-light.svg
new file mode 100644
index 000000000..040b809f6
--- /dev/null
+++ b/img/system/papermark-light.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/papermark.svg b/img/system/papermark.svg
new file mode 100644
index 000000000..efa13f14b
--- /dev/null
+++ b/img/system/papermark.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/papermerge.svg b/img/system/papermerge.svg
new file mode 100644
index 000000000..9b9b65429
--- /dev/null
+++ b/img/system/papermerge.svg
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/parseable.svg b/img/system/parseable.svg
new file mode 100644
index 000000000..96cf98f7e
--- /dev/null
+++ b/img/system/parseable.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/passbolt.svg b/img/system/passbolt.svg
new file mode 100644
index 000000000..429b91807
--- /dev/null
+++ b/img/system/passbolt.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/payload-light.svg b/img/system/payload-light.svg
new file mode 100644
index 000000000..94eded57f
--- /dev/null
+++ b/img/system/payload-light.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/payload.svg b/img/system/payload.svg
new file mode 100644
index 000000000..0e0592edf
--- /dev/null
+++ b/img/system/payload.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/pdfding-light.svg b/img/system/pdfding-light.svg
new file mode 100644
index 000000000..1dbbe4c91
--- /dev/null
+++ b/img/system/pdfding-light.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/pdfding.svg b/img/system/pdfding.svg
new file mode 100644
index 000000000..56ec5bea3
--- /dev/null
+++ b/img/system/pdfding.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/peanut.svg b/img/system/peanut.svg
new file mode 100644
index 000000000..05eda380b
--- /dev/null
+++ b/img/system/peanut.svg
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/peertube.svg b/img/system/peertube.svg
new file mode 100644
index 000000000..94bacae30
--- /dev/null
+++ b/img/system/peertube.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/pelican-panel.svg b/img/system/pelican-panel.svg
new file mode 100644
index 000000000..c4e5971a9
--- /dev/null
+++ b/img/system/pelican-panel.svg
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/penpot-light.svg b/img/system/penpot-light.svg
new file mode 100644
index 000000000..06ddeb8fb
--- /dev/null
+++ b/img/system/penpot-light.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/penpot.svg b/img/system/penpot.svg
new file mode 100644
index 000000000..61d294285
--- /dev/null
+++ b/img/system/penpot.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
diff --git a/img/system/peppermint.svg b/img/system/peppermint.svg
new file mode 100644
index 000000000..5d147234d
--- /dev/null
+++ b/img/system/peppermint.svg
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/pepperminty-wiki.svg b/img/system/pepperminty-wiki.svg
new file mode 100644
index 000000000..e83fb18d1
--- /dev/null
+++ b/img/system/pepperminty-wiki.svg
@@ -0,0 +1,219 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/pfsense-light.svg b/img/system/pfsense-light.svg
new file mode 100644
index 000000000..9985843b7
--- /dev/null
+++ b/img/system/pfsense-light.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/pfsense.svg b/img/system/pfsense.svg
new file mode 100644
index 000000000..df160920a
--- /dev/null
+++ b/img/system/pfsense.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/pg-back-web.svg b/img/system/pg-back-web.svg
new file mode 100644
index 000000000..236346b92
--- /dev/null
+++ b/img/system/pg-back-web.svg
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/photopea-light.svg b/img/system/photopea-light.svg
new file mode 100644
index 000000000..6c940f78a
--- /dev/null
+++ b/img/system/photopea-light.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/photopea.svg b/img/system/photopea.svg
new file mode 100644
index 000000000..ee14a3edd
--- /dev/null
+++ b/img/system/photopea.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/photoprism.svg b/img/system/photoprism.svg
new file mode 100644
index 000000000..84fe30308
--- /dev/null
+++ b/img/system/photoprism.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/photoview.svg b/img/system/photoview.svg
new file mode 100644
index 000000000..8bce74ab9
--- /dev/null
+++ b/img/system/photoview.svg
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/pi-hole.svg b/img/system/pi-hole.svg
new file mode 100644
index 000000000..b78a02218
--- /dev/null
+++ b/img/system/pi-hole.svg
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/pikapods-light.svg b/img/system/pikapods-light.svg
new file mode 100644
index 000000000..86163bc59
--- /dev/null
+++ b/img/system/pikapods-light.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/pikapods.svg b/img/system/pikapods.svg
new file mode 100644
index 000000000..4e74d3ad6
--- /dev/null
+++ b/img/system/pikapods.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/pingvin-share.svg b/img/system/pingvin-share.svg
new file mode 100644
index 000000000..c9c8bb599
--- /dev/null
+++ b/img/system/pingvin-share.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/pinkary.svg b/img/system/pinkary.svg
new file mode 100644
index 000000000..0833263d6
--- /dev/null
+++ b/img/system/pinkary.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/piwigo.svg b/img/system/piwigo.svg
new file mode 100644
index 000000000..095e66501
--- /dev/null
+++ b/img/system/piwigo.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/pixelfed.svg b/img/system/pixelfed.svg
new file mode 100644
index 000000000..32bcee87f
--- /dev/null
+++ b/img/system/pixelfed.svg
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/plane.svg b/img/system/plane.svg
new file mode 100644
index 000000000..1b2c81b99
--- /dev/null
+++ b/img/system/plane.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/plausible.svg b/img/system/plausible.svg
new file mode 100644
index 000000000..d0c78fcad
--- /dev/null
+++ b/img/system/plausible.svg
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/pleroma.svg b/img/system/pleroma.svg
new file mode 100644
index 000000000..0a0d9f9cc
--- /dev/null
+++ b/img/system/pleroma.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/plex-rewind.svg b/img/system/plex-rewind.svg
new file mode 100644
index 000000000..40bff5287
--- /dev/null
+++ b/img/system/plex-rewind.svg
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/plex.svg b/img/system/plex.svg
new file mode 100644
index 000000000..f631c310c
--- /dev/null
+++ b/img/system/plex.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/system/pocket-casts-light.svg b/img/system/pocket-casts-light.svg
new file mode 100644
index 000000000..3c23a604b
--- /dev/null
+++ b/img/system/pocket-casts-light.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/pocket-casts.svg b/img/system/pocket-casts.svg
new file mode 100644
index 000000000..06c0a8e64
--- /dev/null
+++ b/img/system/pocket-casts.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/pocket-id-light.svg b/img/system/pocket-id-light.svg
new file mode 100644
index 000000000..9ceee0c95
--- /dev/null
+++ b/img/system/pocket-id-light.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
diff --git a/img/system/pocket-id.svg b/img/system/pocket-id.svg
new file mode 100644
index 000000000..383da00c6
--- /dev/null
+++ b/img/system/pocket-id.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
diff --git a/img/system/podfetch-light.svg b/img/system/podfetch-light.svg
new file mode 100644
index 000000000..406f5a0e5
--- /dev/null
+++ b/img/system/podfetch-light.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/podfetch.svg b/img/system/podfetch.svg
new file mode 100644
index 000000000..1a83ed02f
--- /dev/null
+++ b/img/system/podfetch.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/podman.svg b/img/system/podman.svg
new file mode 100644
index 000000000..bc2e06561
--- /dev/null
+++ b/img/system/podman.svg
@@ -0,0 +1,160 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/portainer.svg b/img/system/portainer.svg
new file mode 100644
index 000000000..9f3098565
--- /dev/null
+++ b/img/system/portainer.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/postal.svg b/img/system/postal.svg
new file mode 100644
index 000000000..e3e1b7616
--- /dev/null
+++ b/img/system/postal.svg
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/postgresql.svg b/img/system/postgresql.svg
new file mode 100644
index 000000000..92b390ee4
--- /dev/null
+++ b/img/system/postgresql.svg
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/posthog.svg b/img/system/posthog.svg
new file mode 100644
index 000000000..4c54c4238
--- /dev/null
+++ b/img/system/posthog.svg
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/private-internet-access.svg b/img/system/private-internet-access.svg
new file mode 100644
index 000000000..b70f0077a
--- /dev/null
+++ b/img/system/private-internet-access.svg
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/privatebin.svg b/img/system/privatebin.svg
new file mode 100644
index 000000000..087794cb5
--- /dev/null
+++ b/img/system/privatebin.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/projectsend.svg b/img/system/projectsend.svg
new file mode 100644
index 000000000..b5bc5c65d
--- /dev/null
+++ b/img/system/projectsend.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/prometheus.svg b/img/system/prometheus.svg
new file mode 100644
index 000000000..b3f96bde9
--- /dev/null
+++ b/img/system/prometheus.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/prowlarr.svg b/img/system/prowlarr.svg
new file mode 100644
index 000000000..28b071350
--- /dev/null
+++ b/img/system/prowlarr.svg
@@ -0,0 +1,177 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/proxmox-light.svg b/img/system/proxmox-light.svg
new file mode 100644
index 000000000..b881cd410
--- /dev/null
+++ b/img/system/proxmox-light.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/proxmox.svg b/img/system/proxmox.svg
new file mode 100644
index 000000000..b2d1351c3
--- /dev/null
+++ b/img/system/proxmox.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/pterodactyl.svg b/img/system/pterodactyl.svg
new file mode 100644
index 000000000..cfd8a2da9
--- /dev/null
+++ b/img/system/pterodactyl.svg
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/pushover-light.svg b/img/system/pushover-light.svg
new file mode 100644
index 000000000..154a062f5
--- /dev/null
+++ b/img/system/pushover-light.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/img/system/pushover.svg b/img/system/pushover.svg
new file mode 100644
index 000000000..96a5c4bf2
--- /dev/null
+++ b/img/system/pushover.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/pyload.svg b/img/system/pyload.svg
new file mode 100644
index 000000000..74c90c05f
--- /dev/null
+++ b/img/system/pyload.svg
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/python-light.svg b/img/system/python-light.svg
new file mode 100644
index 000000000..3d6ce78dc
--- /dev/null
+++ b/img/system/python-light.svg
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/python.svg b/img/system/python.svg
new file mode 100644
index 000000000..7ccfb4d96
--- /dev/null
+++ b/img/system/python.svg
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/qbittorrent.svg b/img/system/qbittorrent.svg
new file mode 100644
index 000000000..8b53637dd
--- /dev/null
+++ b/img/system/qbittorrent.svg
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/quickwit.svg b/img/system/quickwit.svg
new file mode 100644
index 000000000..8e4d544e3
--- /dev/null
+++ b/img/system/quickwit.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/radarr-light.svg b/img/system/radarr-light.svg
new file mode 100644
index 000000000..2c39b4190
--- /dev/null
+++ b/img/system/radarr-light.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/radarr.svg b/img/system/radarr.svg
new file mode 100644
index 000000000..a368de3fa
--- /dev/null
+++ b/img/system/radarr.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/radicale.svg b/img/system/radicale.svg
new file mode 100644
index 000000000..e90e2d159
--- /dev/null
+++ b/img/system/radicale.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/rallly-light.svg b/img/system/rallly-light.svg
new file mode 100644
index 000000000..db94f497a
--- /dev/null
+++ b/img/system/rallly-light.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/rallly.svg b/img/system/rallly.svg
new file mode 100644
index 000000000..72af809bd
--- /dev/null
+++ b/img/system/rallly.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/rancher-light.svg b/img/system/rancher-light.svg
new file mode 100644
index 000000000..5249715d1
--- /dev/null
+++ b/img/system/rancher-light.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/rancher.svg b/img/system/rancher.svg
new file mode 100644
index 000000000..845d99917
--- /dev/null
+++ b/img/system/rancher.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/raspberry-pi.svg b/img/system/raspberry-pi.svg
new file mode 100644
index 000000000..647b86762
--- /dev/null
+++ b/img/system/raspberry-pi.svg
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/rclone.svg b/img/system/rclone.svg
new file mode 100644
index 000000000..bb2387a72
--- /dev/null
+++ b/img/system/rclone.svg
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/reactive-resume-light.svg b/img/system/reactive-resume-light.svg
new file mode 100644
index 000000000..0f2eab2ec
--- /dev/null
+++ b/img/system/reactive-resume-light.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/reactive-resume.svg b/img/system/reactive-resume.svg
new file mode 100644
index 000000000..c7d421a04
--- /dev/null
+++ b/img/system/reactive-resume.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/readarr.svg b/img/system/readarr.svg
new file mode 100644
index 000000000..2b7287447
--- /dev/null
+++ b/img/system/readarr.svg
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/readeck.svg b/img/system/readeck.svg
new file mode 100644
index 000000000..ca45c7253
--- /dev/null
+++ b/img/system/readeck.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/receipt-wrangler.svg b/img/system/receipt-wrangler.svg
new file mode 100644
index 000000000..ba1e15574
--- /dev/null
+++ b/img/system/receipt-wrangler.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/recipesage.svg b/img/system/recipesage.svg
new file mode 100644
index 000000000..638d0c52b
--- /dev/null
+++ b/img/system/recipesage.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/redict.svg b/img/system/redict.svg
new file mode 100644
index 000000000..3ad8e5ba5
--- /dev/null
+++ b/img/system/redict.svg
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/redlib.svg b/img/system/redlib.svg
new file mode 100644
index 000000000..cdba6527e
--- /dev/null
+++ b/img/system/redlib.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/reolink-light.svg b/img/system/reolink-light.svg
new file mode 100644
index 000000000..03a294ebe
--- /dev/null
+++ b/img/system/reolink-light.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/reolink.svg b/img/system/reolink.svg
new file mode 100644
index 000000000..5183dbe4f
--- /dev/null
+++ b/img/system/reolink.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/requestly.svg b/img/system/requestly.svg
new file mode 100644
index 000000000..d78d73d76
--- /dev/null
+++ b/img/system/requestly.svg
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/restreamer.svg b/img/system/restreamer.svg
new file mode 100644
index 000000000..bbe121030
--- /dev/null
+++ b/img/system/restreamer.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/rhasspy.svg b/img/system/rhasspy.svg
new file mode 100644
index 000000000..64cd3691b
--- /dev/null
+++ b/img/system/rhasspy.svg
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/richy.svg b/img/system/richy.svg
new file mode 100644
index 000000000..3b00752d1
--- /dev/null
+++ b/img/system/richy.svg
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/rocket-chat.svg b/img/system/rocket-chat.svg
new file mode 100644
index 000000000..2a4ebcd37
--- /dev/null
+++ b/img/system/rocket-chat.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/romm.svg b/img/system/romm.svg
new file mode 100644
index 000000000..d3b1ec8d7
--- /dev/null
+++ b/img/system/romm.svg
@@ -0,0 +1,300 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/roundcube.svg b/img/system/roundcube.svg
new file mode 100644
index 000000000..01282f777
--- /dev/null
+++ b/img/system/roundcube.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/rss-bridge.svg b/img/system/rss-bridge.svg
new file mode 100644
index 000000000..bd2b25d50
--- /dev/null
+++ b/img/system/rss-bridge.svg
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/rss-translator.svg b/img/system/rss-translator.svg
new file mode 100644
index 000000000..462d2299a
--- /dev/null
+++ b/img/system/rss-translator.svg
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/rundeck.svg b/img/system/rundeck.svg
new file mode 100644
index 000000000..5eee99f8f
--- /dev/null
+++ b/img/system/rundeck.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/runson-light.svg b/img/system/runson-light.svg
new file mode 100644
index 000000000..8ddfb568b
--- /dev/null
+++ b/img/system/runson-light.svg
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/runson.svg b/img/system/runson.svg
new file mode 100644
index 000000000..43d89784e
--- /dev/null
+++ b/img/system/runson.svg
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/sabnzbd.svg b/img/system/sabnzbd.svg
new file mode 100644
index 000000000..ffa59a39c
--- /dev/null
+++ b/img/system/sabnzbd.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/system/saltcorn.svg b/img/system/saltcorn.svg
new file mode 100644
index 000000000..131dafcc4
--- /dev/null
+++ b/img/system/saltcorn.svg
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/scrutiny-light.svg b/img/system/scrutiny-light.svg
new file mode 100644
index 000000000..6e68a8ddd
--- /dev/null
+++ b/img/system/scrutiny-light.svg
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/scrutiny.svg b/img/system/scrutiny.svg
new file mode 100644
index 000000000..eda82efa7
--- /dev/null
+++ b/img/system/scrutiny.svg
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/seafile.svg b/img/system/seafile.svg
new file mode 100644
index 000000000..dbe1a03d6
--- /dev/null
+++ b/img/system/seafile.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/secureai-tools-light.svg b/img/system/secureai-tools-light.svg
new file mode 100644
index 000000000..1cf2d1221
--- /dev/null
+++ b/img/system/secureai-tools-light.svg
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/secureai-tools.svg b/img/system/secureai-tools.svg
new file mode 100644
index 000000000..e9768026d
--- /dev/null
+++ b/img/system/secureai-tools.svg
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/seelf.svg b/img/system/seelf.svg
new file mode 100644
index 000000000..31cc4f5ec
--- /dev/null
+++ b/img/system/seelf.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/self-hosted-gateway.svg b/img/system/self-hosted-gateway.svg
new file mode 100644
index 000000000..561f7ec09
--- /dev/null
+++ b/img/system/self-hosted-gateway.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/shaarli.svg b/img/system/shaarli.svg
new file mode 100644
index 000000000..250a64753
--- /dev/null
+++ b/img/system/shaarli.svg
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/shellhub-light.svg b/img/system/shellhub-light.svg
new file mode 100644
index 000000000..9954f5a51
--- /dev/null
+++ b/img/system/shellhub-light.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/shellhub.svg b/img/system/shellhub.svg
new file mode 100644
index 000000000..237771987
--- /dev/null
+++ b/img/system/shellhub.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/shlink.svg b/img/system/shlink.svg
new file mode 100644
index 000000000..d6beaffbf
--- /dev/null
+++ b/img/system/shlink.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/shoko-server-light.svg b/img/system/shoko-server-light.svg
new file mode 100644
index 000000000..a3e24c9ed
--- /dev/null
+++ b/img/system/shoko-server-light.svg
@@ -0,0 +1,249 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/shoko-server.svg b/img/system/shoko-server.svg
new file mode 100644
index 000000000..aeb6fba8c
--- /dev/null
+++ b/img/system/shoko-server.svg
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/signal-light.svg b/img/system/signal-light.svg
new file mode 100644
index 000000000..40bcc2fc9
--- /dev/null
+++ b/img/system/signal-light.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/signal.svg b/img/system/signal.svg
new file mode 100644
index 000000000..b4a768283
--- /dev/null
+++ b/img/system/signal.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/simplex-chat-light.svg b/img/system/simplex-chat-light.svg
new file mode 100644
index 000000000..62bf62fbe
--- /dev/null
+++ b/img/system/simplex-chat-light.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/simplex-chat.svg b/img/system/simplex-chat.svg
new file mode 100644
index 000000000..0509d3fef
--- /dev/null
+++ b/img/system/simplex-chat.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/siyuan-light.svg b/img/system/siyuan-light.svg
new file mode 100644
index 000000000..d993a4524
--- /dev/null
+++ b/img/system/siyuan-light.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/siyuan.svg b/img/system/siyuan.svg
new file mode 100644
index 000000000..ec3776e63
--- /dev/null
+++ b/img/system/siyuan.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/slash-light.svg b/img/system/slash-light.svg
new file mode 100644
index 000000000..8b276efd1
--- /dev/null
+++ b/img/system/slash-light.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/slash.svg b/img/system/slash.svg
new file mode 100644
index 000000000..c08f8c1e3
--- /dev/null
+++ b/img/system/slash.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/snikket.svg b/img/system/snikket.svg
new file mode 100644
index 000000000..074d209d3
--- /dev/null
+++ b/img/system/snikket.svg
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/socialhome-light.svg b/img/system/socialhome-light.svg
new file mode 100644
index 000000000..046b894ce
--- /dev/null
+++ b/img/system/socialhome-light.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/socialhome.svg b/img/system/socialhome.svg
new file mode 100644
index 000000000..9b5c8b0a9
--- /dev/null
+++ b/img/system/socialhome.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/solidtime-light.svg b/img/system/solidtime-light.svg
new file mode 100644
index 000000000..642b87647
--- /dev/null
+++ b/img/system/solidtime-light.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/solidtime.svg b/img/system/solidtime.svg
new file mode 100644
index 000000000..22706211d
--- /dev/null
+++ b/img/system/solidtime.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/img/system/sonarqube.svg b/img/system/sonarqube.svg
new file mode 100644
index 000000000..b2f87bb5d
--- /dev/null
+++ b/img/system/sonarqube.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/sonarr.svg b/img/system/sonarr.svg
new file mode 100644
index 000000000..2416340b1
--- /dev/null
+++ b/img/system/sonarr.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/specifically-clementines.svg b/img/system/specifically-clementines.svg
new file mode 100644
index 000000000..3911f1781
--- /dev/null
+++ b/img/system/specifically-clementines.svg
@@ -0,0 +1,959 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/squirrel-servers-manager.svg b/img/system/squirrel-servers-manager.svg
new file mode 100644
index 000000000..7e2c72609
--- /dev/null
+++ b/img/system/squirrel-servers-manager.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/img/system/sshwifty.svg b/img/system/sshwifty.svg
new file mode 100644
index 000000000..8ac41d6c6
--- /dev/null
+++ b/img/system/sshwifty.svg
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/stalwart-mail-server.svg b/img/system/stalwart-mail-server.svg
new file mode 100644
index 000000000..a1e305976
--- /dev/null
+++ b/img/system/stalwart-mail-server.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/standard-notes.svg b/img/system/standard-notes.svg
new file mode 100644
index 000000000..3c4efc003
--- /dev/null
+++ b/img/system/standard-notes.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/step-ca.svg b/img/system/step-ca.svg
new file mode 100644
index 000000000..6de4b3e2a
--- /dev/null
+++ b/img/system/step-ca.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/stirling-pdf.svg b/img/system/stirling-pdf.svg
new file mode 100644
index 000000000..ef72ad7a1
--- /dev/null
+++ b/img/system/stirling-pdf.svg
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/stormkit.svg b/img/system/stormkit.svg
new file mode 100644
index 000000000..5dfc705f4
--- /dev/null
+++ b/img/system/stormkit.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/subatic.svg b/img/system/subatic.svg
new file mode 100644
index 000000000..6ff654da3
--- /dev/null
+++ b/img/system/subatic.svg
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/supabase.svg b/img/system/supabase.svg
new file mode 100644
index 000000000..63c6955c6
--- /dev/null
+++ b/img/system/supabase.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/synapse-light.svg b/img/system/synapse-light.svg
new file mode 100644
index 000000000..1a14cddbd
--- /dev/null
+++ b/img/system/synapse-light.svg
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/synapse.svg b/img/system/synapse.svg
new file mode 100644
index 000000000..b9c886096
--- /dev/null
+++ b/img/system/synapse.svg
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/syncthing.svg b/img/system/syncthing.svg
new file mode 100644
index 000000000..d5ad920a1
--- /dev/null
+++ b/img/system/syncthing.svg
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/tailscale-light.svg b/img/system/tailscale-light.svg
new file mode 100644
index 000000000..572e54385
--- /dev/null
+++ b/img/system/tailscale-light.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/tailscale.svg b/img/system/tailscale.svg
new file mode 100644
index 000000000..a0d192491
--- /dev/null
+++ b/img/system/tailscale.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/tangerine-ui.svg b/img/system/tangerine-ui.svg
new file mode 100644
index 000000000..3d36e3c54
--- /dev/null
+++ b/img/system/tangerine-ui.svg
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/tautulli.svg b/img/system/tautulli.svg
new file mode 100644
index 000000000..454359b2f
--- /dev/null
+++ b/img/system/tautulli.svg
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/telegram.svg b/img/system/telegram.svg
new file mode 100644
index 000000000..81d6bc565
--- /dev/null
+++ b/img/system/telegram.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/teleport-light.svg b/img/system/teleport-light.svg
new file mode 100644
index 000000000..20e35c135
--- /dev/null
+++ b/img/system/teleport-light.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/teleport.svg b/img/system/teleport.svg
new file mode 100644
index 000000000..e61ee74fe
--- /dev/null
+++ b/img/system/teleport.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/threads-light.svg b/img/system/threads-light.svg
new file mode 100644
index 000000000..b53745c2f
--- /dev/null
+++ b/img/system/threads-light.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/threads.svg b/img/system/threads.svg
new file mode 100644
index 000000000..6677814ee
--- /dev/null
+++ b/img/system/threads.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
diff --git a/img/system/thunderbird-light.svg b/img/system/thunderbird-light.svg
new file mode 100644
index 000000000..af9b0f374
--- /dev/null
+++ b/img/system/thunderbird-light.svg
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/thunderbird.svg b/img/system/thunderbird.svg
new file mode 100644
index 000000000..8a8a75445
--- /dev/null
+++ b/img/system/thunderbird.svg
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/tiddlywiki-light.svg b/img/system/tiddlywiki-light.svg
new file mode 100644
index 000000000..50d1bfef4
--- /dev/null
+++ b/img/system/tiddlywiki-light.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/tiddlywiki.svg b/img/system/tiddlywiki.svg
new file mode 100644
index 000000000..74bc15344
--- /dev/null
+++ b/img/system/tiddlywiki.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/tmdb-light.svg b/img/system/tmdb-light.svg
new file mode 100644
index 000000000..c7437b332
--- /dev/null
+++ b/img/system/tmdb-light.svg
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/tmdb.svg b/img/system/tmdb.svg
new file mode 100644
index 000000000..6f5b7ff8e
--- /dev/null
+++ b/img/system/tmdb.svg
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/tooljet.svg b/img/system/tooljet.svg
new file mode 100644
index 000000000..7f2f8d7f5
--- /dev/null
+++ b/img/system/tooljet.svg
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/touitomamout.svg b/img/system/touitomamout.svg
new file mode 100644
index 000000000..4940c193f
--- /dev/null
+++ b/img/system/touitomamout.svg
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/tp-link-light.svg b/img/system/tp-link-light.svg
new file mode 100644
index 000000000..547b7c1da
--- /dev/null
+++ b/img/system/tp-link-light.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/tp-link.svg b/img/system/tp-link.svg
new file mode 100644
index 000000000..ea12d589d
--- /dev/null
+++ b/img/system/tp-link.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/tpdb-light.svg b/img/system/tpdb-light.svg
new file mode 100644
index 000000000..829cf6444
--- /dev/null
+++ b/img/system/tpdb-light.svg
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/tpdb.svg b/img/system/tpdb.svg
new file mode 100644
index 000000000..ef5873658
--- /dev/null
+++ b/img/system/tpdb.svg
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/traccar.svg b/img/system/traccar.svg
new file mode 100644
index 000000000..0e25d0b34
--- /dev/null
+++ b/img/system/traccar.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/traefik.svg b/img/system/traefik.svg
new file mode 100644
index 000000000..ff2dcd87e
--- /dev/null
+++ b/img/system/traefik.svg
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/transmission.svg b/img/system/transmission.svg
new file mode 100644
index 000000000..03305752a
--- /dev/null
+++ b/img/system/transmission.svg
@@ -0,0 +1,150 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/trilium.svg b/img/system/trilium.svg
new file mode 100644
index 000000000..6bcbac785
--- /dev/null
+++ b/img/system/trilium.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/triliumnext.svg b/img/system/triliumnext.svg
new file mode 100644
index 000000000..a3dc9f77e
--- /dev/null
+++ b/img/system/triliumnext.svg
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/truenas-core-light.svg b/img/system/truenas-core-light.svg
new file mode 100644
index 000000000..ca86eb250
--- /dev/null
+++ b/img/system/truenas-core-light.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/truenas-core.svg b/img/system/truenas-core.svg
new file mode 100644
index 000000000..7c4e6ccfd
--- /dev/null
+++ b/img/system/truenas-core.svg
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/truenas-scale-light.svg b/img/system/truenas-scale-light.svg
new file mode 100644
index 000000000..4192e3632
--- /dev/null
+++ b/img/system/truenas-scale-light.svg
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/truenas-scale.svg b/img/system/truenas-scale.svg
new file mode 100644
index 000000000..0b3529b28
--- /dev/null
+++ b/img/system/truenas-scale.svg
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/tubesync-light.svg b/img/system/tubesync-light.svg
new file mode 100644
index 000000000..be78b4715
--- /dev/null
+++ b/img/system/tubesync-light.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/tubesync.svg b/img/system/tubesync.svg
new file mode 100644
index 000000000..0a809005b
--- /dev/null
+++ b/img/system/tubesync.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/tumblr-light.svg b/img/system/tumblr-light.svg
new file mode 100644
index 000000000..1393b7582
--- /dev/null
+++ b/img/system/tumblr-light.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/img/system/tumblr.svg b/img/system/tumblr.svg
new file mode 100644
index 000000000..e2c2cbb73
--- /dev/null
+++ b/img/system/tumblr.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/tvdb-light.svg b/img/system/tvdb-light.svg
new file mode 100644
index 000000000..908d91cb9
--- /dev/null
+++ b/img/system/tvdb-light.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/tvdb.svg b/img/system/tvdb.svg
new file mode 100644
index 000000000..91755b1ba
--- /dev/null
+++ b/img/system/tvdb.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/ubiquiti-unifi-light.svg b/img/system/ubiquiti-unifi-light.svg
new file mode 100644
index 000000000..0649b111a
--- /dev/null
+++ b/img/system/ubiquiti-unifi-light.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/ubiquiti-unifi.svg b/img/system/ubiquiti-unifi.svg
new file mode 100644
index 000000000..b0cc94a4a
--- /dev/null
+++ b/img/system/ubiquiti-unifi.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/umami-light.svg b/img/system/umami-light.svg
new file mode 100644
index 000000000..ffb99b746
--- /dev/null
+++ b/img/system/umami-light.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/umami.svg b/img/system/umami.svg
new file mode 100644
index 000000000..b1fea532b
--- /dev/null
+++ b/img/system/umami.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/umbrel.svg b/img/system/umbrel.svg
new file mode 100644
index 000000000..527e59268
--- /dev/null
+++ b/img/system/umbrel.svg
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/unbound.svg b/img/system/unbound.svg
new file mode 100644
index 000000000..129d96ad2
--- /dev/null
+++ b/img/system/unbound.svg
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/undb.svg b/img/system/undb.svg
new file mode 100644
index 000000000..bd8321582
--- /dev/null
+++ b/img/system/undb.svg
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/unifi-voucher-site.svg b/img/system/unifi-voucher-site.svg
new file mode 100644
index 000000000..97b2679a8
--- /dev/null
+++ b/img/system/unifi-voucher-site.svg
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/unraid.svg b/img/system/unraid.svg
new file mode 100644
index 000000000..1a32288ec
--- /dev/null
+++ b/img/system/unraid.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/upsnap.svg b/img/system/upsnap.svg
new file mode 100644
index 000000000..54ce3f692
--- /dev/null
+++ b/img/system/upsnap.svg
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ P
+ A
+ C
+ K
+ A
+ G
+ E
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/uptime-kuma.svg b/img/system/uptime-kuma.svg
new file mode 100644
index 000000000..04df92492
--- /dev/null
+++ b/img/system/uptime-kuma.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/valkey-light.svg b/img/system/valkey-light.svg
new file mode 100644
index 000000000..e45fb3148
--- /dev/null
+++ b/img/system/valkey-light.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/valkey.svg b/img/system/valkey.svg
new file mode 100644
index 000000000..9c4bfd5b8
--- /dev/null
+++ b/img/system/valkey.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/vaultwarden-light.svg b/img/system/vaultwarden-light.svg
new file mode 100644
index 000000000..bb241d516
--- /dev/null
+++ b/img/system/vaultwarden-light.svg
@@ -0,0 +1,78 @@
+
+
+
+
+ Vaultwarden Icon - White
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Vaultwarden Icon - White
+
+
+ Mathijs van Veluw
+
+
+ Rust Logo
+
+
+
+
diff --git a/img/system/vaultwarden.svg b/img/system/vaultwarden.svg
new file mode 100644
index 000000000..91abbd6a0
--- /dev/null
+++ b/img/system/vaultwarden.svg
@@ -0,0 +1,74 @@
+
+
+
+
+ Vaultwarden Icon
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Vaultwarden Icon
+
+
+ Mathijs van Veluw
+
+
+ Rust Logo
+
+
+
+
diff --git a/img/system/vector.svg b/img/system/vector.svg
new file mode 100644
index 000000000..230673a0b
--- /dev/null
+++ b/img/system/vector.svg
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/victoriametrics-light.svg b/img/system/victoriametrics-light.svg
new file mode 100644
index 000000000..b0125811f
--- /dev/null
+++ b/img/system/victoriametrics-light.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/victoriametrics.svg b/img/system/victoriametrics.svg
new file mode 100644
index 000000000..47b6a85e9
--- /dev/null
+++ b/img/system/victoriametrics.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/img/system/vidzy.svg b/img/system/vidzy.svg
new file mode 100644
index 000000000..1dc241994
--- /dev/null
+++ b/img/system/vidzy.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/vikunja.svg b/img/system/vikunja.svg
new file mode 100644
index 000000000..c8723070a
--- /dev/null
+++ b/img/system/vikunja.svg
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/viseron.svg b/img/system/viseron.svg
new file mode 100644
index 000000000..530479c85
--- /dev/null
+++ b/img/system/viseron.svg
@@ -0,0 +1,1393 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/voilib-light.svg b/img/system/voilib-light.svg
new file mode 100644
index 000000000..b5d8cf02c
--- /dev/null
+++ b/img/system/voilib-light.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/voilib.svg b/img/system/voilib.svg
new file mode 100644
index 000000000..bfe6a3910
--- /dev/null
+++ b/img/system/voilib.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/voltaserve-light.svg b/img/system/voltaserve-light.svg
new file mode 100644
index 000000000..246352946
--- /dev/null
+++ b/img/system/voltaserve-light.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
diff --git a/img/system/voltaserve.svg b/img/system/voltaserve.svg
new file mode 100644
index 000000000..63855fe31
--- /dev/null
+++ b/img/system/voltaserve.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
diff --git a/img/system/wallabag-light.svg b/img/system/wallabag-light.svg
new file mode 100644
index 000000000..86d235dfc
--- /dev/null
+++ b/img/system/wallabag-light.svg
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/wallabag.svg b/img/system/wallabag.svg
new file mode 100644
index 000000000..bd076f91a
--- /dev/null
+++ b/img/system/wallabag.svg
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/wanderer-light.svg b/img/system/wanderer-light.svg
new file mode 100644
index 000000000..189368c2c
--- /dev/null
+++ b/img/system/wanderer-light.svg
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/wanderer.svg b/img/system/wanderer.svg
new file mode 100644
index 000000000..7d96cdffd
--- /dev/null
+++ b/img/system/wanderer.svg
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/webtrees.svg b/img/system/webtrees.svg
new file mode 100644
index 000000000..1b0fbbce2
--- /dev/null
+++ b/img/system/webtrees.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/wekan.svg b/img/system/wekan.svg
new file mode 100644
index 000000000..5a017f1fb
--- /dev/null
+++ b/img/system/wekan.svg
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/wger.svg b/img/system/wger.svg
new file mode 100644
index 000000000..813ddbeb5
--- /dev/null
+++ b/img/system/wger.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/whats-up-docker-light.svg b/img/system/whats-up-docker-light.svg
new file mode 100644
index 000000000..4ae530339
--- /dev/null
+++ b/img/system/whats-up-docker-light.svg
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/whats-up-docker.svg b/img/system/whats-up-docker.svg
new file mode 100644
index 000000000..177712911
--- /dev/null
+++ b/img/system/whats-up-docker.svg
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/wiki-js.svg b/img/system/wiki-js.svg
new file mode 100644
index 000000000..4e4f9ca0b
--- /dev/null
+++ b/img/system/wiki-js.svg
@@ -0,0 +1,490 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/wikidocs.svg b/img/system/wikidocs.svg
new file mode 100644
index 000000000..95c50a1a6
--- /dev/null
+++ b/img/system/wikidocs.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
diff --git a/img/system/wikipedia-light.svg b/img/system/wikipedia-light.svg
new file mode 100644
index 000000000..57e50d40e
--- /dev/null
+++ b/img/system/wikipedia-light.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/wikipedia.svg b/img/system/wikipedia.svg
new file mode 100644
index 000000000..b7a828cb1
--- /dev/null
+++ b/img/system/wikipedia.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/willow.svg b/img/system/willow.svg
new file mode 100644
index 000000000..0265a2a20
--- /dev/null
+++ b/img/system/willow.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/windows-retro-light.svg b/img/system/windows-retro-light.svg
new file mode 100644
index 000000000..26fd77bf6
--- /dev/null
+++ b/img/system/windows-retro-light.svg
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/windows-retro.svg b/img/system/windows-retro.svg
new file mode 100644
index 000000000..8c61db53b
--- /dev/null
+++ b/img/system/windows-retro.svg
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/wireguard.svg b/img/system/wireguard.svg
new file mode 100644
index 000000000..9cbfe5599
--- /dev/null
+++ b/img/system/wireguard.svg
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/wizarr.svg b/img/system/wizarr.svg
new file mode 100644
index 000000000..663580db2
--- /dev/null
+++ b/img/system/wizarr.svg
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/woocommerce.svg b/img/system/woocommerce.svg
new file mode 100644
index 000000000..5de0802a1
--- /dev/null
+++ b/img/system/woocommerce.svg
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
diff --git a/img/system/worklenz-light.svg b/img/system/worklenz-light.svg
new file mode 100644
index 000000000..9d65fa3a6
--- /dev/null
+++ b/img/system/worklenz-light.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/worklenz.svg b/img/system/worklenz.svg
new file mode 100644
index 000000000..a51bc51ca
--- /dev/null
+++ b/img/system/worklenz.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/writefreely-light.svg b/img/system/writefreely-light.svg
new file mode 100644
index 000000000..f43b96f4f
--- /dev/null
+++ b/img/system/writefreely-light.svg
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/writefreely.svg b/img/system/writefreely.svg
new file mode 100644
index 000000000..6e3d9a235
--- /dev/null
+++ b/img/system/writefreely.svg
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/xbackbone.svg b/img/system/xbackbone.svg
new file mode 100644
index 000000000..fb4a6caeb
--- /dev/null
+++ b/img/system/xbackbone.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/xwiki-light.svg b/img/system/xwiki-light.svg
new file mode 100644
index 000000000..3fc5d2345
--- /dev/null
+++ b/img/system/xwiki-light.svg
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/xwiki.svg b/img/system/xwiki.svg
new file mode 100644
index 000000000..551024050
--- /dev/null
+++ b/img/system/xwiki.svg
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/yacht-light.svg b/img/system/yacht-light.svg
new file mode 100644
index 000000000..b7851f486
--- /dev/null
+++ b/img/system/yacht-light.svg
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/yacht.svg b/img/system/yacht.svg
new file mode 100644
index 000000000..302f7c72b
--- /dev/null
+++ b/img/system/yacht.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/yamtrack-light.svg b/img/system/yamtrack-light.svg
new file mode 100644
index 000000000..f68ad4834
--- /dev/null
+++ b/img/system/yamtrack-light.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/yamtrack.svg b/img/system/yamtrack.svg
new file mode 100644
index 000000000..3cf9b27aa
--- /dev/null
+++ b/img/system/yamtrack.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/yarr-light.svg b/img/system/yarr-light.svg
new file mode 100644
index 000000000..ac016e3e5
--- /dev/null
+++ b/img/system/yarr-light.svg
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/yarr.svg b/img/system/yarr.svg
new file mode 100644
index 000000000..e4a6f6a3f
--- /dev/null
+++ b/img/system/yarr.svg
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/your-spotify.svg b/img/system/your-spotify.svg
new file mode 100644
index 000000000..c75979172
--- /dev/null
+++ b/img/system/your-spotify.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/yourls.svg b/img/system/yourls.svg
new file mode 100644
index 000000000..6bf8d7127
--- /dev/null
+++ b/img/system/yourls.svg
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/youtube-dl.svg b/img/system/youtube-dl.svg
new file mode 100644
index 000000000..9d13701dc
--- /dev/null
+++ b/img/system/youtube-dl.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/zabbix.svg b/img/system/zabbix.svg
new file mode 100644
index 000000000..6ae3bfcf0
--- /dev/null
+++ b/img/system/zabbix.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
diff --git a/img/system/zammad.svg b/img/system/zammad.svg
new file mode 100644
index 000000000..0b87c9458
--- /dev/null
+++ b/img/system/zammad.svg
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/zigbee2mqtt.svg b/img/system/zigbee2mqtt.svg
new file mode 100644
index 000000000..acde6529d
--- /dev/null
+++ b/img/system/zigbee2mqtt.svg
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/zipcaptions-light.svg b/img/system/zipcaptions-light.svg
new file mode 100644
index 000000000..6346f430c
--- /dev/null
+++ b/img/system/zipcaptions-light.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
diff --git a/img/system/zipcaptions.svg b/img/system/zipcaptions.svg
new file mode 100644
index 000000000..d701bcf7a
--- /dev/null
+++ b/img/system/zipcaptions.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/zitadel-light.svg b/img/system/zitadel-light.svg
new file mode 100644
index 000000000..ce7cb9348
--- /dev/null
+++ b/img/system/zitadel-light.svg
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/zitadel.svg b/img/system/zitadel.svg
new file mode 100644
index 000000000..2be59f6c9
--- /dev/null
+++ b/img/system/zitadel.svg
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/zoraxy-light.svg b/img/system/zoraxy-light.svg
new file mode 100644
index 000000000..fb8824c69
--- /dev/null
+++ b/img/system/zoraxy-light.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/zoraxy.svg b/img/system/zoraxy.svg
new file mode 100644
index 000000000..64d481cab
--- /dev/null
+++ b/img/system/zoraxy.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/zwave-js-ui-light.svg b/img/system/zwave-js-ui-light.svg
new file mode 100644
index 000000000..c902d0834
--- /dev/null
+++ b/img/system/zwave-js-ui-light.svg
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/img/system/zwave-js-ui.svg b/img/system/zwave-js-ui.svg
new file mode 100644
index 000000000..dc2bcd921
--- /dev/null
+++ b/img/system/zwave-js-ui.svg
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/lang/app/strings/fixed_en.properties b/lang/app/strings/fixed_en.properties
index 9278ae786..63091cf20 100644
--- a/lang/app/strings/fixed_en.properties
+++ b/lang/app/strings/fixed_en.properties
@@ -68,3 +68,5 @@ termius=Termius
devolutions=Devolutions
tryPtb=XPipe Public Test Build
zed=Zed
+windowsCredentialManager=Windows credential manager
+webtop=Webtop
diff --git a/lang/app/strings/translations_da.properties b/lang/app/strings/translations_da.properties
index a6450c18a..ff57075d5 100644
--- a/lang/app/strings/translations_da.properties
+++ b/lang/app/strings/translations_da.properties
@@ -375,7 +375,7 @@ developerModeDescription=Når det er aktiveret, har du adgang til en række ekst
editor=Editor
custom=Brugerdefineret
passwordManagerCommand=Kommando til adgangskodehåndtering
-passwordManagerCommandDescription=Den kommando, der skal udføres for at hente adgangskoder. Pladsholderstrengen $KEY vil blive erstattet af den citerede adgangskode, når den kaldes. Dette bør kalde din adgangskodeadministrator CLI for at udskrive adgangskoden til stdout, f.eks. mypassmgr get $KEY.\n\nDu kan derefter indstille nøglen til at blive hentet, hver gang du opretter en forbindelse, der kræver et kodeord.
+passwordManagerCommandDescription=Implementeringen af adgangskodeadministratoren eller den brugerdefinerede kommando, der skal udføres for at hente adgangskoder. For brugerdefinerede kommandoer vil pladsholderstrengen $KEY blive erstattet af den citerede adgangskodenøgle, når den kaldes. Dette bør kalde din password manager CLI for at udskrive adgangskoden til stdout, f.eks. mypassmgr get $KEY.\n\nDu kan derefter indstille nøglen til at blive hentet, hver gang du opretter en forbindelse, der kræver en adgangskode.
passwordManagerCommandTest=Test password manager
passwordManagerCommandTestDescription=Her kan du teste, om outputtet ser korrekt ud, hvis du har opsat en password manager-kommando. Kommandoen skal kun sende selve adgangskoden til stdout, ingen anden formatering skal inkluderes i outputtet.
preferEditorTabs=Foretrækker at åbne nye faner
@@ -458,7 +458,7 @@ history=Browsing-historik
skipAll=Spring alle over
notes=Bemærkninger
addNotes=Tilføj noter
-order=Bestille ...
+order=Ordne ...
stickToTop=Hold dig på toppen
stickToBottom=Hold på bunden
orderAheadOf=Bestil på forhånd ...
@@ -488,7 +488,7 @@ closeOtherTabs=Luk andre faner
closeAllTabs=Luk alle faner
closeLeftTabs=Luk faner til venstre
closeRightTabs=Luk faner til højre
-addSerial=Seriel ...
+addSerial=Seriel (eksperimentel) ...
connect=Forbind
workspaces=Arbejdsområder
manageWorkspaces=Administrer arbejdsområder
@@ -511,3 +511,22 @@ confirmVaultUnencryptHeader=Vil du virkelig deaktivere avanceret vault-krypterin
confirmVaultUnencryptContent=Dette fjerner den ekstra kryptering for lagrede data og overskriver eksisterende data.
enableHttpApi=Aktiver HTTP API
enableHttpApiDescription=Aktiverer API'en, så eksterne programmer kan kalde XPipe-dæmonen for at udføre handlinger med dine administrerede forbindelser.
+chooseCustomIcon=Vælg et brugerdefineret ikon
+clear=Rydde
+gitVault=Git-hvælving
+fileBrowser=Fil-browser
+confirmAllDeletions=Bekræft alle sletninger
+confirmAllDeletionsDescription=Om der skal vises en bekræftelsesdialog for alle sletteoperationer. Som standard er det kun mapper, der kræver en bekræftelse.
+yesterday=I går
+green=Grøn
+yellow=Gul
+blue=Blå
+red=Rød
+asktextAlertTitle=Spørg
+fileWriteSudoTitle=Sudo filskrivning
+fileWriteSudoHeader=Den fil, du forsøger at skrive, kræver root-rettigheder. Vil du skrive denne fil med sudo?
+fileWriteSudoContent=Dette vil automatisk hæve sig til root med enten de angivne legitimationsoplysninger eller via en prompt.
+dontAllowTerminalRestart=Tillad ikke genstart af terminal
+dontAllowTerminalRestartDescription=Som standard kan terminalsessioner genstartes, når de er afsluttet inde fra terminalen. For at tillade dette accepterer XPipe disse eksterne anmodninger fra terminalen om at starte sessionen igen\n\nXPipe har ingen kontrol over terminalen, og hvor dette opkald kommer fra, så ondsindede lokale programmer kan også bruge denne funktion til at starte forbindelser gennem XPipe. Ved at deaktivere denne funktion forhindres dette scenarie.
+openDocumentation=Åben dokumentation
+openDocumentationDescription=Besøg XPipes dokumentationsside for dette problem
diff --git a/lang/app/strings/translations_de.properties b/lang/app/strings/translations_de.properties
index 060bed085..30988e65d 100644
--- a/lang/app/strings/translations_de.properties
+++ b/lang/app/strings/translations_de.properties
@@ -452,7 +452,7 @@ history=Browsing-Verlauf
skipAll=Alles überspringen
notes=Anmerkungen
addNotes=Notizen hinzufügen
-order=Bestellen ...
+order=Ordnen ...
stickToTop=Oben bleiben
stickToBottom=Auf dem Boden bleiben
orderAheadOf=Vorbestellen ...
@@ -482,7 +482,7 @@ closeOtherTabs=Andere Tabs schließen
closeAllTabs=Alle Registerkarten schließen
closeLeftTabs=Tabs nach links schließen
closeRightTabs=Tabs nach rechts schließen
-addSerial=Serielle ...
+addSerial=Seriell (Experimentell) ...
connect=Verbinden
workspaces=Arbeitsbereiche
manageWorkspaces=Arbeitsbereiche verwalten
@@ -505,3 +505,22 @@ confirmVaultUnencryptHeader=Willst du die erweiterte Tresorverschlüsselung wirk
confirmVaultUnencryptContent=Dadurch wird die zusätzliche Verschlüsselung für gespeicherte Daten entfernt und die vorhandenen Daten werden überschrieben.
enableHttpApi=HTTP-API aktivieren
enableHttpApiDescription=Aktiviert die API, damit externe Programme den XPipe-Daemon aufrufen können, um Aktionen mit deinen verwalteten Verbindungen durchzuführen.
+chooseCustomIcon=Benutzerdefiniertes Symbol auswählen
+clear=Löschen
+gitVault=Git-Tresor
+fileBrowser=Dateibrowser
+confirmAllDeletions=Bestätige alle Löschungen
+confirmAllDeletionsDescription=Ob ein Bestätigungsdialog für alle Löschvorgänge angezeigt werden soll. Standardmäßig benötigen nur Verzeichnisse eine Bestätigung.
+yesterday=Gestern
+green=Grün
+yellow=Gelb
+blue=Blau
+red=Rot
+asktextAlertTitle=Eingabeaufforderung
+fileWriteSudoTitle=Sudo-Datei schreiben
+fileWriteSudoHeader=Die Datei, die du zu schreiben versuchst, erfordert Root-Rechte. Willst du diese Datei mit sudo schreiben?
+fileWriteSudoContent=Dadurch wird automatisch ein Root-Zugang eingerichtet, entweder mit den angegebenen Anmeldedaten oder über eine Eingabeaufforderung.
+dontAllowTerminalRestart=Terminal-Neustart nicht zulassen
+dontAllowTerminalRestartDescription=Standardmäßig können Terminalsitzungen neu gestartet werden, nachdem sie vom Terminal aus beendet wurden. Um dies zu ermöglichen, akzeptiert XPipe diese externen Anfragen vom Terminal, um die Sitzung erneut zu starten\n\nXPipe hat keine Kontrolle über das Terminal und darüber, woher dieser Aufruf kommt. Daher können böswillige lokale Anwendungen diese Funktion ebenfalls nutzen, um Verbindungen über XPipe zu starten. Die Deaktivierung dieser Funktion verhindert dieses Szenario.
+openDocumentation=Offene Dokumentation
+openDocumentationDescription=Besuche die XPipe-Dokumentationsseite zu diesem Thema
diff --git a/lang/app/strings/translations_en.properties b/lang/app/strings/translations_en.properties
index e8d85feaa..d5c8ea7c5 100644
--- a/lang/app/strings/translations_en.properties
+++ b/lang/app/strings/translations_en.properties
@@ -373,7 +373,7 @@ developerModeDescription=When enabled, you will have access to a variety of addi
editor=Editor
custom=Custom
passwordManagerCommand=Password manager command
-passwordManagerCommandDescription=The command to execute to fetch passwords. The placeholder string $KEY will be replaced by the quoted password key when called. This should call your password manager CLI to print the password to stdout, e.g. mypassmgr get $KEY.\n\nYou can then set the key to be retrieved whenever you set up a connection which requires a password.
+passwordManagerCommandDescription=The password manager implementation or custom command to execute to fetch passwords. For custom commands, the placeholder string $KEY will be replaced by the quoted password key when called. This should call your password manager CLI to print the password to stdout, e.g. mypassmgr get $KEY.\n\nYou can then set the key to be retrieved whenever you set up a connection which requires a password.
passwordManagerCommandTest=Test password manager
passwordManagerCommandTestDescription=You can test here whether the output looks correct if you have set up a password manager command. The command should only output the password itself to stdout, no other formatting should be included in the output.
preferEditorTabs=Prefer to open new tabs
@@ -455,7 +455,7 @@ history=Browsing history
skipAll=Skip all
notes=Notes
addNotes=Add notes
-#context: verb
+#context: verb, to reorder
order=Order ...
stickToTop=Keep on top
stickToBottom=Keep on bottom
@@ -486,6 +486,7 @@ closeOtherTabs=Close other tabs
closeAllTabs=Close all tabs
closeLeftTabs=Close tabs to the left
closeRightTabs=Close tabs to the right
+#context: Serial computer connection
addSerial=Serial (Experimental) ...
connect=Connect
workspaces=Workspaces
@@ -508,4 +509,24 @@ confirmVaultUnencryptTitle=Confirm vault unencryption
confirmVaultUnencryptHeader=Do you really want to disable advanced vault encryption?
confirmVaultUnencryptContent=This will remove the additional encryption for stored data and will overwrite existing data.
enableHttpApi=Enable HTTP API
-enableHttpApiDescription=Enables the API, allowing external programs to call the XPipe daemon to perform actions with your managed connections.
\ No newline at end of file
+enableHttpApiDescription=Enables the API, allowing external programs to call the XPipe daemon to perform actions with your managed connections.
+chooseCustomIcon=Choose custom icon
+#context: verb, to delete
+clear=Clear
+gitVault=Git vault
+fileBrowser=File browser
+confirmAllDeletions=Confirm all deletions
+confirmAllDeletionsDescription=Whether to show a confirmation dialog for all delete operations. By default, only directories require a confirmation.
+yesterday=Yesterday
+green=Green
+yellow=Yellow
+blue=Blue
+red=Red
+asktextAlertTitle=Prompt
+fileWriteSudoTitle=Sudo file write
+fileWriteSudoHeader=The file you are trying to write requires root privileges. Do you want to write this file with sudo?
+fileWriteSudoContent=This will automatically elevate to root with either the provided credentials or via a prompt.
+dontAllowTerminalRestart=Don't allow terminal restart
+dontAllowTerminalRestartDescription=By default, terminal sessions can be restarted after they ended from within the terminal. To allow this, XPipe will accept these external requests from the terminal to launch the session again\n\nXPipe doesn't have any control over the terminal and where this call comes from, so malicious local applications can use this functionality as well to launch connections through XPipe. Disabling this functionality prevents this scenario.
+openDocumentation=Open documentation
+openDocumentationDescription=Visit the XPipe docs page for this issue
diff --git a/lang/app/strings/translations_es.properties b/lang/app/strings/translations_es.properties
index ac80899e1..7907f7f70 100644
--- a/lang/app/strings/translations_es.properties
+++ b/lang/app/strings/translations_es.properties
@@ -359,7 +359,7 @@ developerModeDescription=Cuando esté activado, tendrás acceso a una serie de o
editor=Editor
custom=Personalizado
passwordManagerCommand=Comando del gestor de contraseñas
-passwordManagerCommandDescription=El comando a ejecutar para obtener las contraseñas. La cadena de texto $KEY se sustituirá por la clave de contraseña citada cuando se llame. Esto debería llamar a la CLI de tu gestor de contraseñas para que imprima la contraseña en stdout, por ejemplo, mypassmgr get $KEY.\n\nA continuación, puedes configurar la clave para que se recupere siempre que establezcas una conexión que requiera una contraseña.
+passwordManagerCommandDescription=La implementación del gestor de contraseñas o el comando personalizado a ejecutar para obtener las contraseñas. En el caso de los comandos personalizados, la cadena $KEY se sustituirá por la clave de contraseña citada cuando se invoque. Esto debería llamar a la CLI de tu gestor de contraseñas para que imprima la contraseña en stdout, por ejemplo, mypassmgr get $KEY.\n\nA continuación, puedes configurar la clave para que se recupere siempre que establezcas una conexión que requiera una contraseña.
passwordManagerCommandTest=Gestor de contraseñas de prueba
passwordManagerCommandTestDescription=Aquí puedes comprobar si la salida parece correcta si has configurado un comando gestor de contraseñas. El comando sólo debe mostrar la contraseña en la salida estándar, no debe incluir ningún otro formato.
preferEditorTabs=Prefiere abrir nuevas pestañas
@@ -469,7 +469,7 @@ closeOtherTabs=Cerrar otras pestañas
closeAllTabs=Cerrar todas las pestañas
closeLeftTabs=Cerrar pestañas a la izquierda
closeRightTabs=Cerrar pestañas a la derecha
-addSerial=Serie ...
+addSerial=Serie (experimental) ...
connect=Conecta
workspaces=Espacios de trabajo
manageWorkspaces=Gestionar espacios de trabajo
@@ -492,3 +492,22 @@ confirmVaultUnencryptHeader=¿Realmente quieres desactivar la encriptación avan
confirmVaultUnencryptContent=Esto eliminará la encriptación adicional para los datos almacenados y sobrescribirá los datos existentes.
enableHttpApi=Activar la API HTTP
enableHttpApiDescription=Habilita la API, permitiendo que programas externos llamen al demonio XPipe para realizar acciones con tus conexiones gestionadas.
+chooseCustomIcon=Elegir icono personalizado
+clear=Borrar
+gitVault=Bóveda Git
+fileBrowser=Navegador de archivos
+confirmAllDeletions=Confirmar todos los borrados
+confirmAllDeletionsDescription=Si mostrar un diálogo de confirmación para todas las operaciones de borrado. Por defecto, sólo los directorios requieren una confirmación.
+yesterday=Ayer
+green=Verde
+yellow=Amarillo
+blue=Azul
+red=Rojo
+asktextAlertTitle=Pregunta
+fileWriteSudoTitle=Escritura de archivos Sudo
+fileWriteSudoHeader=El archivo que intentas escribir requiere privilegios de root. ¿Quieres escribir este archivo con sudo?
+fileWriteSudoContent=Esto elevará automáticamente a root con las credenciales proporcionadas o a través de un prompt.
+dontAllowTerminalRestart=No permitir el reinicio del terminal
+dontAllowTerminalRestartDescription=Por defecto, las sesiones de terminal pueden reiniciarse una vez finalizadas desde dentro del terminal. Para permitirlo, XPipe aceptará estas peticiones externas del terminal para iniciar de nuevo la sesión\n\nXPipe no tiene ningún control sobre el terminal y de dónde procede esta llamada, por lo que las aplicaciones locales maliciosas también pueden utilizar esta funcionalidad para lanzar conexiones a través de XPipe. Deshabilitar esta funcionalidad evita este escenario.
+openDocumentation=Documentación abierta
+openDocumentationDescription=Visita la página de documentación de XPipe sobre este tema
diff --git a/lang/app/strings/translations_fr.properties b/lang/app/strings/translations_fr.properties
index 4dd941be7..f0ce8c972 100644
--- a/lang/app/strings/translations_fr.properties
+++ b/lang/app/strings/translations_fr.properties
@@ -359,7 +359,7 @@ developerModeDescription=Lorsque cette option est activée, tu as accès à tout
editor=Éditeur
custom=Personnalisé
passwordManagerCommand=Commande du gestionnaire de mots de passe
-passwordManagerCommandDescription=La commande à exécuter pour récupérer les mots de passe. La chaîne de caractères de remplacement $KEY sera remplacée par la clé de mot de passe citée lorsqu'elle sera appelée. Cette commande devrait appeler ton gestionnaire de mots de passe CLI pour imprimer le mot de passe sur stdout, par exemple mypassmgr get $KEY.\n\nTu peux ensuite configurer la clé pour qu'elle soit récupérée chaque fois que tu établis une connexion qui nécessite un mot de passe.
+passwordManagerCommandDescription=L'implémentation du gestionnaire de mots de passe ou la commande personnalisée à exécuter pour récupérer les mots de passe. Pour les commandes personnalisées, la chaîne de caractères $KEY sera remplacée par la clé du mot de passe citée lors de l'appel. Ceci devrait appeler ton gestionnaire de mots de passe CLI pour imprimer le mot de passe sur stdout, par exemple mypassmgr get $KEY.\n\nTu peux ensuite configurer la clé pour qu'elle soit récupérée à chaque fois que tu établis une connexion nécessitant un mot de passe.
passwordManagerCommandTest=Test du gestionnaire de mot de passe
passwordManagerCommandTestDescription=Tu peux tester ici si la sortie semble correcte si tu as mis en place une commande de gestionnaire de mot de passe. La commande ne doit sortir que le mot de passe lui-même sur stdout, aucun autre formatage ne doit être inclus dans la sortie.
preferEditorTabs=Préfère ouvrir de nouveaux onglets
@@ -439,7 +439,7 @@ history=Historique de navigation
skipAll=Sauter tout
notes=Notes
addNotes=Ajouter des notes
-order=Commander...
+order=Ordonner ...
stickToTop=Garde le dessus
stickToBottom=Garde en bas
orderAheadOf=Commande en avance...
@@ -469,7 +469,7 @@ closeOtherTabs=Fermer d'autres onglets
closeAllTabs=Fermer tous les onglets
closeLeftTabs=Ferme les onglets à gauche
closeRightTabs=Ferme les onglets à droite
-addSerial=Série ...
+addSerial=Série (expérimental) ...
connect=Connecter
workspaces=Espaces de travail
manageWorkspaces=Gérer les espaces de travail
@@ -492,3 +492,22 @@ confirmVaultUnencryptHeader=Veux-tu vraiment désactiver le cryptage avancé de
confirmVaultUnencryptContent=Cela supprimera le cryptage supplémentaire pour les données stockées et écrasera les données existantes.
enableHttpApi=Activer l'API HTTP
enableHttpApiDescription=Active l'API, ce qui permet aux programmes externes d'appeler le démon XPipe pour effectuer des actions avec tes connexions gérées.
+chooseCustomIcon=Choisis une icône personnalisée
+clear=Effacer
+gitVault=Coffre-fort Git
+fileBrowser=Navigateur de fichiers
+confirmAllDeletions=Confirme toutes les suppressions
+confirmAllDeletionsDescription=Affichage ou non d'une boîte de dialogue de confirmation pour toutes les opérations de suppression. Par défaut, seuls les répertoires nécessitent une confirmation.
+yesterday=Hier
+green=Vert
+yellow=Jaune
+blue=Bleu
+red=Rouge
+asktextAlertTitle=Invite
+fileWriteSudoTitle=Sudo file write
+fileWriteSudoHeader=Le fichier que tu essaies d'écrire nécessite les privilèges de root. Veux-tu écrire ce fichier avec sudo ?
+fileWriteSudoContent=Cette opération permet d'accéder automatiquement à la fonction de super-utilisateur à l'aide des informations d'identification fournies ou d'un message d'invite.
+dontAllowTerminalRestart=Ne pas autoriser le redémarrage du terminal
+dontAllowTerminalRestartDescription=Par défaut, les sessions de terminal peuvent être relancées après s'être terminées depuis le terminal. Pour permettre cela, XPipe acceptera ces demandes externes du terminal pour relancer la session\n\nXPipe n'a aucun contrôle sur le terminal et sur la provenance de cet appel, de sorte que des applications locales malveillantes peuvent également utiliser cette fonctionnalité pour lancer des connexions par l'intermédiaire de XPipe. La désactivation de cette fonctionnalité permet d'éviter ce scénario.
+openDocumentation=Documentation ouverte
+openDocumentationDescription=Visite la page de documentation de XPipe pour ce problème
diff --git a/lang/app/strings/translations_it.properties b/lang/app/strings/translations_it.properties
index 75f65b3a7..bc2307ae6 100644
--- a/lang/app/strings/translations_it.properties
+++ b/lang/app/strings/translations_it.properties
@@ -359,7 +359,7 @@ developerModeDescription=Se abilitato, avrai accesso a una serie di opzioni aggi
editor=Editore
custom=Personalizzato
passwordManagerCommand=Comando del gestore di password
-passwordManagerCommandDescription=Il comando da eseguire per recuperare le password. La stringa segnaposto $KEY sarà sostituita dalla chiave della password citata quando verrà richiamata. Questo comando dovrebbe richiamare la CLI del tuo gestore di password per stampare la password su stdout, ad esempio mypassmgr get $KEY.\n\nPuoi quindi impostare la chiave da recuperare ogni volta che imposti una connessione che richiede una password.
+passwordManagerCommandDescription=L'implementazione del gestore di password o il comando personalizzato da eseguire per recuperare le password. Per i comandi personalizzati, la stringa segnaposto $KEY sarà sostituita dalla chiave della password citata al momento della chiamata. Questo dovrebbe richiamare la CLI del tuo gestore di password per stampare la password su stdout, ad esempio mypassmgr get $KEY.\n\nPotrai quindi impostare la chiave in modo che venga recuperata ogni volta che imposti una connessione che richiede una password.
passwordManagerCommandTest=Test del gestore di password
passwordManagerCommandTestDescription=Puoi verificare se l'output è corretto se hai impostato un comando di gestione delle password. Il comando deve inviare a stdout solo la password stessa e non deve includere nessun'altra formattazione nell'output.
preferEditorTabs=Preferisce aprire nuove schede
@@ -469,7 +469,7 @@ closeOtherTabs=Chiudere altre schede
closeAllTabs=Chiudi tutte le schede
closeLeftTabs=Chiudere le schede a sinistra
closeRightTabs=Chiudere le schede a destra
-addSerial=Seriale ...
+addSerial=Seriale (sperimentale) ...
connect=Collegare
workspaces=Spazi di lavoro
manageWorkspaces=Gestire gli spazi di lavoro
@@ -492,3 +492,22 @@ confirmVaultUnencryptHeader=Vuoi davvero disabilitare la crittografia avanzata d
confirmVaultUnencryptContent=Questo rimuoverà la crittografia aggiuntiva per i dati memorizzati e sovrascriverà i dati esistenti.
enableHttpApi=Abilita l'API HTTP
enableHttpApiDescription=Abilita l'API, consentendo ai programmi esterni di chiamare il demone XPipe per eseguire azioni con le connessioni gestite.
+chooseCustomIcon=Scegli un'icona personalizzata
+clear=Cancellare
+gitVault=Git vault
+fileBrowser=Browser di file
+confirmAllDeletions=Conferma tutte le eliminazioni
+confirmAllDeletionsDescription=Se mostrare una finestra di conferma per tutte le operazioni di cancellazione. Per impostazione predefinita, solo le directory richiedono una conferma.
+yesterday=Ieri
+green=Verde
+yellow=Giallo
+blue=Blu
+red=Rosso
+asktextAlertTitle=Prompt
+fileWriteSudoTitle=Scrittura di file Sudo
+fileWriteSudoHeader=Il file che stai cercando di scrivere richiede i privilegi di root. Vuoi scrivere questo file con sudo?
+fileWriteSudoContent=In questo modo si eleva automaticamente a root con le credenziali fornite o tramite un prompt.
+dontAllowTerminalRestart=Non consentire il riavvio del terminale
+dontAllowTerminalRestartDescription=Per impostazione predefinita, le sessioni del terminale possono essere riavviate dopo la loro conclusione dall'interno del terminale stesso. Per consentire ciò, XPipe accetterà le seguenti richieste esterne dal terminale per avviare nuovamente la sessione\n\nXPipe non ha alcun controllo sul terminale e sulla provenienza di questa chiamata, quindi anche le applicazioni locali malintenzionate possono utilizzare questa funzionalità per avviare connessioni attraverso XPipe. Disabilitando questa funzionalità si evita questo scenario.
+openDocumentation=Documentazione aperta
+openDocumentationDescription=Visita la pagina dei documenti di XPipe per questo problema
diff --git a/lang/app/strings/translations_ja.properties b/lang/app/strings/translations_ja.properties
index 1abbfdb1b..44ea90fcb 100644
--- a/lang/app/strings/translations_ja.properties
+++ b/lang/app/strings/translations_ja.properties
@@ -359,7 +359,7 @@ developerModeDescription=有効にすると、開発に役立つさまざまな
editor=エディター
custom=カスタム
passwordManagerCommand=パスワードマネージャーコマンド
-passwordManagerCommandDescription=パスワードを取得するために実行するコマンド。プレースホルダ文字列$KEYは、呼び出されたときに引用符で囲まれたパスワードキーに置き換えられる。これは、パスワードを標準出力に出力するために、パスワードマネージャCLIを呼び出す必要がある。\n\nパスワードを必要とする接続をセットアップするときはいつでも、このキーを取得するように設定できる。
+passwordManagerCommandDescription=パスワードを取得するために実行するパスワードマネージャ実装またはカスタムコマンド。カスタムコマンドの場合、$KEYというプレースホルダー文字列は、呼び出されたときに引用符で囲まれたパスワードキーに置き換えられる。これは、パスワードを標準出力に出力するパスワード・マネージャCLIを 呼び出す必要がある。\n\nパスワードを必要とする接続をセットアップするときはいつでも、このキーを取得するように設定できる。
passwordManagerCommandTest=テストパスワードマネージャー
passwordManagerCommandTestDescription=パスワード・マネージャー・コマンドをセットアップした場合、出力が正しく見えるかどうかをここでテストできる。コマンドはパスワードそのものを標準出力に出力するだけで、他の書式は出力に含まれないはずである。
preferEditorTabs=新しいタブを開きたい
@@ -439,7 +439,7 @@ history=閲覧履歴
skipAll=すべてスキップする
notes=備考
addNotes=メモを追加する
-order=注文する
+order=並び替える.
stickToTop=トップをキープする
stickToBottom=底を保つ
orderAheadOf=先に注文する
@@ -469,7 +469,7 @@ closeOtherTabs=他のタブを閉じる
closeAllTabs=すべてのタブを閉じる
closeLeftTabs=タブを左に閉じる
closeRightTabs=タブを右に閉じる
-addSerial=シリアル ...
+addSerial=シリアル(実験)...
connect=接続する
workspaces=ワークスペース
manageWorkspaces=ワークスペースを管理する
@@ -492,3 +492,22 @@ confirmVaultUnencryptHeader=本当に高度なデータ保管庫の暗号化を
confirmVaultUnencryptContent=これにより、保存データの暗号化が解除され、既存のデータが上書きされる。
enableHttpApi=HTTP APIを有効にする
enableHttpApiDescription=APIを有効にし、外部プログラムからXPipeデーモンを呼び出して、管理されている接続に対してアクションを実行できるようにする。
+chooseCustomIcon=カスタムアイコンを選ぶ
+clear=消去する
+gitVault=Git保管庫
+fileBrowser=ファイルブラウザ
+confirmAllDeletions=すべての削除を確認する
+confirmAllDeletionsDescription=すべての削除操作に対して確認ダイアログを表示するかどうか。デフォルトでは、確認が必要なのはディレクトリだけである。
+yesterday=昨日
+green=グリーン
+yellow=黄色
+blue=ブルー
+red=赤い
+asktextAlertTitle=プロンプト
+fileWriteSudoTitle=須藤ファイル書き込み
+fileWriteSudoHeader=書き込もうとしているファイルにはroot権限が必要だ。このファイルをsudoで書き込むか?
+fileWriteSudoContent=これは、提供された認証情報またはプロンプト経由で自動的にrootに昇格する。
+dontAllowTerminalRestart=端末の再起動を許可しない
+dontAllowTerminalRestartDescription=デフォルトでは、ターミナル・セッションはターミナル内から終了後に再開することができる。これを可能にするため、XPipeはターミナルからセッションを再び起動するための以下の外部リクエストを受け付ける。\n\nXPipeはターミナルとこの呼び出しの発信元を制御できないため、悪意のあるローカルアプリケーションはこの機能を使用してXPipe経由で接続を開始することができる。この機能を無効にすることで、このシナリオを防ぐことができる。
+openDocumentation=ドキュメントを開く
+openDocumentationDescription=この問題のXPipeドキュメントページを見る
diff --git a/lang/app/strings/translations_nl.properties b/lang/app/strings/translations_nl.properties
index 8b621fb06..73c3cb6df 100644
--- a/lang/app/strings/translations_nl.properties
+++ b/lang/app/strings/translations_nl.properties
@@ -359,7 +359,7 @@ developerModeDescription=Als deze optie is ingeschakeld, heb je toegang tot een
editor=Bewerker
custom=Aangepaste
passwordManagerCommand=Opdracht voor wachtwoordbeheer
-passwordManagerCommandDescription=Het commando dat moet worden uitgevoerd om wachtwoorden op te halen. De tekenreeks $KEY wordt bij het aanroepen vervangen door de geciteerde wachtwoordsleutel. Dit moet je wachtwoordmanager CLI aanroepen om het wachtwoord naar stdout af te drukken, bijvoorbeeld mypassmgr get $KEY.\n\nJe kunt dan instellen dat de sleutel wordt opgehaald wanneer je een verbinding opzet waarvoor een wachtwoord nodig is.
+passwordManagerCommandDescription=De implementatie van de wachtwoordmanager of het aangepaste commando dat moet worden uitgevoerd om wachtwoorden op te halen. Voor aangepaste commando's wordt de tekenreeks $KEY vervangen door de wachtwoordsleutel wanneer deze wordt aangeroepen. Dit moet je wachtwoordmanager CLI aanroepen om het wachtwoord naar stdout af te drukken, bijvoorbeeld mypassmgr get $KEY.\n\nJe kunt dan instellen dat de sleutel wordt opgehaald wanneer je een verbinding opzet waarvoor een wachtwoord nodig is.
passwordManagerCommandTest=Wachtwoordmanager testen
passwordManagerCommandTestDescription=Je kunt hier testen of de uitvoer er correct uitziet als je een wachtwoordmanager-commando hebt ingesteld. Het commando moet alleen het wachtwoord zelf uitvoeren naar stdout, er mag geen andere opmaak in de uitvoer worden opgenomen.
preferEditorTabs=Open liever nieuwe tabbladen
@@ -439,7 +439,7 @@ history=Browsegeschiedenis
skipAll=Alles overslaan
notes=Opmerkingen
addNotes=Opmerkingen toevoegen
-order=Bestellen ...
+order=Ordenen ...
stickToTop=Bovenaan houden
stickToBottom=Onderaan houden
orderAheadOf=Vooruitbestellen ...
@@ -469,7 +469,7 @@ closeOtherTabs=Andere tabbladen sluiten
closeAllTabs=Alle tabbladen sluiten
closeLeftTabs=Tabbladen naar links sluiten
closeRightTabs=Tabbladen naar rechts sluiten
-addSerial=Serieel ...
+addSerial=Serieel (Experimenteel) ...
connect=Maak verbinding met
workspaces=Werkruimten
manageWorkspaces=Werkruimten beheren
@@ -492,3 +492,22 @@ confirmVaultUnencryptHeader=Wil je echt geavanceerde kluisversleuteling uitschak
confirmVaultUnencryptContent=Hierdoor wordt de extra codering voor opgeslagen gegevens verwijderd en worden bestaande gegevens overschreven.
enableHttpApi=HTTP API inschakelen
enableHttpApiDescription=Schakelt de API in, waardoor externe programma's de XPipe daemon kunnen aanroepen om acties uit te voeren met je beheerde verbindingen.
+chooseCustomIcon=Aangepast pictogram kiezen
+clear=Wis
+gitVault=Git kluis
+fileBrowser=Bestandsbrowser
+confirmAllDeletions=Alle verwijderingen bevestigen
+confirmAllDeletionsDescription=Of een bevestigingsvenster moet worden weergegeven voor alle verwijderbewerkingen. Standaard vereisen alleen mappen een bevestiging.
+yesterday=Gisteren
+green=Groen
+yellow=Geel
+blue=Blauw
+red=Rood
+asktextAlertTitle=Prompt
+fileWriteSudoTitle=Sudo bestand schrijven
+fileWriteSudoHeader=Het bestand dat je probeert te schrijven vereist rootrechten. Wil je dit bestand schrijven met sudo?
+fileWriteSudoContent=Dit zal automatisch verheffen naar root met de verstrekte inloggegevens of via een prompt.
+dontAllowTerminalRestart=Terminal opnieuw opstarten niet toestaan
+dontAllowTerminalRestartDescription=Standaard kunnen terminalsessies opnieuw worden gestart nadat ze vanuit de terminal zijn beëindigd. Om dit mogelijk te maken, accepteert XPipe deze externe verzoeken van de terminal om de sessie opnieuw te starten\n\nXPipe heeft geen controle over de terminal en waar deze oproep vandaan komt, dus kwaadwillende lokale applicaties kunnen deze functionaliteit ook gebruiken om verbindingen via XPipe te starten. Het uitschakelen van deze functionaliteit voorkomt dit scenario.
+openDocumentation=Open documentatie
+openDocumentationDescription=Bezoek de XPipe docs pagina voor dit probleem
diff --git a/lang/app/strings/translations_pt.properties b/lang/app/strings/translations_pt.properties
index eb66613d4..62fac86e2 100644
--- a/lang/app/strings/translations_pt.properties
+++ b/lang/app/strings/translations_pt.properties
@@ -359,7 +359,7 @@ developerModeDescription=Quando ativado, terás acesso a uma variedade de opçõ
editor=Editor
custom=Personaliza
passwordManagerCommand=Comando do gestor de senhas
-passwordManagerCommandDescription=O comando a executar para ir buscar as palavras-passe. A string de espaço reservado $KEY será substituída pela chave de senha citada quando chamada. Isto deve chamar o teu gestor de senhas CLI para imprimir a senha para stdout, por exemplo, mypassmgr get $KEY.\n\nPodes então definir a chave para ser recuperada sempre que configurares uma ligação que requeira uma palavra-passe.
+passwordManagerCommandDescription=A implementação do gestor de palavras-passe ou o comando personalizado a executar para obter palavras-passe. Para comandos personalizados, a string de espaço reservado $KEY será substituída pela chave de senha citada quando chamada. Isto deve chamar o teu gestor de palavras-passe CLI para imprimir a palavra-passe no stdout, por exemplo, mypassmgr get $KEY.\n\nPodes então definir a chave para ser recuperada sempre que estabeleceres uma ligação que requeira uma palavra-passe.
passwordManagerCommandTest=Testa o gestor de palavras-passe
passwordManagerCommandTestDescription=Podes testar aqui se a saída parece correcta se tiveres configurado um comando de gestão de palavras-passe. O comando só deve enviar a própria palavra-passe para stdout, não devendo ser incluída qualquer outra formatação na saída.
preferEditorTabs=Prefere abrir novos separadores
@@ -439,7 +439,7 @@ history=Histórico de navegação
skipAll=Salta tudo
notes=Nota
addNotes=Adiciona notas
-order=Encomenda ...
+order=Ordenar ...
stickToTop=Mantém-te no topo
stickToBottom=Mantém na parte inferior
orderAheadOf=Encomenda antes de ...
@@ -469,7 +469,7 @@ closeOtherTabs=Fecha outros separadores
closeAllTabs=Fecha todos os separadores
closeLeftTabs=Fecha os separadores à esquerda
closeRightTabs=Fecha os separadores à direita
-addSerial=Série ...
+addSerial=Série (Experimental) ...
connect=Liga-te
workspaces=Espaços de trabalho
manageWorkspaces=Gere espaços de trabalho
@@ -492,3 +492,22 @@ confirmVaultUnencryptHeader=Queres mesmo desativar a encriptação avançada da
confirmVaultUnencryptContent=Isto irá remover a encriptação adicional dos dados armazenados e irá substituir os dados existentes.
enableHttpApi=Ativar a API HTTP
enableHttpApiDescription=Habilita a API, permitindo que programas externos chamem o daemon XPipe para executar ações com suas conexões gerenciadas.
+chooseCustomIcon=Escolhe um ícone personalizado
+clear=Limpar
+gitVault=Cofre do Git
+fileBrowser=Navegador de ficheiros
+confirmAllDeletions=Confirma todas as eliminações
+confirmAllDeletionsDescription=Mostra ou não uma caixa de diálogo de confirmação para todas as operações de eliminação. Por predefinição, apenas as diretorias requerem uma confirmação.
+yesterday=Ontem
+green=Verde
+yellow=Amarelo
+blue=Azul
+red=Vermelho
+asktextAlertTitle=Prompt
+fileWriteSudoTitle=Escreve um ficheiro Sudo
+fileWriteSudoHeader=O ficheiro que estás a tentar escrever requer privilégios de root. Queres escrever este ficheiro com sudo?
+fileWriteSudoContent=Isto irá elevar automaticamente para a raiz com as credenciais fornecidas ou através de um prompt.
+dontAllowTerminalRestart=Não permitir o reinício do terminal
+dontAllowTerminalRestartDescription=Por defeito, as sessões de terminal podem ser reiniciadas depois de terminarem a partir do terminal. Para permitir isso, o XPipe aceitará essas solicitações externas do terminal para iniciar a sessão novamente\n\nO XPipe não tem qualquer controlo sobre o terminal e sobre a origem desta chamada, pelo que as aplicações locais maliciosas também podem utilizar esta funcionalidade para iniciar ligações através do XPipe. Desativar esta funcionalidade evita este cenário.
+openDocumentation=Abre a documentação
+openDocumentationDescription=Visita a página de documentação do XPipe para esta questão
diff --git a/lang/app/strings/translations_ru.properties b/lang/app/strings/translations_ru.properties
index 7fa5f5e0d..f91a20fe4 100644
--- a/lang/app/strings/translations_ru.properties
+++ b/lang/app/strings/translations_ru.properties
@@ -359,7 +359,7 @@ developerModeDescription=Если включить эту функцию, то
editor=Редактор
custom=Пользовательский
passwordManagerCommand=Команда менеджера паролей
-passwordManagerCommandDescription=Команда, которую нужно выполнить для получения паролей. Строка-заполнитель $KEY при вызове будет заменена на заключенный в кавычки ключ пароля. Это должно вызвать CLI твоего менеджера паролей для печати пароля в stdout, например, mypassmgr get $KEY.\n\nЗатем ты можешь задать, чтобы ключ извлекался всякий раз, когда ты устанавливаешь соединение, требующее ввода пароля.
+passwordManagerCommandDescription=Реализация менеджера паролей или пользовательская команда, которую нужно выполнить для получения паролей. Для пользовательских команд строка-заполнитель $KEY при вызове будет заменена на ключ пароля, взятый в кавычки. Это должно вызвать CLI твоего менеджера паролей для печати пароля в stdout, например, mypassmgr get $KEY.\n\nЗатем ты можешь задать, чтобы ключ извлекался всякий раз, когда ты устанавливаешь соединение, требующее ввода пароля.
passwordManagerCommandTest=Тестовый менеджер паролей
passwordManagerCommandTestDescription=Здесь ты можешь проверить, правильно ли выглядит вывод, если ты настроил команду менеджера паролей. Команда должна выводить в stdout только сам пароль, никакое другое форматирование не должно присутствовать в выводе.
preferEditorTabs=Предпочитает открывать новые вкладки
@@ -439,7 +439,7 @@ history=История просмотров
skipAll=Пропустить все
notes=Заметки
addNotes=Добавляй заметки
-order=Заказать ...
+order=Упорядочить ...
stickToTop=Держись на высоте
stickToBottom=Держать на дне
orderAheadOf=Заказать заранее ...
@@ -469,7 +469,7 @@ closeOtherTabs=Закрыть другие вкладки
closeAllTabs=Закрыть все вкладки
closeLeftTabs=Закрыть вкладки слева
closeRightTabs=Закрывать вкладки справа
-addSerial=Серийный ...
+addSerial=Последовательное (экспериментальное) ...
connect=Connect
workspaces=Рабочие пространства
manageWorkspaces=Управляй рабочими пространствами
@@ -492,3 +492,22 @@ confirmVaultUnencryptHeader=Ты действительно хочешь отк
confirmVaultUnencryptContent=Это уберет дополнительное шифрование для сохраненных данных и перезапишет существующие.
enableHttpApi=Включить HTTP API
enableHttpApiDescription=Включает API, позволяя внешним программам вызывать демона XPipe для выполнения действий с твоими управляемыми соединениями.
+chooseCustomIcon=Выберите пользовательскую иконку
+clear=Очистить
+gitVault=Git vault
+fileBrowser=Браузер файлов
+confirmAllDeletions=Подтвердите все удаления
+confirmAllDeletionsDescription=Показывать ли диалог подтверждения для всех операций удаления. По умолчанию подтверждение требуется только для каталогов.
+yesterday=Вчера
+green=Зеленый
+yellow=Желтый
+blue=Синий
+red=Красный
+asktextAlertTitle=Prompt
+fileWriteSudoTitle=Запись файла Sudo
+fileWriteSudoHeader=Файл, который ты пытаешься записать, требует привилегий root. Хочешь ли ты записать этот файл с помощью sudo?
+fileWriteSudoContent=Это автоматически повысит статус до root либо с помощью предоставленных учетных данных, либо через приглашение.
+dontAllowTerminalRestart=Не разрешайте перезагрузку терминала
+dontAllowTerminalRestartDescription=По умолчанию терминальные сессии могут быть перезапущены после их завершения изнутри терминала. Чтобы разрешить это, XPipe будет принимать такие внешние запросы от терминала, чтобы снова запустить сессию\n\nXPipe не имеет никакого контроля над терминалом и тем, откуда поступает этот вызов, поэтому вредоносные локальные приложения могут использовать эту функциональность и для запуска соединений через XPipe. Отключение этой функциональности предотвращает подобный сценарий.
+openDocumentation=Открытая документация
+openDocumentationDescription=Посетите страницу документации XPipe по этому вопросу
diff --git a/lang/app/strings/translations_tr.properties b/lang/app/strings/translations_tr.properties
index 7650098c9..494f83bdf 100644
--- a/lang/app/strings/translations_tr.properties
+++ b/lang/app/strings/translations_tr.properties
@@ -360,7 +360,7 @@ developerModeDescription=Etkinleştirildiğinde, geliştirme için yararlı olan
editor=Editör
custom=Özel
passwordManagerCommand=Parola yöneticisi komutu
-passwordManagerCommandDescription=Parolaları almak için çalıştırılacak komut. Yer tutucu dize $KEY, çağrıldığında alıntılanan parola anahtarıyla değiştirilecektir. Bu, parolayı stdout'a yazdırmak için parola yöneticinizin CLI'sini çağırmalıdır, örneğin mypassmgr get $KEY.\n\nDaha sonra anahtarı, parola gerektiren bir bağlantı kurduğunuzda alınacak şekilde ayarlayabilirsiniz.
+passwordManagerCommandDescription=Parolaları almak için çalıştırılacak parola yöneticisi uygulaması veya özel komut. Özel komutlar için $KEY yer tutucu dizesi, çağrıldığında alıntılanan parola anahtarıyla değiştirilecektir. Bu, parolayı stdout'a yazdırmak için parola yöneticinizin CLI'sini çağırmalıdır, örneğin mypassmgr get $KEY.\n\nDaha sonra anahtarı, parola gerektiren bir bağlantı kurduğunuzda alınacak şekilde ayarlayabilirsiniz.
passwordManagerCommandTest=Parola yöneticisini test edin
passwordManagerCommandTestDescription=Bir parola yöneticisi komutu kurduysanız çıktının doğru görünüp görünmediğini burada test edebilirsiniz. Komut yalnızca parolanın kendisini stdout'a çıktılamalıdır, çıktıya başka hiçbir biçimlendirme dahil edilmemelidir.
preferEditorTabs=Yeni sekmeler açmayı tercih edin
@@ -470,7 +470,7 @@ closeOtherTabs=Diğer sekmeleri kapatın
closeAllTabs=Tüm sekmeleri kapat
closeLeftTabs=Sekmeleri sola doğru kapatın
closeRightTabs=Sekmeleri sağa doğru kapatın
-addSerial=Seri ...
+addSerial=Seri (Deneysel) ...
connect=Bağlan
workspaces=Çalışma Alanları
manageWorkspaces=Çalışma alanlarını yönetme
@@ -493,3 +493,22 @@ confirmVaultUnencryptHeader=Gelişmiş kasa şifrelemesini gerçekten devre dı
confirmVaultUnencryptContent=Bu, depolanan veriler için ek şifrelemeyi kaldıracak ve mevcut verilerin üzerine yazacaktır.
enableHttpApi=HTTP API'yi Etkinleştir
enableHttpApiDescription=API'yi etkinleştirerek harici programların yönetilen bağlantılarınızla eylemler gerçekleştirmek için XPipe arka plan programını çağırmasına izin verir.
+chooseCustomIcon=Özel simge seçin
+clear=Temiz
+gitVault=Git kasası
+fileBrowser=Dosya tarayıcısı
+confirmAllDeletions=Tüm silme işlemlerini onaylayın
+confirmAllDeletionsDescription=Tüm silme işlemleri için bir onay iletişim kutusu gösterilip gösterilmeyeceği. Varsayılan olarak, yalnızca dizinler onay gerektirir.
+yesterday=Dün
+green=Yeşil
+yellow=Sarı
+blue=Mavi
+red=Kırmızı
+asktextAlertTitle=İstem
+fileWriteSudoTitle=Sudo dosya yazma
+fileWriteSudoHeader=Yazmaya çalıştığınız dosya root ayrıcalıkları gerektiriyor. Bu dosyayı sudo ile mi yazmak istiyorsunuz?
+fileWriteSudoContent=Bu, sağlanan kimlik bilgileriyle veya bir komut istemi aracılığıyla otomatik olarak kök dizine yükseltme yapacaktır.
+dontAllowTerminalRestart=Terminalin yeniden başlatılmasına izin verme
+dontAllowTerminalRestartDescription=Varsayılan olarak, terminal oturumları terminal içinden sonlandırıldıktan sonra yeniden başlatılabilir. Buna izin vermek için XPipe, oturumu tekrar başlatmak üzere terminalden gelen şu harici istekleri kabul edecektir\n\nXPipe terminal ve bu çağrının nereden geldiği üzerinde herhangi bir kontrole sahip değildir, bu nedenle kötü niyetli yerel uygulamalar XPipe üzerinden bağlantı başlatmak için bu işlevi de kullanabilir. Bu işlevselliğin devre dışı bırakılması bu senaryoyu önler.
+openDocumentation=Açık dokümantasyon
+openDocumentationDescription=Bu sorun için XPipe dokümanlar sayfasını ziyaret edin
diff --git a/lang/app/strings/translations_zh.properties b/lang/app/strings/translations_zh.properties
index e29e91c6d..cdb731b99 100644
--- a/lang/app/strings/translations_zh.properties
+++ b/lang/app/strings/translations_zh.properties
@@ -359,7 +359,7 @@ developerModeDescription=启用后,您可以访问各种对开发有用的附
editor=编辑器
custom=自定义
passwordManagerCommand=密码管理器命令
-passwordManagerCommandDescription=为获取密码而执行的命令。在调用时,占位符字符串 $KEY 将被带引号的密码密钥替换。该命令应调用密码管理器 CLI 将密码打印到 stdout,例如:mypassmgr get $KEY。\n\n然后,您就可以设置在建立需要密码的连接时检索密钥。
+passwordManagerCommandDescription=用于获取密码的密码管理器执行程序或自定义命令。对于自定义命令,在调用时,占位符字符串 $KEY 将被带引号的密码密钥替换。该命令应调用密码管理器 CLI 将密码打印到 stdout,例如:mypassmgr get $KEY。\n\n然后,您就可以设置在建立需要密码的连接时检索密钥。
passwordManagerCommandTest=测试密码管理器
passwordManagerCommandTestDescription=如果您设置了密码管理器命令,可以在此测试输出是否正确。该命令只能将密码本身输出到 stdout,输出中不应包含其他格式。
preferEditorTabs=首选打开新标签页
@@ -469,7 +469,7 @@ closeOtherTabs=关闭其他标签页
closeAllTabs=关闭所有标签页
closeLeftTabs=向左关闭标签
closeRightTabs=向右关闭标签页
-addSerial=串行 ...
+addSerial=串行(实验)...
connect=连接
workspaces=工作空间
manageWorkspaces=管理工作区
@@ -492,3 +492,22 @@ confirmVaultUnencryptHeader=您真的想禁用高级保险库加密吗?
confirmVaultUnencryptContent=这将取消对存储数据的额外加密,并覆盖现有数据。
enableHttpApi=启用 HTTP API
enableHttpApiDescription=启用 API,允许外部程序调用 XPipe 守护进程,对管理连接执行操作。
+chooseCustomIcon=选择自定义图标
+clear=清除
+gitVault=Git 数据库
+fileBrowser=文件浏览器
+confirmAllDeletions=确认所有删除
+confirmAllDeletionsDescription=是否为所有删除操作显示确认对话框。默认情况下,只有目录需要确认。
+yesterday=昨天
+green=绿色
+yellow=黄色
+blue=蓝色
+red=红色
+asktextAlertTitle=提示
+fileWriteSudoTitle=Sudo 文件写入
+fileWriteSudoHeader=您要写入的文件需要 root 权限。你想用 sudo 来写这个文件吗?
+fileWriteSudoContent=这将使用提供的凭据或通过提示自动提升为根用户。
+dontAllowTerminalRestart=不允许终端重启
+dontAllowTerminalRestartDescription=默认情况下,终端会话可以在终端内部结束后重新启动。为了做到这一点,XPipe 将接受来自终端的这些外部请求,以再次启动会话\n\nXPipe无法控制终端以及该调用的来源,因此恶意本地应用程序也可以使用该功能通过XPipe启动连接。禁用该功能可防止出现这种情况。
+openDocumentation=开放文档
+openDocumentationDescription=访问 XPipe 文档页面了解这一问题
diff --git a/lang/app/texts/vault_da.md b/lang/app/texts/vault_da.md
new file mode 100644
index 000000000..64883050e
--- /dev/null
+++ b/lang/app/texts/vault_da.md
@@ -0,0 +1,65 @@
+# XPipe Git Vault
+
+XPipe kan synkronisere alle dine forbindelsesdata med dit eget git remote repository. Du kan synkronisere med dette depot i alle XPipe-applikationsforekomster på samme måde, og alle ændringer, du foretager i en forekomst, afspejles i depotet.
+
+Først og fremmest skal du oprette et remote repository med din foretrukne git-udbyder. Dette repository skal være privat.
+Derefter kan du bare kopiere og indsætte URL'en i XPipes indstilling for remote repository.
+
+Du skal også have en lokalt installeret `git`-klient klar på din lokale maskine. Du kan prøve at køre `git` i en lokal terminal for at tjekke.
+Hvis du ikke har en, kan du besøge [https://git-scm.com](https://git-scm.com/) for at installere git.
+
+## Autentificering til fjerndepotet
+
+Der er flere måder at godkende på. De fleste repositorier bruger HTTPS, hvor du skal angive et brugernavn og en adgangskode.
+Nogle udbydere understøtter også SSH-protokollen, som også understøttes af XPipe.
+Hvis du bruger SSH til git, ved du sikkert, hvordan du skal konfigurere det, så dette afsnit handler kun om HTTPS.
+
+Du skal sætte din git CLI op til at kunne autentificere med dit eksterne git-repository via HTTPS. Der er flere måder at gøre det på.
+Du kan tjekke, om det allerede er gjort, ved at genstarte XPipe, når et fjernlager er konfigureret.
+Hvis den beder dig om dine login-oplysninger, skal du sætte dem op.
+
+Mange specialværktøjer som dette [GitHub CLI] (https://cli.github.com/) gør alt automatisk for dig, når det er installeret.
+Nogle nyere versioner af git-klienter kan også autentificere via særlige webtjenester, hvor du bare skal logge ind på din konto i din browser.
+
+Der er også manuelle måder at autentificere sig på via et brugernavn og et token.
+I dag kræver de fleste udbydere et personligt adgangstoken (PAT) for at godkende fra kommandolinjen i stedet for traditionelle adgangskoder.
+Du kan finde almindelige (PAT)-sider her:
+- **GitHub**: [Personal access tokens (classic)](https://github.com/settings/tokens)
+- **GitLab**: [Personligt adgangstoken](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html)
+- **BitBucket**: [Personligt adgangstoken](https://support.atlassian.com/bitbucket-cloud/docs/access-tokens/)
+- **Gitea**: `Indstillinger -> Applikationer -> Administrer adgangstoken`
+Indstil tokentilladelsen for repository til Read og Write. Resten af tokentilladelserne kan indstilles som Read.
+Selv om din git-klient beder dig om en adgangskode, bør du indtaste dit token, medmindre din udbyder stadig bruger adgangskoder.
+- De fleste udbydere understøtter ikke længere adgangskoder.
+
+Hvis du ikke ønsker at indtaste dine legitimationsoplysninger hver gang, kan du bruge en hvilken som helst git-legitimationshåndtering til det.
+For mere information, se f.eks:
+- [https://git-scm.com/doc/credential-helpers](https://git-scm.com/doc/credential-helpers)
+- [https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git](https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git)
+
+Nogle moderne git-klienter sørger også for at gemme legitimationsoplysninger automatisk.
+
+Hvis alt fungerer, bør XPipe sende en commit til dit fjernrepository.
+
+## Tilføjelse af kategorier til depotet
+
+Som standard er ingen forbindelseskategorier sat til at synkronisere, så du har eksplicit kontrol over, hvilke forbindelser der skal commit'es.
+Så i starten vil dit remote repository være tomt.
+
+For at få dine forbindelser i en kategori lagt ind i dit git-repository,
+skal du klikke på tandhjulsikonet (når du holder musen over kategorien)
+i fanen `Forbindelser` under kategorioversigten i venstre side.
+Klik derefter på `Add to git repository` for at synkronisere kategorien og forbindelserne til dit git-repository.
+Dette vil tilføje alle synkroniserbare forbindelser til git-repository'et.
+
+## Lokale forbindelser synkroniseres ikke
+
+Enhver forbindelse, der ligger under den lokale maskine, kan ikke deles, da den henviser til forbindelser og data, der kun er tilgængelige på det lokale system.
+
+Visse forbindelser, der er baseret på en lokal fil, f.eks. SSH-konfigurationer, kan deles via git, hvis de underliggende data, i dette tilfælde filen, også er blevet føjet til git-repository'et.
+
+## Tilføjelse af filer til git
+
+Når alt er sat op, har du mulighed for at tilføje yderligere filer som f.eks. SSH-nøgler til git.
+Ved siden af hvert filvalg er der en git-knap, som tilføjer filen til git-repository'et.
+Disse filer er også krypterede, når de skubbes.
diff --git a/lang/app/texts/vault_de.md b/lang/app/texts/vault_de.md
new file mode 100644
index 000000000..2ef27cb93
--- /dev/null
+++ b/lang/app/texts/vault_de.md
@@ -0,0 +1,65 @@
+# XPipe Git Vault
+
+XPipe kann alle deine Verbindungsdaten mit deinem eigenen Git Remote Repository synchronisieren. Du kannst mit diesem Repository in allen XPipe-Anwendungsinstanzen auf die gleiche Weise synchronisieren, d.h. jede Änderung, die du in einer Instanz vornimmst, wird in das Repository übernommen.
+
+Als Erstes musst du ein Remote-Repository mit einem Git-Anbieter deiner Wahl erstellen. Dieses Repository muss privat sein.
+Dann kannst du die URL einfach kopieren und in die XPipe-Einstellungen für das Remote-Repository einfügen.
+
+Außerdem brauchst du einen lokal installierten `git`-Client auf deinem lokalen Rechner. Du kannst versuchen, `git` in einem lokalen Terminal auszuführen, um das zu überprüfen.
+Wenn du keinen hast, kannst du [https://git-scm.com](https://git-scm.com/) besuchen, um Git zu installieren.
+
+## Authentifizierung gegenüber dem entfernten Repository
+
+Es gibt mehrere Möglichkeiten, sich zu authentifizieren. Die meisten Repositories verwenden HTTPS, bei dem du einen Benutzernamen und ein Passwort angeben musst.
+Einige Anbieter unterstützen auch das SSH-Protokoll, das auch von XPipe unterstützt wird.
+Wenn du SSH für Git verwendest, weißt du wahrscheinlich, wie man es konfiguriert, daher wird in diesem Abschnitt nur auf HTTPS eingegangen.
+
+Du musst dein Git CLI so einrichten, dass es sich bei deinem entfernten Git-Repository über HTTPS authentifizieren kann. Es gibt mehrere Möglichkeiten, das zu tun.
+Du kannst überprüfen, ob dies bereits geschehen ist, indem du XPipe neu startest, sobald ein entferntes Repository konfiguriert ist.
+Wenn XPipe dich nach deinen Anmeldedaten fragt, musst du sie einrichten.
+
+Viele spezielle Tools wie dieses [GitHub CLI] (https://cli.github.com/) erledigen alles automatisch für dich, wenn es installiert ist.
+Einige neuere Git-Client-Versionen können sich auch über spezielle Webdienste authentifizieren, bei denen du dich einfach in deinem Browser bei deinem Konto anmelden musst.
+
+Es gibt auch manuelle Möglichkeiten, sich mit einem Benutzernamen und einem Token zu authentifizieren.
+Heutzutage verlangen die meisten Anbieter für die Authentifizierung über die Kommandozeile ein Personal Access Token (PAT) anstelle eines herkömmlichen Passworts.
+Gängige (PAT) Seiten findest du hier:
+- **GitHub**: [Persönliche Zugangstoken (klassisch)](https://github.com/settings/tokens)
+- **GitLab**: [Persönliche Zugangstoken](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html)
+- **BitBucket**: [Persönliches Zugriffstoken](https://support.atlassian.com/bitbucket-cloud/docs/access-tokens/)
+- **Gitea**: `Einstellungen -> Anwendungen -> Abschnitt Zugriffstoken verwalten`
+Setze die Token-Berechtigung für das Repository auf Lesen und Schreiben. Die übrigen Token-Berechtigungen können auf Lesen gesetzt werden.
+Auch wenn dein Git-Client dich zur Eingabe eines Passworts auffordert, solltest du dein Token eingeben, es sei denn, dein Anbieter verwendet noch Passwörter.
+- Die meisten Anbieter unterstützen keine Passwörter mehr.
+
+Wenn du deine Anmeldedaten nicht jedes Mal eingeben willst, kannst du dafür einen beliebigen Git-Anmeldemanager verwenden.
+Weitere Informationen findest du zum Beispiel unter:
+- [https://git-scm.com/doc/credential-helpers](https://git-scm.com/doc/credential-helpers)
+- [https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git](https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git)
+
+Einige moderne Git-Clients kümmern sich auch automatisch um die Speicherung der Anmeldeinformationen.
+
+Wenn alles klappt, sollte XPipe einen Commit an dein entferntes Repository senden.
+
+## Kategorien zum Repository hinzufügen
+
+Standardmäßig sind keine Verbindungskategorien für die Synchronisierung eingestellt, damit du explizit festlegen kannst, welche Verbindungen übertragen werden sollen.
+Zu Beginn ist dein entferntes Projektarchiv also leer.
+
+Um die Verbindungen einer Kategorie in dein Git-Repository zu übertragen
+musst du auf das Zahnradsymbol klicken (wenn du den Mauszeiger über die Kategorie bewegst)
+in deinem `Reiter Verbindungen` unter der Kategorieübersicht auf der linken Seite.
+Klicke dann auf `Zum Git-Repository hinzufügen`, um die Kategorie und die Verbindungen mit deinem Git-Repository zu synchronisieren.
+Dadurch werden alle synchronisierbaren Verbindungen zum Git-Repository hinzugefügt.
+
+## Lokale Verbindungen werden nicht synchronisiert
+
+Alle Verbindungen, die sich unter dem lokalen Rechner befinden, können nicht synchronisiert werden, da sie sich auf Verbindungen und Daten beziehen, die nur auf dem lokalen System verfügbar sind.
+
+Bestimmte Verbindungen, die auf einer lokalen Datei basieren, z. B. SSH-Konfigurationen, können über Git geteilt werden, wenn die zugrundeliegenden Daten, in diesem Fall die Datei, ebenfalls zum Git-Repository hinzugefügt wurden.
+
+## Dateien zu git hinzufügen
+
+Wenn alles eingerichtet ist, hast du die Möglichkeit, zusätzliche Dateien wie SSH-Schlüssel zu git hinzuzufügen.
+Neben jeder Datei befindet sich ein Git-Button, mit dem die Datei zum Git-Repository hinzugefügt wird.
+Auch diese Dateien werden verschlüsselt, wenn sie veröffentlicht werden.
diff --git a/lang/app/texts/vault_en.md b/lang/app/texts/vault_en.md
new file mode 100644
index 000000000..799934138
--- /dev/null
+++ b/lang/app/texts/vault_en.md
@@ -0,0 +1,65 @@
+# XPipe Git Vault
+
+XPipe can synchronize all your connection data with your own git remote repository. You can sync with this repository in all XPipe application instances the same way, every change you make in one instance will be reflected in the repository.
+
+First of all, you need to create a remote repository with your favourite git provider of choice. This repository has to be private.
+You can then just copy and paste the URL into the XPipe remote repository setting.
+
+You also need to have a locally installed `git` client ready on your local machine. You can try running `git` in a local terminal to check.
+If you don't have one, you can visit [https://git-scm.com](https://git-scm.com/) to install git.
+
+## Authenticating to the remote repository
+
+There are multiple ways to authenticate. Most repositories use HTTPS where you have to specify a username and password.
+Some providers also support the SSH protocol, which is also supported by XPipe.
+If you use SSH for git, you probably know how to configure it, so this section will cover HTTPS only.
+
+You need to set up your git CLI to be able to authenticate with your remote git repository via HTTPS. There are multiple ways to do that.
+You can check if that is already done by restarting XPipe once a remote repository is configured.
+If it asks you for your login credentials, you need to set it up.
+
+Many special tools like this [GitHub CLI](https://cli.github.com/) do everything automatically for you when installed.
+Some newer git client versions can also authenticate via special web services where you just have to log in into your account in your browser.
+
+There are also manual ways to authenticate via a username and token.
+Nowadays, most providers require a personal access token (PAT) to authenticate from the command-line instead of traditional passwords.
+You can find common (PAT) pages here:
+- **GitHub**: [Personal access tokens (classic)](https://github.com/settings/tokens)
+- **GitLab**: [Personal access token](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html)
+- **BitBucket**: [Personal access token](https://support.atlassian.com/bitbucket-cloud/docs/access-tokens/)
+- **Gitea**: `Settings -> Applications -> Manage Access Tokens section`
+Set the token permission for repository to Read and Write. The rest of the token permissions can be set as Read.
+Even if your git client prompts you for a password, you should enter your token unless your provider still uses passwords.
+- Most providers do not support passwords anymore.
+
+If you don't want to enter your credentials every time, you can use any git credentials manager for that.
+For more information, see for example:
+- [https://git-scm.com/doc/credential-helpers](https://git-scm.com/doc/credential-helpers)
+- [https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git](https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git)
+
+Some modern git clients also take care of storing credentials automatically.
+
+If everything works out, XPipe should push a commit to your remote repository.
+
+## Adding categories to the repository
+
+By default, no connection categories are set to sync so that you have explicit control on what connections to commit.
+So at the start, your remote repository will be empty.
+
+To have your connections of a category put inside your git repository,
+you need to click on the gear icon (when hovering over the category)
+in your `Connections` tab under the category overview on the left side.
+Then click on `Add to git repository` to sync the category and connections to your git repository.
+This will add all syncable connections to the git repository.
+
+## Local connections are not synced
+
+Any connection located under the local machine can not be shared as it refers to connections and data that are only available on the local system.
+
+Certain connections that are based on a local file, for example SSH configs, can be shared via git if the underlying data, in this case the file, have been added to the git repository as well.
+
+## Adding files to git
+
+When everything is set up, you have the option to add any additional files such as SSH keys to git as well.
+Next to every file choice is a git button that will add the file to the git repository.
+These files are also encrypted when pushed.
diff --git a/lang/app/texts/vault_es.md b/lang/app/texts/vault_es.md
new file mode 100644
index 000000000..5010dc4c8
--- /dev/null
+++ b/lang/app/texts/vault_es.md
@@ -0,0 +1,65 @@
+# Bóveda Git XPipe
+
+XPipe puede sincronizar todos tus datos de conexión con tu propio repositorio remoto git. Puedes sincronizar con este repositorio en todas las instancias de la aplicación XPipe de la misma manera, cada cambio que hagas en una instancia se reflejará en el repositorio.
+
+En primer lugar, necesitas crear un repositorio remoto con el proveedor git que prefieras. Este repositorio tiene que ser privado.
+A continuación, sólo tienes que copiar y pegar la URL en la configuración del repositorio remoto de XPipe.
+
+También necesitas tener un cliente `git` instalado localmente en tu máquina local. Puedes probar a ejecutar `git` en un terminal local para comprobarlo.
+Si no tienes uno, puedes visitar [https://git-scm.com](https://git-scm.com/) para instalar git.
+
+## Autenticarse en el repositorio remoto
+
+Hay varias formas de autenticarse. La mayoría de los repositorios utilizan HTTPS, donde tienes que especificar un nombre de usuario y una contraseña.
+Algunos proveedores también admiten el protocolo SSH, que también es compatible con XPipe.
+Si utilizas SSH para git, probablemente sepas cómo configurarlo, así que esta sección cubrirá sólo HTTPS.
+
+Necesitas configurar tu CLI de git para poder autenticarte con tu repositorio git remoto a través de HTTPS. Hay varias formas de hacerlo.
+Puedes comprobar si ya está hecho reiniciando XPipe una vez configurado un repositorio remoto.
+Si te pide tus credenciales de acceso, necesitas configurarlas.
+
+Muchas herramientas especiales como esta [GitHub CLI](https://cli.github.com/) lo hacen todo automáticamente por ti cuando se instalan.
+Algunas versiones más recientes del cliente git también pueden autenticarse a través de servicios web especiales en los que sólo tienes que acceder a tu cuenta en el navegador.
+
+También hay formas manuales de autenticarse mediante un nombre de usuario y un token.
+Hoy en día, la mayoría de los proveedores requieren un token de acceso personal (PAT) para autenticarse desde la línea de comandos en lugar de las contraseñas tradicionales.
+Puedes encontrar páginas comunes (PAT) aquí:
+- **GitHub**: [Tokens de acceso personal (clásico)](https://github.com/settings/tokens)
+- **GitLab**: [Ficha de acceso personal](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html)
+- **BitBucket**: [Clave de acceso personal](https://support.atlassian.com/bitbucket-cloud/docs/access-tokens/)
+- **Gitea**: `Configuración -> Aplicaciones -> Sección Gestionar tokens de acceso`
+Establece el permiso del token para el repositorio en Lectura y Escritura. El resto de permisos del token pueden establecerse como Lectura.
+Aunque tu cliente git te pida una contraseña, debes introducir tu token a menos que tu proveedor aún utilice contraseñas.
+- La mayoría de los proveedores ya no admiten contraseñas.
+
+Si no quieres introducir tus credenciales cada vez, puedes utilizar cualquier gestor de credenciales git para ello.
+Para más información, consulta por ejemplo
+- [https://git-scm.com/doc/credential-helpers](https://git-scm.com/doc/credential-helpers)
+- [https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git](https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git)
+
+Algunos clientes git modernos también se encargan de almacenar las credenciales automáticamente.
+
+Si todo va bien, XPipe debería enviar un commit a tu repositorio remoto.
+
+## Añadir categorías al repositorio
+
+Por defecto, no se establecen categorías de conexión para sincronizar, de modo que tengas un control explícito sobre qué conexiones confirmar.
+Así que al principio, tu repositorio remoto estará vacío.
+
+Para que tus conexiones de una categoría se pongan dentro de tu repositorio git,
+tienes que hacer clic en el icono del engranaje (al pasar el ratón por encima de la categoría)
+en la pestaña `Conexiones` de la vista general de la categoría, a la izquierda.
+Luego haz clic en `Añadir al repositorio git` para sincronizar la categoría y las conexiones con tu repositorio git.
+Esto añadirá todas las conexiones sincronizables al repositorio git.
+
+## Las conexiones locales no se sincronizan
+
+Cualquier conexión localizada en la máquina local no se puede compartir, ya que se refiere a conexiones y datos que sólo están disponibles en el sistema local.
+
+Algunas conexiones que se basan en un archivo local, por ejemplo las configuraciones SSH, pueden compartirse a través de git si los datos subyacentes, en este caso el archivo, se han añadido también al repositorio git.
+
+## Añadir archivos a git
+
+Cuando todo esté configurado, tienes la opción de añadir también a git cualquier archivo adicional, como claves SSH.
+Junto a cada archivo elegido hay un botón git que añadirá el archivo al repositorio git.
+Estos archivos también se encriptan cuando se envían.
diff --git a/lang/app/texts/vault_fr.md b/lang/app/texts/vault_fr.md
new file mode 100644
index 000000000..f1a9d73a0
--- /dev/null
+++ b/lang/app/texts/vault_fr.md
@@ -0,0 +1,65 @@
+# XPipe Git Vault
+
+XPipe peut synchroniser toutes tes données de connexion avec ton propre dépôt distant git. Tu peux te synchroniser avec ce dépôt dans toutes les instances de l'application XPipe de la même manière, chaque changement que tu fais dans une instance sera reflété dans le dépôt.
+
+Tout d'abord, tu dois créer un dépôt distant avec le fournisseur git de ton choix. Ce dépôt doit être privé.
+Il te suffit ensuite de copier et de coller l'URL dans les paramètres du dépôt à distance de XPipe.
+
+Tu dois également avoir un client `git` installé localement et prêt sur ta machine locale. Tu peux essayer d'exécuter `git` dans un terminal local pour vérifier.
+Si tu n'en as pas, tu peux visiter [https://git-scm.com](https://git-scm.com/) pour installer git.
+
+## S'authentifier auprès du dépôt distant
+
+Il y a plusieurs façons de s'authentifier. La plupart des dépôts utilisent le protocole HTTPS pour lequel tu dois spécifier un nom d'utilisateur et un mot de passe.
+Certains fournisseurs prennent également en charge le protocole SSH, qui est également pris en charge par XPipe.
+Si tu utilises SSH pour git, tu sais probablement comment le configurer, c'est pourquoi cette section ne traitera que du HTTPS.
+
+Tu dois configurer ton CLI git pour pouvoir t'authentifier auprès de ton dépôt git distant via HTTPS. Il y a plusieurs façons de le faire.
+Tu peux vérifier si c'est déjà fait en redémarrant XPipe une fois qu'un dépôt distant est configuré.
+S'il te demande tes identifiants de connexion, tu dois les configurer.
+
+De nombreux outils spéciaux comme ce [GitHub CLI] (https://cli.github.com/) font tout automatiquement pour toi lorsqu'ils sont installés.
+Certaines versions plus récentes du client git peuvent également s'authentifier via des services web spéciaux où il te suffit de te connecter à ton compte dans ton navigateur.
+
+Il existe également des moyens manuels de s'authentifier via un nom d'utilisateur et un jeton.
+De nos jours, la plupart des fournisseurs exigent un jeton d'accès personnel (PAT) pour s'authentifier à partir de la ligne de commande au lieu des mots de passe traditionnels.
+Tu peux trouver des pages communes (PAT) ici :
+- **GitHub** : [Jetons d'accès personnels (classiques)](https://github.com/settings/tokens)
+- **GitLab** : [Jeton d'accès personnel](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html)
+- **BitBucket** : [Jeton d'accès personnel](https://support.atlassian.com/bitbucket-cloud/docs/access-tokens/)
+- **Gitea** : `Paramètres -> Applications -> Section Gérer les jetons d'accès`
+Définis la permission du jeton pour le référentiel sur Lecture et Écriture. Le reste des permissions du jeton peut être défini comme Lecture.
+Même si ton client git te demande un mot de passe, tu dois saisir ton jeton, sauf si ton fournisseur utilise encore des mots de passe.
+- La plupart des fournisseurs ne prennent plus en charge les mots de passe.
+
+Si tu ne veux pas entrer tes informations d'identification à chaque fois, tu peux utiliser n'importe quel gestionnaire d'informations d'identification git pour cela.
+Pour plus d'informations, voir par exemple :
+- [https://git-scm.com/doc/credential-helpers](https://git-scm.com/doc/credential-helpers)
+- [https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git](https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git)
+
+Certains clients git modernes se chargent également de stocker les informations d'identification automatiquement.
+
+Si tout se passe bien, XPipe devrait pousser un commit vers ton dépôt distant.
+
+## Ajouter des catégories au dépôt
+
+Par défaut, aucune catégorie de connexion n'est définie pour la synchronisation afin que tu aies un contrôle explicite sur les connexions à valider.
+Ainsi, au début, ton dépôt distant sera vide.
+
+Pour que les connexions d'une catégorie soient placées à l'intérieur de ton dépôt git, tu dois cliquer sur l'icône de l'engrenage,
+tu dois cliquer sur l'icône de l'engrenage (lorsque tu survoles la catégorie)
+dans ton onglet `Connexions` sous l'aperçu de la catégorie sur le côté gauche.
+Cliquez ensuite sur `Ajouter au dépôt git` pour synchroniser la catégorie et les connexions avec votre dépôt git.
+Cela ajoutera toutes les connexions synchronisables au dépôt git.
+
+## Les connexions locales ne sont pas synchronisées
+
+Toute connexion située sous la machine locale ne peut pas être partagée car elle fait référence à des connexions et des données qui ne sont disponibles que sur le système local.
+
+Certaines connexions basées sur un fichier local, par exemple les configurations SSH, peuvent être partagées via git si les données sous-jacentes, dans ce cas le fichier, ont également été ajoutées au dépôt git.
+
+## Ajouter des fichiers à git
+
+Lorsque tout est configuré, tu as la possibilité d'ajouter à git des fichiers supplémentaires tels que des clés SSH.
+À côté de chaque choix de fichier se trouve un bouton git qui ajoutera le fichier au dépôt git.
+Ces fichiers sont également cryptés lorsqu'ils sont poussés.
diff --git a/lang/app/texts/vault_it.md b/lang/app/texts/vault_it.md
new file mode 100644
index 000000000..f5e4e74c9
--- /dev/null
+++ b/lang/app/texts/vault_it.md
@@ -0,0 +1,65 @@
+# XPipe Git Vault
+
+XPipe può sincronizzare tutti i dati delle tue connessioni con il tuo repository git remoto. Puoi sincronizzarti con questo repository in tutte le istanze dell'applicazione XPipe allo stesso modo: ogni modifica apportata in un'istanza si rifletterà nel repository.
+
+Prima di tutto, devi creare un repository remoto con il tuo provider git preferito. Questo repository deve essere privato.
+A questo punto puoi semplicemente copiare e incollare l'URL nell'impostazione del repository remoto di XPipe.
+
+Devi anche avere un client `git` installato localmente sul tuo computer locale. Puoi provare a eseguire `git` in un terminale locale per verificare.
+Se non ne hai uno, puoi visitare [https://git-scm.com](https://git-scm.com/) per installare git.
+
+## Autenticazione al repository remoto
+
+Esistono diversi modi per autenticarsi. La maggior parte dei repository utilizza il protocollo HTTPS in cui è necessario specificare un nome utente e una password.
+Alcuni provider supportano anche il protocollo SSH, che è supportato anche da XPipe.
+Se utilizzi SSH per git, probabilmente sai come configurarlo, quindi questa sezione tratterà solo l'HTTPS.
+
+Devi impostare la tua git CLI in modo che sia in grado di autenticarsi con il repository git remoto tramite HTTPS. Ci sono diversi modi per farlo.
+Puoi verificare se è già stato fatto riavviando XPipe una volta configurato un repository remoto.
+Se ti chiede le credenziali di accesso, devi impostarle.
+
+Molti strumenti speciali come questo [GitHub CLI](https://cli.github.com/) fanno tutto automaticamente quando vengono installati.
+Alcune versioni più recenti del client git possono anche autenticarsi tramite servizi web speciali in cui è sufficiente accedere al proprio account nel browser.
+
+Esistono anche modi manuali per autenticarsi tramite un nome utente e un token.
+Al giorno d'oggi, la maggior parte dei provider richiede un token di accesso personale (PAT) per l'autenticazione da riga di comando al posto della tradizionale password.
+Puoi trovare le pagine comuni (PAT) qui:
+- **GitHub**: [Token di accesso personale (classico)](https://github.com/settings/tokens)
+- **GitLab**: [Token di accesso personale](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html)
+- **BitBucket**: [Token di accesso personale](https://support.atlassian.com/bitbucket-cloud/docs/access-tokens/)
+- **Gitea**: `Impostazioni -> Applicazioni -> Sezione Gestione dei token di accesso`
+Imposta i permessi del token per il repository su Lettura e Scrittura. Gli altri permessi del token possono essere impostati come Lettura.
+Anche se il tuo client git ti chiede una password, devi inserire il tuo token a meno che il tuo provider non usi ancora le password.
+- La maggior parte dei provider non supporta più le password.
+
+Se non vuoi inserire le tue credenziali ogni volta, puoi utilizzare un qualsiasi gestore di credenziali git.
+Per maggiori informazioni, vedi ad esempio:
+- [https://git-scm.com/doc/credential-helpers](https://git-scm.com/doc/credential-helpers)
+- [https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git](https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git)
+
+Alcuni client git moderni si occupano anche di memorizzare automaticamente le credenziali.
+
+Se tutto funziona, XPipe dovrebbe inviare un commit al tuo repository remoto.
+
+## Aggiunta di categorie al repository
+
+Per impostazione predefinita, non vengono impostate categorie di connessioni da sincronizzare, in modo da avere un controllo esplicito su quali connessioni effettuare il commit.
+All'inizio, quindi, il tuo repository remoto sarà vuoto.
+
+Per inserire le connessioni di una categoria nel tuo repository git,
+devi cliccare sull'icona dell'ingranaggio (quando passi il mouse sulla categoria)
+nella scheda `Collegamenti` sotto la panoramica delle categorie sul lato sinistro.
+Poi clicca su `Aggiungi al repository git` per sincronizzare la categoria e le connessioni al tuo repository git.
+In questo modo tutte le connessioni sincronizzabili verranno aggiunte al repository git.
+
+## Le connessioni locali non vengono sincronizzate
+
+Tutte le connessioni che si trovano sul computer locale non possono essere condivise perché si riferiscono a connessioni e dati che sono disponibili solo sul sistema locale.
+
+Alcune connessioni basate su un file locale, ad esempio le configurazioni SSH, possono essere condivise tramite git se i dati sottostanti, in questo caso il file, sono stati aggiunti al repository git.
+
+## Aggiungere file a git
+
+Quando tutto è pronto, hai la possibilità di aggiungere a git anche altri file, come le chiavi SSH.
+Accanto a ogni file scelto c'è un pulsante git che aggiunge il file al repository git.
+Anche questi file vengono crittografati quando vengono inviati.
diff --git a/lang/app/texts/vault_ja.md b/lang/app/texts/vault_ja.md
new file mode 100644
index 000000000..ea0612c6d
--- /dev/null
+++ b/lang/app/texts/vault_ja.md
@@ -0,0 +1,65 @@
+# XPipe Git Vault
+
+XPipeは、すべての接続データを独自のgitリモートリポジトリと同期することができる。このリポジトリは、すべてのXPipeアプリケーションインスタンスで同じように同期でき、あるインスタンスで行ったすべての変更がリポジトリに反映される。
+
+まず最初に、お気に入りのgitプロバイダでリモートリポジトリを作成する必要がある。このリポジトリはプライベートでなければならない。
+そして、そのURLをXPipeのリモートリポジトリ設定にコピー&ペーストすればよい。
+
+また、ローカルマシンに`git`クライアントをインストールしておく必要がある。ローカルターミナルで`git`を実行して確認できる。
+持っていない場合は、[https://git-scm.com](https://git-scm.com/) にアクセスして git をインストールすることができる。
+
+## リモートリポジトリを認証する
+
+認証には複数の方法がある。ほとんどのリポジトリは HTTPS を使っており、ユーザー名とパスワードを指定する必要がある。
+プロバイダによっては SSH プロトコルをサポートしているところもあり、XPipe でもサポートしている。
+git で SSH を使っている人なら、おそらく設定方法は知っていると思うので、ここでは HTTPS についてのみ説明する。
+
+リモートの git リポジトリと HTTPS 経由で認証できるように git CLI を設定する必要がある。それには複数の方法がある。
+リモートリポジトリの設定が完了したら、XPipe を再起動することで設定が完了しているかどうかを確認できる。
+ログイン認証情報の入力を求められたら、それを設定する必要がある。
+
+この[GitHub CLI](https://cli.github.com/)のような特別なツールの多くは、インストールすると自動的にすべてをやってくれる。
+新しいバージョンの git クライアントの中には、特別なウェブサービスを使って認証できるものもあり、その場合はブラウザで自分のアカウントにログインするだけでよい。
+
+ユーザー名とトークンを使って手動で認証する方法もある。
+現在では、ほとんどのプロバイダが、コマンドラインからの認証に、従来のパスワードの代わりにパーソナル・アクセストークン(PAT)を要求している。
+一般的な(PAT)ページはこちら:
+- **GitHub**:[個人アクセストークン(クラシック)](https://github.com/settings/tokens)
+- **GitLab**:[個人アクセストークン](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html)
+- **BitBucket**: [個人アクセストークン]()[個人アクセストークン](https://support.atlassian.com/bitbucket-cloud/docs/access-tokens/)
+- **Gitea**: `Settings -> Applications -> Manage Access Tokens セクション`。
+リポジトリのトークン権限をReadとWriteに設定する。残りのトークンのパーミッションはReadに設定できる。
+gitクライアントがパスワードの入力を促しても、プロバイダーがまだパスワードを使っていない限り、トークンを入力する必要がある。
+- ほとんどのプロバイダーはもうパスワードをサポートしていない。
+
+毎回認証情報を入力したくない場合は、git認証情報マネージャを使えばいい。
+詳しくは
+- [https://git-scm.com/doc/credential-helpers](https://git-scm.com/doc/credential-helpers)
+- [https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git](https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git)
+
+最近の git クライアントの中には、認証情報を自動的に保存してくれるものもある。
+
+うまくいけば、XPipe がリモートリポジトリにコミットをプッシュしてくれるはずだ。
+
+## カテゴリをリポジトリに追加する
+
+デフォルトでは、コミットする接続を明示的に制御できるように、同期する接続カテゴリは設定されていない。
+そのため、最初はリモートリポジトリは空になる。
+
+あるカテゴリの接続を git リポジトリに追加するには、歯車のアイコンをクリックする必要がある、
+歯車のアイコンをクリックする必要がある。
+をクリックする。
+それから`Add to git repository`をクリックして、カテゴリと接続をgitリポジトリに同期する。
+これで、同期可能なすべての接続がgitリポジトリに追加される。
+
+## ローカル接続は同期されない
+
+ローカルマシンの下にある接続は、ローカルシステムでのみ利用可能な接続やデータを参照するため、共有することができない。
+
+ローカルファイルに基づいた接続、たとえば SSH 設定などは、その基礎となるデータ(この場合はファイル)が git リポジトリに追加されていれば、git 経由で共有することができる。
+
+## git にファイルを追加する
+
+すべての設定が終わったら、SSH キーなどの追加ファイルを git に追加することもできる。
+すべてのファイルを選択すると、その横に git ボタンが表示され、ファイルが git リポジトリに追加される。
+プッシュされたファイルは暗号化される。
diff --git a/lang/app/texts/vault_nl.md b/lang/app/texts/vault_nl.md
new file mode 100644
index 000000000..4e2fae559
--- /dev/null
+++ b/lang/app/texts/vault_nl.md
@@ -0,0 +1,65 @@
+# XPipe Git Vault
+
+XPipe kan al je verbindingsgegevens synchroniseren met je eigen git remote repository. Je kunt met deze repository synchroniseren in alle XPipe applicatie instanties op dezelfde manier, elke verandering die je maakt in een instantie zal worden weerspiegeld in de repository.
+
+Allereerst moet je een remote repository aanmaken met je favoriete git provider naar keuze. Deze repository moet privé zijn.
+Je kunt dan gewoon de URL kopiëren en plakken in de XPipe remote repository instelling.
+
+Je moet ook een lokaal geïnstalleerde `git` client klaar hebben staan op je lokale machine. Je kunt proberen `git` in een lokale terminal te draaien om dit te controleren.
+Als je er geen hebt, kun je naar [https://git-scm.com](https://git-scm.com/) gaan om git te installeren.
+
+## Authenticeren naar de remote repository
+
+Er zijn meerdere manieren om te authenticeren. De meeste repositories gebruiken HTTPS waarbij je een gebruikersnaam en wachtwoord moet opgeven.
+Sommige providers ondersteunen ook het SSH protocol, dat ook door XPipe wordt ondersteund.
+Als je SSH voor git gebruikt, weet je waarschijnlijk hoe je het moet configureren, dus deze sectie zal alleen HTTPS behandelen.
+
+Je moet je git CLI instellen om te kunnen authenticeren met je remote git repository via HTTPS. Er zijn meerdere manieren om dat te doen.
+Je kunt controleren of dat al is gedaan door XPipe opnieuw te starten zodra een remote repository is geconfigureerd.
+Als het je vraagt om je inloggegevens, dan moet je dat instellen.
+
+Veel speciale tools zoals deze [GitHub CLI](https://cli.github.com/) doen alles automatisch voor je als ze geïnstalleerd zijn.
+Sommige nieuwere git client versies kunnen ook authenticeren via speciale webservices waarbij je alleen maar hoeft in te loggen op je account in je browser.
+
+Er zijn ook handmatige manieren om je te authenticeren via een gebruikersnaam en token.
+Tegenwoordig vereisen de meeste providers een persoonlijk toegangstoken (PAT) voor authenticatie vanaf de commandoregel in plaats van traditionele wachtwoorden.
+Je kunt veelgebruikte (PAT) pagina's hier vinden:
+- **GitHub**: [Persoonlijke toegangstokens (klassiek)](https://github.com/settings/tokens)
+- **GitLab**: [Persoonlijk toegangstoken](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html)
+- **BitBucket**: [Persoonlijk toegangstoken](https://support.atlassian.com/bitbucket-cloud/docs/access-tokens/)
+- **Gitea**: `Instellingen -> Toepassingen -> Sectie Toegangsmunten beheren`
+Stel de tokenrechten voor repository in op Lezen en Schrijven. De rest van de tokenrechten kun je instellen als Lezen.
+Zelfs als je git client je om een wachtwoord vraagt, moet je je token invoeren, tenzij je provider nog steeds wachtwoorden gebruikt.
+- De meeste providers ondersteunen geen wachtwoorden meer.
+
+Als je niet elke keer je referenties wilt invoeren, dan kun je daarvoor elke git credentials manager gebruiken.
+Zie voor meer informatie bijvoorbeeld:
+- [https://git-scm.com/doc/credential-helpers](https://git-scm.com/doc/credential-helpers)
+- [https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git](https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git)
+
+Sommige moderne git clients zorgen er ook voor dat de referenties automatisch worden opgeslagen.
+
+Als alles werkt, zou XPipe een commit naar je remote repository moeten pushen.
+
+## Categorieën aan het archief toevoegen
+
+Standaard zijn er geen verbindingscategorieën ingesteld om te synchroniseren, zodat je expliciete controle hebt over welke verbindingen je wilt vastleggen.
+Dus in het begin zal je remote repository leeg zijn.
+
+Om je connecties van een categorie in je git repository te plaatsen,
+moet je op het tandwiel icoon klikken (als je met je muis over de categorie gaat)
+in je `Connecties` tab onder het categorieoverzicht aan de linkerkant.
+Klik dan op `Toevoegen aan git repository` om de categorie en verbindingen te synchroniseren met je git repository.
+Dit voegt alle synchroniseerbare verbindingen toe aan de git repository.
+
+## Lokale verbindingen worden niet gesynchroniseerd
+
+Elke verbinding die zich onder de lokale machine bevindt kan niet worden gedeeld, omdat het verwijst naar verbindingen en gegevens die alleen beschikbaar zijn op het lokale systeem.
+
+Bepaalde verbindingen die gebaseerd zijn op een lokaal bestand, bijvoorbeeld SSH configs, kunnen gedeeld worden via git als de onderliggende gegevens, in dit geval het bestand, ook aan de git repository zijn toegevoegd.
+
+## Bestanden toevoegen aan git
+
+Als alles is ingesteld, heb je de optie om extra bestanden zoals SSH sleutels ook aan git toe te voegen.
+Naast elke bestandskeuze staat een git knop die het bestand zal toevoegen aan de git repository.
+Deze bestanden worden ook versleuteld als ze worden gepushed.
diff --git a/lang/app/texts/vault_pt.md b/lang/app/texts/vault_pt.md
new file mode 100644
index 000000000..e16756b99
--- /dev/null
+++ b/lang/app/texts/vault_pt.md
@@ -0,0 +1,65 @@
+# XPipe Git Vault
+
+XPipe pode sincronizar todos os teus dados de conexão com o teu próprio repositório remoto git. Podes sincronizar com este repositório em todas as instâncias da aplicação XPipe da mesma forma, cada alteração que fizeres numa instância será reflectida no repositório.
+
+Antes de mais, tens de criar um repositório remoto com o teu fornecedor git preferido. Este repositório tem de ser privado.
+Depois, basta copiar e colar o URL na definição do repositório remoto do XPipe.
+
+Também precisas de ter um cliente `git` instalado localmente na tua máquina local. Podes tentar executar o `git` num terminal local para verificar.
+Se não tiveres um, podes visitar [https://git-scm.com](https://git-scm.com/) para instalar o git.
+
+## Autenticando para o repositório remoto
+
+Existem várias formas de te autenticares. A maioria dos repositórios usa HTTPS onde tens de especificar um nome de utilizador e uma palavra-passe.
+Alguns provedores também suportam o protocolo SSH, que também é suportado pelo XPipe.
+Se usas o SSH para o git, provavelmente sabes como o configurar, por isso esta secção irá cobrir apenas o HTTPS.
+
+Precisas de configurar o teu git CLI para ser capaz de autenticar com o teu repositório git remoto via HTTPS. Há várias maneiras de fazer isso.
+Podes verificar se isso já foi feito reiniciando o XPipe quando um repositório remoto estiver configurado.
+Se ele te pedir as tuas credenciais de login, tens de as configurar.
+
+Muitas ferramentas especiais como esta [GitHub CLI](https://cli.github.com/) fazem tudo automaticamente para ti quando instaladas.
+Algumas versões mais recentes do cliente git também podem autenticar através de serviços web especiais onde apenas tens de iniciar sessão na tua conta no teu browser.
+
+Existem também formas manuais de te autenticares através de um nome de utilizador e de um token.
+Atualmente, a maioria dos fornecedores exige um token de acesso pessoal (PAT) para autenticar a partir da linha de comandos em vez das palavras-passe tradicionais.
+Podes encontrar páginas comuns (PAT) aqui:
+- **GitHub**: [Tokens de acesso pessoal (clássico)](https://github.com/settings/tokens)
+- **GitLab**: [Token de acesso pessoal](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html)
+- **BitBucket**: [Token de acesso pessoal](https://support.atlassian.com/bitbucket-cloud/docs/access-tokens/)
+- **Gitea**: `Configurações -> Aplicações -> secção Gerir Tokens de Acesso`
+Define a permissão do token para o repositório como Leitura e Escrita. O resto das permissões do token podem ser definidas como Read.
+Mesmo que o teu cliente git te peça uma palavra-passe, deves introduzir o teu token, a menos que o teu fornecedor ainda utilize palavras-passe.
+- A maioria dos provedores não suporta mais senhas.
+
+Se não quiseres introduzir as tuas credenciais todas as vezes, podes usar qualquer gestor de credenciais git para isso.
+Para mais informações, vê por exemplo:
+- [https://git-scm.com/doc/credential-helpers](https://git-scm.com/doc/credential-helpers)
+- [https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git](https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git)
+
+Alguns clientes git modernos também se encarregam de armazenar as credenciais automaticamente.
+
+Se tudo funcionar bem, o XPipe deve enviar um commit para o teu repositório remoto.
+
+## Adicionando categorias ao repositório
+
+Por padrão, nenhuma categoria de conexão é definida para sincronizar, para que tenhas controle explícito sobre quais conexões devem ser confirmadas.
+Assim, no início, o teu repositório remoto estará vazio.
+
+Para que as tuas ligações de uma categoria sejam colocadas no teu repositório git,
+precisas clicar no ícone de engrenagem (ao passar o mouse sobre a categoria)
+no teu separador `Conexões` sob a visão geral da categoria no lado esquerdo.
+Em seguida, clica em `Adicionar ao repositório git` para sincronizar a categoria e as conexões ao seu repositório git.
+Isso adicionará todas as conexões sincronizáveis ao repositório git.
+
+## As conexões locais não são sincronizadas
+
+Qualquer conexão localizada na máquina local não pode ser compartilhada, pois se refere a conexões e dados que estão disponíveis apenas no sistema local.
+
+Certas conexões que são baseadas em um arquivo local, por exemplo, configurações SSH, podem ser compartilhadas via git se os dados subjacentes, neste caso o arquivo, tiverem sido adicionados ao repositório git também.
+
+## Adicionando arquivos ao git
+
+Quando tudo estiver configurado, tens a opção de adicionar quaisquer ficheiros adicionais, tais como chaves SSH, ao git também.
+Junto a cada escolha de ficheiro está um botão git que irá adicionar o ficheiro ao repositório git.
+Estes ficheiros são também encriptados quando enviados.
diff --git a/lang/app/texts/vault_ru.md b/lang/app/texts/vault_ru.md
new file mode 100644
index 000000000..1f6cad4be
--- /dev/null
+++ b/lang/app/texts/vault_ru.md
@@ -0,0 +1,65 @@
+# XPipe Git Vault
+
+XPipe может синхронизировать все твои данные о соединениях с собственным удаленным git-репозиторием. Ты можешь синхронизироваться с этим репозиторием во всех экземплярах приложения XPipe одинаково, каждое изменение, которое ты сделаешь в одном экземпляре, будет отражено в репозитории.
+
+Прежде всего, тебе нужно создать удаленный репозиторий с помощью твоего любимого git-провайдера на выбор. Этот репозиторий должен быть приватным.
+Затем ты можешь просто скопировать и вставить URL в настройку удаленного репозитория XPipe.
+
+Также тебе нужно иметь готовый локально установленный клиент `git` на твоей локальной машине. Ты можешь попробовать запустить `git` в локальном терминале, чтобы проверить.
+Если у тебя его нет, ты можешь зайти на сайт [https://git-scm.com](https://git-scm.com/), чтобы установить git.
+
+## Аутентификация в удаленном репозитории
+
+Существует несколько способов аутентификации. Большинство репозиториев используют HTTPS, где тебе нужно указать имя пользователя и пароль.
+Некоторые провайдеры также поддерживают протокол SSH, который также поддерживается XPipe.
+Если ты используешь SSH для git, то наверняка знаешь, как его настроить, поэтому в этом разделе мы рассмотрим только HTTPS.
+
+Тебе нужно настроить свой git CLI так, чтобы он мог аутентифицироваться с удаленным git-репозиторием по HTTPS. Сделать это можно несколькими способами.
+Ты можешь проверить, сделано ли это уже, перезапустив XPipe после настройки удаленного репозитория.
+Если он попросит тебя ввести учетные данные для входа, значит, тебе нужно их настроить.
+
+Многие специальные инструменты вроде этого [GitHub CLI](https://cli.github.com/) при установке делают все автоматически за тебя.
+Некоторые новые версии git-клиентов также могут аутентифицироваться через специальные веб-сервисы, где тебе нужно просто войти в свой аккаунт в браузере.
+
+Существуют и ручные способы аутентификации с помощью имени пользователя и токена.
+Сейчас большинство провайдеров требуют ввести персональный токен доступа (PAT) для аутентификации из командной строки вместо традиционных паролей.
+Общие страницы (PAT) ты можешь найти здесь:
+- **GitHub**: [Personal access tokens (classic)](https://github.com/settings/tokens)
+- **GitLab**: [Personal access token](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html)
+- **BitBucket**: [Персональный токен доступа](https://support.atlassian.com/bitbucket-cloud/docs/access-tokens/)
+- **Gitea**: `Настройки -> Приложения -> раздел Manage Access Tokens`.
+Установи разрешение токена для репозитория на чтение и запись. Остальные разрешения токена могут быть установлены как Read.
+Даже если твой git-клиент запрашивает у тебя пароль, ты должен ввести свой токен, если только твой провайдер все еще не использует пароли.
+- Большинство провайдеров больше не поддерживают пароли.
+
+Если ты не хочешь каждый раз вводить свои учетные данные, то можешь использовать для этого любой менеджер учетных данных git.
+Более подробную информацию можно найти, например:
+- [https://git-scm.com/doc/credential-helpers](https://git-scm.com/doc/credential-helpers)
+- [https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git](https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git)
+
+Некоторые современные git-клиенты также заботятся о хранении учетных данных автоматически.
+
+Если все работает, XPipe должен протолкнуть коммит в твой удаленный репозиторий.
+
+## Добавление категорий в репозиторий
+
+По умолчанию для синхронизации не заданы категории соединений, чтобы у тебя был явный контроль над тем, какие соединения коммитить.
+Поэтому в самом начале твой удаленный репозиторий будет пустым.
+
+Чтобы соединения той или иной категории были помещены в твой git-репозиторий,
+тебе нужно нажать на значок шестеренки (при наведении курсора на категорию)
+на вкладке `Связи` под обзором категории слева.
+Затем нажми на `Add to git repository`, чтобы синхронизировать категорию и соединения с твоим git-репозиторием.
+Это добавит все синхронизируемые соединения в git-репозиторий.
+
+## Локальные соединения не синхронизируются
+
+Любое соединение, расположенное на локальной машине, не может быть общим, так как оно относится к соединениям и данным, которые доступны только в локальной системе.
+
+Некоторыми соединениями, основанными на локальном файле, например SSH-конфигами, можно поделиться через git, если базовые данные, в данном случае файл, также были добавлены в git-репозиторий.
+
+## Добавление файлов в git
+
+Когда все готово, у тебя есть возможность добавить в git любые дополнительные файлы, например SSH-ключи.
+Рядом с каждым выбранным файлом есть кнопка git, которая добавит файл в git-репозиторий.
+Эти файлы также будут зашифрованы при добавлении.
diff --git a/lang/app/texts/vault_tr.md b/lang/app/texts/vault_tr.md
new file mode 100644
index 000000000..3a4abe305
--- /dev/null
+++ b/lang/app/texts/vault_tr.md
@@ -0,0 +1,65 @@
+# XPipe Git Vault
+
+XPipe, tüm bağlantı verilerinizi kendi git uzak deponuzla senkronize edebilir. Bu depo ile tüm XPipe uygulama örneklerinde aynı şekilde senkronize edebilirsiniz, bir örnekte yaptığınız her değişiklik depoya yansıtılacaktır.
+
+Her şeyden önce, tercih ettiğiniz git sağlayıcısı ile uzak bir depo oluşturmanız gerekir. Bu depo özel olmalıdır.
+Daha sonra URL'yi kopyalayıp XPipe uzak depo ayarına yapıştırabilirsiniz.
+
+Ayrıca yerel makinenizde yerel olarak yüklenmiş bir `git` istemcisinin hazır olması gerekir. Kontrol etmek için yerel bir terminalde `git` çalıştırmayı deneyebilirsiniz.
+Eğer yoksa, git'i yüklemek için [https://git-scm.com](https://git-scm.com/) adresini ziyaret edebilirsiniz.
+
+## Uzak depoda kimlik doğrulama
+
+Kimlik doğrulamanın birden fazla yolu vardır. Çoğu depo, bir kullanıcı adı ve parola belirtmeniz gereken HTTPS kullanır.
+Bazı sağlayıcılar XPipe tarafından da desteklenen SSH protokolünü de destekler.
+Eğer git için SSH kullanıyorsanız, muhtemelen nasıl yapılandıracağınızı biliyorsunuzdur, bu yüzden bu bölüm sadece HTTPS'yi kapsayacaktır.
+
+HTTPS aracılığıyla uzak git deponuzla kimlik doğrulaması yapabilmek için git CLI'nızı ayarlamanız gerekir. Bunu yapmanın birden fazla yolu vardır.
+Uzak bir depo yapılandırıldıktan sonra XPipe'ı yeniden başlatarak bunun zaten yapılıp yapılmadığını kontrol edebilirsiniz.
+Eğer sizden oturum açma kimlik bilgilerinizi isterse, bunu ayarlamanız gerekir.
+
+Bunun gibi birçok özel araç [GitHub CLI] (https://cli.github.com/) yüklendiğinde her şeyi sizin için otomatik olarak yapar.
+Bazı yeni git istemci sürümleri, tarayıcınızda hesabınıza giriş yapmanız gereken özel web hizmetleri aracılığıyla da kimlik doğrulaması yapabilir.
+
+Bir kullanıcı adı ve belirteç aracılığıyla kimlik doğrulaması yapmanın manuel yolları da vardır.
+Günümüzde çoğu sağlayıcı, geleneksel parolalar yerine komut satırından kimlik doğrulaması için kişisel erişim belirteci (PAT) gerektirmektedir.
+Yaygın (PAT) sayfalarını burada bulabilirsiniz:
+- **GitHub**: [Kişisel erişim belirteçleri (klasik)](https://github.com/settings/tokens)
+- **GitLab**: [Kişisel erişim belirteci](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html)
+- **BitBucket**: [Kişisel erişim belirteci](https://support.atlassian.com/bitbucket-cloud/docs/access-tokens/)
+- **Gitea**: `Ayarlar -> Uygulamalar -> Erişim Belirteçlerini Yönet bölümü`
+Depo için belirteç iznini Okuma ve Yazma olarak ayarlayın. Token izinlerinin geri kalanı Okuma olarak ayarlanabilir.
+Git istemciniz sizden bir parola istese bile, sağlayıcınız hala parola kullanmıyorsa token'ınızı girmelisiniz.
+- Çoğu sağlayıcı artık şifreleri desteklemiyor.
+
+Her seferinde kimlik bilgilerinizi girmek istemiyorsanız, bunun için herhangi bir git kimlik bilgileri yöneticisini kullanabilirsiniz.
+Daha fazla bilgi için örneğin bkz:
+- [https://git-scm.com/doc/credential-helpers](https://git-scm.com/doc/credential-helpers)
+- [https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git](https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git)
+
+Bazı modern git istemcileri kimlik bilgilerinin otomatik olarak saklanmasını da sağlar.
+
+Her şey yolunda giderse, XPipe uzak deponuza bir commit göndermelidir.
+
+## Depoya kategori ekleme
+
+Varsayılan olarak, hiçbir bağlantı kategorisi senkronize edilecek şekilde ayarlanmamıştır, böylece hangi bağlantıların işleneceği üzerinde açık bir kontrole sahip olursunuz.
+Yani başlangıçta uzak deponuz boş olacaktır.
+
+Bir kategorideki bağlantılarınızın git deponuzun içine yerleştirilmesini sağlamak için,
+dişli simgesine tıklamanız gerekir (kategorinin üzerine geldiğinizde)
+sol taraftaki kategoriye genel bakış altındaki `Bağlantılar` sekmenizde.
+Ardından kategoriyi ve bağlantıları git deponuzla senkronize etmek için `Git deposuna ekle` seçeneğine tıklayın.
+Bu, senkronize edilebilir tüm bağlantıları git deposuna ekleyecektir.
+
+## Yerel bağlantılar senkronize edilmiyor
+
+Yerel makine altında bulunan herhangi bir bağlantı, yalnızca yerel sistemde bulunan bağlantıları ve verileri ifade ettiğinden paylaşılamaz.
+
+Yerel bir dosyaya dayanan belirli bağlantılar, örneğin SSH yapılandırmaları, altta yatan veriler, bu durumda dosya da git deposuna eklenmişse git aracılığıyla paylaşılabilir.
+
+## git'e dosya ekleme
+
+Her şey ayarlandığında, SSH anahtarları gibi ek dosyaları da git'e ekleme seçeneğiniz vardır.
+Her dosya seçiminin yanında, dosyayı git deposuna ekleyecek bir git düğmesi bulunur.
+Bu dosyalar itildiğinde de şifrelenir.
diff --git a/lang/app/texts/vault_zh.md b/lang/app/texts/vault_zh.md
new file mode 100644
index 000000000..35b9636ac
--- /dev/null
+++ b/lang/app/texts/vault_zh.md
@@ -0,0 +1,65 @@
+# XPipe Git Vault
+
+XPipe可以将所有连接数据与您自己的git远程仓库同步。您可以在所有 XPipe 应用程序实例中以相同的方式与该版本库同步,您在一个实例中所做的每一项更改都将反映在版本库中。
+
+首先,您需要使用自己喜欢的 git 提供商创建一个远程仓库。该仓库必须是私有的。
+然后,您只需将 URL 复制并粘贴到 XPipe 远程仓库设置中即可。
+
+您还需要在本地计算机上安装 `git` 客户端。您可以尝试在本地终端运行 `git` 进行检查。
+如果没有,可以访问 [https://git-scm.com](https://git-scm.com/)安装 git。
+
+## 验证远程仓库
+
+有多种认证方式。大多数版本库使用 HTTPS,需要指定用户名和密码。
+有些提供商还支持 SSH 协议,XPipe 也支持该协议。
+如果您在 git 中使用 SSH,可能已经知道如何配置,因此本节将只介绍 HTTPS。
+
+您需要设置 git CLI,以便能通过 HTTPS 与远程 git 仓库进行身份验证。有多种方法可以做到这一点。
+您可以在配置好远程仓库后重启 XPipe 来检查是否已经完成。
+如果系统要求您提供登录凭证,您就需要进行设置。
+
+许多特殊工具,如 [GitHub CLI](https://cli.github.com/),在安装后会自动完成所有操作。
+一些较新的 Git 客户端版本还能通过特殊的网络服务进行身份验证,只需在浏览器中登录账户即可。
+
+也有通过用户名和令牌手动认证的方法。
+如今,大多数服务提供商都要求使用个人访问令牌(PAT),而不是传统的密码来进行命令行身份验证。
+您可以在这里找到常用的 (PAT) 页面:
+- **GitHub**:[个人访问令牌(经典)](https://github.com/settings/tokens)
+- **GitLab**:[个人访问令牌](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html)
+- **BitBucket**:[个人访问令牌](https://support.atlassian.com/bitbucket-cloud/docs/access-tokens/)
+- **Gitea**:`设置 -> 应用程序 -> 管理访问令牌部分`。
+将存储库的令牌权限设置为 "读取 "和 "写入"。其他令牌权限可设置为 "读取"。
+即使 git 客户端提示您输入密码,您也应该输入令牌,除非您的提供商仍然使用密码。
+- 大多数提供商已经不支持密码了。
+
+如果不想每次都输入凭据,可以使用任何 git 凭据管理器。
+更多信息,请参阅
+- [https://git-scm.com/doc/credential-helpers](https://git-scm.com/doc/credential-helpers)
+- [https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git](https://docs.github.com/en/get-started/getting-started-with-git/caching-your-github-credentials-in-git)
+
+一些现代的 git 客户端也会自动存储凭据。
+
+如果一切正常,XPipe 就会向您的远程仓库推送提交。
+
+## 为版本库添加类别
+
+默认情况下,不会将连接类别设置为同步,这样您就可以明确控制要提交的连接。
+因此,一开始,您的远程版本库将是空的。
+
+要将某个类别的连接放到您的 git 仓库中,您需要点击齿轮图标、
+需要点击齿轮图标(悬停在类别上时)
+点击左侧类别概览下的 `Connections` 标签中的齿轮图标。
+然后点击`添加到 git 仓库`,将类别和连接同步到 git 仓库。
+这将把所有可同步的连接添加到 git 仓库。
+
+##本地连接不会同步
+
+任何位于本地机器下的连接都不能共享,因为它涉及的连接和数据只在本地系统上可用。
+
+某些基于本地文件的连接(例如 SSH 配置)可以通过 git 共享,前提是底层数据(这里指文件)也已添加到 git 仓库中。
+
+## 添加文件到 git
+
+一切就绪后,您还可以向 git 添加 SSH 密钥等其他文件。
+在每个文件选项旁都有一个 git 按钮,可以将文件添加到 git 仓库。
+这些文件在推送时也会加密。
diff --git a/lang/base/strings/translations_da.properties b/lang/base/strings/translations_da.properties
index 579899a35..56f8886dd 100644
--- a/lang/base/strings/translations_da.properties
+++ b/lang/base/strings/translations_da.properties
@@ -173,3 +173,8 @@ hasService=$COUNT$ tilgængelig tjeneste
openHttp=Åben HTTP-tjeneste
openHttps=Åben HTTPS-tjeneste
noScriptsAvailable=Ingen tilgængelige scripts
+changeIcon=Skift ikon
+init=Indlæg
+shell=Skal
+hub=Hub
+script=script
diff --git a/lang/base/strings/translations_de.properties b/lang/base/strings/translations_de.properties
index 62f9d9d2c..9b6038304 100644
--- a/lang/base/strings/translations_de.properties
+++ b/lang/base/strings/translations_de.properties
@@ -164,3 +164,8 @@ hasService=$COUNT$ verfügbarer Dienst
openHttp=Offener HTTP-Dienst
openHttps=HTTPS-Dienst öffnen
noScriptsAvailable=Keine Skripte verfügbar
+changeIcon=Symbol ändern
+init=Init
+shell=Shell
+hub=Hub
+script=skript
diff --git a/lang/base/strings/translations_en.properties b/lang/base/strings/translations_en.properties
index 83532ae40..b0d63da77 100644
--- a/lang/base/strings/translations_en.properties
+++ b/lang/base/strings/translations_en.properties
@@ -162,5 +162,11 @@ hasService=$COUNT$ available service
openHttp=Open HTTP service
openHttps=Open HTTPS service
noScriptsAvailable=No scripts available
+changeIcon=Change icon
+init=Init
+shell=Shell
+hub=Hub
+#context: Computer script
+script=script
diff --git a/lang/base/strings/translations_es.properties b/lang/base/strings/translations_es.properties
index 4bc1acdeb..5996607cd 100644
--- a/lang/base/strings/translations_es.properties
+++ b/lang/base/strings/translations_es.properties
@@ -162,3 +162,8 @@ hasService=$COUNT$ servicio disponible
openHttp=Servicio HTTP abierto
openHttps=Abrir servicio HTTPS
noScriptsAvailable=No hay guiones disponibles
+changeIcon=Cambiar icono
+init=Init
+shell=Shell
+hub=Hub
+script=script
diff --git a/lang/base/strings/translations_fr.properties b/lang/base/strings/translations_fr.properties
index 2d3b63240..2b1ed3572 100644
--- a/lang/base/strings/translations_fr.properties
+++ b/lang/base/strings/translations_fr.properties
@@ -162,3 +162,8 @@ hasService=$COUNT$ service disponible
openHttp=Service HTTP ouvert
openHttps=Service HTTPS ouvert
noScriptsAvailable=Pas de scripts disponibles
+changeIcon=Changer d'icône
+init=Init
+shell=Coquille
+hub=Hub
+script=script
diff --git a/lang/base/strings/translations_it.properties b/lang/base/strings/translations_it.properties
index 0dc6f7179..1a40b2ce8 100644
--- a/lang/base/strings/translations_it.properties
+++ b/lang/base/strings/translations_it.properties
@@ -162,3 +162,8 @@ hasService=$COUNT$ servizio disponibile
openHttp=Servizio HTTP aperto
openHttps=Servizio HTTPS aperto
noScriptsAvailable=Non sono disponibili script
+changeIcon=Cambia icona
+init=Init
+shell=Conchiglia
+hub=Hub
+script=script
diff --git a/lang/base/strings/translations_ja.properties b/lang/base/strings/translations_ja.properties
index 1969f52ed..e5aab3171 100644
--- a/lang/base/strings/translations_ja.properties
+++ b/lang/base/strings/translations_ja.properties
@@ -162,3 +162,8 @@ hasService=$COUNT$ 利用可能なサービス
openHttp=オープンHTTPサービス
openHttps=HTTPSサービスを開く
noScriptsAvailable=スクリプトはない
+changeIcon=アイコンの変更
+init=イニシャル
+shell=シェル
+hub=ハブ
+script=スクリプト
diff --git a/lang/base/strings/translations_nl.properties b/lang/base/strings/translations_nl.properties
index f29e0f46b..f8734d078 100644
--- a/lang/base/strings/translations_nl.properties
+++ b/lang/base/strings/translations_nl.properties
@@ -162,3 +162,8 @@ hasService=$COUNT$ beschikbare dienst
openHttp=Open HTTP service
openHttps=Open HTTPS service
noScriptsAvailable=Geen scripts beschikbaar
+changeIcon=Pictogram wijzigen
+init=Init
+shell=Shell
+hub=Hub
+script=script
diff --git a/lang/base/strings/translations_pt.properties b/lang/base/strings/translations_pt.properties
index 1ca6da6bf..4e8c2c7e3 100644
--- a/lang/base/strings/translations_pt.properties
+++ b/lang/base/strings/translations_pt.properties
@@ -162,3 +162,8 @@ hasService=$COUNT$ serviço disponível
openHttp=Abre o serviço HTTP
openHttps=Abre o serviço HTTPS
noScriptsAvailable=Não há scripts disponíveis
+changeIcon=Altera o ícone
+init=Init
+shell=Concha
+hub=Hub
+script=guião
diff --git a/lang/base/strings/translations_ru.properties b/lang/base/strings/translations_ru.properties
index faa826dd6..21fd099ab 100644
--- a/lang/base/strings/translations_ru.properties
+++ b/lang/base/strings/translations_ru.properties
@@ -162,3 +162,8 @@ hasService=$COUNT$ доступный сервис
openHttp=Открытый HTTP-сервис
openHttps=Открытая служба HTTPS
noScriptsAvailable=Нет доступных скриптов
+changeIcon=Значок изменения
+init=Init
+shell=Shell
+hub=Хаб
+script=скрипт
diff --git a/lang/base/strings/translations_tr.properties b/lang/base/strings/translations_tr.properties
index 188490243..57bbe223f 100644
--- a/lang/base/strings/translations_tr.properties
+++ b/lang/base/strings/translations_tr.properties
@@ -162,3 +162,8 @@ hasService=$COUNT$ mevcut hizmet
openHttp=Açık HTTP hizmeti
openHttps=HTTPS hizmetini açın
noScriptsAvailable=Mevcut senaryo yok
+changeIcon=Simge değiştir
+init=Başlangıç
+shell=Kabuk
+hub=Hub
+script=senaryo
diff --git a/lang/base/strings/translations_zh.properties b/lang/base/strings/translations_zh.properties
index e2cbc2be3..d2acd5ac5 100644
--- a/lang/base/strings/translations_zh.properties
+++ b/lang/base/strings/translations_zh.properties
@@ -162,3 +162,8 @@ hasService=$COUNT$ 可用服务
openHttp=开放式 HTTP 服务
openHttps=打开 HTTPS 服务
noScriptsAvailable=无脚本可用
+changeIcon=更改图标
+init=启动
+shell=外壳
+hub=枢纽
+script=脚本
diff --git a/lang/proc/strings/translations_da.properties b/lang/proc/strings/translations_da.properties
index 3b90b9a0b..cd480d783 100644
--- a/lang/proc/strings/translations_da.properties
+++ b/lang/proc/strings/translations_da.properties
@@ -11,11 +11,11 @@ vmwareGuiDescription=Om en virtuel maskine skal startes i baggrunden eller i et
vmwareEncryptionPassword=Krypteringsadgangskode
#custom
vmwareEncryptionPasswordDescription=Den adgangskode, der bruges til at kryptere VM'en.
-vmwarePasswordDescription=Den påkrævede adgangskode for gæstebrugeren.
-vmwarePassword=Brugerens adgangskode
-vmwareUser=Gæstebruger
+vmPasswordDescription=Den påkrævede adgangskode for gæstebrugeren.
+vmPassword=Brugerens adgangskode
+vmUser=Gæstebruger
runTempContainer=Kør midlertidig container
-vmwareUserDescription=Brugernavnet på din primære gæstebruger
+vmUserDescription=Brugernavnet på din primære gæstebruger
dockerTempRunAlertTitle=Kør midlertidig container
dockerTempRunAlertHeader=Dette vil køre en shell-proces i en midlertidig container, som automatisk bliver fjernet, når den stoppes.
imageName=Navn på billede
@@ -407,3 +407,7 @@ editConfiguration=Rediger konfiguration
viewInDashboard=Visning i dashboard
setDefault=Indstil standard
removeDefault=Fjern standard
+connectAsOtherUser=Opret forbindelse som anden bruger
+provideUsername=Giv et alternativt brugernavn til at logge ind med
+vmIdentity=Gæsteidentitet
+vmIdentityDescription=Den SSH-identitetsgodkendelsesmetode, der skal bruges til at oprette forbindelse, hvis det er nødvendigt
diff --git a/lang/proc/strings/translations_de.properties b/lang/proc/strings/translations_de.properties
index 5e3e484de..6a7d83241 100644
--- a/lang/proc/strings/translations_de.properties
+++ b/lang/proc/strings/translations_de.properties
@@ -9,11 +9,11 @@ showNonRunningInstances=Nicht laufende Instanzen anzeigen
vmwareGuiDescription=Ob eine virtuelle Maschine im Hintergrund oder in einem Fenster gestartet werden soll.
vmwareEncryptionPassword=Verschlüsselungspasswort
vmwareEncryptionPasswordDescription=Das optionale Passwort, das zur Verschlüsselung der VM verwendet wird.
-vmwarePasswordDescription=Das erforderliche Passwort für den Gastbenutzer.
-vmwarePassword=Benutzer-Passwort
-vmwareUser=Gast-Benutzer
+vmPasswordDescription=Das erforderliche Passwort für den Gastbenutzer.
+vmPassword=Benutzer-Passwort
+vmUser=Gast-Benutzer
runTempContainer=Temporärer Container ausführen
-vmwareUserDescription=Der Benutzername deines primären Gastbenutzers
+vmUserDescription=Der Benutzername deines primären Gastbenutzers
dockerTempRunAlertTitle=Temporärer Container ausführen
dockerTempRunAlertHeader=Damit wird ein Shell-Prozess in einem temporären Container ausgeführt, der automatisch entfernt wird, sobald er gestoppt wird.
#custom
@@ -385,3 +385,7 @@ editConfiguration=Konfiguration bearbeiten
viewInDashboard=Ansicht im Dashboard
setDefault=Standard einstellen
removeDefault=Standard entfernen
+connectAsOtherUser=Als anderer Benutzer verbinden
+provideUsername=Einen alternativen Benutzernamen zum Einloggen angeben
+vmIdentity=Gast-Identität
+vmIdentityDescription=Die SSH-Identitätsauthentifizierungsmethode, die bei Bedarf für die Verbindung verwendet wird
diff --git a/lang/proc/strings/translations_en.properties b/lang/proc/strings/translations_en.properties
index b22c5623f..99ea6ebcb 100644
--- a/lang/proc/strings/translations_en.properties
+++ b/lang/proc/strings/translations_en.properties
@@ -9,11 +9,11 @@ showNonRunningInstances=Show non-running instances
vmwareGuiDescription=Whether to start a virtual machine in the background or in a window.
vmwareEncryptionPassword=Encryption password
vmwareEncryptionPasswordDescription=The optional password used to encrypt the VM.
-vmwarePasswordDescription=The required password for the guest user.
-vmwarePassword=User password
-vmwareUser=Guest user
+vmPasswordDescription=The required password for the guest user.
+vmPassword=User password
+vmUser=Guest user
runTempContainer=Run temporary container
-vmwareUserDescription=The username of your primary guest user
+vmUserDescription=The username of your primary guest user
dockerTempRunAlertTitle=Run temporary container
dockerTempRunAlertHeader=This will run a shell process in a temporary container that will get automatically removed once it is stopped.
imageName=Image name
@@ -383,3 +383,7 @@ editConfiguration=Edit configuration
viewInDashboard=View in dashboard
setDefault=Set default
removeDefault=Remove default
+connectAsOtherUser=Connect as other user
+provideUsername=Provide alternative username to log in with
+vmIdentity=Guest identity
+vmIdentityDescription=The SSH identity authentication method to use for connecting if needed
diff --git a/lang/proc/strings/translations_es.properties b/lang/proc/strings/translations_es.properties
index 3a2885241..3ea7a3ebb 100644
--- a/lang/proc/strings/translations_es.properties
+++ b/lang/proc/strings/translations_es.properties
@@ -9,11 +9,11 @@ showNonRunningInstances=Mostrar instancias no en ejecución
vmwareGuiDescription=Si iniciar una máquina virtual en segundo plano o en una ventana.
vmwareEncryptionPassword=Contraseña de encriptación
vmwareEncryptionPasswordDescription=La contraseña opcional utilizada para encriptar la VM.
-vmwarePasswordDescription=La contraseña necesaria para el usuario invitado.
-vmwarePassword=Contraseña de usuario
-vmwareUser=Usuario invitado
+vmPasswordDescription=La contraseña necesaria para el usuario invitado.
+vmPassword=Contraseña de usuario
+vmUser=Usuario invitado
runTempContainer=Ejecutar un contenedor temporal
-vmwareUserDescription=El nombre de usuario de tu usuario invitado principal
+vmUserDescription=El nombre de usuario de tu usuario invitado principal
dockerTempRunAlertTitle=Ejecutar un contenedor temporal
dockerTempRunAlertHeader=Esto ejecutará un proceso shell en un contenedor temporal que se eliminará automáticamente cuando se detenga.
imageName=Nombre de la imagen
@@ -381,3 +381,7 @@ editConfiguration=Editar configuración
viewInDashboard=Vista en el panel de control
setDefault=Establecer por defecto
removeDefault=Eliminar por defecto
+connectAsOtherUser=Conectarse como otro usuario
+provideUsername=Proporcionar un nombre de usuario alternativo con el que iniciar sesión
+vmIdentity=Identidad de invitado
+vmIdentityDescription=El método de autenticación de identidad SSH a utilizar para conectarse si es necesario
diff --git a/lang/proc/strings/translations_fr.properties b/lang/proc/strings/translations_fr.properties
index 3faabd80f..69f6d4384 100644
--- a/lang/proc/strings/translations_fr.properties
+++ b/lang/proc/strings/translations_fr.properties
@@ -9,11 +9,11 @@ showNonRunningInstances=Afficher les instances non exécutées
vmwareGuiDescription=S'il faut démarrer une machine virtuelle en arrière-plan ou dans une fenêtre.
vmwareEncryptionPassword=Mot de passe de cryptage
vmwareEncryptionPasswordDescription=Le mot de passe facultatif utilisé pour crypter la VM.
-vmwarePasswordDescription=Le mot de passe requis pour l'utilisateur invité.
-vmwarePassword=Mot de passe de l'utilisateur
-vmwareUser=Utilisateur invité
+vmPasswordDescription=Le mot de passe requis pour l'utilisateur invité.
+vmPassword=Mot de passe de l'utilisateur
+vmUser=Utilisateur invité
runTempContainer=Exécuter un conteneur temporaire
-vmwareUserDescription=Le nom d'utilisateur de l'invité principal
+vmUserDescription=Le nom d'utilisateur de l'invité principal
dockerTempRunAlertTitle=Exécuter un conteneur temporaire
dockerTempRunAlertHeader=Cela permet d'exécuter un processus shell dans un conteneur temporaire qui sera automatiquement supprimé une fois qu'il aura été arrêté.
imageName=Nom de l'image
@@ -381,3 +381,7 @@ editConfiguration=Modifier la configuration
viewInDashboard=Vue dans le tableau de bord
setDefault=Définir par défaut
removeDefault=Supprimer la valeur par défaut
+connectAsOtherUser=Se connecter en tant qu'autre utilisateur
+provideUsername=Fournir un autre nom d'utilisateur pour se connecter
+vmIdentity=Identité de l'invité
+vmIdentityDescription=La méthode d'authentification de l'identité SSH à utiliser pour se connecter si nécessaire
diff --git a/lang/proc/strings/translations_it.properties b/lang/proc/strings/translations_it.properties
index 449f984a3..60353b4f2 100644
--- a/lang/proc/strings/translations_it.properties
+++ b/lang/proc/strings/translations_it.properties
@@ -9,11 +9,11 @@ showNonRunningInstances=Mostra le istanze non in esecuzione
vmwareGuiDescription=Se avviare una macchina virtuale in background o in una finestra.
vmwareEncryptionPassword=Password di crittografia
vmwareEncryptionPasswordDescription=La password opzionale utilizzata per criptare la VM.
-vmwarePasswordDescription=La password richiesta per l'utente ospite.
-vmwarePassword=Password utente
-vmwareUser=Utente ospite
+vmPasswordDescription=La password richiesta per l'utente ospite.
+vmPassword=Password utente
+vmUser=Utente ospite
runTempContainer=Eseguire un contenitore temporaneo
-vmwareUserDescription=Il nome utente dell'utente ospite principale
+vmUserDescription=Il nome utente dell'utente ospite principale
dockerTempRunAlertTitle=Eseguire un contenitore temporaneo
dockerTempRunAlertHeader=Esegue un processo di shell in un contenitore temporaneo che verrà rimosso automaticamente una volta terminato.
imageName=Nome dell'immagine
@@ -381,3 +381,7 @@ editConfiguration=Modifica la configurazione
viewInDashboard=Vista nel cruscotto
setDefault=Imposta predefinito
removeDefault=Rimuovi l'impostazione predefinita
+connectAsOtherUser=Connettersi come altro utente
+provideUsername=Fornisce un nome utente alternativo con cui accedere
+vmIdentity=Identità dell'ospite
+vmIdentityDescription=Il metodo di autenticazione dell'identità SSH da utilizzare per la connessione, se necessario
diff --git a/lang/proc/strings/translations_ja.properties b/lang/proc/strings/translations_ja.properties
index f71fdb6a3..27712d922 100644
--- a/lang/proc/strings/translations_ja.properties
+++ b/lang/proc/strings/translations_ja.properties
@@ -9,11 +9,11 @@ showNonRunningInstances=実行されていないインスタンスを表示す
vmwareGuiDescription=仮想マシンをバックグラウンドで起動するか、ウィンドウで起動するか。
vmwareEncryptionPassword=暗号化パスワード
vmwareEncryptionPasswordDescription=VMを暗号化するためのオプションのパスワード。
-vmwarePasswordDescription=ゲストユーザーに必要なパスワード。
-vmwarePassword=ユーザーパスワード
-vmwareUser=ゲストユーザー
+vmPasswordDescription=ゲストユーザーに必要なパスワード。
+vmPassword=ユーザーパスワード
+vmUser=ゲストユーザー
runTempContainer=一時コンテナを実行する
-vmwareUserDescription=プライマリゲストユーザーのユーザー名
+vmUserDescription=プライマリゲストユーザーのユーザー名
dockerTempRunAlertTitle=一時コンテナを実行する
dockerTempRunAlertHeader=これは一時的なコンテナでシェルプロセスを実行し、停止されると自動的に削除される。
imageName=画像名
@@ -381,3 +381,7 @@ editConfiguration=設定を編集する
viewInDashboard=ダッシュボードで見る
setDefault=デフォルトを設定する
removeDefault=デフォルトを削除する
+connectAsOtherUser=他のユーザーとして接続する
+provideUsername=別のユーザー名でログインする
+vmIdentity=ゲストID
+vmIdentityDescription=必要に応じて接続に使用するSSH ID認証方法
diff --git a/lang/proc/strings/translations_nl.properties b/lang/proc/strings/translations_nl.properties
index 094a071c0..4ded02222 100644
--- a/lang/proc/strings/translations_nl.properties
+++ b/lang/proc/strings/translations_nl.properties
@@ -9,11 +9,11 @@ showNonRunningInstances=Niet-lopende instanties tonen
vmwareGuiDescription=Of een virtuele machine op de achtergrond of in een venster moet worden gestart.
vmwareEncryptionPassword=Encryptie wachtwoord
vmwareEncryptionPasswordDescription=Het optionele wachtwoord dat wordt gebruikt om de VM te versleutelen.
-vmwarePasswordDescription=Het vereiste wachtwoord voor de gastgebruiker.
-vmwarePassword=Wachtwoord gebruiker
-vmwareUser=Gast gebruiker
+vmPasswordDescription=Het vereiste wachtwoord voor de gastgebruiker.
+vmPassword=Wachtwoord gebruiker
+vmUser=Gast gebruiker
runTempContainer=Tijdelijke container uitvoeren
-vmwareUserDescription=De gebruikersnaam van je primaire gastgebruiker
+vmUserDescription=De gebruikersnaam van je primaire gastgebruiker
dockerTempRunAlertTitle=Tijdelijke container uitvoeren
dockerTempRunAlertHeader=Hiermee wordt een shellproces uitgevoerd in een tijdelijke container die automatisch wordt verwijderd zodra het wordt gestopt.
imageName=Naam afbeelding
@@ -381,3 +381,7 @@ editConfiguration=Configuratie bewerken
viewInDashboard=Weergave in dashboard
setDefault=Standaard instellen
removeDefault=Standaard verwijderen
+connectAsOtherUser=Verbinden als andere gebruiker
+provideUsername=Geef een alternatieve gebruikersnaam om mee in te loggen
+vmIdentity=Identiteit van de gast
+vmIdentityDescription=De SSH-identiteitsverificatiemethode om eventueel te gebruiken om verbinding te maken
diff --git a/lang/proc/strings/translations_pt.properties b/lang/proc/strings/translations_pt.properties
index ae8e536fc..4b7af2870 100644
--- a/lang/proc/strings/translations_pt.properties
+++ b/lang/proc/strings/translations_pt.properties
@@ -9,11 +9,11 @@ showNonRunningInstances=Mostra instâncias não em execução
vmwareGuiDescription=Se pretende iniciar uma máquina virtual em segundo plano ou numa janela.
vmwareEncryptionPassword=Palavra-passe de encriptação
vmwareEncryptionPasswordDescription=A palavra-passe opcional utilizada para encriptar a VM.
-vmwarePasswordDescription=A palavra-passe necessária para o utilizador convidado.
-vmwarePassword=Palavra-passe do utilizador
-vmwareUser=Utilizador convidado
+vmPasswordDescription=A palavra-passe necessária para o utilizador convidado.
+vmPassword=Palavra-passe do utilizador
+vmUser=Utilizador convidado
runTempContainer=Executa um contentor temporário
-vmwareUserDescription=O nome de utilizador do teu principal utilizador convidado
+vmUserDescription=O nome de utilizador do teu principal utilizador convidado
dockerTempRunAlertTitle=Executa um contentor temporário
dockerTempRunAlertHeader=Isto irá executar um processo shell num contentor temporário que será automaticamente removido assim que for parado.
imageName=Nome da imagem
@@ -381,3 +381,7 @@ editConfiguration=Edita a configuração
viewInDashboard=Ver no painel de controlo
setDefault=Definir predefinição
removeDefault=Remover predefinição
+connectAsOtherUser=Liga-te como outro utilizador
+provideUsername=Fornece um nome de utilizador alternativo para iniciar sessão
+vmIdentity=Identidade do convidado
+vmIdentityDescription=O método de autenticação de identidade SSH a utilizar para estabelecer ligação, se necessário
diff --git a/lang/proc/strings/translations_ru.properties b/lang/proc/strings/translations_ru.properties
index ae241690f..f8c54bee3 100644
--- a/lang/proc/strings/translations_ru.properties
+++ b/lang/proc/strings/translations_ru.properties
@@ -9,11 +9,11 @@ showNonRunningInstances=Показать неработающие экземпл
vmwareGuiDescription=Запускать ли виртуальную машину в фоновом режиме или в окне.
vmwareEncryptionPassword=Пароль шифрования
vmwareEncryptionPasswordDescription=Необязательный пароль, используемый для шифрования виртуальной машины.
-vmwarePasswordDescription=Необходимый пароль для гостевого пользователя.
-vmwarePassword=Пароль пользователя
-vmwareUser=Гость-пользователь
+vmPasswordDescription=Необходимый пароль для гостевого пользователя.
+vmPassword=Пароль пользователя
+vmUser=Гость-пользователь
runTempContainer=Запустить временный контейнер
-vmwareUserDescription=Имя пользователя твоего основного гостевого пользователя
+vmUserDescription=Имя пользователя твоего основного гостевого пользователя
dockerTempRunAlertTitle=Запустить временный контейнер
dockerTempRunAlertHeader=Это запустит shell-процесс во временном контейнере, который будет автоматически удален после его остановки.
imageName=Название изображения
@@ -381,3 +381,7 @@ editConfiguration=Редактирование конфигурации
viewInDashboard=Вид в приборной панели
setDefault=Установить по умолчанию
removeDefault=Убрать значение по умолчанию
+connectAsOtherUser=Подключиться как другой пользователь
+provideUsername=Предоставьте альтернативное имя пользователя для входа в систему
+vmIdentity=Идентификация гостя
+vmIdentityDescription=Метод аутентификации SSH, который нужно использовать для подключения при необходимости
diff --git a/lang/proc/strings/translations_tr.properties b/lang/proc/strings/translations_tr.properties
index 4a8c50c84..6de85c5dc 100644
--- a/lang/proc/strings/translations_tr.properties
+++ b/lang/proc/strings/translations_tr.properties
@@ -9,11 +9,11 @@ showNonRunningInstances=Çalışmayan örnekleri göster
vmwareGuiDescription=Bir sanal makinenin arka planda mı yoksa bir pencerede mi başlatılacağı.
vmwareEncryptionPassword=Şifreleme parolası
vmwareEncryptionPasswordDescription=VM'yi şifrelemek için kullanılan isteğe bağlı parola.
-vmwarePasswordDescription=Konuk kullanıcı için gerekli parola.
-vmwarePassword=Kullanıcı şifresi
-vmwareUser=Misafir kullanıcı
+vmPasswordDescription=Konuk kullanıcı için gerekli parola.
+vmPassword=Kullanıcı şifresi
+vmUser=Misafir kullanıcı
runTempContainer=Geçici konteyneri çalıştır
-vmwareUserDescription=Birincil konuk kullanıcınızın kullanıcı adı
+vmUserDescription=Birincil konuk kullanıcınızın kullanıcı adı
dockerTempRunAlertTitle=Geçici konteyneri çalıştır
dockerTempRunAlertHeader=Bu, durdurulduğunda otomatik olarak kaldırılacak geçici bir kapsayıcıda bir kabuk işlemi çalıştıracaktır.
imageName=Resim adı
@@ -381,3 +381,7 @@ editConfiguration=Yapılandırmayı düzenle
viewInDashboard=Gösterge tablosunda görüntüle
setDefault=Varsayılanı ayarla
removeDefault=Varsayılanı kaldır
+connectAsOtherUser=Diğer kullanıcı olarak bağlan
+provideUsername=Oturum açmak için alternatif kullanıcı adı sağlayın
+vmIdentity=Misafir kimliği
+vmIdentityDescription=Gerekirse bağlanmak için kullanılacak SSH kimlik doğrulama yöntemi
diff --git a/lang/proc/strings/translations_zh.properties b/lang/proc/strings/translations_zh.properties
index 40e5fb610..cd9fb4266 100644
--- a/lang/proc/strings/translations_zh.properties
+++ b/lang/proc/strings/translations_zh.properties
@@ -9,11 +9,11 @@ showNonRunningInstances=显示非运行实例
vmwareGuiDescription=是在后台启动虚拟机,还是在窗口中启动。
vmwareEncryptionPassword=加密密码
vmwareEncryptionPasswordDescription=用于加密虚拟机的可选密码。
-vmwarePasswordDescription=访客用户所需的密码。
-vmwarePassword=用户密码
-vmwareUser=访客用户
+vmPasswordDescription=访客用户所需的密码。
+vmPassword=用户密码
+vmUser=访客用户
runTempContainer=运行临时容器
-vmwareUserDescription=主要访客用户的用户名
+vmUserDescription=主要访客用户的用户名
dockerTempRunAlertTitle=运行临时容器
dockerTempRunAlertHeader=这将在临时容器中运行一个 shell 进程,一旦停止,该进程将自动删除。
imageName=图像名称
@@ -381,3 +381,7 @@ editConfiguration=编辑配置
viewInDashboard=在仪表板中查看
setDefault=设置默认值
removeDefault=删除默认值
+connectAsOtherUser=以其他用户身份连接
+provideUsername=提供其他登录用户名
+vmIdentity=访客身份
+vmIdentityDescription=必要时用于连接的 SSH 身份验证方法
diff --git a/version b/version
index 8bb422239..c8a4e44d7 100644
--- a/version
+++ b/version
@@ -1 +1 @@
-11.3
+12.0-9