diff --git a/core/installer/app_configs/app_global_env.cue b/core/installer/app_configs/app_global_env.cue
index ca7e099..47af9a0 100644
--- a/core/installer/app_configs/app_global_env.cue
+++ b/core/installer/app_configs/app_global_env.cue
@@ -11,21 +11,7 @@
 	network: #EnvNetwork
 }
 
-networks: {
-	public: #Network & {
-		name: "Public"
-		ingressClass: "\(global.pcloudEnvName)-ingress-public"
-		certificateIssuer: "\(global.id)-public"
-		domain: global.domain
-		allocatePortAddr: "http://port-allocator.\(global.pcloudEnvName)-ingress-public.svc.cluster.local/api/allocate"
-	}
-	private: #Network & {
-		name: "Private"
-		ingressClass: "\(global.id)-ingress-private"
-		domain: global.privateDomain
-		allocatePortAddr: "http://port-allocator.\(global.id)-ingress-private.svc.cluster.local/api/allocate"
-	}
-}
+networks: {}
 
 // TODO(gio): remove
 ingressPrivate: "\(global.id)-ingress-private"
diff --git a/core/installer/app_manager.go b/core/installer/app_manager.go
index 4fc0b1f..2cc29ed 100644
--- a/core/installer/app_manager.go
+++ b/core/installer/app_manager.go
@@ -649,6 +649,10 @@
 	}
 }
 
+func WithNoNetworks() InstallOption {
+	return WithNetworks([]Network{})
+}
+
 func WithBranch(branch string) InstallOption {
 	return func(o *installOptions) {
 		o.Branch = branch
diff --git a/core/installer/cmd/dodo_app.go b/core/installer/cmd/dodo_app.go
index 2eb5b8f..ea5e7fd 100644
--- a/core/installer/cmd/dodo_app.go
+++ b/core/installer/cmd/dodo_app.go
@@ -28,6 +28,7 @@
 	appAdminKey       string
 	gitRepoPublicKey  string
 	db                string
+	networks          []string
 }
 
 func dodoAppCmd() *cobra.Command {
@@ -101,6 +102,12 @@
 		"",
 		"",
 	)
+	cmd.Flags().StringSliceVar(
+		&dodoAppFlags.networks,
+		"networks",
+		[]string{},
+		"",
+	)
 	return cmd
 }
 
@@ -160,6 +167,7 @@
 		softClient,
 		dodoAppFlags.namespace,
 		dodoAppFlags.envAppManagerAddr,
+		dodoAppFlags.networks,
 		nsc,
 		jc,
 		env,
@@ -168,7 +176,7 @@
 		return err
 	}
 	if dodoAppFlags.appAdminKey != "" {
-		if _, err := s.CreateApp("app", dodoAppFlags.appAdminKey); err != nil {
+		if _, err := s.CreateApp("app", dodoAppFlags.appAdminKey, "Private"); err != nil {
 			return err
 		}
 	}
diff --git a/core/installer/values-tmpl/dodo-app-instance.cue b/core/installer/values-tmpl/dodo-app-instance.cue
index e22f177..e0d6906 100644
--- a/core/installer/values-tmpl/dodo-app-instance.cue
+++ b/core/installer/values-tmpl/dodo-app-instance.cue
@@ -15,7 +15,6 @@
 readme: "Deploy app by pushing to Git repository"
 description: "Deploy app by pushing to Git repository"
 icon: ""
-_domain: "\(input.subdomain).\(input.network.domain)"
 
 resources: {
 	"config-kustomization": {
diff --git a/core/installer/values-tmpl/dodo-app.cue b/core/installer/values-tmpl/dodo-app.cue
index 99d4418..974225f 100644
--- a/core/installer/values-tmpl/dodo-app.cue
+++ b/core/installer/values-tmpl/dodo-app.cue
@@ -8,7 +8,8 @@
 	network: #Network @name(Network)
 	subdomain: string @name(Subdomain)
 	sshPort: int @name(SSH Port) @role(port)
-	adminKey: string @name(Admin SSH Public Key)
+	adminKey: string | *"" @name(Admin SSH Public Key)
+	allowedNetworks: string | *"" @name(Allowed Networks)
 
 	// TODO(gio): auto generate
 	ssKeys: #SSHKey
@@ -117,6 +118,7 @@
 			appAdminKey: input.adminKey
 			gitRepoPublicKey: input.ssKeys.public
 			persistentVolumeClaimName: volumes.db.name
+			allowedNetworks: input.allowedNetworks
 		}
 	}
 }
diff --git a/core/installer/welcome/dodo-app-tmpl/index.html b/core/installer/welcome/dodo-app-tmpl/index.html
new file mode 100644
index 0000000..e9a9b11
--- /dev/null
+++ b/core/installer/welcome/dodo-app-tmpl/index.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html lang='en'>
+	<head>
+		<title>dodo: app</title>
+		<meta charset='utf-8'>
+	</head>
+	<body>
+		{{ range .Apps }}
+		<a href="/{{ . }}">{{ . }}</a>
+		{{ end }}
+	</body>
+</html>
diff --git a/core/installer/welcome/dodo_app.go b/core/installer/welcome/dodo_app.go
index 20e881d..1c91cbc 100644
--- a/core/installer/welcome/dodo_app.go
+++ b/core/installer/welcome/dodo_app.go
@@ -2,13 +2,16 @@
 
 import (
 	"context"
+	"embed"
 	"encoding/json"
 	"errors"
 	"fmt"
 	"golang.org/x/crypto/bcrypt"
+	"html/template"
 	"io"
 	"io/fs"
 	"net/http"
+	"slices"
 	"strings"
 	"sync"
 
@@ -19,6 +22,9 @@
 	"github.com/gorilla/securecookie"
 )
 
+//go:embed dodo-app-tmpl/*
+var dodoAppTmplFS embed.FS
+
 const (
 	ConfigRepoName = "config"
 	namespacesFile = "/namespaces.json"
@@ -28,6 +34,18 @@
 	userCtx        = "user"
 )
 
+type dodoAppTmplts struct {
+	index *template.Template
+}
+
+func parseTemplatesDodoApp(fs embed.FS) (dodoAppTmplts, error) {
+	index, err := template.New("index.html").ParseFS(fs, "dodo-app-tmpl/index.html")
+	if err != nil {
+		return dodoAppTmplts{}, err
+	}
+	return dodoAppTmplts{index}, nil
+}
+
 type DodoAppServer struct {
 	l                 sync.Locker
 	st                Store
@@ -39,12 +57,14 @@
 	client            soft.Client
 	namespace         string
 	envAppManagerAddr string
+	networks          []string
 	env               installer.EnvConfig
 	nsc               installer.NamespaceCreator
 	jc                installer.JobCreator
 	workers           map[string]map[string]struct{}
 	appNs             map[string]string
 	sc                *securecookie.SecureCookie
+	tmplts            dodoAppTmplts
 }
 
 // TODO(gio): Initialize appNs on startup
@@ -58,10 +78,15 @@
 	client soft.Client,
 	namespace string,
 	envAppManagerAddr string,
+	networks []string,
 	nsc installer.NamespaceCreator,
 	jc installer.JobCreator,
 	env installer.EnvConfig,
 ) (*DodoAppServer, error) {
+	tmplts, err := parseTemplatesDodoApp(dodoAppTmplFS)
+	if err != nil {
+		return nil, err
+	}
 	sc := securecookie.New(
 		securecookie.GenerateRandomKey(64),
 		securecookie.GenerateRandomKey(32),
@@ -77,12 +102,14 @@
 		client,
 		namespace,
 		envAppManagerAddr,
+		networks,
 		env,
 		nsc,
 		jc,
 		map[string]map[string]struct{}{},
 		map[string]string{},
 		sc,
+		tmplts,
 	}
 	config, err := client.GetRepo(ConfigRepoName)
 	if err != nil {
@@ -223,6 +250,10 @@
 	http.Redirect(w, r, fmt.Sprintf("/%s", appName), http.StatusSeeOther)
 }
 
+type statusData struct {
+	Apps []string
+}
+
 func (s *DodoAppServer) handleStatus(w http.ResponseWriter, r *http.Request) {
 	user := r.Context().Value(userCtx)
 	if user == nil {
@@ -234,8 +265,10 @@
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 		return
 	}
-	for _, a := range apps {
-		fmt.Fprintf(w, "%s\n", a)
+	data := statusData{apps}
+	if err := s.tmplts.index.Execute(w, data); err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
 	}
 }
 
@@ -272,7 +305,7 @@
 	c := contents.String()
 	fmt.Println(c)
 	if err := json.NewDecoder(strings.NewReader(c)).Decode(&req); err != nil {
-		fmt.Println(err)
+		http.Error(w, err.Error(), http.StatusBadRequest)
 		return
 	}
 	if req.Ref != "refs/heads/master" || req.Repository.Name == ConfigRepoName {
@@ -280,7 +313,7 @@
 	}
 	// TODO(gio): Create commit record on app init as well
 	go func() {
-		networks, err := getNetworks(fmt.Sprintf("%s/api/networks", s.envAppManagerAddr))
+		networks, err := s.getNetworks()
 		if err != nil {
 			return
 		}
@@ -326,6 +359,7 @@
 
 type apiCreateAppReq struct {
 	AdminPublicKey string `json:"adminPublicKey"`
+	NetworkName    string `json:"networkName"`
 }
 
 type apiCreateAppResp struct {
@@ -345,7 +379,7 @@
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 		return
 	}
-	password, err := s.CreateApp(appName, req.AdminPublicKey)
+	password, err := s.CreateApp(appName, req.AdminPublicKey, req.NetworkName)
 	if err != nil {
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 		return
@@ -360,7 +394,7 @@
 	}
 }
 
-func (s *DodoAppServer) CreateApp(appName, adminPublicKey string) (string, error) {
+func (s *DodoAppServer) CreateApp(appName, adminPublicKey, networkName string) (string, error) {
 	s.l.Lock()
 	defer s.l.Unlock()
 	fmt.Printf("Creating app: %s\n", appName)
@@ -373,11 +407,7 @@
 	if err != nil {
 		return "", err
 	}
-	if user != "" {
-		if err := s.client.AddPublicKey(user, adminPublicKey); err != nil {
-			return "", err
-		}
-	} else {
+	if user == "" {
 		user = appName
 		if err := s.client.AddUser(user, adminPublicKey); err != nil {
 			return "", err
@@ -409,7 +439,7 @@
 	if err != nil {
 		return "", err
 	}
-	if err := InitRepo(appRepo); err != nil {
+	if err := InitRepo(appRepo, networkName); err != nil {
 		return "", err
 	}
 	apps := installer.NewInMemoryAppRepository(installer.CreateAllApps())
@@ -424,7 +454,7 @@
 	}
 	namespace := fmt.Sprintf("%s%s%s", s.env.NamespacePrefix, app.Namespace(), suffix)
 	s.appNs[appName] = namespace
-	networks, err := getNetworks(fmt.Sprintf("%s/api/networks", s.envAppManagerAddr))
+	networks, err := s.getNetworks()
 	if err != nil {
 		return "", err
 	}
@@ -460,7 +490,7 @@
 				"gitRepoPublicKey": s.gitRepoPublicKey,
 			},
 			installer.WithConfig(&s.env),
-			installer.WithNetworks(networks),
+			installer.WithNoNetworks(),
 			installer.WithNoPublish(),
 			installer.WithNoLock(),
 		); err != nil {
@@ -593,14 +623,14 @@
 	type: "golang:1.22.0"
 	run: "main.go"
 	ingress: {
-		network: "Private" // or Public
+		network: "%s"
 		subdomain: "testapp"
 		auth: enabled: false
 	}
 }
 `
 
-func InitRepo(repo soft.RepoIO) error {
+func InitRepo(repo soft.RepoIO, networkName string) error {
 	return repo.Do(func(fs soft.RepoFS) (string, error) {
 		{
 			w, err := fs.Writer("go.mod")
@@ -624,7 +654,7 @@
 				return "", err
 			}
 			defer w.Close()
-			fmt.Fprint(w, appCue)
+			fmt.Fprintf(w, appCue, networkName)
 		}
 		return "go web app template", nil
 	})
@@ -634,14 +664,24 @@
 	return "foo"
 }
 
-func getNetworks(addr string) ([]installer.Network, error) {
+func (s *DodoAppServer) getNetworks() ([]installer.Network, error) {
+	addr := fmt.Sprintf("%s/api/networks", s.envAppManagerAddr)
 	resp, err := http.Get(addr)
 	if err != nil {
 		return nil, err
 	}
-	ret := []installer.Network{}
-	if json.NewDecoder(resp.Body).Decode(&ret); err != nil {
+	networks := []installer.Network{}
+	if json.NewDecoder(resp.Body).Decode(&networks); err != nil {
 		return nil, err
 	}
+	if len(s.networks) == 0 {
+		return networks, nil
+	}
+	ret := []installer.Network{}
+	for _, n := range networks {
+		if slices.Contains(s.networks, n.Name) {
+			ret = append(ret, n)
+		}
+	}
 	return ret, nil
 }
