diff --git a/.formatter.exs b/.formatter.exs
index ef8840c..18b26c5 100644
--- a/.formatter.exs
+++ b/.formatter.exs
@@ -1,6 +1,6 @@
 [
   import_deps: [:ecto, :ecto_sql, :phoenix],
   subdirectories: ["priv/*/migrations"],
-  plugins: [Phoenix.LiveView.HTMLFormatter],
+  plugins: [Styler, Phoenix.LiveView.HTMLFormatter],
   inputs: ["*.{heex,ex,exs}", "{config,lib,test}/**/*.{heex,ex,exs}", "priv/*/seeds.exs"]
 ]
diff --git a/config/config.exs b/config/config.exs
index c295613..260235d 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -7,11 +7,6 @@
 # General application configuration
 import Config
 
-config :cms,
-  namespace: CMS,
-  ecto_repos: [CMS.Repo],
-  generators: [timestamp_type: :utc_datetime, binary_id: true]
-
 # Configures the endpoint
 config :cms, CMSWeb.Endpoint,
   url: [host: "localhost"],
@@ -23,28 +18,20 @@ config :cms, CMSWeb.Endpoint,
   pubsub_server: CMS.PubSub,
   live_view: [signing_salt: "afQxdsCJ"]
 
+config :cms,
+  namespace: CMS,
+  ecto_repos: [CMS.Repo],
+  generators: [timestamp_type: :utc_datetime, binary_id: true]
+
 # Configure esbuild (the version is required)
 config :esbuild,
   version: "0.17.11",
   cms: [
-    args:
-      ~w(js/app.js --bundle --target=es2017 --outdir=../priv/static/assets --external:/fonts/* --external:/images/*),
+    args: ~w(js/app.js --bundle --target=es2017 --outdir=../priv/static/assets --external:/fonts/* --external:/images/*),
     cd: Path.expand("../assets", __DIR__),
     env: %{"NODE_PATH" => Path.expand("../deps", __DIR__)}
   ]
 
-# Configure tailwind (the version is required)
-config :tailwind,
-  version: "3.4.3",
-  cms: [
-    args: ~w(
-      --config=tailwind.config.js
-      --input=css/app.css
-      --output=../priv/static/assets/app.css
-    ),
-    cd: Path.expand("../assets", __DIR__)
-  ]
-
 # Configures Elixir's Logger
 config :logger, :console,
   format: "$time $metadata[$level] $message\n",
@@ -53,6 +40,19 @@ config :logger, :console,
 # Use Jason for JSON parsing in Phoenix
 config :phoenix, :json_library, Jason
 
-# Import environment specific config. This must remain at the bottom
-# of this file so it overrides the configuration defined above.
+# Configure tailwind (the version is required)
+config :tailwind,
+  version: "3.4.3",
+  cms: [
+    args: ~w(
+      --config=tailwind.config.js
+      --input=css/app.css
+      --output=../priv/static/assets/app.css
+    ),
+
+    # Import environment specific config. This must remain at the bottom
+    # of this file so it overrides the configuration defined above.
+    cd: Path.expand("../assets", __DIR__)
+  ]
+
 import_config "#{config_env()}.exs"
diff --git a/config/dev.exs b/config/dev.exs
index 46bff75..52e40ff 100644
--- a/config/dev.exs
+++ b/config/dev.exs
@@ -1,6 +1,13 @@
 import Config
 
 # Configure your database
+# For development, we disable any cache and enable
+# debugging and code reloading.
+#
+# The watchers configuration can be used to run external
+# watchers to your application. For example, we can use it
+# to bundle .js and .css sources.
+# Binding to loopback ipv4 address prevents access from other machines.
 config :cms, CMS.Repo,
   username: "postgres",
   password: "postgres",
@@ -10,13 +17,6 @@ config :cms, CMS.Repo,
   show_sensitive_data_on_connection_error: true,
   pool_size: 10
 
-# For development, we disable any cache and enable
-# debugging and code reloading.
-#
-# The watchers configuration can be used to run external
-# watchers to your application. For example, we can use it
-# to bundle .js and .css sources.
-# Binding to loopback ipv4 address prevents access from other machines.
 config :cms, CMSWeb.Endpoint,
   # Change to `ip: {0, 0, 0, 0}` to allow access from other machines.
   http: [ip: {127, 0, 0, 1}, port: 4000],
@@ -29,29 +29,6 @@ config :cms, CMSWeb.Endpoint,
     tailwind: {Tailwind, :install_and_run, [:cms, ~w(--watch)]}
   ]
 
-# ## SSL Support
-#
-# In order to use HTTPS in development, a self-signed
-# certificate can be generated by running the following
-# Mix task:
-#
-#     mix phx.gen.cert
-#
-# Run `mix help phx.gen.cert` for more information.
-#
-# The `http:` config above can be replaced with:
-#
-#     https: [
-#       port: 4001,
-#       cipher_suite: :strong,
-#       keyfile: "priv/cert/selfsigned_key.pem",
-#       certfile: "priv/cert/selfsigned.pem"
-#     ],
-#
-# If desired, both `http:` and `https:` keys can be
-# configured to run both http and https servers on
-# different ports.
-
 # Watch static and templates for browser reloading.
 config :cms, CMSWeb.Endpoint,
   live_reload: [
@@ -61,21 +38,45 @@ config :cms, CMSWeb.Endpoint,
     ]
   ]
 
+# ## SSL Support
+#
+
 # Enable dev routes for dashboard and mailbox
+# In order to use HTTPS in development, a self-signed
+# certificate can be generated by running the following
+# Mix task:
+#
 config :cms, dev_routes: true
 
 # Do not include metadata nor timestamps in development logs
+#     mix phx.gen.cert
+#
+# Run `mix help phx.gen.cert` for more information.
+#
 config :logger, :console, format: "[$level] $message\n"
 
-# Set a higher stacktrace during development. Avoid configuring such
-# in production as building large stacktraces may be expensive.
-config :phoenix, :stacktrace_depth, 20
-
 # Initialize plugs at runtime for faster development compilation
+# The `http:` config above can be replaced with:
+#
+#     https: [
 config :phoenix, :plug_init_mode, :runtime
 
+# Set a higher stacktrace during development. Avoid configuring such
+#       port: 4001,
+# in production as building large stacktraces may be expensive.
+#       cipher_suite: :strong,
+#       keyfile: "priv/cert/selfsigned_key.pem",
+#       certfile: "priv/cert/selfsigned.pem"
+config :phoenix, :stacktrace_depth, 20
+
 config :phoenix_live_view,
   # Include HEEx debug annotations as HTML comments in rendered markup
+  #     ],
+  #
   debug_heex_annotations: true,
   # Enable helpful, but potentially expensive runtime checks
+  # If desired, both `http:` and `https:` keys can be
+  # configured to run both http and https servers on
+  # different ports.
+
   enable_expensive_runtime_checks: true
diff --git a/config/runtime.exs b/config/runtime.exs
index 6dd5bc8..c94d12f 100644
--- a/config/runtime.exs
+++ b/config/runtime.exs
@@ -30,12 +30,6 @@ if config_env() == :prod do
 
   maybe_ipv6 = if System.get_env("ECTO_IPV6") in ~w(true 1), do: [:inet6], else: []
 
-  config :cms, CMS.Repo,
-    # ssl: true,
-    url: database_url,
-    pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10"),
-    socket_options: maybe_ipv6
-
   # The secret key base is used to sign/encrypt cookies and other secrets.
   # A default value is used in config/dev.exs and config/test.exs but you
   # want to use a different value for prod and you most likely don't want
@@ -51,7 +45,11 @@ if config_env() == :prod do
   host = System.get_env("PHX_HOST") || "example.com"
   port = String.to_integer(System.get_env("PORT") || "4000")
 
-  config :cms, :dns_cluster_query, System.get_env("DNS_CLUSTER_QUERY")
+  config :cms, CMS.Repo,
+    # ssl: true,
+    url: database_url,
+    pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10"),
+    socket_options: maybe_ipv6
 
   config :cms, CMSWeb.Endpoint,
     url: [host: host, port: 443, scheme: "https"],
@@ -65,6 +63,8 @@ if config_env() == :prod do
     ],
     secret_key_base: secret_key_base
 
+  config :cms, :dns_cluster_query, System.get_env("DNS_CLUSTER_QUERY")
+
   # ## SSL Support
   #
   # To get SSL working, you will need to add the `https` key
diff --git a/lib/cms_web.ex b/lib/cms_web.ex
index 4b96c5e..d00f5ad 100644
--- a/lib/cms_web.ex
+++ b/lib/cms_web.ex
@@ -23,10 +23,11 @@ defmodule CMSWeb do
     quote do
       use Phoenix.Router, helpers: false
 
-      # Import common connection and controller functions to use in pipelines
-      import Plug.Conn
       import Phoenix.Controller
       import Phoenix.LiveView.Router
+
+      # Import common connection and controller functions to use in pipelines
+      import Plug.Conn
     end
   end
 
@@ -80,10 +81,10 @@ defmodule CMSWeb do
 
   defp html_helpers do
     quote do
+      import CMSWeb.CoreComponents
       # HTML escaping functionality
       import Phoenix.HTML
       # Core UI components
-      import CMSWeb.CoreComponents
 
       # Shortcut for generating JS commands
       alias Phoenix.LiveView.JS
diff --git a/lib/cms_web/telemetry.ex b/lib/cms_web/telemetry.ex
index f4fb349..ffc1ce9 100644
--- a/lib/cms_web/telemetry.ex
+++ b/lib/cms_web/telemetry.ex
@@ -1,5 +1,7 @@
 defmodule CMSWeb.Telemetry do
+  @moduledoc false
   use Supervisor
+
   import Telemetry.Metrics
 
   def start_link(arg) do
@@ -70,8 +72,7 @@ defmodule CMSWeb.Telemetry do
       ),
       summary("cms.repo.query.idle_time",
         unit: {:native, :millisecond},
-        description:
-          "The time the connection spent waiting before being checked out for the query"
+        description: "The time the connection spent waiting before being checked out for the query"
       ),
 
       # VM Metrics
diff --git a/mix.exs b/mix.exs
index eade29a..4966a8d 100644
--- a/mix.exs
+++ b/mix.exs
@@ -44,17 +44,15 @@ defmodule CMS.MixProject do
       {:esbuild, "~> 0.8", runtime: Mix.env() == :dev},
       {:tailwind, "~> 0.2", runtime: Mix.env() == :dev},
       {:heroicons,
-       github: "tailwindlabs/heroicons",
-       tag: "v2.1.1",
-       sparse: "optimized",
-       app: false,
-       compile: false,
-       depth: 1},
+       github: "tailwindlabs/heroicons", tag: "v2.1.1", sparse: "optimized", app: false, compile: false, depth: 1},
       {:telemetry_metrics, "~> 1.0"},
       {:telemetry_poller, "~> 1.0"},
       {:jason, "~> 1.2"},
       {:dns_cluster, "~> 0.1.1"},
-      {:bandit, "~> 1.5"}
+      {:bandit, "~> 1.5"},
+
+      # dev/test only
+      {:styler, "~> 1.4", only: [:dev, :test], runtime: false}
     ]
   end
 
diff --git a/mix.lock b/mix.lock
index 3e64eaa..349bd08 100644
--- a/mix.lock
+++ b/mix.lock
@@ -24,6 +24,7 @@
   "plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"},
   "plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"},
   "postgrex": {:hex, :postgrex, "0.20.0", "363ed03ab4757f6bc47942eff7720640795eb557e1935951c1626f0d303a3aed", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "d36ef8b36f323d29505314f704e21a1a038e2dc387c6409ee0cd24144e187c0f"},
+  "styler": {:hex, :styler, "1.4.0", "5944723d08afe4d38210b674d7e97dd1137a75968a85a633983cc308e86dc5f2", [:mix], [], "hexpm", "07de0e89c27490c8e469bb814d77ddaaa3283d7d8038501021d80a7705cf13e9"},
   "tailwind": {:hex, :tailwind, "0.2.4", "5706ec47182d4e7045901302bf3a333e80f3d1af65c442ba9a9eed152fb26c2e", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "c6e4a82b8727bab593700c998a4d98cf3d8025678bfde059aed71d0000c3e463"},
   "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"},
   "telemetry_metrics": {:hex, :telemetry_metrics, "1.1.0", "5bd5f3b5637e0abea0426b947e3ce5dd304f8b3bc6617039e2b5a008adc02f8f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7b79e8ddfde70adb6db8a6623d1778ec66401f366e9a8f5dd0955c56bc8ce67"},
diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex
index 6fe4645..d655c24 100644
--- a/test/support/conn_case.ex
+++ b/test/support/conn_case.ex
@@ -19,15 +19,14 @@ defmodule CMSWeb.ConnCase do
 
   using do
     quote do
+      use CMSWeb, :verified_routes
+      import CMSWeb.ConnCase
+      import Phoenix.ConnTest
+      import Plug.Conn
       # The default endpoint for testing
       @endpoint CMSWeb.Endpoint
 
-      use CMSWeb, :verified_routes
-
       # Import conveniences for testing with connections
-      import Plug.Conn
-      import Phoenix.ConnTest
-      import CMSWeb.ConnCase
     end
   end
 
diff --git a/test/support/data_case.ex b/test/support/data_case.ex
index 68cac5a..0432616 100644
--- a/test/support/data_case.ex
+++ b/test/support/data_case.ex
@@ -16,14 +16,16 @@ defmodule CMS.DataCase do
 
   use ExUnit.CaseTemplate
 
+  alias Ecto.Adapters.SQL.Sandbox
+
   using do
     quote do
-      alias CMS.Repo
-
+      import CMS.DataCase
       import Ecto
       import Ecto.Changeset
       import Ecto.Query
-      import CMS.DataCase
+
+      alias CMS.Repo
     end
   end
 
@@ -36,8 +38,8 @@ defmodule CMS.DataCase do
   Sets up the sandbox based on the test tags.
   """
   def setup_sandbox(tags) do
-    pid = Ecto.Adapters.SQL.Sandbox.start_owner!(CMS.Repo, shared: not tags[:async])
-    on_exit(fn -> Ecto.Adapters.SQL.Sandbox.stop_owner(pid) end)
+    pid = Sandbox.start_owner!(CMS.Repo, shared: not tags[:async])
+    on_exit(fn -> Sandbox.stop_owner(pid) end)
   end
 
   @doc """