diff --git a/cmd/autorollback.go b/cmd/autorollback.go
new file mode 100644
index 00000000..eade7596
--- /dev/null
+++ b/cmd/autorollback.go
@@ -0,0 +1,76 @@
+package cmd
+
+import (
+	"github.com/drycc/controller-sdk-go/api"
+	"github.com/drycc/controller-sdk-go/appsettings"
+)
+
+// AutorollbackInfo provides information about the status of app autorollback.
+func (d *DryccCmd) AutorollbackInfo(appID string) error {
+	s, appID, err := load(d.ConfigFile, appID)
+
+	if err != nil {
+		return err
+	}
+
+	appSettings, err := appsettings.List(s.Client, appID)
+	if d.checkAPICompatibility(s.Client, err) != nil {
+		return err
+	}
+
+	if appSettings.Autorollback == nil || *appSettings.Autorollback {
+		d.Println("Autorollback is enabled.")
+	} else {
+		d.Println("Autorollback is disabled.")
+	}
+	return nil
+}
+
+// AutorollbackEnable enables an app when deploy failed
+func (d *DryccCmd) AutorollbackEnable(appID string) error {
+	s, appID, err := load(d.ConfigFile, appID)
+
+	if err != nil {
+		return err
+	}
+
+	d.Printf("Enabling autorollback for %s... ", appID)
+
+	quit := progress(d.WOut)
+	appSettings := api.AppSettings{Autorollback: api.NewAutorollback()}
+	_, err = appsettings.Set(s.Client, appID, appSettings)
+	quit <- true
+	<-quit
+
+	if err != nil {
+		return err
+	}
+
+	d.Println("done")
+	return nil
+}
+
+// AutorollbackDisable disables an app when deploy failed
+func (d *DryccCmd) AutorollbackDisable(appID string) error {
+	s, appID, err := load(d.ConfigFile, appID)
+
+	if err != nil {
+		return err
+	}
+
+	d.Printf("Disabling autorollback for %s... ", appID)
+
+	quit := progress(d.WOut)
+	appSettings := api.AppSettings{Autorollback: api.NewAutorollback()}
+	*appSettings.Autorollback = false
+	_, err = appsettings.Set(s.Client, appID, appSettings)
+	quit <- true
+	<-quit
+
+	if err != nil {
+		return err
+	}
+
+	d.Println("done")
+	return nil
+}
diff --git a/cmd/autorollback_test.go b/cmd/autorollback_test.go
new file mode 100644
index 00000000..7fa4df52
--- /dev/null
+++ b/cmd/autorollback_test.go
@@ -0,0 +1,118 @@
+package cmd
+
+import (
+	"bytes"
+	"fmt"
+	"net/http"
+	"testing"
+
+	"github.com/drycc/controller-sdk-go/api"
+	"github.com/drycc/workflow-cli/pkg/testutil"
+	"github.com/stretchr/testify/assert"
+)
+
+func TestAutorollbackInfo(t *testing.T) {
+	t.Parallel()
+	cf, server, err := testutil.NewTestServerAndClient()
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer server.Close()
+	var b bytes.Buffer
+	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
+
+	server.Mux.HandleFunc("/v2/apps/rivendell/settings/", func(w http.ResponseWriter, _ *http.Request) {
+		testutil.SetHeaders(w)
+		fmt.Fprintf(w, `{
+			"owner": "elrond",
+			"app": "rivendell",
+			"routable": true,
+			"autoerollback": true,
+			"created": "2024-01-01T00:00:00UTC",
+			"updated": "2024-01-01T00:00:00UTC",
+			"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+		}`)
+	})
+
+	err = cmdr.AutorollbackInfo("rivendell")
+	assert.NoError(t, err)
+	assert.Equal(t, b.String(), "Autorollback is enabled.\n", "output")
+
+	server.Mux.HandleFunc("/v2/apps/mordor/settings/", func(w http.ResponseWriter, _ *http.Request) {
+		testutil.SetHeaders(w)
+		fmt.Fprintf(w, `{
+			"owner": "sauron",
+			"app": "mordor",
+			"routable": false,
+			"autorollback": false,
+			"created": "2024-01-01T00:00:00UTC",
+			"updated": "2024-01-01T00:00:00UTC",
+			"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+		}`)
+	})
+	b.Reset()
+
+	err = cmdr.AutorollbackInfo("mordor")
+	assert.NoError(t, err)
+	assert.Equal(t, b.String(), "Autorollback is disabled.\n", "output")
+
+	// test that no autorollback field doesn't trigger a panic
+	server.Mux.HandleFunc("/v2/apps/gondor/settings/", func(w http.ResponseWriter, _ *http.Request) {
+		testutil.SetHeaders(w)
+		fmt.Fprintf(w, `{
+			"owner": "aragorn",
+			"app": "gondor",
+			"created": "2024-01-01T00:00:00UTC",
+			"updated": "2024-01-01T00:00:00UTC",
+			"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+		}`)
+	})
+	b.Reset()
+
+	err = cmdr.AutorollbackInfo("gondor")
+	assert.NoError(t, err)
+	assert.Equal(t, b.String(), "Autorollback is enabled.\n", "output")
+}
+
+func TestAutorollbackEnable(t *testing.T) {
+	t.Parallel()
+	cf, server, err := testutil.NewTestServerAndClient()
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer server.Close()
+	var b bytes.Buffer
+	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
+
+	server.Mux.HandleFunc("/v2/apps/lothlorien/settings/", func(w http.ResponseWriter, r *http.Request) {
+		testutil.SetHeaders(w)
+		testutil.AssertBody(t, api.AppSettings{Autorollback: api.NewAutorollback()}, r)
+		fmt.Fprintf(w, `{}`)
+	})
+
+	err = cmdr.AutorollbackEnable("lothlorien")
+	assert.NoError(t, err)
+	assert.Equal(t, testutil.StripProgress(b.String()), "Enabling autorollback for lothlorien... done\n", "output")
+}
+
+func TestAutorollbackDisable(t *testing.T) {
+	t.Parallel()
+	cf, server, err := testutil.NewTestServerAndClient()
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer server.Close()
+	var b bytes.Buffer
+	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
+
+	server.Mux.HandleFunc("/v2/apps/bree/settings/", func(w http.ResponseWriter, r *http.Request) {
+		testutil.SetHeaders(w)
+		autorollback := false
+		testutil.AssertBody(t, api.AppSettings{Autorollback: &autorollback}, r)
+		fmt.Fprintf(w, `{}`)
+	})
+
+	err = cmdr.AutorollbackDisable("bree")
+	assert.NoError(t, err)
+	assert.Equal(t, testutil.StripProgress(b.String()), "Disabling autorollback for bree... done\n", "output")
+}
diff --git a/cmd/cmd.go b/cmd/cmd.go
index 6d61f4b1..52db2413 100644
--- a/cmd/cmd.go
+++ b/cmd/cmd.go
@@ -19,6 +19,9 @@ type Commander interface {
 	AppRun(string, string, []string, uint32, uint32) error
 	AppDestroy(string, string) error
 	AppTransfer(string, string) error
+	AutorollbackInfo(string) error
+	AutorollbackEnable(string) error
+	AutorollbackDisable(string) error
 	AutoscaleList(string) error
 	AutoscaleSet(string, string, int, int, int) error
 	AutoscaleUnset(string, string) error
diff --git a/drycc.go b/drycc.go
index 6cfd89f8..49301c26 100644
--- a/drycc.go
+++ b/drycc.go
@@ -49,11 +49,13 @@ Auth commands, use 'drycc help auth' to learn more:
 Subcommands, use 'drycc help [subcommand]' to learn more:
 
   apps          manage applications used to provide services
+  autorollback  manage autorollback if or not for applications 
   autoscale     manage autoscale for applications
   builds        manage builds created using 'git push'
   certs         manage SSL endpoints for an app
   config        manage environment variables that define app config
   domains       manage and assign domain names to your applications
+  gateways      manage gateways for your applications
   git           manage git for applications
   healthchecks  manage healthchecks for applications
   keys          manage ssh keys used for 'git push' deployments
@@ -63,19 +65,18 @@ Subcommands, use 'drycc help [subcommand]' to learn more:
   ps            manage processes inside an app
   pts           manage process types inside an app
   registry      manage private registry information for your application
+  resources     manage resources for your applications 
   releases      manage releases of an application
+  routes        manage routes for your applications 
   routing       manage routability of an application
+  services      manage services for your applications
   tags          manage tags for application containers
+  timeouts      manage pods termination grace period 
   tls           manage TLS settings for applications
-  users         manage users
   tokens        manage tokens
+  users         manage users
   version       display client version
-  services      manage services for your applications
-  routes        manage routes for your applications
-  gateways      manage gateways for your applications
-  timeouts      manage pods termination grace period
   volumes       manage volumes for your applications
-  resources     manage resources for your applications
 
 Shortcut commands, use 'drycc shortcuts' to see all:
 
@@ -117,6 +118,8 @@ Use 'git push drycc main' to deploy to an application.
 		err = parser.Apps(argv, &cmdr)
 	case "auth":
 		err = parser.Auth(argv, &cmdr)
+	case "autorollback":
+		err = parser.Autorollback(argv, &cmdr)
 	case "autoscale":
 		err = parser.Autoscale(argv, &cmdr)
 	case "builds":
diff --git a/go.mod b/go.mod
index aad4f1ff..b2530ce8 100644
--- a/go.mod
+++ b/go.mod
@@ -5,7 +5,7 @@ go 1.22
 require (
 	github.com/containerd/console v1.0.4
 	github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815
-	github.com/drycc/controller-sdk-go v0.0.0-20240813085032-a42edd42331d
+	github.com/drycc/controller-sdk-go v0.0.0-20240814100555-0168972aa222
 	github.com/drycc/pkg v0.0.0-20240225112316-78fc9239f51f
 	github.com/olekukonko/tablewriter v0.0.5
 	github.com/schollz/progressbar/v3 v3.14.4
diff --git a/go.sum b/go.sum
index 43b8dbd3..02e2e4bb 100644
--- a/go.sum
+++ b/go.sum
@@ -5,8 +5,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ=
 github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
-github.com/drycc/controller-sdk-go v0.0.0-20240813085032-a42edd42331d h1:f08Ta9ilxs0eCuMkJ2+2eXEBnMGIRNK9EgLd1lCw7wo=
-github.com/drycc/controller-sdk-go v0.0.0-20240813085032-a42edd42331d/go.mod h1:n6eQe1irJqjwLo/7t9+Dhdv6faSESQN+ATnZRBP3/Uc=
+github.com/drycc/controller-sdk-go v0.0.0-20240814100555-0168972aa222 h1:1OKrh5oWwImYvN8c8kNeMSz5BaZxriIp55eb1oKrJeU=
+github.com/drycc/controller-sdk-go v0.0.0-20240814100555-0168972aa222/go.mod h1:n6eQe1irJqjwLo/7t9+Dhdv6faSESQN+ATnZRBP3/Uc=
 github.com/drycc/pkg v0.0.0-20240225112316-78fc9239f51f h1:kgjvUQJeAszDoU1Vo4vTTE92KI8Av3JPb6Qn890niXg=
 github.com/drycc/pkg v0.0.0-20240225112316-78fc9239f51f/go.mod h1:n+QxGif6ha9CEoxVnlipxb9IdmerybcUSzTEDFkvjiA=
 github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
diff --git a/parser/autorollback.go b/parser/autorollback.go
new file mode 100644
index 00000000..0d606830
--- /dev/null
+++ b/parser/autorollback.go
@@ -0,0 +1,98 @@
+package parser
+
+import (
+	docopt "github.com/docopt/docopt-go"
+	"github.com/drycc/workflow-cli/cmd"
+)
+
+// Autorollback displays all relevant commands for `drycc autorollback`.
+func Autorollback(argv []string, cmdr cmd.Commander) error {
+	usage := `
+Valid commands for autorollback:
+
+autorollback:info       view autorollback info of an application
+autorollback:enable     enable autorollback for an app
+autorollback:disable    disable autorollback for an app
+
+Use 'drycc help [command]' to learn more.
+`
+
+	switch argv[0] {
+	case "autorollback:info":
+		return autorollbackInfo(argv, cmdr)
+	case "autorollback:enable":
+		return autorollbackEnable(argv, cmdr)
+	case "autorollback:disable":
+		return autorollbackDisable(argv, cmdr)
+	default:
+		if printHelp(argv, usage) {
+			return nil
+		}
+
+		if argv[0] == "autorollback" {
+			argv[0] = "autorollback:info"
+			return autorollbackInfo(argv, cmdr)
+		}
+
+		PrintUsage(cmdr)
+		return nil
+	}
+}
+
+func autorollbackInfo(argv []string, cmdr cmd.Commander) error {
+	usage := `
+Prints info about the current application's autorollback if or not.
+
+Usage: drycc autorollback:info [options]
+
+Options:
+  -a --app=<app>
+    the uniquely identifiable name for the application.
+`
+
+	args, err := docopt.ParseArgs(usage, argv, "")
+	if err != nil {
+		return err
+	}
+
+	return cmdr.AutorollbackInfo(safeGetString(args, "--app"))
+}
+
+func autorollbackEnable(argv []string, cmdr cmd.Commander) error {
+	usage := `
+Enables autorollback for an app.
+
+Usage: drycc autorollback:enable [options]
+
+Options:
+  -a --app=<app>
+    the uniquely identifiable name of the application.
+`
+
+	args, err := docopt.ParseArgs(usage, argv, "")
+	if err != nil {
+		return err
+	}
+
+	return cmdr.AutorollbackEnable(safeGetString(args, "--app"))
+}
+
+func autorollbackDisable(argv []string, cmdr cmd.Commander) error {
+	usage := `
+Disables autorollback for an app.
+
+Usage: drycc autorollback:disable [options]
+
+Options:
+  -a --app=<app>
+    the uniquely identifiable name of the application.
+`
+
+	args, err := docopt.ParseArgs(usage, argv, "")
+
+	if err != nil {
+		return err
+	}
+
+	return cmdr.AutorollbackDisable(safeGetString(args, "--app"))
+}
diff --git a/parser/autorollback_test.go b/parser/autorollback_test.go
new file mode 100644
index 00000000..80043cb8
--- /dev/null
+++ b/parser/autorollback_test.go
@@ -0,0 +1,74 @@
+package parser
+
+import (
+	"bytes"
+	"errors"
+	"testing"
+
+	"github.com/drycc/workflow-cli/pkg/testutil"
+	"github.com/stretchr/testify/assert"
+)
+
+// Create fake implementations of each method that return the argument
+// we expect to have called the function (as an error to satisfy the interface).
+
+func (d FakeDryccCmd) AutorollbackInfo(string) error {
+	return errors.New("autorollback:info")
+}
+
+func (d FakeDryccCmd) AutorollbackEnable(string) error {
+	return errors.New("autorollback:enable")
+}
+
+func (d FakeDryccCmd) AutorollbackDisable(string) error {
+	return errors.New("autorollback:disable")
+}
+
+func TestAutorollback(t *testing.T) {
+	t.Parallel()
+
+	cf, server, err := testutil.NewTestServerAndClient()
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer server.Close()
+	var b bytes.Buffer
+	cmdr := FakeDryccCmd{WOut: &b, ConfigFile: cf}
+
+	// cases defines the arguments and expected return of the call.
+	// if expected is "", it defaults to args[0].
+	cases := []struct {
+		args     []string
+		expected string
+	}{
+		{
+			args:     []string{"autorollback:info"},
+			expected: "",
+		},
+		{
+			args:     []string{"autorollback:enable"},
+			expected: "",
+		},
+		{
+			args:     []string{"autorollback:disable"},
+			expected: "",
+		},
+		{
+			args:     []string{"autorollback"},
+			expected: "autorollback:info",
+		},
+	}
+
+	// For each case, check that calling the route with the arguments
+	// returns the expected error, which is args[0] if not provided.
+	for _, c := range cases {
+		var expected string
+		if c.expected == "" {
+			expected = c.args[0]
+		} else {
+			expected = c.expected
+		}
+		err = Autorollback(c.args, cmdr)
+		assert.Error(t, errors.New(expected), err)
+	}
+}
