diff --git a/Dockerfile b/Dockerfile
index eb7104403968cd9421abea4ea7b71a65eefe1c78..21e7fe26ed0ffa19987ca6bd14c10d49efc3d0a9 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM python:3.7-slim-buster
+FROM python:3.8-slim-buster
 
 RUN pip install \
     cookiecutter==1.6.0
diff --git a/cookiecutter-docker.sh b/cookiecutter-docker.sh
index b223bd4cd3c1c1bbfc343632b27837aaa30ec559..2880946ea018984cc98febad97b018dec5006321 100755
--- a/cookiecutter-docker.sh
+++ b/cookiecutter-docker.sh
@@ -62,5 +62,3 @@ run_cookiecutter() {
 
 process_args "$@"
 run_cookiecutter
-
-exit 0
diff --git a/cookiecutter.json b/cookiecutter.json
index 075e5e5b07131b4009f2baed642d4b9dd3e44456..50dac8c221bc63b249262ef8bda00ad6b32ef09b 100644
--- a/cookiecutter.json
+++ b/cookiecutter.json
@@ -1,12 +1,12 @@
 {
-	"full_name": "Steven Loria",
-	"email": "sloria1@gmail.com",
-	"github_username": "sloria",
-	"project_name": "My Flask App",
-	"app_name": "{{cookiecutter.project_name.lower().replace('-', '_').replace(' ', '_')}}",
-	"project_short_description": "A flasky app.",
-	"use_pipenv": ["no", "yes"],
-	"python_version": ["3.7", "3.6"],
-	"node_version": ["12", "10", "8"],
-	"use_heroku": ["no", "yes"]
+  "full_name": "Steven Loria",
+  "email": "sloria1@gmail.com",
+  "github_username": "sloria",
+  "project_name": "My Flask App",
+  "app_name": "{{cookiecutter.project_name.lower().replace('-', '_').replace(' ', '_')}}",
+  "project_short_description": "A flasky app.",
+  "use_pipenv": ["no", "yes"],
+  "python_version": ["3.8", "3.7", "3.6"],
+  "node_version": ["12", "10"],
+  "use_heroku": ["no", "yes"]
 }
diff --git a/hooks/pre_gen_project.py b/hooks/pre_gen_project.py
index 26c1340a900366baf4577a7dd74ebb887c40871b..57b2630315309008820e0cba2d3bb9f3f37fdf61 100644
--- a/hooks/pre_gen_project.py
+++ b/hooks/pre_gen_project.py
@@ -31,7 +31,7 @@ def validate_python_module_name():
     module_name = "{{ cookiecutter.app_name }}"
     if not re.match(MODULE_REGEX, module_name):
         log_warning(module_name)
-        raise ValueError
+        sys.exit(1)
 
 
 if __name__ == "__main__":
diff --git a/{{cookiecutter.app_name}}/tests/factories.py b/{{cookiecutter.app_name}}/tests/factories.py
index 17d0203f88956714951d0481582e2ff5c048a761..40160d3377c6e0291b2c5cc8a34c2a25c123251e 100644
--- a/{{cookiecutter.app_name}}/tests/factories.py
+++ b/{{cookiecutter.app_name}}/tests/factories.py
@@ -20,8 +20,8 @@ class BaseFactory(SQLAlchemyModelFactory):
 class UserFactory(BaseFactory):
     """User factory."""
 
-    username = Sequence(lambda n: "user{0}".format(n))
-    email = Sequence(lambda n: "user{0}@example.com".format(n))
+    username = Sequence(lambda n: f"user{n}")
+    email = Sequence(lambda n: f"user{n}@example.com")
     password = PostGenerationMethodCall("set_password", "example")
     active = True
 
diff --git a/{{cookiecutter.app_name}}/{{cookiecutter.app_name}}/app.py b/{{cookiecutter.app_name}}/{{cookiecutter.app_name}}/app.py
index e6eaaa6178f10843f5919df0bb305d3369ba41b2..dd05cc5eb61ac07712b872433a741b2ea5e943e5 100644
--- a/{{cookiecutter.app_name}}/{{cookiecutter.app_name}}/app.py
+++ b/{{cookiecutter.app_name}}/{{cookiecutter.app_name}}/app.py
@@ -61,7 +61,7 @@ def register_errorhandlers(app):
         """Render error template."""
         # If a HTTPException, pull the `code` attribute; default to 500
         error_code = getattr(error, "code", 500)
-        return render_template("{0}.html".format(error_code)), error_code
+        return render_template(f"{error_code}.html"), error_code
 
     for errcode in [401, 404, 500]:
         app.errorhandler(errcode)(render_error)
diff --git a/{{cookiecutter.app_name}}/{{cookiecutter.app_name}}/commands.py b/{{cookiecutter.app_name}}/{{cookiecutter.app_name}}/commands.py
index 9049219a1095b8197858c8465398b3e4b5da2edf..65b168b4389466c793de398fac5df60a57da53d7 100644
--- a/{{cookiecutter.app_name}}/{{cookiecutter.app_name}}/commands.py
+++ b/{{cookiecutter.app_name}}/{{cookiecutter.app_name}}/commands.py
@@ -49,7 +49,7 @@ def lint(fix_imports, check):
     def execute_tool(description, *args):
         """Execute a checking tool with its arguments."""
         command_line = list(args) + files_and_directories
-        click.echo("{}: {}".format(description, " ".join(command_line)))
+        click.echo(f"{description}: {' '.join(command_line)}")
         rv = call(command_line)
         if rv != 0:
             exit(rv)
diff --git a/{{cookiecutter.app_name}}/{{cookiecutter.app_name}}/database.py b/{{cookiecutter.app_name}}/{{cookiecutter.app_name}}/database.py
index 17c612dad39b49828c4fbd97d5ff6a039cfbac94..435f955d853f4450a87fa5ce837177a07093b1e8 100644
--- a/{{cookiecutter.app_name}}/{{cookiecutter.app_name}}/database.py
+++ b/{{cookiecutter.app_name}}/{{cookiecutter.app_name}}/database.py
@@ -78,7 +78,7 @@ def reference_col(
     column_kwargs = column_kwargs or {}
 
     return Column(
-        db.ForeignKey("{0}.{1}".format(tablename, pk_name), **foreign_key_kwargs),
+        db.ForeignKey(f"{tablename}.{pk_name}", **foreign_key_kwargs),
         nullable=nullable,
-        **column_kwargs
+        **column_kwargs,
     )
diff --git a/{{cookiecutter.app_name}}/{{cookiecutter.app_name}}/user/models.py b/{{cookiecutter.app_name}}/{{cookiecutter.app_name}}/user/models.py
index 6ee97c0db4317c9a2e331ed13060f05a8f5054ff..e9746c3c0c18778baf77a1cb9f2503a136adef05 100644
--- a/{{cookiecutter.app_name}}/{{cookiecutter.app_name}}/user/models.py
+++ b/{{cookiecutter.app_name}}/{{cookiecutter.app_name}}/user/models.py
@@ -29,7 +29,7 @@ class Role(SurrogatePK, Model):
 
     def __repr__(self):
         """Represent instance as a unique string."""
-        return "<Role({name})>".format(name=self.name)
+        return f"<Role({self.name})>"
 
 
 class User(UserMixin, SurrogatePK, Model):
@@ -65,8 +65,8 @@ class User(UserMixin, SurrogatePK, Model):
     @property
     def full_name(self):
         """Full user name."""
-        return "{0} {1}".format(self.first_name, self.last_name)
+        return f"{self.first_name} {self.last_name}"
 
     def __repr__(self):
         """Represent instance as a unique string."""
-        return "<User({username!r})>".format(username=self.username)
+        return f"<User({self.username!r})>"
diff --git a/{{cookiecutter.app_name}}/{{cookiecutter.app_name}}/utils.py b/{{cookiecutter.app_name}}/{{cookiecutter.app_name}}/utils.py
index 5e93055566feaa3be3f9b1177357c54c9e8c0716..6c91dd0ade6a0bb5bf5b0673e9c778cfe4239843 100644
--- a/{{cookiecutter.app_name}}/{{cookiecutter.app_name}}/utils.py
+++ b/{{cookiecutter.app_name}}/{{cookiecutter.app_name}}/utils.py
@@ -7,4 +7,4 @@ def flash_errors(form, category="warning"):
     """Flash all errors for a form."""
     for field, errors in form.errors.items():
         for error in errors:
-            flash("{0} - {1}".format(getattr(form, field).label.text, error), category)
+            flash(f"{getattr(form, field).label.text} - {error}", category)