diff --git a/cli/cli.go b/cli/cli.go
index d8a48344..b1bc445c 100644
--- a/cli/cli.go
+++ b/cli/cli.go
@@ -7,7 +7,7 @@ var Shortcuts = map[string]string{
 	"info":     "apps:info",
 	"login":    "auth:login",
 	"logout":   "auth:logout",
-	"logs":     "apps:logs",
+	"logs":     "ps:logs",
 	"open":     "apps:open",
 	"pull":     "builds:create",
 	"rollback": "releases:rollback",
diff --git a/cmd/builds.go b/cmd/builds.go
index 1c8e3833..f023a738 100644
--- a/cmd/builds.go
+++ b/cmd/builds.go
@@ -93,17 +93,10 @@ func (d *DryccCmd) BuildsFetch(appID string, version int, procfile, dryccpath, c
 		return err
 	}
 	// Confirm again
-	dockerfile := "Dockerfile"
-	err = buildFetchConfirmAction(confirm, dockerfile, procfile, dryccpath, save)
+	err = buildFetchConfirmAction(confirm, procfile, dryccpath, save)
 	if err != nil {
 		return err
 	}
-	if len(build.Dockerfile) != 0 {
-		err := writeDockerfileToPath(d, dockerfile, build.Dockerfile, save)
-		if err != nil {
-			return fmt.Errorf("failed to write Dockerfile: %w", err)
-		}
-	}
 
 	if len(build.Procfile) != 0 {
 		err := writeProcfileToPath(d, procfile, build.Procfile, save)
@@ -124,25 +117,13 @@ func (d *DryccCmd) BuildsFetch(appID string, version int, procfile, dryccpath, c
 	return nil
 }
 
-func writeDockerfileToPath(d *DryccCmd, dockerfile string, dockerinfo string, save bool) error {
-	if save {
-		os.Remove(dockerfile)
-		err := os.WriteFile(dockerfile, []byte(dockerinfo), 0664)
-		return err
-	}
-	d.Println("# Source:", dockerfile)
-	d.Println(dockerinfo)
-	return nil
-
-}
-
 func writeProcfileToPath(d *DryccCmd, procfile string, Procinfo map[string]string, save bool) error {
 	if save {
 		os.Remove(procfile)
 		err := os.WriteFile(procfile, []byte(d.toYamlString(Procinfo, 2)), 0664)
 		return err
 	}
-	d.Println("# Source:", procfile)
+	d.Println("---\n# Source:", procfile)
 	d.Println(d.toYamlString(Procinfo, 2))
 	return nil
 }
@@ -180,7 +161,7 @@ func writeDryccfileToPath(d *DryccCmd, dryccpath string, dryccfile map[string]in
 					return fmt.Errorf("failed to write env file: %w", err)
 				}
 			} else {
-				d.Println("# Source:", envFilePath)
+				d.Println("---\n# Source:", envFilePath)
 				d.Println(content)
 			}
 		}
@@ -203,7 +184,7 @@ func writeDryccfileToPath(d *DryccCmd, dryccpath string, dryccfile map[string]in
 					return fmt.Errorf("failed to write pipeline file: %w", err)
 				}
 			} else {
-				d.Println("# Source:", filePath)
+				d.Println("---\n# Source:", filePath)
 				d.Println(string(yamlContent))
 			}
 		}
@@ -238,13 +219,13 @@ func buildConfirmAction(c *drycc.Client, appID string, procfileMap map[string]st
 	return nil
 }
 
-func buildFetchConfirmAction(confirm, dockerfile, procfile, dryccpath string, save bool) error {
+func buildFetchConfirmAction(confirm, procfile, dryccpath string, save bool) error {
 
 	if save && (confirm == "" || confirm != "yes") {
 		// hint
 		msg := fmt.Sprintf(" !    WARNING: Potentially Build Fetch Action\n"+
-			" !    This operation will overwrite the current \x1b[1m%s\x1b[0m, \x1b[1m%s\x1b[0m or \x1b[1m%s\x1b[0m locally\n"+
-			" !    To proceed, type \"yes\" !\n\n> ", dockerfile, procfile, dryccpath)
+			" !    This operation will overwrite the current \x1b[1m%s\x1b[0m or \x1b[1m%s\x1b[0m locally\n"+
+			" !    To proceed, type \"yes\" !\n\n> ", procfile, dryccpath)
 
 		fmt.Print(msg)
 		fmt.Scanln(&confirm)
diff --git a/cmd/config.go b/cmd/config.go
index ec7962ac..190a843f 100644
--- a/cmd/config.go
+++ b/cmd/config.go
@@ -13,7 +13,6 @@ import (
 	"github.com/drycc/controller-sdk-go/api"
 	"github.com/drycc/controller-sdk-go/appsettings"
 	"github.com/drycc/controller-sdk-go/config"
-	"sigs.k8s.io/yaml"
 )
 
 // ConfigInfo for an app
@@ -32,7 +31,12 @@ func (d *DryccCmd) ConfigInfo(appID string, ptype string, group string, version
 		Group: make(map[string][]api.ConfigVar),
 		Ptype: make(map[string]api.PtypeValue),
 	}
+	hasGlobalGroup := false
 	for _, value := range sortConfigValues(config.Values) {
+		if value.Group == "global" {
+			hasGlobalGroup = true
+		}
+
 		// display the selected or all
 		if (ptype != "" && value.Ptype == ptype) ||
 			(group != "" && value.Group == group) ||
@@ -70,11 +74,43 @@ func (d *DryccCmd) ConfigInfo(appID string, ptype string, group string, version
 		return nil
 	}
 
-	c, err := yaml.Marshal(cv)
-	if err != nil {
-		return err
+	// Format and print the output
+
+	// print group
+	for group, configVars := range cv.Group {
+		d.Println("---\n# Group:", group)
+		var content string
+		for _, configVar := range configVars {
+			content += fmt.Sprintf("%s=%v\n", configVar.Name, configVar.Value)
+		}
+		d.Println(content)
 	}
-	d.Println(string(c))
+	// print ptype
+	for ptype, ptypeValue := range cv.Ptype {
+		d.Printf("---\n# Ptype %s config\n", ptype)
+
+		if len(ptypeValue.Env) > 0 {
+			d.Println("## env")
+			var content string
+			for _, configVar := range ptypeValue.Env {
+				content += fmt.Sprintf("%s=%v\n", configVar.Name, configVar.Value)
+			}
+			d.Println(content)
+		}
+
+		if len(ptypeValue.Ref) > 0 {
+			d.Println("## ref")
+			var content string
+			for _, ref := range ptypeValue.Ref {
+				content += fmt.Sprintf("- %s\n", ref)
+			}
+			if hasGlobalGroup {
+				content += fmt.Sprintf("- %s\n", "global")
+			}
+			d.Println(content)
+		}
+	}
+
 	return nil
 }
 
diff --git a/cmd/shortcuts_test.go b/cmd/shortcuts_test.go
index d8a341c8..fadf637a 100644
--- a/cmd/shortcuts_test.go
+++ b/cmd/shortcuts_test.go
@@ -12,7 +12,7 @@ destroy -> apps:destroy
 info -> apps:info
 login -> auth:login
 logout -> auth:logout
-logs -> apps:logs
+logs -> ps:logs
 open -> apps:open
 pull -> builds:create
 rollback -> releases:rollback
diff --git a/drycc.go b/drycc.go
index 3dbc6e6d..3e51b28d 100644
--- a/drycc.go
+++ b/drycc.go
@@ -83,8 +83,9 @@ Shortcut commands, use 'drycc shortcuts' to see all:
 
   create        create a new application
   destroy       destroy an application
+  exec          execute a command in a container
   info          view information about the current app
-  logs          view aggregated log info for the app
+  logs          print the logs for a container
   open          open a URL to the app in a browser
   pull          imports an image and deploys as a new release
   run           run a command in an ephemeral app container
