diff --git a/core/installer/cmd/app_manager.go b/core/installer/cmd/app_manager.go
new file mode 100644
index 0000000..1fc6d64
--- /dev/null
+++ b/core/installer/cmd/app_manager.go
@@ -0,0 +1,55 @@
+package main
+
+import (
+	"os"
+
+	"github.com/giolekva/pcloud/core/installer"
+	"github.com/spf13/cobra"
+	"golang.org/x/crypto/ssh"
+)
+
+var appManagerFlags struct {
+	sshKey   string
+	repoAddr string
+}
+
+func appManagerCmd() *cobra.Command {
+	cmd := &cobra.Command{
+		Use:  "appmanager",
+		RunE: installCmdRun,
+	}
+	cmd.Flags().StringVar(
+		&installFlags.sshKey,
+		"ssh-key",
+		"",
+		"",
+	)
+	cmd.Flags().StringVar(
+		&installFlags.repoAddr,
+		"repo-addr",
+		"",
+		"",
+	)
+	return cmd
+}
+
+func appManagerCmdRun(cmd *cobra.Command, args []string) error {
+	sshKey, err := os.ReadFile(installFlags.sshKey)
+	if err != nil {
+		return err
+	}
+	signer, err := ssh.ParsePrivateKey(sshKey)
+	if err != nil {
+		return err
+	}
+	repo, err := cloneRepo(installFlags.repoAddr, signer)
+	if err != nil {
+		return err
+	}
+	_, err = installer.NewAppManager(repo, signer)
+	if err != nil {
+		return err
+	}
+	// TODO(gio): start server
+	return nil
+}
diff --git a/core/installer/cmd/apps.go b/core/installer/cmd/apps.go
index b96ac6f..0a58be2 100644
--- a/core/installer/cmd/apps.go
+++ b/core/installer/cmd/apps.go
@@ -1,28 +1,22 @@
 package main
 
 import (
-	"fmt"
-	"io/ioutil"
 	"net"
 	"os"
-	"time"
 
 	"github.com/giolekva/pcloud/core/installer"
 	"github.com/go-git/go-billy/v5/memfs"
 	"github.com/go-git/go-git/v5"
-	"github.com/go-git/go-git/v5/plumbing/object"
 	gitssh "github.com/go-git/go-git/v5/plumbing/transport/ssh"
 	"github.com/go-git/go-git/v5/storage/memory"
 	"github.com/spf13/cobra"
 	"golang.org/x/crypto/ssh"
-	"sigs.k8s.io/yaml"
 )
 
 const appDirName = "apps"
 
 var installFlags struct {
 	sshKey   string
-	config   string
 	appName  string
 	repoAddr string
 }
@@ -39,12 +33,6 @@
 		"",
 	)
 	cmd.Flags().StringVar(
-		&installFlags.config,
-		"config",
-		"",
-		"",
-	)
-	cmd.Flags().StringVar(
 		&installFlags.appName,
 		"app",
 		"",
@@ -59,30 +47,7 @@
 	return cmd
 }
 
-type inMemoryAppRepository struct {
-	apps []installer.App
-}
-
-func NewInMemoryAppRepository(apps []installer.App) installer.AppRepository {
-	return &inMemoryAppRepository{
-		apps,
-	}
-}
-
-func (r inMemoryAppRepository) Find(name string) (*installer.App, error) {
-	for _, a := range r.apps {
-		if a.Name == name {
-			return &a, nil
-		}
-	}
-	return nil, fmt.Errorf("Application not found: %s", name)
-}
-
 func installCmdRun(cmd *cobra.Command, args []string) error {
-	cfg, err := readConfig(installFlags.config)
-	if err != nil {
-		return err
-	}
 	sshKey, err := os.ReadFile(installFlags.sshKey)
 	if err != nil {
 		return err
@@ -95,58 +60,19 @@
 	if err != nil {
 		return err
 	}
-	wt, err := repo.Worktree()
-	if err != nil {
-		return err
-	}
-	appRoot, err := wt.Filesystem.Chroot(appDirName)
-	if err != nil {
-		return err
-	}
 	m, err := installer.NewAppManager(
-		appRoot,
-		cfg,
-		NewInMemoryAppRepository(installer.CreateAllApps()),
+		repo,
+		signer,
 	)
 	if err != nil {
 		return err
 	}
-	if err := m.Install(installFlags.appName); err != nil {
-		return err
-	}
-	if st, err := wt.Status(); err != nil {
-		return err
-	} else {
-		fmt.Printf("%+v\n", st)
-	}
-	wt.AddGlob("*")
-	if st, err := wt.Status(); err != nil {
-		return err
-	} else {
-		fmt.Printf("%+v\n", st)
-	}
-	if _, err := wt.Commit(fmt.Sprintf("install: %s", installFlags.appName), &git.CommitOptions{
-		Author: &object.Signature{
-			Name: "pcloud-appmanager",
-			When: time.Now(),
-		},
-	}); err != nil {
-		return err
-	}
-	return repo.Push(&git.PushOptions{
-		RemoteName: "origin",
-		Auth:       auth(signer),
-	})
-}
-
-func readConfig(config string) (installer.Config, error) {
-	var cfg installer.Config
-	inp, err := ioutil.ReadFile(config)
+	appRepo := installer.NewInMemoryAppRepository(installer.CreateAllApps())
+	app, err := appRepo.Find(installFlags.appName)
 	if err != nil {
-		return cfg, err
+		return err
 	}
-	err = yaml.UnmarshalStrict(inp, &cfg)
-	return cfg, err
+	return m.Install(*app)
 }
 
 func cloneRepo(address string, signer ssh.Signer) (*git.Repository, error) {
