installer: refactor App interface
diff --git a/core/installer/tasks/env.go b/core/installer/tasks/env.go
index f5978b3..04b3c9a 100644
--- a/core/installer/tasks/env.go
+++ b/core/installer/tasks/env.go
@@ -20,7 +20,7 @@
 	fluxUserName   string
 	keys           *keygen.KeyPair
 	appManager     *installer.AppManager
-	appsRepo       installer.AppRepository[installer.App]
+	appsRepo       installer.AppRepository
 	nsGen          installer.NamespaceGenerator
 	emptySuffixGen installer.SuffixGenerator
 }
diff --git a/core/installer/tasks/infra.go b/core/installer/tasks/infra.go
index d7ff235..39d9f50 100644
--- a/core/installer/tasks/infra.go
+++ b/core/installer/tasks/infra.go
@@ -113,7 +113,7 @@
 			if err != nil {
 				return err
 			}
-			if err := st.appManager.Install(*app, st.nsGen, installer.NewSuffixGenerator("-ingress-private"), map[string]any{
+			if err := st.appManager.Install(app, st.nsGen, installer.NewSuffixGenerator("-ingress-private"), map[string]any{
 				"name":       fmt.Sprintf("%s-ingress-private", env.Name),
 				"from":       ingressPrivateIP.String(),
 				"to":         ingressPrivateIP.String(),
@@ -122,7 +122,7 @@
 			}); err != nil {
 				return err
 			}
-			if err := st.appManager.Install(*app, st.nsGen, installer.NewSuffixGenerator("-headscale"), map[string]any{
+			if err := st.appManager.Install(app, st.nsGen, installer.NewSuffixGenerator("-headscale"), map[string]any{
 				"name":       fmt.Sprintf("%s-headscale", env.Name),
 				"from":       headscaleIP.String(),
 				"to":         headscaleIP.String(),
@@ -131,7 +131,7 @@
 			}); err != nil {
 				return err
 			}
-			if err := st.appManager.Install(*app, st.nsGen, st.emptySuffixGen, map[string]any{
+			if err := st.appManager.Install(app, st.nsGen, st.emptySuffixGen, map[string]any{
 				"name":       env.Name,
 				"from":       "10.1.0.100", // TODO(gio): auto-generate
 				"to":         "10.1.0.254",
@@ -146,7 +146,7 @@
 			if err != nil {
 				return err
 			}
-			if err := st.appManager.Install(*app, st.nsGen, st.emptySuffixGen, map[string]any{
+			if err := st.appManager.Install(app, st.nsGen, st.emptySuffixGen, map[string]any{
 				"privateNetwork": map[string]any{
 					"hostname": "private-network-proxy",
 					"username": "private-network-proxy",
@@ -167,7 +167,7 @@
 		if err != nil {
 			return err
 		}
-		if err := st.appManager.Install(*app, st.nsGen, st.emptySuffixGen, map[string]any{}); err != nil {
+		if err := st.appManager.Install(app, st.nsGen, st.emptySuffixGen, map[string]any{}); err != nil {
 			return err
 		}
 		return nil
@@ -177,7 +177,7 @@
 		if err != nil {
 			return err
 		}
-		if err := st.appManager.Install(*app, st.nsGen, st.emptySuffixGen, map[string]any{
+		if err := st.appManager.Install(app, st.nsGen, st.emptySuffixGen, map[string]any{
 			"apiConfigMap": map[string]any{
 				"name":      "api-config", // TODO(gio): take from global pcloud config
 				"namespace": fmt.Sprintf("%s-dns-zone-manager", env.PCloudEnvName),
@@ -196,7 +196,7 @@
 		if err != nil {
 			return err
 		}
-		if err := st.appManager.Install(*app, st.nsGen, st.emptySuffixGen, map[string]any{
+		if err := st.appManager.Install(app, st.nsGen, st.emptySuffixGen, map[string]any{
 			"subdomain": "test", // TODO(giolekva): make core-auth chart actually use this
 		}); err != nil {
 			return err
@@ -216,7 +216,7 @@
 		if err != nil {
 			return err
 		}
-		if err := st.appManager.Install(*app, st.nsGen, st.emptySuffixGen, map[string]any{
+		if err := st.appManager.Install(app, st.nsGen, st.emptySuffixGen, map[string]any{
 			"subdomain": "headscale",
 		}); err != nil {
 			return err
@@ -247,7 +247,7 @@
 		if err != nil {
 			return err
 		}
-		if err := st.appManager.Install(*app, st.nsGen, st.emptySuffixGen, map[string]any{
+		if err := st.appManager.Install(app, st.nsGen, st.emptySuffixGen, map[string]any{
 			"repoAddr":      st.ssClient.GetRepoAddress("config"),
 			"sshPrivateKey": string(keys.RawPrivateKey()),
 		}); err != nil {
@@ -279,7 +279,7 @@
 		if err != nil {
 			return err
 		}
-		if err := st.appManager.Install(*app, st.nsGen, st.emptySuffixGen, map[string]any{
+		if err := st.appManager.Install(app, st.nsGen, st.emptySuffixGen, map[string]any{
 			"repoAddr":      st.ssClient.GetRepoAddress("config"),
 			"sshPrivateKey": string(keys.RawPrivateKey()),
 		}); err != nil {
diff --git a/core/installer/tasks/init.go b/core/installer/tasks/init.go
index d41dde7..f898a1f 100644
--- a/core/installer/tasks/init.go
+++ b/core/installer/tasks/init.go
@@ -52,7 +52,7 @@
 		if err := st.nsCreator.Create(env.Name); err != nil {
 			return err
 		}
-		if err := st.repo.InstallApp(*ssApp, filepath.Join("/environments", env.Name, "config-repo"), ssValues, derived); err != nil {
+		if err := st.repo.InstallApp(ssApp, filepath.Join("/environments", env.Name, "config-repo"), ssValues, derived); err != nil {
 			return err
 		}
 		return nil