+
+
{data?.name}
diff --git a/biome.json b/biome.json
index b39d20fa6..5f49b47c6 100644
--- a/biome.json
+++ b/biome.json
@@ -1,5 +1,10 @@
{
"$schema": "./node_modules/@biomejs/biome/configuration_schema.json",
+ "vcs": {
+ "enabled": true,
+ "clientKind": "git",
+ "useIgnoreFile": true
+ },
"files": {
"ignoreUnknown": true,
"includes": [
@@ -10,7 +15,8 @@
"!**/drizzle/**",
"!node_modules/**",
"!packages/server/package.json"
- ]
+ ],
+ "maxSize": 2097152
},
"assist": { "actions": { "source": { "organizeImports": "on" } } },
"linter": {
diff --git a/packages/server/src/db/schema/application.ts b/packages/server/src/db/schema/application.ts
index c469ac788..c1eb8b65c 100644
--- a/packages/server/src/db/schema/application.ts
+++ b/packages/server/src/db/schema/application.ts
@@ -115,6 +115,7 @@ export const applications = pgTable("application", {
subtitle: text("subtitle"),
command: text("command"),
args: text("args").array(),
+ icon: text("icon"),
refreshToken: text("refreshToken").$defaultFn(() => nanoid()),
sourceType: sourceType("sourceType").notNull().default("github"),
cleanCache: boolean("cleanCache").default(false),
@@ -372,6 +373,11 @@ const createSchema = createInsertSchema(applications, {
endpointSpecSwarm: EndpointSpecSwarmSchema.nullable(),
ulimitsSwarm: UlimitsSwarmSchema.nullable(),
enableSubmodules: z.boolean().optional(),
+ icon: z
+ .string()
+ .max(2 * 1024 * 1024, "Icon must be less than 2MB")
+ .nullable()
+ .optional(),
});
export const apiCreateApplication = createSchema.pick({
diff --git a/packages/server/src/services/environment.ts b/packages/server/src/services/environment.ts
index 7e50f9382..097dc1bd3 100644
--- a/packages/server/src/services/environment.ts
+++ b/packages/server/src/services/environment.ts
@@ -59,6 +59,7 @@ export const findEnvironmentById = async (environmentId: string) => {
applicationStatus: true,
description: true,
serverId: true,
+ icon: true,
},
},
mariadb: {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index cb61d48e3..4f962c675 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -305,6 +305,9 @@ importers:
dockerode:
specifier: 4.0.2
version: 4.0.2
+ dompurify:
+ specifier: ^3.3.3
+ version: 3.3.3
dotenv:
specifier: 16.4.5
version: 16.4.5
@@ -459,6 +462,9 @@ importers:
'@types/bcrypt':
specifier: 5.0.2
version: 5.0.2
+ '@types/dompurify':
+ specifier: ^3.2.0
+ version: 3.2.0
'@types/js-cookie':
specifier: ^3.0.6
version: 3.0.6
@@ -516,6 +522,9 @@ importers:
memfs:
specifier: ^4.17.2
version: 4.56.10(tslib@2.8.1)
+ simple-icons:
+ specifier: ^16.14.0
+ version: 16.14.0
tailwindcss:
specifier: ^3.4.17
version: 3.4.19(tsx@4.16.2)(yaml@2.8.1)
@@ -3968,6 +3977,10 @@ packages:
'@types/dockerode@3.3.23':
resolution: {integrity: sha512-Lz5J+NFgZS4cEVhquwjIGH4oQwlVn2h7LXD3boitujBnzOE5o7s9H8hchEjoDK2SlRsJTogdKnQeiJgPPKLIEw==}
+ '@types/dompurify@3.2.0':
+ resolution: {integrity: sha512-Fgg31wv9QbLDA0SpTOXO3MaxySc4DKGLi8sna4/Utjo4r3ZRPdCt4UQee8BWr+Q5z21yifghREPJGYaEOEIACg==}
+ deprecated: This is a stub types definition. dompurify provides its own type definitions, so you do not need this installed.
+
'@types/estree-jsx@1.0.5':
resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
@@ -5059,6 +5072,9 @@ packages:
dompurify@3.2.6:
resolution: {integrity: sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==}
+ dompurify@3.3.3:
+ resolution: {integrity: sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==}
+
domutils@3.2.2:
resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
@@ -7501,6 +7517,10 @@ packages:
simple-get@4.0.1:
resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==}
+ simple-icons@16.14.0:
+ resolution: {integrity: sha512-2Nvs3jJpCfMWQerD4zdv91g/MpnWn81a7uhyAC0reuhrjmS2MtSmwIKwewOJR6Xe97ZmfltDntCDqKJIBawQOw==}
+ engines: {node: '>=0.12.18'}
+
sisteransi@1.0.5:
resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
@@ -12022,6 +12042,10 @@ snapshots:
'@types/docker-modem': 3.0.6
'@types/node': 24.10.13
+ '@types/dompurify@3.2.0':
+ dependencies:
+ dompurify: 3.3.3
+
'@types/estree-jsx@1.0.5':
dependencies:
'@types/estree': 1.0.8
@@ -13118,6 +13142,10 @@ snapshots:
optionalDependencies:
'@types/trusted-types': 2.0.7
+ dompurify@3.3.3:
+ optionalDependencies:
+ '@types/trusted-types': 2.0.7
+
domutils@3.2.2:
dependencies:
dom-serializer: 2.0.0
@@ -15673,6 +15701,8 @@ snapshots:
once: 1.4.0
simple-concat: 1.0.1
+ simple-icons@16.14.0: {}
+
sisteransi@1.0.5: {}
slash@3.0.0: {}