apps: qbittorrent + jellyfin
diff --git a/core/installer/app.go b/core/installer/app.go
index 9e3cb29..ccdbe97 100644
--- a/core/installer/app.go
+++ b/core/installer/app.go
@@ -7,6 +7,19 @@
 	Templates []*template.Template
 }
 
+func CreateAllApps(tmpls *template.Template) []App {
+	return []App{
+		CreateAppIngressPrivate(tmpls),
+		CreateAppCoreAuth(tmpls),
+		CreateAppVaultwarden(tmpls),
+		CreateAppMatrix(tmpls),
+		CreateAppPihole(tmpls),
+		CreateAppMaddy(tmpls),
+		CreateAppQBittorrent(tmpls),
+		CreateAppJellyfin(tmpls),
+	}
+}
+
 func CreateAppIngressPrivate(tmpls *template.Template) App {
 	return App{
 		"ingress-private",
@@ -64,3 +77,21 @@
 		},
 	}
 }
+
+func CreateAppQBittorrent(tmpls *template.Template) App {
+	return App{
+		"qbittorrent",
+		[]*template.Template{
+			tmpls.Lookup("qbittorrent.yaml"),
+		},
+	}
+}
+
+func CreateAppJellyfin(tmpls *template.Template) App {
+	return App{
+		"jellyfin",
+		[]*template.Template{
+			tmpls.Lookup("jellyfin.yaml"),
+		},
+	}
+}
diff --git a/core/installer/main.go b/core/installer/main.go
index e9ec79b..8c006ba 100644
--- a/core/installer/main.go
+++ b/core/installer/main.go
@@ -75,14 +75,7 @@
 	if err != nil {
 		log.Fatal(err)
 	}
-	apps := []App{
-		CreateAppIngressPrivate(tmpls),
-		CreateAppCoreAuth(tmpls),
-		CreateAppVaultwarden(tmpls),
-		CreateAppMatrix(tmpls),
-		CreateAppPihole(tmpls),
-		CreateAppMaddy(tmpls),
-	}
+	apps := CreateAllApps(tmpls)
 	for _, a := range apps {
 		if a.Name == installFlags.appName {
 			for _, t := range a.Templates {
diff --git a/core/installer/values-tmpl/jellyfin.yaml b/core/installer/values-tmpl/jellyfin.yaml
new file mode 100644
index 0000000..d68109a
--- /dev/null
+++ b/core/installer/values-tmpl/jellyfin.yaml
@@ -0,0 +1,22 @@
+apiVersion: helm.toolkit.fluxcd.io/v2beta1
+kind: HelmRelease
+metadata:
+  name: jellyfin
+  namespace: {{ .Values.NamespacePrefix }}app-jellyfin
+spec:
+  chart:
+    spec:
+      chart: charts/jellyfin
+      sourceRef:
+        kind: GitRepository
+        name: pcloud
+        namespace: {{ .Values.Id }}
+  dependsOn:
+    - name: namespaces
+      namespace: {{ .Values.Id }}
+  interval: 1m0s
+  values:
+    pcloudInstanceId: {{ .Values.Id }}
+    ingress:
+      className: {{ .Values.Id }}-ingress-private
+      domain: jellyfin.p.{{ .Values.Domain }}
diff --git a/core/installer/values-tmpl/qbittorrent.yaml b/core/installer/values-tmpl/qbittorrent.yaml
new file mode 100644
index 0000000..0eaf507
--- /dev/null
+++ b/core/installer/values-tmpl/qbittorrent.yaml
@@ -0,0 +1,32 @@
+apiVersion: helm.toolkit.fluxcd.io/v2beta1
+kind: HelmRelease
+metadata:
+  name: qbittorrent
+  namespace: {{ .Values.NamespacePrefix }}app-torrent # TODO(giolekva): qbittorrent
+spec:
+  chart:
+    spec:
+      chart: charts/qbittorrent
+      sourceRef:
+        kind: GitRepository
+        name: pcloud
+        namespace: {{ .Values.Id }}
+  dependsOn:
+    - name: namespaces
+      namespace: {{ .Values.Id }}
+  interval: 1m0s
+  values:
+    pcloudInstanceId: {{ .Values.Id }}
+    image:
+      repository: lscr.io/linuxserver/qbittorrent
+      tag: latest
+      pullPolicy: IfNotPresent
+    ingress:
+      className: {{ .Values.Id }}-ingress-private
+      domain: torrent.p.{{ .Values.Domain }}
+    webui:
+      port: 8080
+    bittorrent:
+      port: 6881
+    storage:
+      size: 1Ti