installer: add soft-serve
diff --git a/core/installer/app.go b/core/installer/app.go
index f3d465b..c139071 100644
--- a/core/installer/app.go
+++ b/core/installer/app.go
@@ -119,6 +119,7 @@
 		CreateAppMaddy(valuesTmpls, tmpls),
 		CreateAppQBittorrent(valuesTmpls, tmpls),
 		CreateAppJellyfin(valuesTmpls, tmpls),
+		CreateAppSoftServe(valuesTmpls, tmpls),
 		CreateAppRpuppy(valuesTmpls, tmpls),
 	}
 }
@@ -331,6 +332,26 @@
 	}
 }
 
+func CreateAppSoftServe(fs embed.FS, tmpls *template.Template) StoreApp {
+	schema, err := fs.ReadFile("values-tmpl/soft-serve.jsonschema")
+	if err != nil {
+		panic(err)
+	}
+	return StoreApp{
+		App{
+			"soft-serve",
+			[]string{"app-soft-serve"},
+			[]*template.Template{
+				tmpls.Lookup("soft-serve.yaml"),
+			},
+			string(schema),
+			tmpls.Lookup("soft-serve.md"),
+		},
+		`<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 48 48"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="4"><path stroke-linejoin="round" d="M15.34 22.5L21 37l3 6l3-6l5.66-14.5"/><path d="M19 32h10"/><path stroke-linejoin="round" d="M24 3c-6 0-8 6-8 6s-6 2-6 7s5 7 5 7s3.5-2 9-2s9 2 9 2s5-2 5-7s-6-7-6-7s-2-6-8-6Z"/></g></svg>`,
+		"A tasty, self-hostable Git server for the command line. 🍦",
+	}
+}
+
 func CreateAppHeadscale(fs embed.FS, tmpls *template.Template) App {
 	schema, err := fs.ReadFile("values-tmpl/headscale.jsonschema")
 	if err != nil {
diff --git a/core/installer/values-tmpl/soft-serve.jsonschema b/core/installer/values-tmpl/soft-serve.jsonschema
new file mode 100644
index 0000000..8142797
--- /dev/null
+++ b/core/installer/values-tmpl/soft-serve.jsonschema
@@ -0,0 +1,10 @@
+{
+  "type": "object",
+  "properties": {
+    "Network": { "type": "string", "default": "Public", "role": "network" },
+    "Subdomain": { "type": "string", "default": "softserve" },
+	"AdminKey": { "type": "string" },
+	"SourcePort": { "type": "string", "default": "0" }
+  },
+  "additionalProperties": false
+}
diff --git a/core/installer/values-tmpl/soft-serve.md b/core/installer/values-tmpl/soft-serve.md
new file mode 100644
index 0000000..28e43a8
--- /dev/null
+++ b/core/installer/values-tmpl/soft-serve.md
@@ -0,0 +1 @@
+Soft-Serve with TCP ingress
diff --git a/core/installer/values-tmpl/soft-serve.yaml b/core/installer/values-tmpl/soft-serve.yaml
new file mode 100644
index 0000000..d2d4cb3
--- /dev/null
+++ b/core/installer/values-tmpl/soft-serve.yaml
@@ -0,0 +1,39 @@
+apiVersion: helm.toolkit.fluxcd.io/v2beta1
+kind: HelmRelease
+metadata:
+  name: soft-serve
+  namespace: {{ .Release.Namespace }}
+spec:
+  chart:
+    spec:
+      chart: charts/soft-serve
+      sourceRef:
+        kind: GitRepository
+        name: pcloud
+        namespace: {{ .Global.Id }}
+  interval: 1m0s
+  values:
+    reservedIP: ""
+    addressPool: {{ .Global.Id }}
+    adminKey: {{ .Values.AdminKey }}
+    {{- if .Values.Network }}
+    ingress:
+      enabled: true # TODO(giolekva): make it configurable
+      ingressClassName: {{ .Values.Network.IngressClass }}
+      certificateIssuer: {{ .Values.Network.CertificateIssuer }}
+      domain: {{ .Values.Subdomain }}.{{ .Values.Network.Domain }}
+      {{- if .Values.SourcePort }}
+      sourcePort: {{ .Values.SourcePort }}
+      {{- end }}
+    {{- end }}
+# reservedIP: ""
+# addressPool: qwe
+# adminKey: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOa7FUrmXzdY3no8qNGUk7OPaRcIUi8G7MVbLlff9eB/ lekva@gl-mbp-m1-max.local"
+# ingress:
+#   enabled: true
+#   ingressClassName: pcloud-ingress-public
+#   certificateIssuer: qwe-public
+#   domain: gt.qwe.lekva.me
+#   # ingressClassName: qwe-ingress-private
+#   # certificateIssuer: ""
+#   # domain: gt.p.qwe.lekva.me