diff --git a/core/installer/cmd/dodo_app.go b/core/installer/cmd/dodo_app.go
index 3e4f6bd..5d54147 100644
--- a/core/installer/cmd/dodo_app.go
+++ b/core/installer/cmd/dodo_app.go
@@ -2,8 +2,6 @@
 
 import (
 	"encoding/json"
-	"errors"
-	"fmt"
 	"log"
 	"os"
 
@@ -95,7 +93,8 @@
 	if err != nil {
 		return err
 	}
-	softClient, err := soft.NewClient(dodoAppFlags.repoAddr, sshKey, log.Default())
+	cg := soft.RealClientGetter{}
+	softClient, err := cg.Get(dodoAppFlags.repoAddr, sshKey, log.Default())
 	if err != nil {
 		return err
 	}
@@ -103,144 +102,25 @@
 	if err != nil {
 		return err
 	}
-	if err := softClient.AddRepository("config"); err == nil {
-		repo, err := softClient.GetRepo("config")
-		if err != nil {
-			return err
-		}
-		appRepo := installer.NewInMemoryAppRepository(installer.CreateAllApps())
-		app, err := installer.FindEnvApp(appRepo, "dodo-app-instance")
-		if err != nil {
-			return err
-		}
-		nsc := installer.NewNoOpNamespaceCreator()
-		if err != nil {
-			return err
-		}
-		hf := installer.NewGitHelmFetcher()
-		m, err := installer.NewAppManager(repo, nsc, jc, hf, "/")
-		if err != nil {
-			return err
-		}
-		if _, err := m.Install(app, "app", "/app", dodoAppFlags.namespace, map[string]any{
-			"appName":          "app",
-			"repoAddr":         softClient.GetRepoAddress("app"),
-			"gitRepoPublicKey": dodoAppFlags.gitRepoPublicKey,
-		}, installer.WithConfig(&env)); err != nil {
-			return err
-		}
-		if cfg, err := m.FindInstance("app"); err != nil {
-			return err
-		} else {
-			fluxKeys, ok := cfg.Input["fluxKeys"]
-			if !ok {
-				return fmt.Errorf("Fluxcd keys not found")
-			}
-			fluxPublicKey, ok := fluxKeys.(map[string]any)["public"]
-			if !ok {
-				return fmt.Errorf("Fluxcd keys not found")
-			}
-			if err := softClient.AddUser("fluxcd", fluxPublicKey.(string)); err != nil {
-				return err
-			}
-			if err := softClient.AddReadOnlyCollaborator("app", "fluxcd"); err != nil {
-				return err
-			}
-		}
-	} else if !errors.Is(err, soft.ErrorAlreadyExists) {
+	nsc, err := newNSCreator()
+	if err != nil {
 		return err
 	}
-	if err := softClient.AddRepository("app"); err == nil {
-		repo, err := softClient.GetRepo("app")
-		if err != nil {
+	s := welcome.NewDodoAppServer(
+		dodoAppFlags.port,
+		dodoAppFlags.self,
+		string(sshKey),
+		dodoAppFlags.gitRepoPublicKey,
+		softClient,
+		dodoAppFlags.namespace,
+		nsc,
+		jc,
+		env,
+	)
+	if dodoAppFlags.appAdminKey != "" {
+		if err := s.CreateApp("app", dodoAppFlags.appAdminKey); err != nil {
 			return err
 		}
-		if err := initRepo(repo); err != nil {
-			return err
-		}
-		if err := welcome.UpdateDodoApp("app", softClient, dodoAppFlags.namespace, string(sshKey), jc, &env); err != nil {
-			return err
-		}
-		if err := softClient.AddWebhook("app", fmt.Sprintf("http://%s/update", dodoAppFlags.self), "--active=true", "--events=push", "--content-type=json"); err != nil {
-			return err
-		}
-		if err := softClient.AddUser("app", dodoAppFlags.appAdminKey); err != nil {
-			return err
-		}
-		if err := softClient.AddReadWriteCollaborator("app", "app"); err != nil {
-			return err
-		}
-	} else if !errors.Is(err, soft.ErrorAlreadyExists) {
-		return err
 	}
-	s := welcome.NewDodoAppServer(dodoAppFlags.port, string(sshKey), softClient, dodoAppFlags.namespace, jc, env)
 	return s.Start()
 }
-
-const goMod = `module dodo.app
-
-go 1.18
-`
-
-const mainGo = `package main
-
-import (
-	"flag"
-	"fmt"
-	"log"
-	"net/http"
-)
-
-var port = flag.Int("port", 8080, "Port to listen on")
-
-func handler(w http.ResponseWriter, r *http.Request) {
-	fmt.Fprintln(w, "Hello from Dodo App!")
-}
-
-func main() {
-	flag.Parse()
-	http.HandleFunc("/", handler)
-	log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", *port), nil))
-}
-`
-
-const appCue = `app: {
-	type: "golang:1.22.0"
-	run: "main.go"
-	ingress: {
-		network: "Private" // or Public
-		subdomain: "testapp"
-		auth: enabled: false
-	}
-}
-`
-
-func initRepo(repo soft.RepoIO) error {
-	return repo.Do(func(fs soft.RepoFS) (string, error) {
-		{
-			w, err := fs.Writer("go.mod")
-			if err != nil {
-				return "", err
-			}
-			defer w.Close()
-			fmt.Fprint(w, goMod)
-		}
-		{
-			w, err := fs.Writer("main.go")
-			if err != nil {
-				return "", err
-			}
-			defer w.Close()
-			fmt.Fprintf(w, "%s", mainGo)
-		}
-		{
-			w, err := fs.Writer("app.cue")
-			if err != nil {
-				return "", err
-			}
-			defer w.Close()
-			fmt.Fprint(w, appCue)
-		}
-		return "go web app template", nil
-	})
-}
