diff --git a/core/installer/soft/client.go b/core/installer/soft/client.go
index 582b216..01d79c7 100644
--- a/core/installer/soft/client.go
+++ b/core/installer/soft/client.go
@@ -10,7 +10,7 @@
 
 	"github.com/go-git/go-billy/v5/memfs"
 	"github.com/go-git/go-git/v5"
-	"github.com/go-git/go-git/v5/config"
+	// "github.com/go-git/go-git/v5/config"
 	"github.com/go-git/go-git/v5/plumbing"
 	"github.com/go-git/go-git/v5/plumbing/object"
 	gitssh "github.com/go-git/go-git/v5/plumbing/transport/ssh"
@@ -31,7 +31,7 @@
 	if err != nil {
 		return nil, err
 	}
-	log.SetPrefix("SOFT-SERVE")
+	log.SetPrefix("SOFT-SERVE: ")
 	return &Client{
 		ip,
 		port,
@@ -40,31 +40,21 @@
 	}, nil
 }
 
-func (ss *Client) UpdateConfig(config Config, reason string) error {
-	log.Print("Updating configuration")
-	configBytes, err := yaml.Marshal(config)
-	if err != nil {
+func (ss *Client) AddUser(name, pubKey string) error {
+	log.Printf("Adding user %s", name)
+	if err := ss.RunCommand(fmt.Sprintf("user create %s", name)); err != nil {
 		return err
 	}
-	repo, err := ss.cloneRepository("config")
-	if err != nil {
-		return err
-	}
-	wt, err := repo.Worktree()
-	if err != nil {
-		return err
-	}
-	if err := ss.writeFile(wt, "config.yaml", string(configBytes)); err != nil {
-		return err
-	}
-	if err := ss.commit(wt, reason); err != nil {
-		return nil
-	}
-	return ss.push(repo)
+	return ss.RunCommand(fmt.Sprintf("user add-pubkey %s %s", name, pubKey))
 }
 
-func (ss *Client) ReloadConfig() error {
-	log.Print("Reloading configuration")
+func (ss *Client) MakeUserAdmin(name string) error {
+	log.Printf("Making user %s admin", name)
+	return ss.RunCommand(fmt.Sprintf("user set-admin %s true", name))
+}
+
+func (ss *Client) RunCommand(cmd string) error {
+	log.Printf("Running command %s", cmd)
 	client, err := ssh.Dial("tcp", ss.addressSSH(), ss.sshClientConfig())
 	if err != nil {
 		return err
@@ -74,32 +64,17 @@
 		return err
 	}
 	defer session.Close()
-	return session.Run("reload")
+	return session.Run(cmd)
 }
 
 func (ss *Client) AddRepository(name, readme string) error {
 	log.Printf("Adding repository %s", name)
-	repo, err := git.Init(memory.NewStorage(), memfs.New())
-	if err != nil {
-		return err
-	}
-	wt, err := repo.Worktree()
-	if err != nil {
-		return err
-	}
-	if err := ss.writeFile(wt, "README.md", readme); err != nil {
-		return err
-	}
-	if err := ss.commit(wt, "init"); err != nil {
-		return err
-	}
-	if _, err := repo.CreateRemote(&config.RemoteConfig{
-		Name: "soft",
-		URLs: []string{ss.repoPathByName(name)},
-	}); err != nil {
-		return err
-	}
-	return ss.push(repo)
+	return ss.RunCommand(fmt.Sprintf("repo create %s -d \"%s\"", name, readme))
+}
+
+func (ss *Client) AddCollaborator(repo, user string) error {
+	log.Printf("Adding collaborator %s %s", repo, user)
+	return ss.RunCommand(fmt.Sprintf("repo collab add %s %s", repo, user))
 }
 
 func (ss *Client) CreateRepository(name string) error {
@@ -152,10 +127,10 @@
 	if err := ss.writeFile(wt, "config.yaml", string(configBytes)); err != nil {
 		return err
 	}
-	if err := ss.commit(wt, fmt.Sprintf("add-repo: %s", name)); err != nil {
+	if err := ss.Commit(wt, fmt.Sprintf("add-repo: %s", name)); err != nil {
 		return err
 	}
-	return ss.push(configRepo)
+	return ss.Push(configRepo)
 }
 
 func (ss *Client) getConfigRepo() (*git.Repository, error) {
@@ -174,7 +149,7 @@
 	return fmt.Sprintf("%s/%s", ss.addressGit(), name)
 }
 
-func (ss *Client) commit(wt *git.Worktree, message string) error {
+func (ss *Client) Commit(wt *git.Worktree, message string) error {
 	_, err := wt.Commit(message, &git.CommitOptions{
 		Author: &object.Signature{
 			Name:  "pcloud",
@@ -185,7 +160,7 @@
 	return err
 }
 
-func (ss *Client) push(repo *git.Repository) error {
+func (ss *Client) Push(repo *git.Repository) error {
 	return repo.Push(&git.PushOptions{
 		RemoteName: "soft",
 		Auth:       ss.authGit(),
@@ -205,7 +180,7 @@
 	return err
 }
 
-func (ss *Client) cloneRepository(name string) (*git.Repository, error) {
+func (ss *Client) CloneRepository(name string) (*git.Repository, error) {
 	return git.Clone(memory.NewStorage(), memfs.New(), &git.CloneOptions{
 		URL:             ss.repoPathByName(name),
 		Auth:            ss.authGit(),
@@ -227,6 +202,24 @@
 	}
 }
 
+func (ss *Client) GetPublicKey() ([]byte, error) {
+	var ret []byte
+	config := &ssh.ClientConfig{
+		Auth: []ssh.AuthMethod{
+			ssh.PublicKeys(ss.signer),
+		},
+		HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
+			ret = ssh.MarshalAuthorizedKey(key)
+			return nil
+		},
+	}
+	_, err := ssh.Dial("tcp", ss.addressSSH(), config)
+	if err != nil {
+		return nil, err
+	}
+	return ret, nil
+}
+
 func (ss *Client) sshClientConfig() *ssh.ClientConfig {
 	return &ssh.ClientConfig{
 		Auth: []ssh.AuthMethod{
@@ -235,6 +228,7 @@
 		HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
 			// TODO(giolekva): verify server public key
 			// fmt.Printf("## %s || %s -- \n", serverPubKey, ssh.MarshalAuthorizedKey(key))
+			fmt.Printf("%s %s %s", hostname, remote, ssh.MarshalAuthorizedKey(key))
 			return nil
 		},
 	}
