Repository: gobuffalo/buffalo
Pull request #1707 (2019-06-22 21:58:38)

removes pkg/errors and adds support for unwraping both pkg/errors and go2 proposal errors.


Patch:
diff --git a/binding/binding.go b/binding/binding.go
index 03a0d4c1..273b4ddf 100644
--- a/binding/binding.go
+++ b/binding/binding.go
@@ -9,8 +9,6 @@ import (
 	"sync"
 	"time"
 
-	"errors"
-
 	"github.com/gobuffalo/nulls"
 	"github.com/gobuffalo/buffalo/internal/httpx"
 	"github.com/monoculum/formam"
@@ -82,7 +80,7 @@ func Exec(req *http.Request, value interface{}) error {
 
 	ct := httpx.ContentType(req)
 	if ct == "" {
-		return errors.New("blank content type")
+		return fmt.Errorf("blank content type")
 	}
 	if b, ok := binders[ct]; ok {
 		return b(req, value)
diff --git a/buffalo/cmd/destroy/action.go b/buffalo/cmd/destroy/action.go
index 5b79bf70..e65b4a6d 100644
--- a/buffalo/cmd/destroy/action.go
+++ b/buffalo/cmd/destroy/action.go
@@ -1,7 +1,7 @@
 package destroy
 
 import (
-	"errors"
+	"fmt"
 
 	"github.com/gobuffalo/flect"
 	"github.com/spf13/cobra"
@@ -15,7 +15,7 @@ var ActionCmd = &cobra.Command{
 	Short:   "Destroy action files",
 	RunE: func(cmd *cobra.Command, args []string) error {
 		if len(args) == 0 {
-			return errors.New("you need to provide a valid action file name in order to destroy it")
+			return fmt.Errorf("you need to provide a valid action file name in order to destroy it")
 		}
 
 		name := args[0]
diff --git a/buffalo/cmd/destroy/mailer.go b/buffalo/cmd/destroy/mailer.go
index 0fb40574..bebbc3cb 100644
--- a/buffalo/cmd/destroy/mailer.go
+++ b/buffalo/cmd/destroy/mailer.go
@@ -1,7 +1,6 @@
 package destroy
 
 import (
-	"errors"
 	"fmt"
 	"os"
 	"path/filepath"
@@ -19,7 +18,7 @@ var MailerCmd = &cobra.Command{
 	Short:   "Destroy mailer files",
 	RunE: func(cmd *cobra.Command, args []string) error {
 		if len(args) == 0 {
-			return errors.New("you need to provide a valid mailer name in order to destroy it")
+			return fmt.Errorf("you need to provide a valid mailer name in order to destroy it")
 		}
 
 		name := args[0]
diff --git a/buffalo/cmd/destroy/resource.go b/buffalo/cmd/destroy/resource.go
index 44e6168d..3a94328c 100644
--- a/buffalo/cmd/destroy/resource.go
+++ b/buffalo/cmd/destroy/resource.go
@@ -10,8 +10,6 @@ import (
 
 	"github.com/gobuffalo/flect"
 
-	"errors"
-
 	"github.com/sirupsen/logrus"
 	"github.com/spf13/cobra"
 )
@@ -27,7 +25,7 @@ var ResourceCmd = &cobra.Command{
 	Short:   "Destroy resource files",
 	RunE: func(cmd *cobra.Command, args []string) error {
 		if len(args) == 0 {
-			return errors.New("you need to provide a valid resource name in order to destroy it")
+			return fmt.Errorf("you need to provide a valid resource name in order to destroy it")
 		}
 
 		name := args[0]
diff --git a/buffalo/cmd/fix/plugins.go b/buffalo/cmd/fix/plugins.go
index 9be693d9..3bce2beb 100644
--- a/buffalo/cmd/fix/plugins.go
+++ b/buffalo/cmd/fix/plugins.go
@@ -6,10 +6,10 @@ import (
 	"os"
 
 	"github.com/gobuffalo/buffalo/genny/plugins/install"
+	"github.com/gobuffalo/buffalo/internal/errx"
 	"github.com/gobuffalo/buffalo/plugins"
 	"github.com/gobuffalo/buffalo/plugins/plugdeps"
 	"github.com/gobuffalo/genny"
-	"github.com/pkg/errors"
 )
 
 // Plugins will fix plugins between releases
@@ -17,8 +17,8 @@ func Plugins(r *Runner) error {
 	fmt.Println("~~~ Cleaning plugins cache ~~~")
 	os.RemoveAll(plugins.CachePath)
 	plugs, err := plugdeps.List(r.App)
-	if err != nil && (errors.Cause(err) != plugdeps.ErrMissingConfig) {
-		return errors.WithStack(err)
+	if err != nil && (errx.Unwrap(err) != plugdeps.ErrMissingConfig) {
+		return err
 	}
 
 	run := genny.WetRunner(context.Background())
diff --git a/buffalo/cmd/generate/action.go b/buffalo/cmd/generate/action.go
index 35ec0dc2..aab14183 100644
--- a/buffalo/cmd/generate/action.go
+++ b/buffalo/cmd/generate/action.go
@@ -2,8 +2,7 @@ package generate
 
 import (
 	"context"
-
-	"errors"
+	"fmt"
 
 	"github.com/gobuffalo/buffalo/genny/actions"
 	"github.com/gobuffalo/genny"
@@ -26,11 +25,11 @@ var ActionCmd = &cobra.Command{
 	Short:   "Generate new action(s)",
 	RunE: func(cmd *cobra.Command, args []string) error {
 		if len(args) == 0 {
-			return errors.New("you must provide a name")
+			return fmt.Errorf("you must provide a name")
 		}
 		actionOptions.Name = args[0]
 		if len(args) == 1 {
-			return errors.New("you must provide at least one action name")
+			return fmt.Errorf("you must provide at least one action name")
 		}
 		actionOptions.Actions = args[1:]
 
diff --git a/buffalo/cmd/generate/resource.go b/buffalo/cmd/generate/resource.go
index 3a336138..7c3367af 100644
--- a/buffalo/cmd/generate/resource.go
+++ b/buffalo/cmd/generate/resource.go
@@ -2,8 +2,7 @@ package generate
 
 import (
 	"context"
-
-	"errors"
+	"fmt"
 
 	"github.com/gobuffalo/attrs"
 	"github.com/gobuffalo/buffalo/genny/resource"
@@ -28,7 +27,7 @@ var ResourceCmd = &cobra.Command{
 	Short:   "Generate a new actions/resource file",
 	RunE: func(cmd *cobra.Command, args []string) error {
 		if len(args) == 0 {
-			return errors.New("you must supply a name")
+			return fmt.Errorf("you must supply a name")
 		}
 		ctx := context.Background()
 		run := genny.WetRunner(ctx)
diff --git a/buffalo/cmd/new.go b/buffalo/cmd/new.go
index 141a2203..79796f5f 100644
--- a/buffalo/cmd/new.go
+++ b/buffalo/cmd/new.go
@@ -19,6 +19,7 @@ import (
 	"github.com/gobuffalo/buffalo/genny/newapp/web"
 	"github.com/gobuffalo/buffalo/genny/refresh"
 	"github.com/gobuffalo/buffalo/genny/vcs"
+	"github.com/gobuffalo/buffalo/internal/errx"
 	"github.com/gobuffalo/envy"
 	fname "github.com/gobuffalo/flect/name"
 	"github.com/gobuffalo/genny"
@@ -27,7 +28,6 @@ import (
 	"github.com/gobuffalo/meta"
 	"github.com/gobuffalo/packr/v2/plog"
 	"github.com/gobuffalo/plush"
-	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
 	"github.com/spf13/cobra"
 	"github.com/spf13/pflag"
@@ -51,7 +51,7 @@ func parseNewOptions(args []string) (newAppOptions, error) {
 	}
 
 	if len(args) == 0 {
-		return nopts, errors.New("you must enter a name for your new application")
+		return nopts, fmt.Errorf("you must enter a name for your new application")
 	}
 	if configError != nil {
 		return nopts, configError
@@ -198,7 +198,7 @@ var newCmd = &cobra.Command{
 			gg, err = web.New(wo)
 		}
 		if err != nil {
-			if errors.Cause(err) == core.ErrNotInGoPath {
+			if errx.Unwrap(err) == core.ErrNotInGoPath {
 				return notInGoPath(app)
 			}
 			return err
diff --git a/buffalo/cmd/plugins/add.go b/buffalo/cmd/plugins/add.go
index a8ea7aa2..505c55c9 100644
--- a/buffalo/cmd/plugins/add.go
+++ b/buffalo/cmd/plugins/add.go
@@ -7,10 +7,10 @@ import (
 	"strings"
 
 	"github.com/gobuffalo/buffalo/genny/add"
+	"github.com/gobuffalo/buffalo/internal/errx"
 	"github.com/gobuffalo/buffalo/plugins/plugdeps"
 	"github.com/gobuffalo/genny"
 	"github.com/gobuffalo/meta"
-	"github.com/pkg/errors"
 	"github.com/spf13/cobra"
 )
 
@@ -30,8 +30,8 @@ var addCmd = &cobra.Command{
 
 		app := meta.New(".")
 		plugs, err := plugdeps.List(app)
-		if err != nil && (errors.Cause(err) != plugdeps.ErrMissingConfig) {
-			return errors.WithStack(err)
+		if err != nil && (errx.Unwrap(err) != plugdeps.ErrMissingConfig) {
+			return err
 		}
 
 		tags := app.BuildTags("", addOptions.buildTags...)
@@ -54,7 +54,7 @@ var addCmd = &cobra.Command{
 			Plugins: plugs.List(),
 		})
 		if err != nil {
-			return errors.WithStack(err)
+			return err
 		}
 		run.With(g)
 
diff --git a/buffalo/cmd/plugins/generate.go b/buffalo/cmd/plugins/generate.go
index a8003f89..4d200be3 100644
--- a/buffalo/cmd/plugins/generate.go
+++ b/buffalo/cmd/plugins/generate.go
@@ -13,7 +13,6 @@ import (
 	"github.com/gobuffalo/genny/gogen"
 	"github.com/gobuffalo/licenser/genny/licenser"
 	"github.com/gobuffalo/logger"
-	"github.com/pkg/errors"
 	"github.com/spf13/cobra"
 	"github.com/spf13/viper"
 )
@@ -42,7 +41,7 @@ var generateCmd = &cobra.Command{
 
 		gg, err := plugin.New(popts)
 		if err != nil {
-			return errors.WithStack(err)
+			return err
 		}
 		r.Root = popts.Root
 		r.WithRun(genny.Force(r.Root, viper.GetBool("force")))
@@ -51,14 +50,14 @@ var generateCmd = &cobra.Command{
 		if viper.GetBool("with-gen") {
 			gg, err := with.GenerateCmd(popts)
 			if err != nil {
-				return errors.WithStack(err)
+				return err
 			}
 			r.WithGroup(gg)
 		}
 
 		g, err := gogen.Fmt(r.Root)
 		if err != nil {
-			return errors.WithStack(err)
+			return err
 		}
 		r.With(g)
 
diff --git a/buffalo/cmd/plugins/install.go b/buffalo/cmd/plugins/install.go
index 4c39ea1b..f91f06a4 100644
--- a/buffalo/cmd/plugins/install.go
+++ b/buffalo/cmd/plugins/install.go
@@ -9,11 +9,11 @@ import (
 	"strings"
 
 	"github.com/gobuffalo/buffalo/genny/plugins/install"
+	"github.com/gobuffalo/buffalo/internal/errx"
 	"github.com/gobuffalo/buffalo/plugins/plugdeps"
 	"github.com/gobuffalo/genny"
 	"github.com/gobuffalo/logger"
 	"github.com/gobuffalo/meta"
-	"github.com/pkg/errors"
 	"github.com/spf13/cobra"
 )
 
@@ -34,7 +34,7 @@ var installCmd = &cobra.Command{
 				run.FileFn = func(f genny.File) (genny.File, error) {
 					bb := &bytes.Buffer{}
 					if _, err := io.Copy(bb, f); err != nil {
-						return f, errors.WithStack(err)
+						return f, err
 					}
 					return genny.NewFile(f.Name(), bb), nil
 				}
@@ -43,8 +43,8 @@ var installCmd = &cobra.Command{
 
 		app := meta.New(".")
 		plugs, err := plugdeps.List(app)
-		if err != nil && (errors.Cause(err) != plugdeps.ErrMissingConfig) {
-			return errors.WithStack(err)
+		if err != nil && (errx.Unwrap(err) != plugdeps.ErrMissingConfig) {
+			return err
 		}
 
 		for _, a := range args {
@@ -66,7 +66,7 @@ var installCmd = &cobra.Command{
 			Vendor:  installOptions.vendor,
 		})
 		if err != nil {
-			return errors.WithStack(err)
+			return err
 		}
 		run.WithGroup(gg)
 
diff --git a/buffalo/cmd/plugins/internal/cache/list.go b/buffalo/cmd/plugins/internal/cache/list.go
index 54f75c56..47f77b09 100644
--- a/buffalo/cmd/plugins/internal/cache/list.go
+++ b/buffalo/cmd/plugins/internal/cache/list.go
@@ -6,7 +6,6 @@ import (
 	"io/ioutil"
 
 	"github.com/gobuffalo/buffalo/plugins"
-	"github.com/pkg/errors"
 	"github.com/spf13/cobra"
 )
 
@@ -17,16 +16,16 @@ var ListCmd = &cobra.Command{
 	RunE: func(cmd *cobra.Command, args []string) error {
 		b, err := ioutil.ReadFile(plugins.CachePath)
 		if err != nil {
-			return errors.WithStack(err)
+			return err
 		}
 		m := map[string]interface{}{}
 		err = json.Unmarshal(b, &m)
 		if err != nil {
-			return errors.WithStack(err)
+			return err
 		}
 		is, err := json.MarshalIndent(m, "", "  ")
 		if err != nil {
-			return errors.WithStack(err)
+			return err
 		}
 
 		fmt.Println(string(is))
diff --git a/buffalo/cmd/plugins/list.go b/buffalo/cmd/plugins/list.go
index 8ad72a7c..39783a48 100644
--- a/buffalo/cmd/plugins/list.go
+++ b/buffalo/cmd/plugins/list.go
@@ -9,7 +9,6 @@ import (
 	"text/tabwriter"
 
 	pluginsin "github.com/gobuffalo/buffalo/plugins"
-	"github.com/pkg/errors"
 	"github.com/spf13/cobra"
 )
 
@@ -19,7 +18,7 @@ var listCmd = &cobra.Command{
 	RunE: func(cmd *cobra.Command, args []string) error {
 		list, err := pluginsin.Available()
 		if err != nil {
-			return errors.WithStack(err)
+			return err
 		}
 
 		var cmds pluginsin.Commands
diff --git a/buffalo/cmd/plugins/listen.go b/buffalo/cmd/plugins/listen.go
index a427ebd9..290c26d5 100644
--- a/buffalo/cmd/plugins/listen.go
+++ b/buffalo/cmd/plugins/listen.go
@@ -7,7 +7,6 @@ import (
 	"github.com/gobuffalo/buffalo/plugins"
 	"github.com/gobuffalo/events"
 	"github.com/gobuffalo/genny"
-	"github.com/pkg/errors"
 )
 
 // Listen is listener for plugin events pipeline
@@ -21,7 +20,7 @@ func Listen(e events.Event) error {
 	opts := &install.Options{}
 	gg, err := install.New(opts)
 	if err != nil {
-		return errors.WithStack(err)
+		return err
 	}
 	run.WithGroup(gg)
 	payload := e.Payload
@@ -29,7 +28,7 @@ func Listen(e events.Event) error {
 	events.EmitPayload(plugins.EvtSetupStarted, payload)
 	if err := run.Run(); err != nil {
 		events.EmitError(plugins.EvtSetupErr, err, payload)
-		return errors.WithStack(err)
+		return err
 	}
 	events.EmitPayload(plugins.EvtSetupFinished, payload)
 	return nil
diff --git a/buffalo/cmd/plugins/remove.go b/buffalo/cmd/plugins/remove.go
index 0631c638..227ff031 100644
--- a/buffalo/cmd/plugins/remove.go
+++ b/buffalo/cmd/plugins/remove.go
@@ -3,13 +3,14 @@ package plugins
 import (
 	"bytes"
 	"context"
+	"fmt"
 	"path"
 	"strings"
 
+	"github.com/gobuffalo/buffalo/internal/errx"
 	"github.com/gobuffalo/buffalo/plugins/plugdeps"
 	"github.com/gobuffalo/genny"
 	"github.com/gobuffalo/meta"
-	"github.com/pkg/errors"
 	"github.com/spf13/cobra"
 )
 
@@ -23,7 +24,7 @@ var removeCmd = &cobra.Command{
 	Short: "removes plugin from config/buffalo-plugins.toml",
 	RunE: func(cmd *cobra.Command, args []string) error {
 		if len(args) == 0 {
-			return errors.New("you must specify at least one package")
+			return fmt.Errorf("you must specify at least one package")
 		}
 		run := genny.WetRunner(context.Background())
 		if removeOptions.dryRun {
@@ -32,8 +33,8 @@ var removeCmd = &cobra.Command{
 
 		app := meta.New(".")
 		plugs, err := plugdeps.List(app)
-		if err != nil && (errors.Cause(err) != plugdeps.ErrMissingConfig) {
-			return errors.WithStack(err)
+		if err != nil && (errx.Unwrap(err) != plugdeps.ErrMissingConfig) {
+			return err
 		}
 
 		for _, a := range args {
@@ -49,12 +50,12 @@ var removeCmd = &cobra.Command{
 			p := plugdeps.ConfigPath(app)
 			bb := &bytes.Buffer{}
 			if err := plugs.Encode(bb); err != nil {
-				return errors.WithStack(err)
+				return err
 			}
 			return r.File(genny.NewFile(p, bb))
 		})
 		if err != nil {
-			return errors.WithStack(err)
+			return err
 		}
 
 		return run.Run()
diff --git a/buffalo/cmd/root.go b/buffalo/cmd/root.go
index 1bea89bf..9d4ada24 100644
--- a/buffalo/cmd/root.go
+++ b/buffalo/cmd/root.go
@@ -1,7 +1,6 @@
 package cmd
 
 import (
-	"errors"
 	"fmt"
 	"os"
 	"strings"
@@ -34,7 +33,7 @@ var RootCmd = &cobra.Command{
 		}
 
 		if !insideBuffaloProject() {
-			return errors.New("you need to be inside your buffalo project path to run this command")
+			return fmt.Errorf("you need to be inside your buffalo project path to run this command")
 		}
 
 		return nil
diff --git a/buffalo/cmd/setup.go b/buffalo/cmd/setup.go
index 21df5e87..83edece6 100644
--- a/buffalo/cmd/setup.go
+++ b/buffalo/cmd/setup.go
@@ -10,8 +10,6 @@ import (
 
 	"golang.org/x/sync/errgroup"
 
-	"errors"
-
 	"github.com/gobuffalo/envy"
 	"github.com/gobuffalo/events"
 	"github.com/gobuffalo/meta"
@@ -222,10 +220,10 @@ func yarnCheck(app meta.App) error {
 
 func nodeCheck(meta.App) error {
 	if _, err := exec.LookPath("node"); err != nil {
-		return errors.New("this application requires node, and we could not find it installed on your system please install node and try again")
+		return fmt.Errorf("this application requires node, and we could not find it installed on your system please install node and try again")
 	}
 	if _, err := exec.LookPath("npm"); err != nil {
-		return errors.New("this application requires npm, and we could not find it installed on your system please install npm and try again")
+		return fmt.Errorf("this application requires npm, and we could not find it installed on your system please install npm and try again")
 	}
 	return nil
 }
diff --git a/default_context.go b/default_context.go
index b33bc970..d58c6877 100644
--- a/default_context.go
+++ b/default_context.go
@@ -15,8 +15,8 @@ import (
 	"time"
 
 	"github.com/gobuffalo/buffalo/binding"
+	"github.com/gobuffalo/buffalo/internal/errx"
 	"github.com/gobuffalo/buffalo/render"
-	"github.com/pkg/errors"
 )
 
 // assert that DefaultContext is implementing Context
@@ -129,7 +129,7 @@ func (d *DefaultContext) Render(status int, rr render.Renderer) error {
 
 		err := rr.Render(bb, data)
 		if err != nil {
-			if er, ok := errors.Cause(err).(render.ErrRedirect); ok {
+			if er, ok := errx.Unwrap(err).(render.ErrRedirect); ok {
 				return d.Redirect(er.Status, er.URL)
 			}
 			return HTTPError{Status: 500, Cause: err}
diff --git a/errors.go b/errors.go
index 06271f7b..1505e518 100644
--- a/errors.go
+++ b/errors.go
@@ -10,10 +10,10 @@ import (
 	"strings"
 
 	"github.com/gobuffalo/buffalo/internal/defaults"
+	"github.com/gobuffalo/buffalo/internal/errx"
 	"github.com/gobuffalo/buffalo/internal/httpx"
 	"github.com/gobuffalo/events"
 	"github.com/gobuffalo/plush"
-	"github.com/pkg/errors"
 )
 
 // HTTPError a typed error returned by http Handlers and used for choosing error handlers
@@ -77,9 +77,9 @@ func (a *App) PanicHandler(next Handler) Handler {
 				case error:
 					err = t
 				case string:
-					err = errors.New(t)
+					err = fmt.Errorf(t)
 				default:
-					err = errors.New(fmt.Sprint(t))
+					err = fmt.Errorf(fmt.Sprint(t))
 				}
 				err = err
 				events.EmitError(events.ErrPanic, err,
@@ -104,7 +104,7 @@ func (a *App) defaultErrorMiddleware(next Handler) Handler {
 		}
 		status := 500
 		// unpack root cause and check for HTTPError
-		cause := errors.Cause(err)
+		cause := errx.Unwrap(err)
 		switch cause {
 		case sql.ErrNoRows:
 			status = 404
@@ -155,10 +155,6 @@ type ErrorResponse struct {
 
 const defaultErrorCT = "text/html; charset=utf-8"
 
-type stackTracer interface {
-	StackTrace() errors.StackTrace
-}
-
 func defaultErrorHandler(status int, origErr error, c Context) error {
 	env := c.Value("env")
 	requestCT := defaults.String(httpx.ContentType(c.Request()), defaultErrorCT)
@@ -174,18 +170,11 @@ func defaultErrorHandler(status int, origErr error, c Context) error {
 	}
 
 	trace := fmt.Sprintf("%s\n\n%+v", origErr, origErr)
-	if st, ok := origErr.(stackTracer); ok {
-		var log []string
-		for _, t := range st.StackTrace() {
-			log = append(log, fmt.Sprintf("%+v", t))
-		}
-		trace = fmt.Sprintf("%s\n%s", origErr, strings.Join(log, "\n"))
-	}
 	switch strings.ToLower(requestCT) {
 	case "application/json", "text/json", "json":
 		c.Response().Header().Set("content-type", "application/json")
 		err := json.NewEncoder(c.Response()).Encode(&ErrorResponse{
-			Error: errors.Cause(origErr).Error(),
+			Error: errx.Unwrap(origErr).Error(),
 			Trace: trace,
 			Code:  status,
 		})
@@ -195,7 +184,7 @@ func defaultErrorHandler(status int, origErr error, c Context) error {
 	case "application/xml", "text/xml", "xml":
 		c.Response().Header().Set("content-type", "text/xml")
 		err := xml.NewEncoder(c.Response()).Encode(&ErrorResponse{
-			Error: errors.Cause(origErr).Error(),
+			Error: errx.Unwrap(origErr).Error(),
 			Trace: trace,
 			Code:  status,
 		})
diff --git a/genny/actions/options.go b/genny/actions/options.go
index c6b1e129..f929d390 100644
--- a/genny/actions/options.go
+++ b/genny/actions/options.go
@@ -1,7 +1,7 @@
 package actions
 
 import (
-	"errors"
+	"fmt"
 
 	"github.com/gobuffalo/meta"
 )
@@ -18,11 +18,11 @@ type Options struct {
 // Validate that options are usuable
 func (opts *Options) Validate() error {
 	if len(opts.Name) == 0 {
-		return errors.New("you must provide a name")
+		return fmt.Errorf("you must provide a name")
 	}
 
 	if len(opts.Actions) == 0 {
-		return errors.New("you must provide at least one action name")
+		return fmt.Errorf("you must provide at least one action name")
 	}
 
 	if opts.App.IsZero() {
diff --git a/genny/add/add.go b/genny/add/add.go
index bd670495..f0afba8c 100644
--- a/genny/add/add.go
+++ b/genny/add/add.go
@@ -6,7 +6,6 @@ import (
 
 	"github.com/gobuffalo/buffalo/plugins/plugdeps"
 	"github.com/gobuffalo/genny"
-	"github.com/pkg/errors"
 )
 
 // New add plugin to the config file
@@ -14,14 +13,14 @@ func New(opts *Options) (*genny.Generator, error) {
 	g := genny.New()
 
 	if err := opts.Validate(); err != nil {
-		return g, errors.WithStack(err)
+		return g, err
 	}
 
 	bb := &bytes.Buffer{}
 	plugs := plugdeps.New()
 	plugs.Add(opts.Plugins...)
 	if err := plugs.Encode(bb); err != nil {
-		return g, errors.WithStack(err)
+		return g, err
 	}
 
 	cpath := filepath.Join(opts.App.Root, "config", "buffalo-plugins.toml")
diff --git a/genny/add/options.go b/genny/add/options.go
index 5c50f1e7..390d75e1 100644
--- a/genny/add/options.go
+++ b/genny/add/options.go
@@ -3,9 +3,9 @@ package add
 import (
 	"os"
 
+	"github.com/gobuffalo/buffalo/internal/errx"
 	"github.com/gobuffalo/buffalo/plugins/plugdeps"
 	"github.com/gobuffalo/meta"
-	"github.com/pkg/errors"
 )
 
 // Options container for passing needed info for
@@ -20,14 +20,14 @@ func (opts *Options) Validate() error {
 	if opts.App.IsZero() {
 		pwd, err := os.Getwd()
 		if err != nil {
-			return errors.WithStack(err)
+			return err
 		}
 		opts.App = meta.New(pwd)
 	}
 	if len(opts.Plugins) == 0 {
 		plugs, err := plugdeps.List(opts.App)
-		if err != nil && (errors.Cause(err) != plugdeps.ErrMissingConfig) {
-			return errors.WithStack(err)
+		if err != nil && (errx.Unwrap(err) != plugdeps.ErrMissingConfig) {
+			return err
 		}
 		opts.Plugins = plugs.List()
 	}
diff --git a/genny/assets/webpack/webpack.go b/genny/assets/webpack/webpack.go
index ecfcc39d..96a8db8f 100644
--- a/genny/assets/webpack/webpack.go
+++ b/genny/assets/webpack/webpack.go
@@ -1,12 +1,11 @@
 package webpack
 
 import (
+	"fmt"
 	"os/exec"
 	"path/filepath"
 	"runtime"
 
-	"errors"
-
 	"github.com/gobuffalo/genny"
 	"github.com/gobuffalo/genny/gogen"
 	"github.com/gobuffalo/packr/v2"
@@ -35,7 +34,7 @@ func New(opts *Options) (*genny.Generator, error) {
 
 	g.RunFn(func(r *genny.Runner) error {
 		if _, err := r.LookPath("npm"); err != nil {
-			return errors.New("could not find npm executable")
+			return fmt.Errorf("could not find npm executable")
 		}
 		return nil
 	})
diff --git a/genny/build/validate.go b/genny/build/validate.go
index d12385bb..64b7ecd5 100644
--- a/genny/build/validate.go
+++ b/genny/build/validate.go
@@ -5,8 +5,6 @@ import (
 	"html/template"
 	"strings"
 
-	"errors"
-
 	"github.com/gobuffalo/genny"
 	"github.com/gobuffalo/packd"
 	"github.com/gobuffalo/plush"
@@ -58,7 +56,7 @@ func ValidateTemplates(walk packd.Walker, tvs []TemplateValidator) genny.RunFn {
 		if len(errs) == 0 {
 			return nil
 		}
-		return errors.New(strings.Join(errs, "\n"))
+		return fmt.Errorf(strings.Join(errs, "\n"))
 	}
 }
 
diff --git a/genny/ci/options.go b/genny/ci/options.go
index 04f2c3d9..fe61cb17 100644
--- a/genny/ci/options.go
+++ b/genny/ci/options.go
@@ -1,7 +1,6 @@
 package ci
 
 import (
-	"errors"
 	"fmt"
 	"strings"
 
@@ -33,7 +32,7 @@ func (opts *Options) Validate() error {
 	}
 
 	if len(opts.Provider) == 0 {
-		return errors.New("no provider chosen")
+		return fmt.Errorf("no provider chosen")
 	}
 	opts.Provider = strings.ToLower(opts.Provider)
 
diff --git a/genny/docker/docker.go b/genny/docker/docker.go
index abc99d96..6a67b4d4 100644
--- a/genny/docker/docker.go
+++ b/genny/docker/docker.go
@@ -4,7 +4,7 @@ import (
 	"text/template"
 
 	"github.com/gobuffalo/genny"
-	"github.com/gobuffalo/gogen"
+	"github.com/gobuffalo/genny/gogen"
 	"github.com/gobuffalo/packr/v2"
 )
 
diff --git a/genny/grift/options.go b/genny/grift/options.go
index b5e7e87d..ab69915e 100644
--- a/genny/grift/options.go
+++ b/genny/grift/options.go
@@ -1,10 +1,9 @@
 package grift
 
 import (
+	"fmt"
 	"strings"
 
-	"errors"
-
 	"github.com/gobuffalo/flect/name"
 )
 
@@ -24,7 +23,7 @@ func (opts Options) Last(n name.Ident) bool {
 // Validate options
 func (opts *Options) Validate() error {
 	if len(opts.Args) == 0 {
-		return errors.New("you need to provide a name for the grift task")
+		return fmt.Errorf("you need to provide a name for the grift task")
 	}
 
 	opts.Namespaced = strings.Contains(opts.Args[0], ":")
diff --git a/genny/info/info.go b/genny/info/info.go
index 231ab1eb..786f93d1 100644
--- a/genny/info/info.go
+++ b/genny/info/info.go
@@ -5,7 +5,6 @@ import (
 
 	"github.com/gobuffalo/genny"
 	"github.com/gobuffalo/packr/v2"
-	"github.com/pkg/errors"
 )
 
 // New returns a generator that performs buffalo
@@ -14,7 +13,7 @@ func New(opts *Options) (*genny.Generator, error) {
 	g := genny.New()
 
 	if err := opts.Validate(); err != nil {
-		return g, errors.WithStack(err)
+		return g, err
 	}
 
 	g.RunFn(appDetails(opts))
diff --git a/genny/mail/options.go b/genny/mail/options.go
index a0b78999..abd7bd01 100644
--- a/genny/mail/options.go
+++ b/genny/mail/options.go
@@ -1,7 +1,7 @@
 package mail
 
 import (
-	"errors"
+	"fmt"
 
 	"github.com/gobuffalo/flect/name"
 	"github.com/gobuffalo/meta"
@@ -21,7 +21,7 @@ func (opts *Options) Validate() error {
 	}
 
 	if len(opts.Name.String()) == 0 {
-		return errors.New("you must supply a name for your mailer")
+		return fmt.Errorf("you must supply a name for your mailer")
 	}
 	return nil
 }
diff --git a/genny/newapp/core/core.go b/genny/newapp/core/core.go
index f7482da0..336fac44 100644
--- a/genny/newapp/core/core.go
+++ b/genny/newapp/core/core.go
@@ -6,6 +6,7 @@ import (
 	"github.com/gobuffalo/buffalo/genny/ci"
 	"github.com/gobuffalo/buffalo/genny/plugins/install"
 	"github.com/gobuffalo/buffalo/genny/refresh"
+	"github.com/gobuffalo/buffalo/internal/errx"
 	"github.com/gobuffalo/buffalo/plugins/plugdeps"
 	"github.com/gobuffalo/buffalo/runtime"
 	"github.com/gobuffalo/genny/depgen"
@@ -13,7 +14,6 @@ import (
 	"github.com/gobuffalo/genny/gogen"
 	"github.com/gobuffalo/genny/gogen/gomods"
 	"github.com/gobuffalo/meta"
-	"github.com/pkg/errors"
 )
 
 // New generator for creating a Buffalo application
@@ -41,7 +41,7 @@ func New(opts *Options) (*genny.Group, error) {
 	}
 
 	plugs, err := plugdeps.List(app)
-	if err != nil && (errors.Cause(err) != plugdeps.ErrMissingConfig) {
+	if err != nil && (errx.Unwrap(err) != plugdeps.ErrMissingConfig) {
 		return nil, err
 	}
 
diff --git a/genny/newapp/core/errors.go b/genny/newapp/core/errors.go
index 51bf27cd..f47fc7c4 100644
--- a/genny/newapp/core/errors.go
+++ b/genny/newapp/core/errors.go
@@ -1,9 +1,9 @@
 package core
 
-import "errors"
+import "fmt"
 
 // ErrGoModulesWithDep is thrown when trying to use both dep and go modules
-var ErrGoModulesWithDep = errors.New("dep and modules can not be used at the same time")
+var ErrGoModulesWithDep = fmt.Errorf("dep and modules can not be used at the same time")
 
 // ErrNotInGoPath is thrown when not using go modules outside of GOPATH
-var ErrNotInGoPath = errors.New("currently not in a $GOPATH")
+var ErrNotInGoPath = fmt.Errorf("currently not in a $GOPATH")
diff --git a/genny/newapp/web/options.go b/genny/newapp/web/options.go
index bf92ae51..559cfe12 100644
--- a/genny/newapp/web/options.go
+++ b/genny/newapp/web/options.go
@@ -1,7 +1,7 @@
 package web
 
 import (
-	"errors"
+	"fmt"
 
 	"github.com/gobuffalo/buffalo/genny/assets/standard"
 	"github.com/gobuffalo/buffalo/genny/assets/webpack"
@@ -44,7 +44,7 @@ func (opts *Options) Validate() error {
 	}
 
 	if opts.Standard != nil && opts.Webpack != nil {
-		return errors.New("you can not use both webpack and standard generators")
+		return fmt.Errorf("you can not use both webpack and standard generators")
 	}
 
 	return nil
diff --git a/genny/plugins/install/install.go b/genny/plugins/install/install.go
index 0b7366c3..738f1f6d 100644
--- a/genny/plugins/install/install.go
+++ b/genny/plugins/install/install.go
@@ -1,6 +1,7 @@
 package install
 
 import (
+	"fmt"
 	"go/build"
 	"os"
 	"path/filepath"
@@ -9,7 +10,6 @@ import (
 	"github.com/gobuffalo/buffalo/plugins/plugdeps"
 	"github.com/gobuffalo/genny"
 	"github.com/gobuffalo/genny/gogen"
-	"github.com/pkg/errors"
 )
 
 // New installs plugins and then added them to the config file
@@ -17,7 +17,7 @@ func New(opts *Options) (*genny.Group, error) {
 	gg := &genny.Group{}
 
 	if err := opts.Validate(); err != nil {
-		return gg, errors.WithStack(err)
+		return gg, err
 	}
 
 	aopts := &add.Options{
@@ -26,7 +26,7 @@ func New(opts *Options) (*genny.Group, error) {
 	}
 
 	if err := aopts.Validate(); err != nil {
-		return gg, errors.WithStack(err)
+		return gg, err
 	}
 
 	g := genny.New()
@@ -49,7 +49,7 @@ func New(opts *Options) (*genny.Group, error) {
 
 	g, err := add.New(aopts)
 	if err != nil {
-		return gg, errors.WithStack(err)
+		return gg, err
 	}
 
 	gg.Add(g)
@@ -61,13 +61,13 @@ func pRun(proot string, p plugdeps.Plugin) genny.RunFn {
 	return func(r *genny.Runner) error {
 		c := build.Default
 		if c.GOOS == "windows" {
-			return errors.New("vendoring of plugins is currently not supported on windows. PRs are VERY welcome! :)")
+			return fmt.Errorf("vendoring of plugins is currently not supported on windows. PRs are VERY welcome! :)")
 		}
 
 		bp := filepath.Join(c.GOPATH, "bin", p.Binary)
 		sf, err := r.FindFile(bp)
 		if err != nil {
-			return errors.WithStack(err)
+			return err
 		}
 
 		pbp := filepath.Join(proot, p.Binary)
@@ -75,7 +75,7 @@ func pRun(proot string, p plugdeps.Plugin) genny.RunFn {
 
 		df := genny.NewFile(pbp, sf)
 		if err := r.File(df); err != nil {
-			return errors.WithStack(err)
+			return err
 		}
 
 		os.Chmod(pbp, 0555)
diff --git a/genny/plugins/install/options.go b/genny/plugins/install/options.go
index da240732..06e2e071 100644
--- a/genny/plugins/install/options.go
+++ b/genny/plugins/install/options.go
@@ -3,9 +3,9 @@ package install
 import (
 	"os"
 
+	"github.com/gobuffalo/buffalo/internal/errx"
 	"github.com/gobuffalo/buffalo/plugins/plugdeps"
 	"github.com/gobuffalo/meta"
-	"github.com/pkg/errors"
 )
 
 // Options container for passing needed info for
@@ -22,14 +22,14 @@ func (opts *Options) Validate() error {
 	if opts.App.IsZero() {
 		pwd, err := os.Getwd()
 		if err != nil {
-			return errors.WithStack(err)
+			return err
 		}
 		opts.App = meta.New(pwd)
 	}
 	if len(opts.Plugins) == 0 {
 		plugs, err := plugdeps.List(opts.App)
-		if err != nil && (errors.Cause(err) != plugdeps.ErrMissingConfig) {
-			return errors.WithStack(err)
+		if err != nil && (errx.Unwrap(err) != plugdeps.ErrMissingConfig) {
+			return err
 		}
 		opts.Plugins = plugs.List()
 	}
diff --git a/genny/plugins/plugin/options.go b/genny/plugins/plugin/options.go
index 87cc5c4a..36b4e706 100644
--- a/genny/plugins/plugin/options.go
+++ b/genny/plugins/plugin/options.go
@@ -1,13 +1,12 @@
 package plugin
 
 import (
+	"fmt"
 	"os/user"
 	"path"
 	"path/filepath"
 	"strings"
 	"time"
-
-	"github.com/pkg/errors"
 )
 
 // Options container for passing needed info for
@@ -24,7 +23,7 @@ type Options struct {
 // Validate makes sure that the options are valid for generator
 func (opts *Options) Validate() error {
 	if opts.PluginPkg == "" {
-		return errors.New("plugin has to have a package name")
+		return fmt.Errorf("plugin has to have a package name")
 	}
 	if len(opts.License) == 0 {
 		opts.License = "mit"
@@ -47,7 +46,7 @@ func (opts *Options) Validate() error {
 	if len(opts.Author) == 0 {
 		u, err := user.Current()
 		if err != nil {
-			return errors.WithStack(err)
+			return err
 		}
 		if len(u.Name) != 0 {
 			opts.Author = u.Name
diff --git a/genny/plugins/plugin/plugin.go b/genny/plugins/plugin/plugin.go
index 3f26cb80..d4db84ce 100644
--- a/genny/plugins/plugin/plugin.go
+++ b/genny/plugins/plugin/plugin.go
@@ -10,7 +10,6 @@ import (
 	"github.com/gobuffalo/plush"
 	"github.com/gobuffalo/release/genny/initgen"
 	"github.com/gobuffalo/release/genny/makefile"
-	"github.com/pkg/errors"
 )
 
 // New generates a plugin project
@@ -18,7 +17,7 @@ func New(opts *Options) (*genny.Group, error) {
 	gg := &genny.Group{}
 
 	if err := opts.Validate(); err != nil {
-		return gg, errors.WithStack(err)
+		return gg, err
 	}
 
 	g := genny.New()
@@ -37,7 +36,7 @@ func New(opts *Options) (*genny.Group, error) {
 
 	g, err := licenser.New(lopts)
 	if err != nil {
-		return gg, errors.WithStack(err)
+		return gg, err
 	}
 	gg.Add(g)
 
@@ -50,7 +49,7 @@ func New(opts *Options) (*genny.Group, error) {
 		},
 	})
 	if err != nil {
-		return gg, errors.WithStack(err)
+		return gg, err
 	}
 	gg.Merge(ig)
 
diff --git a/genny/plugins/plugin/with/generate.go b/genny/plugins/plugin/with/generate.go
index 1ec5de32..efe1706e 100644
--- a/genny/plugins/plugin/with/generate.go
+++ b/genny/plugins/plugin/with/generate.go
@@ -10,20 +10,19 @@ import (
 	"github.com/gobuffalo/genny/plushgen"
 	"github.com/gobuffalo/packr/v2"
 	"github.com/gobuffalo/plush"
-	"github.com/pkg/errors"
 )
 
 // GenerateCmd generates a plugin project with go mods
 func GenerateCmd(opts *plugin.Options) (*genny.Group, error) {
 	gg := &genny.Group{}
 	if err := opts.Validate(); err != nil {
-		return gg, errors.WithStack(err)
+		return gg, err
 	}
 
 	g := genny.New()
 	box := packr.New("./generate/templates", "./generate/templates")
 	if err := g.Box(box); err != nil {
-		return gg, errors.WithStack(err)
+		return gg, err
 	}
 	ctx := plush.NewContext()
 	ctx.Set("opts", opts)
@@ -35,7 +34,7 @@ func GenerateCmd(opts *plugin.Options) (*genny.Group, error) {
 	g.RunFn(func(r *genny.Runner) error {
 		f, err := r.FindFile("cmd/available.go")
 		if err != nil {
-			return errors.WithStack(err)
+			return err
 		}
 		const g = `Available.Add("generate", generateCmd)`
 		const m = `Available.Mount(rootCmd)`
@@ -50,7 +49,7 @@ func GenerateCmd(opts *plugin.Options) (*genny.Group, error) {
 		Prefix: "genny",
 	})
 	if err != nil {
-		return gg, errors.WithStack(err)
+		return gg, err
 	}
 	gg.Add(g)
 
diff --git a/genny/plugins/plugin/with/generate/templates/cmd/generate.go.plush b/genny/plugins/plugin/with/generate/templates/cmd/generate.go.plush
index c78c62cb..a50c4633 100644
--- a/genny/plugins/plugin/with/generate/templates/cmd/generate.go.plush
+++ b/genny/plugins/plugin/with/generate/templates/cmd/generate.go.plush
@@ -6,7 +6,6 @@ import (
 	"<%= opts.PluginPkg %>/genny/<%= opts.ShortName %>"
 	"github.com/gobuffalo/genny"
 	"github.com/gobuffalo/genny/gogen"
-	"github.com/pkg/errors"
 	"github.com/spf13/cobra"
 )
 
@@ -30,13 +29,13 @@ var generateCmd = &cobra.Command{
 
 		g, err := <%= opts.ShortName %>.New(generateOptions.Options)
 		if err != nil {
-			return errors.WithStack(err)
+			return err
 		}
 		r.With(g)
 
 		g, err = gotools.GoFmt(r.Root)
 		if err != nil {
-			return errors.WithStack(err)
+			return err
 		}
 		r.With(g)
 
diff --git a/genny/resource/_fixtures/default/actions/widgets.go.tmpl b/genny/resource/_fixtures/default/actions/widgets.go.tmpl
index 0d1e4afe..51cb9d6d 100644
--- a/genny/resource/_fixtures/default/actions/widgets.go.tmpl
+++ b/genny/resource/_fixtures/default/actions/widgets.go.tmpl
@@ -2,7 +2,7 @@ package actions
 
 import (
 
-  "errors"
+  "fmt"
   "github.com/gobuffalo/buffalo"
   "github.com/gobuffalo/pop"
   "github.com/markbates/coke/models"
@@ -31,7 +31,7 @@ func (v WidgetsResource) List(c buffalo.Context) error {
   // Get the DB connection from the context
   tx, ok := c.Value("tx").(*pop.Connection)
   if !ok {
-    return errors.New("no transaction found")
+    return fmt.Errorf("no transaction found")
   }
 
   widgets := &models.Widgets{}
@@ -57,7 +57,7 @@ func (v WidgetsResource) Show(c buffalo.Context) error {
   // Get the DB connection from the context
   tx, ok := c.Value("tx").(*pop.Connection)
   if !ok {
-    return errors.New("no transaction found")
+    return fmt.Errorf("no transaction found")
   }
 
   // Allocate an empty Widget
@@ -91,7 +91,7 @@ func (v WidgetsResource) Create(c buffalo.Context) error {
   // Get the DB connection from the context
   tx, ok := c.Value("tx").(*pop.Connection)
   if !ok {
-    return errors.New("no transaction found")
+    return fmt.Errorf("no transaction found")
   }
 
   // Validate the data from the html form
@@ -121,7 +121,7 @@ func (v WidgetsResource) Edit(c buffalo.Context) error {
   // Get the DB connection from the context
   tx, ok := c.Value("tx").(*pop.Connection)
   if !ok {
-    return errors.New("no transaction found")
+    return fmt.Errorf("no transaction found")
   }
 
   // Allocate an empty Widget
@@ -140,7 +140,7 @@ func (v WidgetsResource) Update(c buffalo.Context) error {
   // Get the DB connection from the context
   tx, ok := c.Value("tx").(*pop.Connection)
   if !ok {
-    return errors.New("no transaction found")
+    return fmt.Errorf("no transaction found")
   }
 
   // Allocate an empty Widget
@@ -181,7 +181,7 @@ func (v WidgetsResource) Destroy(c buffalo.Context) error {
   // Get the DB connection from the context
   tx, ok := c.Value("tx").(*pop.Connection)
   if !ok {
-    return errors.New("no transaction found")
+    return fmt.Errorf("no transaction found")
   }
 
   // Allocate an empty Widget
diff --git a/genny/resource/_fixtures/nested/actions/admin_widgets.go.tmpl b/genny/resource/_fixtures/nested/actions/admin_widgets.go.tmpl
index 0fa9dda7..ee0dc98a 100644
--- a/genny/resource/_fixtures/nested/actions/admin_widgets.go.tmpl
+++ b/genny/resource/_fixtures/nested/actions/admin_widgets.go.tmpl
@@ -2,7 +2,7 @@ package actions
 
 import (
 
-  "errors"
+  "fmt"
   "github.com/gobuffalo/buffalo"
   "github.com/gobuffalo/pop"
   "github.com/markbates/coke/models"
@@ -31,7 +31,7 @@ func (v AdminWidgetsResource) List(c buffalo.Context) error {
   // Get the DB connection from the context
   tx, ok := c.Value("tx").(*pop.Connection)
   if !ok {
-    return errors.New("no transaction found")
+    return fmt.Errorf("no transaction found")
   }
 
   widgets := &models.Widgets{}
@@ -59,7 +59,7 @@ func (v AdminWidgetsResource) Show(c buffalo.Context) error {
   // Get the DB connection from the context
   tx, ok := c.Value("tx").(*pop.Connection)
   if !ok {
-    return errors.New("no transaction found")
+    return fmt.Errorf("no transaction found")
   }
 
   // Allocate an empty Widget
@@ -97,7 +97,7 @@ func (v AdminWidgetsResource) Create(c buffalo.Context) error {
   // Get the DB connection from the context
   tx, ok := c.Value("tx").(*pop.Connection)
   if !ok {
-    return errors.New("no transaction found")
+    return fmt.Errorf("no transaction found")
   }
 
   // Validate the data from the html form
@@ -127,7 +127,7 @@ func (v AdminWidgetsResource) Edit(c buffalo.Context) error {
   // Get the DB connection from the context
   tx, ok := c.Value("tx").(*pop.Connection)
   if !ok {
-    return errors.New("no transaction found")
+    return fmt.Errorf("no transaction found")
   }
 
   // Allocate an empty Widget
@@ -148,7 +148,7 @@ func (v AdminWidgetsResource) Update(c buffalo.Context) error {
   // Get the DB connection from the context
   tx, ok := c.Value("tx").(*pop.Connection)
   if !ok {
-    return errors.New("no transaction found")
+    return fmt.Errorf("no transaction found")
   }
 
   // Allocate an empty Widget
@@ -189,7 +189,7 @@ func (v AdminWidgetsResource) Destroy(c buffalo.Context) error {
   // Get the DB connection from the context
   tx, ok := c.Value("tx").(*pop.Connection)
   if !ok {
-    return errors.New("no transaction found")
+    return fmt.Errorf("no transaction found")
   }
 
   // Allocate an empty Widget
diff --git a/genny/resource/options.go b/genny/resource/options.go
index cd470566..2b9f6992 100644
--- a/genny/resource/options.go
+++ b/genny/resource/options.go
@@ -1,7 +1,7 @@
 package resource
 
 import (
-	"errors"
+	"fmt"
 	"strings"
 
 	"github.com/gobuffalo/attrs"
@@ -26,7 +26,7 @@ func (opts *Options) Validate() error {
 	}
 
 	if len(opts.Name) == 0 {
-		return errors.New("you must provide a name")
+		return fmt.Errorf("you must provide a name")
 	}
 
 	if len(opts.Model) == 0 {
diff --git a/genny/resource/templates/use_model/actions/resource-name.go.tmpl b/genny/resource/templates/use_model/actions/resource-name.go.tmpl
index eee89da0..6ed8cf59 100644
--- a/genny/resource/templates/use_model/actions/resource-name.go.tmpl
+++ b/genny/resource/templates/use_model/actions/resource-name.go.tmpl
@@ -2,7 +2,7 @@ package actions
 
 import (
 
-  "errors"
+  "fmt"
   "github.com/gobuffalo/buffalo"
   "github.com/gobuffalo/pop"
   "{{.opts.App.ModelsPkg}}"
@@ -31,7 +31,7 @@ func (v {{.opts.Name.Resource}}Resource) List(c buffalo.Context) error {
   // Get the DB connection from the context
   tx, ok := c.Value("tx").(*pop.Connection)
   if !ok {
-    return errors.New("no transaction found")
+    return fmt.Errorf("no transaction found")
   }
 
   {{.opts.Model.VarCasePlural}} := &models.{{.opts.Model.Group}}{}
@@ -61,7 +61,7 @@ func (v {{.opts.Name.Resource}}Resource) Show(c buffalo.Context) error {
   // Get the DB connection from the context
   tx, ok := c.Value("tx").(*pop.Connection)
   if !ok {
-    return errors.New("no transaction found")
+    return fmt.Errorf("no transaction found")
   }
 
   // Allocate an empty {{.opts.Model.Proper}}
@@ -105,7 +105,7 @@ func (v {{.opts.Name.Resource}}Resource) Create(c buffalo.Context) error {
   // Get the DB connection from the context
   tx, ok := c.Value("tx").(*pop.Connection)
   if !ok {
-    return errors.New("no transaction found")
+    return fmt.Errorf("no transaction found")
   }
 
   // Validate the data from the html form
@@ -139,7 +139,7 @@ func (v {{.opts.Name.Resource}}Resource) Edit(c buffalo.Context) error {
   // Get the DB connection from the context
   tx, ok := c.Value("tx").(*pop.Connection)
   if !ok {
-    return errors.New("no transaction found")
+    return fmt.Errorf("no transaction found")
   }
 
   // Allocate an empty {{.opts.Model.Proper}}
@@ -163,7 +163,7 @@ func (v {{.opts.Name.Resource}}Resource) Update(c buffalo.Context) error {
   // Get the DB connection from the context
   tx, ok := c.Value("tx").(*pop.Connection)
   if !ok {
-    return errors.New("no transaction found")
+    return fmt.Errorf("no transaction found")
   }
 
   // Allocate an empty {{.opts.Model.Proper}}
@@ -207,7 +207,7 @@ func (v {{.opts.Name.Resource}}Resource) Destroy(c buffalo.Context) error {
   // Get the DB connection from the context
   tx, ok := c.Value("tx").(*pop.Connection)
   if !ok {
-    return errors.New("no transaction found")
+    return fmt.Errorf("no transaction found")
   }
 
   // Allocate an empty {{.opts.Model.Proper}}
diff --git a/go.mod b/go.mod
index 2dec25a0..a1119c84 100644
--- a/go.mod
+++ b/go.mod
@@ -31,7 +31,7 @@ require (
 	github.com/gobuffalo/x v0.0.0-20190614162758-d80e318e1bb4 // indirect
 	github.com/gorilla/mux v1.7.2
 	github.com/gorilla/sessions v1.1.3
-	github.com/karrick/godirwalk v1.10.12
+	github.com/karrick/godirwalk v1.10.3
 	github.com/markbates/deplist v1.2.0
 	github.com/markbates/grift v1.0.6
 	github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2
@@ -39,7 +39,6 @@ require (
 	github.com/markbates/safe v1.0.1
 	github.com/markbates/sigtx v1.0.0
 	github.com/monoculum/formam v0.0.0-20190307031628-bc555adff0cd
-	github.com/pkg/errors v0.8.1
 	github.com/sirupsen/logrus v1.4.2
 	github.com/spf13/cobra v0.0.5
 	github.com/spf13/pflag v1.0.3
diff --git a/go.sum b/go.sum
index aaf34c41..60851398 100644
--- a/go.sum
+++ b/go.sum
@@ -137,7 +137,6 @@ github.com/gobuffalo/depgen v0.0.0-20190315124901-e02f65b90669/go.mod h1:yTQe8xo
 github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=
 github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
 github.com/gobuffalo/depgen v0.1.1/go.mod h1:65EOv3g7CMe4kc8J1Ds+l2bjcwrWKGXkE4/vpRRLPWY=
-github.com/gobuffalo/depgen v0.2.0 h1:CYuqsR8sq+L9G9+A6uUcTEuaK8AGenAjtYOm238fN3M=
 github.com/gobuffalo/depgen v0.2.0/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=
 github.com/gobuffalo/envy v1.6.4/go.mod h1:Abh+Jfw475/NWtYMEt+hnJWRiC8INKWibIMyNt1w2Mc=
 github.com/gobuffalo/envy v1.6.5/go.mod h1:N+GkhhZ/93bGZc6ZKhJLP6+m+tCNPKwgSpH9kaifseQ=
@@ -449,7 +448,6 @@ github.com/gobuffalo/shoulders v1.1.0 h1:nzhFIkpYmWPYF3sxtw3KQ5z7l1QIM3tLApyk+TL
 github.com/gobuffalo/shoulders v1.1.0/go.mod h1:kcIJs3p7VqoBJ36Mzs+x767NyzTx0pxBvzZdWTWZYF8=
 github.com/gobuffalo/syncx v0.0.0-20181120191700-98333ab04150/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
 github.com/gobuffalo/syncx v0.0.0-20181120194010-558ac7de985f/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
-github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754 h1:tpom+2CJmpzAWj5/VEHync2rJGi+epHNIeRSWjzGA+4=
 github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
 github.com/gobuffalo/tags v2.0.11+incompatible/go.mod h1:9XmhOkyaB7UzvuY4UoZO4s67q8/xRMVJEaakauVQYeY=
 github.com/gobuffalo/tags v2.0.14+incompatible/go.mod h1:9XmhOkyaB7UzvuY4UoZO4s67q8/xRMVJEaakauVQYeY=
@@ -540,9 +538,8 @@ github.com/karrick/godirwalk v1.7.5/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46s
 github.com/karrick/godirwalk v1.7.7/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34=
 github.com/karrick/godirwalk v1.7.8/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34=
 github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
+github.com/karrick/godirwalk v1.10.3 h1:lOpSw2vJP0y5eLBW906QwKsUK/fe/QDyoqM5rnnuPDY=
 github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
-github.com/karrick/godirwalk v1.10.12 h1:BqUm+LuJcXjGv1d2mj3gBiQyrQ57a0rYoAmhvJQ7RDU=
-github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
 github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
 github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
 github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
@@ -713,6 +710,7 @@ github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:Udh
 github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e h1:qpG93cPwA5f7s/ZPBJnGOYQNK/vKsaDaseuKT5Asee8=
 github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA=
 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
 github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
 github.com/spf13/afero v1.2.0/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
 github.com/spf13/afero v1.2.1 h1:qgMbHoJbPbw579P+1zVY+6n4nIFuIchaIjzZ/I/Yq8M=
@@ -732,6 +730,7 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn
 github.com/spf13/viper v1.2.1/go.mod h1:P4AexN0a+C9tGAnUFNwDMYYZv3pjFuvmeiMyKRaNVlI=
 github.com/spf13/viper v1.3.0/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
 github.com/spf13/viper v1.3.1/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
+github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M=
 github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
 github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU=
 github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
@@ -780,6 +779,7 @@ golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACk
 golang.org/x/crypto v0.0.0-20190403202508-8e1b8d32e692/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
 golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
 golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5 h1:58fnuSXlxZmFdJyvtTFVmVhcMLU6v5fEb/ok4wyqtNU=
 golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 h1:1wopBVtVdWnn03fZelqdXTqk7U7zPQCb+T4rbU9ZEoU=
 golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
diff --git a/handler.go b/handler.go
index c6535cc8..cb6fb13f 100644
--- a/handler.go
+++ b/handler.go
@@ -16,7 +16,7 @@ package buffalo
 	}
 
 	func (c Context) error {
-		return c.Error(422, errors.New("oops!!"))
+		return c.Error(422, fmt.Errorf("oops!!"))
 	}
 */
 type Handler func(Context) error
diff --git a/internal/errx/errors.go b/internal/errx/errors.go
new file mode 100644
index 00000000..c89189b8
--- /dev/null
+++ b/internal/errx/errors.go
@@ -0,0 +1,21 @@
+package errx
+
+// go2 errors
+type wrapper interface {
+	Unwrap() error
+}
+
+// pkg/errors
+type causer interface {
+	Cause() error
+}
+
+func Unwrap(err error) error {
+	switch e := err.(type) {
+	case wrapper:
+		return e.Unwrap()
+	case causer:
+		return e.Cause()
+	}
+	return err
+}
diff --git a/mail/internal/mail/auth.go b/mail/internal/mail/auth.go
index b8c0dde7..7b3d073f 100644
--- a/mail/internal/mail/auth.go
+++ b/mail/internal/mail/auth.go
@@ -2,7 +2,6 @@ package mail
 
 import (
 	"bytes"
-	"errors"
 	"fmt"
 	"net/smtp"
 )
@@ -24,11 +23,11 @@ func (a *loginAuth) Start(server *smtp.ServerInfo) (string, []byte, error) {
 			}
 		}
 		if !advertised {
-			return "", nil, errors.New("gomail: unencrypted connection")
+			return "", nil, fmt.Errorf("gomail: unencrypted connection")
 		}
 	}
 	if server.Name != a.host {
-		return "", nil, errors.New("gomail: wrong host name")
+		return "", nil, fmt.Errorf("gomail: wrong host name")
 	}
 	return "LOGIN", nil, nil
 }
diff --git a/mail/internal/mail/send.go b/mail/internal/mail/send.go
index 62e67f0b..5881b707 100644
--- a/mail/internal/mail/send.go
+++ b/mail/internal/mail/send.go
@@ -1,7 +1,6 @@
 package mail
 
 import (
-	"errors"
 	"fmt"
 	"io"
 	stdmail "net/mail"
@@ -66,7 +65,7 @@ func (m *Message) getFrom() (string, error) {
 	if len(from) == 0 {
 		from = m.header["From"]
 		if len(from) == 0 {
-			return "", errors.New(`gomail: invalid message, "From" field is absent`)
+			return "", fmt.Errorf(`gomail: invalid message, "From" field is absent`)
 		}
 	}
 
diff --git a/mail/internal/mail/writeto.go b/mail/internal/mail/writeto.go
index faf6124d..74602d87 100644
--- a/mail/internal/mail/writeto.go
+++ b/mail/internal/mail/writeto.go
@@ -2,7 +2,7 @@ package mail
 
 import (
 	"encoding/base64"
-	"errors"
+	"fmt"
 	"io"
 	"mime"
 	"mime/multipart"
@@ -151,7 +151,7 @@ func (w *messageWriter) addFiles(files []*file, isAttachment bool) {
 
 func (w *messageWriter) Write(p []byte) (int, error) {
 	if w.err != nil {
-		return 0, errors.New("gomail: cannot write as writer is in error")
+		return 0, fmt.Errorf("gomail: cannot write as writer is in error")
 	}
 
 	var n int
diff --git a/mail/smtp_sender.go b/mail/smtp_sender.go
index 120debf0..8e472d14 100644
--- a/mail/smtp_sender.go
+++ b/mail/smtp_sender.go
@@ -1,11 +1,10 @@
 package mail
 
 import (
+	"fmt"
 	"io"
 	"strconv"
 
-	"errors"
-
 	gomail "github.com/gobuffalo/buffalo/mail/internal/mail"
 )
 
@@ -77,7 +76,7 @@ func NewSMTPSender(host string, port string, user string, password string) (SMTP
 	iport, err := strconv.Atoi(port)
 
 	if err != nil {
-		return SMTPSender{}, errors.New("invalid port for the SMTP mail")
+		return SMTPSender{}, fmt.Errorf("invalid port for the SMTP mail")
 	}
 
 	dialer := &gomail.Dialer{
diff --git a/packrd/packed-packr.go b/packrd/packed-packr.go
index a4e6e7ca..26d39b57 100644
--- a/packrd/packed-packr.go
+++ b/packrd/packed-packr.go
@@ -39,7 +39,7 @@ var _ = func() error {
 		"5326a1f49e88f03a1e5f2c3a40e54348": "1f8b08000000000000ffac94516bdb400cc7dffb29340f460b251d648c61285bb61656284d4952c69ee28bad24c7ce2757a74b1742befb909d3849b70c56f69060cb27e92ffda42b70818eaa12bda4270085350e7349212997e1d1256a32622626600ac96ad5a14a42e79e716a7faed7e33d6f3d3aa7a0ae8e72e3f4596d15b1dabaddb7eff53506e41412266abe9a109e888bd67422188e2979ad3ff84e1172e335121808d6cf1cc2c3e01682b0f533981283cc1182291172f2533b8b6cc4924fb73122bb6ddcf4e24213a7faf7e9b4559eaadeb38bdf0a56751f2bc30147b6c44be1886fcae8c40ec5086a1f42636434851ea12897ddb0537f478220732360a7b0a45897914576d93990cc910f2507308c10ac432f6e0976e689b1e8d4a16e3cc8dc06c84dc0f3ba64ed421983680c31d683710e181fa3652cd4e831d7a8501936250a72e86c94fd8db216fdbff0564c45cc0f68b4448d0b54f703fdc232796da771b0306ccdc4610021a00532db0261615cc40076db84ba6b9d03c2ab55b25a25eb35fa459f21b9ea8d7a9f7bc3ebf1c3e0367919fe9dfa970cc17abd6df6bf6dd92eeb8ec2b1dabef687a3649f519db4a174cce7be3f509f9a617dbca178b47dc3eb41b201da446f291fcdd01b0ebff50757076e0dfc9e2fea3d6807a025fcc77985c912028ae8a65b81e80b64a0aade9596fee6bd9e3095b721958252698ccf78ed7fdaa396423734c69c9c6b2e1148a24c3f949377e3197a64e3c6b9ddedf797dec3e8a67ff7aaf182ac4d9e81f145f63c6fd6eceb04b5289def4c7564faf444fc032aa60ad92d3b9b7837cda5a1978227811019cfa1a0fa259f1b3f433825d660677a2384ed9e744e7e050000ffff6b7d0f64e9050000",
 		"53cc1d15028e0b1431c355d61ba109d4": "1f8b08000000000000ff648ec14ec2401086ef7d8a3ff4a209e9039870a8b2310605d2ad282732b453d8b8ec34bbdb62dfde948428718ef3ff33df97a23c9a808c5d8fc658c699020eecd853e41afb01fbae69c8ca1454d738b267c42363ecf7e40ded2d070cd2c131d748d26b1f5160856a1817e572a2961b8803b5ad351545230e21928f5d8b20e30b7f939dc57f0554e23d57d10e5992a2948bc42fb70b8c85dace36f9ebbb4223fe44717ab1a9c8c152640fcfd11bee476d1360dc3fd2e83ca00bc61d20217be6c8aebf9b2cd476729f256992427dd3a9b5fc90a498e765fe986bb55be75a7fac8af9ecf33a490aadb47e592d775a3d15aabc8ddecaf54eab62a38a3ffb9f000000ffffb53849697f010000",
 		"5597b95c7800708f526fe349c8315960": "1f8b08000000000000ff5490cf4ec3300c87ef3cc54f968640a2aae04ad20b4fe22d5e172d69a6381b428877476bba35bbe49f3ffbb3639cbf601758d5524edf343c01eddb2e852ebaeefd638e006663b14f192fc7374451e551f4157ec23eb01ef08b4de51a32ea381337bc851e651c2417cc6b774d3f623310720ab2c468cdab82a8635b0c30db73296942f93989a57aa1fb3021a9101c17ee9cd7e8ef520267cf5de0ad044b5f33d796058c9e78aad4c13b2793a592cf42c373f151f4d3f457e0a195beea9b597be72febffe0efd6fb7a5e9065fb0f0000ffff829b6c549e010000",
-		"58087a293b8355d4c89fcbff6f66a041": "1f8b08000000000000ffec594d531b3913befb5774e6f0d6cc5b5e995039b1c5c104c85295cd52e0b0c79498e9b15568a489a4c1665dfeef5b2d69b04dec31543e361f9cb0ad56f7d35f8f5aa2e6f90d1f23f0dc09ad6caf27aa5a1b0769af0790a031dad8843e8e859b34d72cd7d560acaf9bb2e4520fe2dfed02b5aefde27cce74ed2c1bd635fb531728edf9cd78b1487a59af3718c068222c944222080b635468b8c302aeefe028286270e64097251a0b1caeb9153958679adc3506a1d486b4f0a2106adc072c84136a0c5c1550a0c4f0056a3e46066725dce9c6404528c85ca50dd2ee5c57b5c419684302a0100bbf066ec215b80946b382c42a548e53c496b24e9316b20dae758779ef4eb5947a4a2014afe88fd463526497bab000a15a670f68938fd2015c0a356e243790b621f40becdce81acd629191ecf1118cf8b5c40338978de1f2a1b05f14ff6014bf40ab1b936f107fc72b64ed72943ee76eb2941cac89bebf781ba5ae044e6184552db943f2b840b3b2cbc515bbbeff946214843cbc4128872d70da4f1439ca8769bf97daf81f368728a4bae7ee6adca939d4d4bc07102bf85ea8b7f0d0de0aeb608cce0297f281c1374637f562c1623937caf794af315ed7be443ccc9abb09e97a7332820df1ecd14e486f7781cd3c9834bf87fa5a2b873397816f5b202fc80a3a6ff5f80872ad140650a5d195ff390f9b7a006ed6077d03078790b32b2e1b4c13374b3296febfd635298f7bb31e8028e185bef126000cbac6a860d5b277384d13a5c119ae2c8fd674a38a84362e8857d6c376c5cd6b6e3194c1624100fee75366d9c6f8cebd0e5f9963a1a8dc0cda463acbe09c1b5e5948a8d513dfff498de643f84a9e1a2d8907689bd08a053dc758f2463ab825a72d708341c3e1cb073a0ef7f712daf39130ba196b019c1a5d05d369cee2872c8b282fd01981b7b8bd6096c9383e0ab14563c8c447369432ed8c56f6bb177e71084ac84ff2d1067c30806151c4e2f398a963f46a0180d5201ce45cc135426303239140dbbbe479ce2ed1a5c93284491f3eb671d0260bd9251714c2260a6297ce1005ae177dfbeb6f8b45403b11caf9b61e364e834155a0410fd92237f9046adfdcf7d840eadce359626c973ed4064b314bfacb5368d96bbe26e773405544e3317839bbf046d3fdbdbd3e184638d2bcdf5dba591659e272a2a7812528800577dc3ba3d5368eeae20c52d8d2c636ce18cce7c93c592cd6567c259e1d2f9e422984fc47a414aa70e98b00812bc0aa76775b62bd8d80e8a895d84540ad867b061a6928852aba0e9f9039c32b746860737e28ddd4716cadfbdd8c9d0a556ceeff166c1f22e3a4c966dd49d64111393ba108a7aff65ef5496885a17fb51e6e031a7a38f8bf9c5987f66fbcf6da07037887d3e84ee8ef529bca3b9a1be471d85438ddd6eacb81b77342d8daea0aa78fef676a9dce76fea933bdab8d7db25714526a5e5312912e1374d5d8d6d53a12e0ae618f34fa6c9eff75f999d35e00b6939cff031a3c220eec5616033671950cfd82e1e263d7282f67473b19efd113cff7794a5d71290a4acf72326811dd07a707708bc6d8feca51d0ee1baa22164277949671dd1129510663ec0f6e87ea2ecda224dd41f94dc0193c047ecb85246a00a1ac287089ba6d5fbf33b6747c3ce807f57e348c0331b52af0318f03a6c2295bd34257ee90bbc6a2a199b4dd9b6b63300f6b42d58d63ebc759a48157fbfb4f21fcb5436f13e97bdb67259935e82f084ab741b1e880836df21cad850aade563f4c4762ab99da4191b16459a4481a40f2336a20a91be9957786e233ae6cf142c58bb3f7bc081011b5d530c16220447af0d244bae01a10a9cf987908ddcf9f24b9e92278570f7c7240f0f23f727e53662fd944e49d5130ec7ee397840281ecfb8e4c2f330fca853e0796cfd0ec6d60793ccfbda1f34f984ab31760c339186bb8799b55be8f9fbaf7b0b0dc89f5bef076abdcd63e0c381f99bcd7f5df353acae9f667ea243ed7980da3640353edbdf66807aea33837f7cb6cee8bbf08faa2e965e7924decad39ea457a6a4e393b727a393af4ad511ff3357fff26f866b28dab2f80254fe39ac5212837c794e2982773b59e5e25b33cabf010000ffffc114e703cf1f0000",
+		"58087a293b8355d4c89fcbff6f66a041": "1f8b08000000000000ffec595b53e33a127ecfafe8f1c396bd9555186a9ed8e2210c304bd5ec2c0519f6714ad86d47852c792419c249f9bf9f6a4926092717a8b99cb9f01412b7babfbe7ddd320dcf6f7885c07327b4b28381a81b6d1ca483014052d62ea1cf4ab8697bcd725d8f2a7ddd9625977a143f370b34baf10fe773a61b67d9b869d87f7581d29edf545d970cb2c1603482c9545828854410162a5468b8c302aeefe128286270e64097251a0b1caeb915395867dadcb506a1d486b4f0a210aa1a0216c209550157051428317c818657c8e0ac847bdd1aa8090599abb5413a9debba9138036d48001462e19f819b72056e8ad1ac20b11a95e314ae85acd3a4856c83ebdd61debb532da5be23108ad7f42175458aec4217162054efec011df2513a804ba1aa567203691f42ff809d1bdda0e9ba8c648f8f60c2af251ec0b96c0d978f85fd43f10746f10bb4ba35f91af10fbc46d63f8ed2e7dc4d1792a315d18f17efa3d495c03b9860dd48ee903c2ed02c9d72f1895d3d7f4a310a421ede2894c30638fd5f1439ca87e9bf97daf81fd68728a47ae0ee1bdca939d4d47c00102bf84168d07968ef857550a1b3c0a57c64f09dd16dd3752c9673ab7c43f91ae34de34bc4c36cb89b92ae7727135813cf019d84f47617d8cc8349f307a86fb572387319a031da00794156d079abc747906ba530802a8daefdcf7938340070b321e81b3838849c5d71d9629ab85992b1f49f8d6e48793c9b0d004409aff48d370160d0b54641593b764296cb34511a9ce1caf2684db7aa48e86047a4b21ab62b6ede728ba10cba8e00fcc3a7ccb2b5f19d7b1dbe322ba1a8dc0cda563acbe09c1b5e5b48a8d513dfff4983e653f84a9e1a2d8907e898d08a053dc758f2563ab825a72d708341c3e1eb473a0ef7f7123af39930ba19eb019c1a5d07d369cee21f5916515ea033026f7173c12c92717c14628bc69089cf6c2c65ba355ad9bfbdf0ab435042aee6038de9033e1ac1b82862f179ccd4317ab900c06a100e72aee01aa1b5819148a0ef5df23c6797e8d26411c264089ffb38689385ec920b0a611d05b14b678802578bbefff55f5d17d04e8572beadc7add360501568d043b6c84d3e85c637f70336903af7781618fb479f1a83a59825c3c5145af49aafc9f91c5015d1780c5ece2ebcd1747f6f6f0886118e341f6e2fdd2c8b2c7139d577812528800577dc3ba3d5268edac619a4b0a78d4d9c319acf9379d2752b4f7c259e1d77cfa11442fe33520a55b8f44580c01560ddb8fb0db1de4440346a256e23a05ec303034d34944215db864fc89ce1353a34b03e3f946eea38b6d2fd6ec64e852ad6f77f0f76089171d264bdee24db421179886efa66efcd90849618fa77ebe13ea0a18783ff8b9d756cff8fd75efb68041ff02eba13fabbd4a6f68ee606795c3615de6d6af5c5c2bb7543d8d8ea0aef9edecf1f70473bffd299ded5c63ed94b0a29356f2989489709ba6a6cea6a1d0970d7b2471a7d36cfff77f985db5e00b6939cff061a3c220edcae2c066cea6a19fa05c3c5c7ae505ece8e7632de93379e1f734a5d71290a4acf6233e8113d046700708bc6d8e1d228e8cf8d55110b617b941671dd1129510663ec3fdc8ed57d9a4549ba83f29b80d31798057ecb85246a00a1ac287081ba6f5f7f32b67438940c837abf1ac685985a1578c5e382a9f08ead68a12b77c85d6bd1d04eda9fcdb5319887674235ad63abe32cd2c09bfdfde710fecad05b47fadef65949660dfa0b82d27d502c3ae060db3c476ba1466b79859ed84e25b7d33463e3a2489328900c61c2265421d237f312cfad45c7fc4cc182f5e7b3471c18b0d135c560214270f4ca42b2e01a10aac0997f11b2963b5f7fcd29795208f73026797831f230293711eb5fe994543d63386edf834784e2e98c4b2ebc2cc34f9a022f6beb0fb0b63eda643e367ed0e453ae2adcb2cc441adebeccacdc42cf3f7edb5b6840fed27a3f51ebad5f031f2fccdf6dffdbb63fc5eafa65f6271a6a2f0bd4a605aaf5d9fe3e0bd4735f33f897cfd6197d1ffe51b58da5975e126fe4694fd24b5bd2f1c9fb93c9c937a5ea88ff85ab7ffb77862b28fab2f80a54fe25ac5212837c7d4e2982773b59e5e27b33ca9f010000ffffea202445cc1f0000",
 		"593cbb702bb3c5a0fcbfa227df3a58f1": "1f8b08000000000000ff7452cb6edc300cbceb2b089dd6856b033d1ac821011a1468da5ef203b24ddb42255195e83c50ecbf1792656f1a6cf6b2e26866c8a1e5d5f05bcd086a604d2e0aa1ada7c070120072d6bcac7d33906d67ead7695286daa408edd317f92163ff0fe8460c5254423ca900013e6d48f3d5cdda6106558cc8f18e5ee006b273f3139f4f5279df6d57b206d934ad5f7ba307590931ad6e00ed349f2af82b0002dc40f14dd272fce5739e4448bfb6856f8f3f1ec0a8575a1998a04758238e30510065cc761df0cf8a91635764097cc8922ed7692ea30795bc9b85ad91b5b87448290672acb4d36eceae34012f088cd61bc578183feec01dbd74ef831fec92fd525775d1dfee6bcb731d4b7c3bcded381e7d6141e331445830e0116ec3ba7d7ba5de57964dd2761cb9cf3d11470eca27c41e76ab1bc85a749c531aed30be55f768e819941ba1bcaaebefa5b8b5c93aca77ed6d6cee29d8eff8ba7d820b545f67de53d8c8ff413bf99c0ee74a9cc5bf000000ffff6f674a71fa020000",
 		"5a8408312923fc8c5fdddc2e213566cc": "1f8b08000000000000ff010000ffff0000000000000000",
 		"5dd1df1b2c53e1a3425bfe5dc07ff730": "1f8b08000000000000ff8c525d8f123d14beefaf3859decb773a10634cd660823bb81a6521ec977b653aed613832735adb4e7443f8ef663a08a8bb89e102e8739e8f9e3e03b85953000aa0a069eb485988aa4228acdea05f518da0d880c76f2d790cf066bc8760f44a0e5f8a01ac6374e13ccf8dd5419a84496d9b1cb922c6bc0de8ab960c76071935aac23c19259fac6ca936b978b79ccfa0b265bb5aa9dae6fbeff3ed565a1783bc431fc8f26e072a40a2a01762797b05cdc69087ccc17f97f3c5e4e67d1ebcce7fd126cec985d21b55e16253ed76e27ebefc587c58fedbb0d86e690547f09ee2fa1e4ba7f406b2dd4e0c2076abfb4e750d5ae935425c23b06b80384455d71022baffa1e51a4300d76bcbafc132e8b5e20a839814c5ef807ccaf541794e96ddf8a3f22c6bab3720d306baff07c72c639b396f2b8f2188ed16eb8089d94d9e46fb6b904d9a3bfe4a66f2e94005ba83aa4107c8a1f578eaf70469664d5b6348f0f4ea0e2ee7a3d168362f6e3f4dafc7964fac3bd9ca428511642ea5fc03dab7a32f02645d632369c82ce42571ae9c137da154ed88317194db8032a6bf77ff5aa50aebe730ad328d3ed28ab48a18c4a139c941888bf9e201b26ce56d33def7f1600e528801dcb2b64d831c215af02da77294c4ca3f02319c396f4dab23593e83c61a3c1703e8b7f2657a75373ec29dd85b6293043af9686128d30782058aa0154389101019ba4460db18c8f47dd496a322469f763e298ae578cf1662fa7931bf9ec28be170f86ce4862aafba1c014a5c598f1dc2c4d5c985baec17b3e2b8819e84af8f0fd2c1f803f5f1e467000000ffffb0f46bad7a040000",
@@ -64,7 +64,7 @@ var _ = func() error {
 		"8ce13eeed27bfd94470fb7430910bf43": "1f8b08000000000000ff2c8d4b6a03310c86f73a8536597a085d9ab647e8054a311a5be31864c9f8119adb974cbaf9d0e3e7fba9b5d0cda6c70d4a56eb9cc26192b80f0f0eefacc93a3814cb2f0e704863f07c0e6ded522238ccbd1ce765d6060ef7a2e0502d71a89696f0f3b50d1ac3458a3786a25156e214f877b28e627ad66dd99e64bdc3be8aa4d068defc297ded89851e1edfae571db017a5fe084a953dbe5f3e905adbbea8325e3edd998768b592a67008e5e1f1fb075869170ed1c4faf038fb6210cbff967d1d0789c15f000000ffff20a0099817010000",
 		"8fca3f2f698f93dd31db24828b9ab0f7": "1f8b08000000000000ff2ccdb10dc3201046e13a37c52f2a68f00caed266058c023939e690392ac4ee511257affaf46a887bc84fe4939336223eaa9c0a4b80c9acafbef928c79265eb2985b72c570dddcc18f052b5f9b556bf466529edb167cc69c811a55e22b8b05a8741c025fdfdb7b2e10fbed83a47933e010000fffff34f28648b000000",
 		"920fdc8a8285bc442cfb791bcafe45b6": "1f8b08000000000000ff8c51cb4ec33010bcef572c3ed955e5481c41bd8004b78204e2ee868d6bd5b12d67034151fe1dd9e5a11e785c6766673ce364da83b184f38c3a989ef4fd07b02c00ae4f31334a4014d6f17edce936f68d8dbbb1eb8c8f8da510dec48f74f2e3b0b7147e5198f6909b97f33f3c0428806e0c2d6ee955c6c403aeee12bb18068572559fa16f2950361cf31a29e79815ce8068f162834741b9550088ae2b8a42142bfd64bc7b364c525d56fc6c83c1f97a8d9889c71cd05653405c4e0dacbe8a93ac35aabf2843eee2b4357dd950ac5168dd7cad7be37c811ba63e79c33408f5bf50c496a71258f72851d731304d2cd591d30fc452943e625d6b15dceac76cc2d0c5dc53969fdf7102b63ca922fd8e0ccec302f01e0000ffff7aa1c8be1a020000",
-		"9520f324d82a6b9cf6f4fe175e5ef1f8": "1f8b08000000000000ffac524d6fdb3a103c93bf621f810454a047e1e1dd8c3a409336bda581833687a2075aa268c2d2aeb0249b0686ff7b215b091cc3c9a9275bfb313b9c99c1d66beb1dd47d2365e807e2045a0a551326f73b292985fa7036071a5234775df601efd61ece2e2bef109faa97defd8a38dddadec1d9a59242f9905679696aea2b4fcbdcb6b6a3fdcefbddca9377783433ac7de59889e351230eed7fff57352dd92a5948f9cb3278878e6d725f87140823cc2126ce75828d141727f99a69548a869f16196149d4c9ed468aa93183f3771737db526ea5acaa97e3d77d03ec0676d1618a9056eea50535f5bdc5e615d9717e0ee7bb9798ebfdc0468a6fd1cd00409d96b99462f73d03f58c13c102ba4778736191f1f30cda8cb5aefb062e5e5d2cc1b28ff0e3674c1cd017b0137d144e30cce6b073c83cb8b4c8888ef594127365ebb567cad8e8a2905288d01edb602669472cc1f08cf569577d1b4b88ed88e7cb91ca48e1b40fb7ee511f1f9c7e8b3d9d71fd9f3960e8260a2e65c6fd03a3790869759f6cbdd68e797f5508de95b52f0e18ccc15322eaa2f942377dd26c1644e92fdd98e6d92c32ea428a7daa46af206048ba18610f12636e3aeba32ecc1551f7ddf29d3e3fad7a09aae1a77f39a31affaa125adb455782e28c87e12486c790569413d4ec6c0ae8a10d9d8b400c9c11c7c294dfa80a09a7fd18b97d6c9a2955fa807221b7f24f000000ffff1136ba3e74040000",
+		"9520f324d82a6b9cf6f4fe175e5ef1f8": "1f8b08000000000000ff9c52cd6edb3c103c934fb11f810454a08f42d19b510768d2a6b73470d1e650f4404b144d44da359664d3c0f0bb17b495c0099c1c7a92b43f33a3d959dbf6ce7a07edd84919c63571022d856a0993fb939494427d389903ad53343743f6016fee3c9c9c37de213e344fbd6f2be2746d470727e74a0ae5435ae5a569696c3c2d73dfdb81f63b6f771b4fdee18b99b8eedfbd6f5a5ab255b292f2b765f00e1ddbe4beae53208c30879838b70936529c1d9565a651293a7e58648425d120b71b29a6c60c4edf5cdc6c6bb995b2699ec82fc70ed8add9458729425ab9a716b4348e16bb6762cbfc1c4e777f622ef7031b29be4737030075dccd5a8addf70cd4234e040be8eee1d58545c6cf33e833b6ba1d3b387bc65883651fe1e7af9838a0afc0311317e304c36c0ebb43985b971619d1b19ec2602e6c7be7993276baaaa41422f42fcf60266b0b966078c4fab4abbe8e25c4b6e0f9ba4829128edfe1daddeb9784d3b3dacb29ebffcd01c3304970293396f28e430836b721adb4af0ef8e6e029110dd17ca1ab3169360ba2f44f885397cd22a3aea4d827a6dc010286a4ab027290067335581f75652e88861f966ff4e971476b501d3ffccf1955795535f47688ae06c5190f83470cf721ad282768d9d914d0431f06178118382396c294cda82a09c7bd2eda3e76dd94187d20b9925bf9370000ffff4d6db28e37040000",
 		"a61b972dce26544398f591b4e2f715f3": "1f8b08000000000000ff548fc16ae3301086cfd653081d16693172f6bab0a7253d95b484400fa514c51d2ba296e48c4634c1f8dd8b1453da8b0edf7c9aff9fc9f4efc6029f67ae83f1a01f57b02c8c393f45242e59230812b96005638db08e4ef9a8fbe83b1b8f7918cc183b0b215ccb5b4cf1d34a8440fd09bbba65b87608e7ec1004538c0d39f4fc00895e77f02189ff5ea3f441f19935c8fffee3abafaba1186b6ccb01eba8a05f0f13b918d2bc28d6a0dec52d62440988c5c51c8ab8562b3bf6390440a9ea4c3f393a495bcdafaf85ef7390aa6248b5446190f24849deec7b081221e9ffd17b13de52cb37ea3bbf7323a496ff29f670bb6385cf9b97226ecfd98c52c0c5f869044d17122d1ff4ce7828d10bfb0c0000fffffb4a36cd9f010000",
 		"a676ca891e9d7b9f2f10d3a887fc812b": "1f8b08000000000000ff7490cd6ac3301084effb148320c52ec1a6f4169a4009bd96d0d25e4a0f8a2c2b22966456522e21ef5eecfcf487f424d0ce7e333bbd545b6934946b88aceb0327140400a275491001e2613247e853ac565d36d6afb60693457df97ddd044ecfd2694c1662d01b9b36795da9e06a13d6b96d6517eaf3db8f8cf85718fbf6eebe5661cd52504954d7d8698e36f8a56bc0ba671db54f1169a3cf13a8e09cf40ded24ff54cf713382aae571be27e02dead970d44926a6048cc167102a336b9f2ed8d0e2fa71c3d24bf64f33b4d9ab42b906b7bf9ca6906c223e3e6362eb4d09cd1c18fbb1d0d6a56ac5d6a7ce17e21f83ebc6d5fb3159397258a7cc1ede76041ca674201ae2c07a9b8a7234bb4a59baa67a6c9a53d4e2bbb0920ef4150000ffffe257d10308020000",
 		"a95877cfc2957859690620af727512eb": "1f8b08000000000000fff248cdc9c957482bcacf55a8ae56d0cb4bcc4dd50bc92cc949cdac4a55a8ade502040000ffff8a41cdb420000000",
diff --git a/plugins/decorate.go b/plugins/decorate.go
index 8f3e4b95..7dff9b7b 100644
--- a/plugins/decorate.go
+++ b/plugins/decorate.go
@@ -9,12 +9,11 @@ import (
 	"strings"
 
 	"github.com/gobuffalo/envy"
-	"github.com/pkg/errors"
 	"github.com/spf13/cobra"
 )
 
 // ErrPlugMissing error for when a plugin is missing
-var ErrPlugMissing = errors.New("plugin missing")
+var ErrPlugMissing = fmt.Errorf("plugin missing")
 
 // Decorate setup cobra Commands for plugins
 func Decorate(c Command) *cobra.Command {
@@ -44,7 +43,7 @@ func Decorate(c Command) *cobra.Command {
 
 			bin, err := LookPath(c.Binary)
 			if err != nil {
-				return errors.WithStack(err)
+				return err
 			}
 
 			ex := exec.Command(bin, ax...)
@@ -74,7 +73,7 @@ func LookPath(s string) (string, error) {
 	var bin string
 	pwd, err := os.Getwd()
 	if err != nil {
-		return "", errors.WithStack(err)
+		return "", err
 	}
 
 	var looks []string
@@ -93,7 +92,7 @@ func LookPath(s string) (string, error) {
 	}
 
 	if len(bin) == 0 {
-		return "", errors.Wrapf(ErrPlugMissing, "could not find %s in %q", s, looks)
+		return "", ErrPlugMissing
 	}
 	return bin, nil
 }
diff --git a/plugins/plugcmds/available.go b/plugins/plugcmds/available.go
index 68ed4d8c..6fbfe523 100644
--- a/plugins/plugcmds/available.go
+++ b/plugins/plugcmds/available.go
@@ -2,12 +2,12 @@ package plugcmds
 
 import (
 	"encoding/json"
+	"fmt"
 	"io"
 	"os"
 
 	"github.com/gobuffalo/buffalo/plugins"
 	"github.com/gobuffalo/events"
-	"github.com/pkg/errors"
 	"github.com/spf13/cobra"
 )
 
@@ -140,13 +140,13 @@ func buildListen(fn func(e events.Event) error) *cobra.Command {
 		Aliases: []string{},
 		RunE: func(cmd *cobra.Command, args []string) error {
 			if len(args) == 0 {
-				return errors.New("must pass a payload")
+				return fmt.Errorf("must pass a payload")
 			}
 
 			e := events.Event{}
 			err := json.Unmarshal([]byte(args[0]), &e)
 			if err != nil {
-				return errors.WithStack(err)
+				return err
 			}
 
 			return fn(e)
diff --git a/plugins/plugdeps/plugdeps.go b/plugins/plugdeps/plugdeps.go
index bc1cf570..6f5a755b 100644
--- a/plugins/plugdeps/plugdeps.go
+++ b/plugins/plugdeps/plugdeps.go
@@ -1,17 +1,17 @@
 package plugdeps
 
 import (
+	"fmt"
 	"os"
 	"path/filepath"
 	"strings"
 
 	"github.com/gobuffalo/meta"
 	"github.com/karrick/godirwalk"
-	"github.com/pkg/errors"
 )
 
 // ErrMissingConfig is if config/buffalo-plugins.toml file is not found. Use plugdeps#On(app) to test if plugdeps are being used
-var ErrMissingConfig = errors.Errorf("could not find a buffalo-plugins config file at %s", ConfigPath(meta.New(".")))
+var ErrMissingConfig = fmt.Errorf("could not find a buffalo-plugins config file at %s", ConfigPath(meta.New(".")))
 
 // List all of the plugins the application depeneds on. Will return ErrMissingConfig
 // if the app is not using config/buffalo-plugins.toml to manage their plugins.
@@ -24,7 +24,7 @@ func List(app meta.App) (*Plugins, error) {
 
 	lp, err := listLocal(app)
 	if err != nil {
-		return plugs, errors.WithStack(err)
+		return plugs, err
 	}
 	plugs.Add(lp.List()...)
 
@@ -35,10 +35,10 @@ func List(app meta.App) (*Plugins, error) {
 	p := ConfigPath(app)
 	tf, err := os.Open(p)
 	if err != nil {
-		return plugs, errors.WithStack(err)
+		return plugs, err
 	}
 	if err := plugs.Decode(tf); err != nil {
-		return plugs, errors.WithStack(err)
+		return plugs, err
 	}
 
 	return plugs, nil
@@ -67,7 +67,7 @@ func listLocal(app meta.App) (*Plugins, error) {
 		},
 	})
 	if err != nil {
-		return plugs, errors.WithStack(err)
+		return plugs, err
 	}
 
 	return plugs, nil
diff --git a/plugins/plugdeps/plugins.go b/plugins/plugdeps/plugins.go
index 88250f24..4f326605 100644
--- a/plugins/plugdeps/plugins.go
+++ b/plugins/plugdeps/plugins.go
@@ -6,7 +6,6 @@ import (
 	"sync"
 
 	"github.com/BurntSushi/toml"
-	"github.com/pkg/errors"
 )
 
 // Plugins manages the config/buffalo-plugins.toml file
@@ -23,7 +22,7 @@ func (plugs *Plugins) Encode(w io.Writer) error {
 	}
 
 	if err := toml.NewEncoder(w).Encode(tp); err != nil {
-		return errors.WithStack(err)
+		return err
 	}
 	return nil
 }
@@ -34,7 +33,7 @@ func (plugs *Plugins) Decode(r io.Reader) error {
 		Plugins: []Plugin{},
 	}
 	if _, err := toml.DecodeReader(r, tp); err != nil {
-		return errors.WithStack(err)
+		return err
 	}
 	for _, p := range tp.Plugins {
 		plugs.Add(p)
diff --git a/plugins/plugins.go b/plugins/plugins.go
index 466ef367..b90c732f 100644
--- a/plugins/plugins.go
+++ b/plugins/plugins.go
@@ -10,12 +10,12 @@ import (
 	"strings"
 	"time"
 
+	"github.com/gobuffalo/buffalo/internal/errx"
 	"github.com/gobuffalo/buffalo/plugins/plugdeps"
 	"github.com/gobuffalo/envy"
 	"github.com/gobuffalo/meta"
 	"github.com/karrick/godirwalk"
 	"github.com/markbates/oncer"
-	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
 )
 
@@ -206,7 +206,7 @@ func listPlugDeps(app meta.App) (List, error) {
 		}
 		bin, err := LookPath(bin)
 		if err != nil {
-			if errors.Cause(err) != ErrPlugMissing {
+			if errx.Unwrap(err) != ErrPlugMissing {
 				return list, err
 			}
 			continue
diff --git a/render/auto.go b/render/auto.go
index f1958e52..469df592 100644
--- a/render/auto.go
+++ b/render/auto.go
@@ -9,12 +9,10 @@ import (
 	"regexp"
 	"strings"
 
-	"errors"
-
 	"github.com/gobuffalo/flect/name"
 )
 
-var errNoID = errors.New("no ID on model")
+var errNoID = fmt.Errorf("no ID on model")
 
 // ErrRedirect indicates to Context#Render that this is a
 // redirect and a template shouldn't be rendered.
diff --git a/render/download.go b/render/download.go
index 92d5ff44..9da1f2c9 100644
--- a/render/download.go
+++ b/render/download.go
@@ -8,8 +8,6 @@ import (
 	"net/http"
 	"path/filepath"
 	"strconv"
-
-	"errors"
 )
 
 type downloadRenderer struct {
@@ -36,7 +34,7 @@ func (r downloadRenderer) Render(w io.Writer, d Data) error {
 
 	ctx, ok := r.ctx.(responsible)
 	if !ok {
-		return errors.New("context has no response writer")
+		return fmt.Errorf("context has no response writer")
 	}
 
 	header := ctx.Response().Header()
diff --git a/render/sse.go b/render/sse.go
index 3b394339..28e1b311 100644
--- a/render/sse.go
+++ b/render/sse.go
@@ -2,7 +2,6 @@ package render
 
 import (
 	"encoding/json"
-	"errors"
 	"fmt"
 	"net/http"
 )
@@ -66,7 +65,7 @@ func NewEventSource(w http.ResponseWriter) (*EventSource, error) {
 	var ok bool
 	es.fl, ok = w.(http.Flusher)
 	if !ok {
-		return es, errors.New("streaming is not supported")
+		return es, fmt.Errorf("streaming is not supported")
 	}
 
 	es.w.Header().Set("Content-Type", "text/event-stream")
diff --git a/render/string.go b/render/string.go
index a9a77b9d..218467de 100644
--- a/render/string.go
+++ b/render/string.go
@@ -3,8 +3,6 @@ package render
 import (
 	"fmt"
 	"io"
-
-	"errors"
 )
 
 type stringRenderer struct {
@@ -19,7 +17,7 @@ func (s stringRenderer) ContentType() string {
 func (s stringRenderer) Render(w io.Writer, data Data) error {
 	te, ok := s.TemplateEngines["text"]
 	if !ok {
-		return errors.New("could not find a template engine for text")
+		return fmt.Errorf("could not find a template engine for text")
 	}
 	t, err := te(s.body, data, s.Helpers)
 	if err != nil {
diff --git a/render/template.go b/render/template.go
index 7ac3442c..aea00f3b 100644
--- a/render/template.go
+++ b/render/template.go
@@ -1,6 +1,7 @@
 package render
 
 import (
+	"fmt"
 	"html/template"
 	"io"
 	"os"
@@ -8,7 +9,6 @@ import (
 	"sort"
 	"strings"
 
-	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
 )
 
@@ -122,7 +122,7 @@ func (s templateRenderer) exec(name string, data Data) (template.HTML, error) {
 		}
 		body, err = te(body, data, helpers)
 		if err != nil {
-			return "", errors.Wrap(err, name)
+			return "", err
 		}
 	}
 
@@ -160,7 +160,7 @@ func (s templateRenderer) assetPath(file string) (string, error) {
 
 		err = loadManifest(manifest)
 		if err != nil {
-			return assetPathFor(file), errors.Wrap(err, "your manifest.json is not correct")
+			return assetPathFor(file), fmt.Errorf("your manifest.json is not correct: %s", err)
 		}
 	}
 
diff --git a/resource.go b/resource.go
index 2a576220..fb6da3fb 100644
--- a/resource.go
+++ b/resource.go
@@ -1,6 +1,6 @@
 package buffalo
 
-import "errors"
+import "fmt"
 
 // Resource interface allows for the easy mapping
 // of common RESTful actions to a set of paths. See
@@ -49,25 +49,25 @@ type BaseResource struct{}
 
 // List default implementation. Returns a 404
 func (v BaseResource) List(c Context) error {
-	return c.Error(404, errors.New("resource not implemented"))
+	return c.Error(404, fmt.Errorf("resource not implemented"))
 }
 
 // Show default implementation. Returns a 404
 func (v BaseResource) Show(c Context) error {
-	return c.Error(404, errors.New("resource not implemented"))
+	return c.Error(404, fmt.Errorf("resource not implemented"))
 }
 
 // Create default implementation. Returns a 404
 func (v BaseResource) Create(c Context) error {
-	return c.Error(404, errors.New("resource not implemented"))
+	return c.Error(404, fmt.Errorf("resource not implemented"))
 }
 
 // Update default implementation. Returns a 404
 func (v BaseResource) Update(c Context) error {
-	return c.Error(404, errors.New("resource not implemented"))
+	return c.Error(404, fmt.Errorf("resource not implemented"))
 }
 
 // Destroy default implementation. Returns a 404
 func (v BaseResource) Destroy(c Context) error {
-	return c.Error(404, errors.New("resource not implemented"))
+	return c.Error(404, fmt.Errorf("resource not implemented"))
 }
diff --git a/response.go b/response.go
index 8f458d8f..81f9c757 100644
--- a/response.go
+++ b/response.go
@@ -3,10 +3,9 @@ package buffalo
 import (
 	"bufio"
 	"encoding/binary"
+	"fmt"
 	"net"
 	"net/http"
-
-	"errors"
 )
 
 // Response implements the http.ResponseWriter interface and allows
@@ -35,7 +34,7 @@ func (w *Response) Hijack() (net.Conn, *bufio.ReadWriter, error) {
 	if hj, ok := w.ResponseWriter.(http.Hijacker); ok {
 		return hj.Hijack()
 	}
-	return nil, nil, errors.New("does not implement http.Hijack")
+	return nil, nil, fmt.Errorf("does not implement http.Hijack")
 }
 
 // Flush the response
diff --git a/route.go b/route.go
index bf54d8de..b5f7b311 100644
--- a/route.go
+++ b/route.go
@@ -6,8 +6,6 @@ import (
 	"net/url"
 	"sort"
 	"strings"
-
-	"errors"
 )
 
 // Routes returns a list of all of the routes defined
@@ -81,5 +79,5 @@ func (a RouteList) Lookup(name string) (*RouteInfo, error) {
 			return ri, nil
 		}
 	}
-	return nil, errors.New("path name not found")
+	return nil, fmt.Errorf("path name not found")
 }
diff --git a/route_info.go b/route_info.go
index 3a3511c1..cdd5b1c7 100644
--- a/route_info.go
+++ b/route_info.go
@@ -9,7 +9,6 @@ import (
 	"strings"
 
 	"github.com/gobuffalo/flect"
-	"github.com/pkg/errors"
 
 	"github.com/gobuffalo/events"
 	"github.com/gorilla/mux"
@@ -80,7 +79,7 @@ func (ri *RouteInfo) BuildPathHelper() RouteHelperFunc {
 
 		url, err := cRoute.MuxRoute.URL(pairs...)
 		if err != nil {
-			return "", errors.Wrapf(err, "missing parameters for %v", cRoute.Path)
+			return "", fmt.Errorf("missing parameters for %v: %s", cRoute.Path, err)
 		}
 
 		result := url.Path
diff --git a/server.go b/server.go
index 348dd4db..35024679 100644
--- a/server.go
+++ b/server.go
@@ -7,12 +7,12 @@ import (
 	"strings"
 	"syscall"
 
+	"github.com/gobuffalo/buffalo/internal/errx"
 	"github.com/gobuffalo/buffalo/servers"
 	"github.com/gobuffalo/events"
 	"github.com/gobuffalo/packd"
 	"github.com/markbates/refresh/refresh/web"
 	"github.com/markbates/sigtx"
-	"github.com/pkg/errors"
 )
 
 // Serve the application at the specified address/port and listen for OS
@@ -100,7 +100,7 @@ func (a *App) Serve(srvs ...servers.Server) error {
 // Stop the application and attempt to gracefully shutdown
 func (a *App) Stop(err error) error {
 	a.cancel()
-	if err != nil && errors.Cause(err) != context.Canceled {
+	if err != nil && errx.Unwrap(err) != context.Canceled {
 		a.Logger.Error(err)
 		return err
 	}


Test patch:
diff --git a/buffalo/cmd/test.go b/buffalo/cmd/test.go
index 812d5cac..d6f09ae3 100644
--- a/buffalo/cmd/test.go
+++ b/buffalo/cmd/test.go
@@ -2,14 +2,13 @@ package cmd
 
 import (
 	"bytes"
+	"fmt"
 	"io"
 	"os"
 	"os/exec"
 	"path/filepath"
 	"strings"
 
-	"errors"
-
 	"github.com/gobuffalo/envy"
 	"github.com/gobuffalo/meta"
 	"github.com/sirupsen/logrus"
@@ -173,7 +172,7 @@ func (m mFlagRunner) Run() error {
 		}
 	}
 	if errs {
-		return errors.New("errors running tests")
+		return fmt.Errorf("errors running tests")
 	}
 	return nil
 }
diff --git a/errors_test.go b/errors_test.go
index 09e352fc..0346009f 100644
--- a/errors_test.go
+++ b/errors_test.go
@@ -1,10 +1,9 @@
 package buffalo
 
 import (
+	"fmt"
 	"testing"
 
-	"errors"
-
 	"github.com/gobuffalo/httptest"
 
 	"github.com/stretchr/testify/require"
@@ -14,7 +13,7 @@ func Test_defaultErrorHandler_SetsContentType(t *testing.T) {
 	r := require.New(t)
 	app := New(Options{})
 	app.GET("/", func(c Context) error {
-		return c.Error(401, errors.New("boom"))
+		return c.Error(401, fmt.Errorf("boom"))
 	})
 
 	w := httptest.New(app)
@@ -28,7 +27,7 @@ func Test_defaultErrorHandler_JSON(t *testing.T) {
 	r := require.New(t)
 	app := New(Options{})
 	app.GET("/", func(c Context) error {
-		return c.Error(401, errors.New("boom"))
+		return c.Error(401, fmt.Errorf("boom"))
 	})
 
 	w := httptest.New(app)
@@ -46,7 +45,7 @@ func Test_defaultErrorHandler_XML(t *testing.T) {
 	r := require.New(t)
 	app := New(Options{})
 	app.GET("/", func(c Context) error {
-		return c.Error(401, errors.New("boom"))
+		return c.Error(401, fmt.Errorf("boom"))
 	})
 
 	w := httptest.New(app)
@@ -68,7 +67,7 @@ func Test_PanicHandler(t *testing.T) {
 		panic("string boom")
 	})
 	app.GET("/error", func(c Context) error {
-		panic(errors.New("error boom"))
+		panic(fmt.Errorf("error boom"))
 	})
 
 	table := []struct {
@@ -110,7 +109,7 @@ func Test_defaultErrorMiddleware(t *testing.T) {
 	app.Use(func(next Handler) Handler {
 		return func(c Context) error {
 			c.Set("T", "t")
-			return c.Error(422, errors.New("boom"))
+			return c.Error(422, fmt.Errorf("boom"))
 		}
 	})
 	app.GET("/", func(c Context) error {
@@ -134,7 +133,7 @@ func Test_SetErrorMiddleware(t *testing.T) {
 		return nil
 	})
 	app.GET("/", func(c Context) error {
-		return c.Error(422, errors.New("boom"))
+		return c.Error(422, fmt.Errorf("boom"))
 	})
 
 	w := httptest.New(app)
diff --git a/genny/plugins/install/install_test.go b/genny/plugins/install/install_test.go
index 531b448d..dcc379bf 100644
--- a/genny/plugins/install/install_test.go
+++ b/genny/plugins/install/install_test.go
@@ -12,7 +12,6 @@ import (
 	"github.com/gobuffalo/genny"
 	"github.com/gobuffalo/genny/gentest"
 	"github.com/gobuffalo/meta"
-	"github.com/pkg/errors"
 	"github.com/stretchr/testify/require"
 )
 
@@ -34,7 +33,7 @@ func Test_New(t *testing.T) {
 	run.FileFn = func(f genny.File) (genny.File, error) {
 		bb := &bytes.Buffer{}
 		if _, err := io.Copy(bb, f); err != nil {
-			return f, errors.WithStack(err)
+			return f, err
 		}
 		return genny.NewFile(f.Name(), bb), nil
 	}
diff --git a/plugins/plugdeps/plugdeps_test.go b/plugins/plugdeps/plugdeps_test.go
index edf4d1e7..b30a75b4 100644
--- a/plugins/plugdeps/plugdeps_test.go
+++ b/plugins/plugdeps/plugdeps_test.go
@@ -5,8 +5,8 @@ import (
 	"path/filepath"
 	"testing"
 
+	"github.com/gobuffalo/buffalo/internal/errx"
 	"github.com/gobuffalo/meta"
-	"github.com/pkg/errors"
 	"github.com/stretchr/testify/require"
 )
 
@@ -37,7 +37,7 @@ func Test_List_Off(t *testing.T) {
 	app := meta.App{}
 	plugs, err := List(app)
 	r.Error(err)
-	r.Equal(errors.Cause(err), ErrMissingConfig)
+	r.Equal(errx.Unwrap(err), ErrMissingConfig)
 	r.Len(plugs.List(), 0)
 }
 
diff --git a/render/partials_test.go b/render/partials_test.go
index 3d5a2082..777859ad 100644
--- a/render/partials_test.go
+++ b/render/partials_test.go
@@ -5,8 +5,8 @@ import (
 	"strings"
 	"testing"
 
+	"github.com/gobuffalo/buffalo/internal/errx"
 	"github.com/gobuffalo/packd"
-	"github.com/pkg/errors"
 	"github.com/stretchr/testify/require"
 )
 
@@ -73,7 +73,7 @@ func Test_Template_Partial_Form(t *testing.T) {
 
 	bb := &bytes.Buffer{}
 	err = re.HTML("new.html").Render(bb, Data{"user": u})
-	r.NoError(errors.Cause(err))
+	r.NoError(errx.Unwrap(err))
 	r.Equal(result, strings.TrimSpace(bb.String()))
 
 }
diff --git a/router_test.go b/router_test.go
index c6017b0e..9d39d429 100644
--- a/router_test.go
+++ b/router_test.go
@@ -8,8 +8,6 @@ import (
 	"strings"
 	"testing"
 
-	"errors"
-
 	"github.com/gobuffalo/buffalo/render"
 	"github.com/gobuffalo/envy"
 	"github.com/gobuffalo/httptest"
@@ -384,12 +382,12 @@ type WebResource struct {
 
 // Edit default implementation. Returns a 404
 func (v WebResource) Edit(c Context) error {
-	return c.Error(404, errors.New("resource not implemented"))
+	return c.Error(404, fmt.Errorf("resource not implemented"))
 }
 
 // New default implementation. Returns a 404
 func (v WebResource) New(c Context) error {
-	return c.Error(404, errors.New("resource not implemented"))
+	return c.Error(404, fmt.Errorf("resource not implemented"))
 }
 
 func Test_App_NamedRoutes(t *testing.T) {