diff --git a/.tool-versions b/.tool-versions
index 12b580032affa76621ce689e2977811dba39c0c0..717852f3eed3fc18daed70cfaafb7f554529d90c 100644
--- a/.tool-versions
+++ b/.tool-versions
@@ -1,4 +1,4 @@
-elixir 1.11.3-otp-23
-erlang 23.2.1
-nodejs 15.3.0
-python 3.9.4
\ No newline at end of file
+elixir 1.12.2-otp-24
+erlang 24.0.3
+nodejs 16.3.0
+python 3.9.4
diff --git a/Dockerfile b/Dockerfile
index c1c8fa72027261d165ce4d36acd0663772440d0f..13c7fc393e7251b2b5b5ecefe674dea1e16a8aad 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -2,7 +2,7 @@
 # platform specific, it makes sense to build it in the docker
 
 #### Builder
-FROM hexpm/elixir:1.11.3-erlang-23.2.1-alpine-3.12.1 as buildcontainer
+FROM hexpm/elixir:1.12.2-erlang-24.0-alpine-3.13.3 as buildcontainer
 
 # preparation
 ARG APP_VER=0.0.1
@@ -49,7 +49,7 @@ COPY rel rel
 RUN mix release plausible
 
 # Main Docker Image
-FROM alpine:3.12.1
+FROM alpine:3.13.3
 LABEL maintainer="tckb <tckb@tgrthi.me>"
 ENV LANG=C.UTF-8
 
diff --git a/config/.env.dev b/config/.env.dev
index 4149f265d67eefdca2f31074901bfcb28ee5011b..910c721b975d87d8f7fb1dbd9d22afc282f28bac 100644
--- a/config/.env.dev
+++ b/config/.env.dev
@@ -1,6 +1,6 @@
 BASE_URL=http://localhost:8000
 DATABASE_URL=postgres://postgres:postgres@127.0.0.1:5432/plausible_dev
-CLICKHOUSE_DATABASE_URL=http://127.0.0.1:8123/plausible_dev
+CLICKHOUSE_DATABASE_URL=http://127.0.0.1:8123/plausible_events_db
 SECRET_KEY_BASE=/njrhntbycvastyvtk1zycwfm981vpo/0xrvwjjvemdakc/vsvbrevlwsc6u8rcg
 ENVIRONMENT=dev
 MAILER_ADAPTER=Bamboo.LocalAdapter
diff --git a/config/runtime.exs b/config/runtime.exs
index fca0206ac8c7ac7509de942d9bf6b070a9389679..7cd19c0b6aa37ac732ba6a10dbce9f3e91e09daf 100644
--- a/config/runtime.exs
+++ b/config/runtime.exs
@@ -19,9 +19,7 @@ end
 base_url = URI.parse(base_url)
 
 if base_url.scheme not in ["http", "https"] do
-  raise "BASE_URL must start with `http` or `https`. Currently configured as `#{
-          System.get_env("BASE_URL")
-        }`"
+  raise "BASE_URL must start with `http` or `https`. Currently configured as `#{System.get_env("BASE_URL")}`"
 end
 
 secret_key_base = get_var_from_path_or_env(config_dir, "SECRET_KEY_BASE", nil)
diff --git a/lib/plausible/google/api.ex b/lib/plausible/google/api.ex
index 53042343f634dc60763e476969bb5fff14ad38f1..2261b3466bb0e566eef74036a28b2d8b3b5e8d99 100644
--- a/lib/plausible/google/api.ex
+++ b/lib/plausible/google/api.ex
@@ -6,9 +6,7 @@ defmodule Plausible.Google.Api do
     if Application.get_env(:plausible, :environment) == "test" do
       ""
     else
-      "https://accounts.google.com/o/oauth2/v2/auth?client_id=#{client_id()}&redirect_uri=#{
-        redirect_uri()
-      }&prompt=consent&response_type=code&access_type=offline&scope=#{@scope}&state=#{site_id}"
+      "https://accounts.google.com/o/oauth2/v2/auth?client_id=#{client_id()}&redirect_uri=#{redirect_uri()}&prompt=consent&response_type=code&access_type=offline&scope=#{@scope}&state=#{site_id}"
     end
   end
 
@@ -16,9 +14,7 @@ defmodule Plausible.Google.Api do
     res =
       HTTPoison.post!(
         "https://www.googleapis.com/oauth2/v4/token",
-        "client_id=#{client_id()}&client_secret=#{client_secret()}&code=#{code}&grant_type=authorization_code&redirect_uri=#{
-          redirect_uri()
-        }",
+        "client_id=#{client_id()}&client_secret=#{client_secret()}&code=#{code}&grant_type=authorization_code&redirect_uri=#{redirect_uri()}",
         "Content-Type": "application/x-www-form-urlencoded"
       )
 
@@ -129,9 +125,7 @@ defmodule Plausible.Google.Api do
     res =
       HTTPoison.post!(
         "https://www.googleapis.com/oauth2/v4/token",
-        "client_id=#{client_id()}&client_secret=#{client_secret()}&refresh_token=#{
-          auth.refresh_token
-        }&grant_type=refresh_token&redirect_uri=#{redirect_uri()}",
+        "client_id=#{client_id()}&client_secret=#{client_secret()}&refresh_token=#{auth.refresh_token}&grant_type=refresh_token&redirect_uri=#{redirect_uri()}",
         "Content-Type": "application/x-www-form-urlencoded"
       )
 
diff --git a/lib/plausible_web/controllers/api/external_stats_controller.ex b/lib/plausible_web/controllers/api/external_stats_controller.ex
index 1aa63bb8e112d39045597b98b9bcbed75121a5b1..0bd276d3efcee31b972c03429ae6cf8304e47690 100644
--- a/lib/plausible_web/controllers/api/external_stats_controller.ex
+++ b/lib/plausible_web/controllers/api/external_stats_controller.ex
@@ -114,9 +114,7 @@ defmodule PlausibleWeb.Api.ExternalStatsController do
 
         event_only_filter && invalid_metric in @session_metrics ->
           {:error,
-           "Session metric `#{invalid_metric}` cannot be queried when using a filter on `#{
-             event_only_filter
-           }`."}
+           "Session metric `#{invalid_metric}` cannot be queried when using a filter on `#{event_only_filter}`."}
 
         true ->
           {:error,
@@ -212,9 +210,7 @@ defmodule PlausibleWeb.Api.ExternalStatsController do
       :ok
     else
       {:error,
-       "Error parsing `interval` parameter: invalid interval `#{interval}`. Valid intervals are #{
-         @valid_intervals_str
-       }"}
+       "Error parsing `interval` parameter: invalid interval `#{interval}`. Valid intervals are #{@valid_intervals_str}"}
     end
   end
 
diff --git a/lib/plausible_web/controllers/site/membership_controller.ex b/lib/plausible_web/controllers/site/membership_controller.ex
index c8bb3f6776a04d74c9326c353d355b6cff74416d..e35ee5169ba292f741fb1c02e90066ebbf13d7d9 100644
--- a/lib/plausible_web/controllers/site/membership_controller.ex
+++ b/lib/plausible_web/controllers/site/membership_controller.ex
@@ -59,9 +59,7 @@ defmodule PlausibleWeb.Site.MembershipController do
       conn
       |> put_flash(
         :success,
-        "#{email} has been invited to #{site_domain} as #{
-          PlausibleWeb.SiteView.with_indefinite_article(role)
-        }"
+        "#{email} has been invited to #{site_domain} as #{PlausibleWeb.SiteView.with_indefinite_article(role)}"
       )
       |> redirect(to: Routes.site_path(conn, :settings_people, site.domain))
     end
diff --git a/lib/plausible_web/controllers/stats_controller.ex b/lib/plausible_web/controllers/stats_controller.ex
index 00c0e9ae7df4d7e064ccdd9cd9b5a756eaee7c71..6a97d10c3b28883d4ea944b0f2f97824a41fdb6a 100644
--- a/lib/plausible_web/controllers/stats_controller.ex
+++ b/lib/plausible_web/controllers/stats_controller.ex
@@ -60,9 +60,7 @@ defmodule PlausibleWeb.StatsController do
       |> Enum.join()
 
     filename =
-      "Plausible export #{domain} #{Timex.format!(query.date_range.first, "{ISOdate} ")} to #{
-        Timex.format!(query.date_range.last, "{ISOdate} ")
-      }.csv"
+      "Plausible export #{domain} #{Timex.format!(query.date_range.first, "{ISOdate} ")} to #{Timex.format!(query.date_range.last, "{ISOdate} ")}.csv"
 
     conn
     |> put_resp_content_type("text/csv")
diff --git a/lib/plausible_web/email.ex b/lib/plausible_web/email.ex
index c63782f8707ceaf3cc12774f90a520edd708dd76..d21b1008c05f8b2e71c8775b64ac736926a61457 100644
--- a/lib/plausible_web/email.ex
+++ b/lib/plausible_web/email.ex
@@ -200,9 +200,7 @@ defmodule PlausibleWeb.Email do
     |> to(invitation.inviter.email)
     |> tag("invitation-accepted")
     |> subject(
-      "[Plausible Analytics] #{invitation.email} accepted your invitation to #{
-        invitation.site.domain
-      }"
+      "[Plausible Analytics] #{invitation.email} accepted your invitation to #{invitation.site.domain}"
     )
     |> render("invitation_accepted.html",
       invitation: invitation
@@ -214,9 +212,7 @@ defmodule PlausibleWeb.Email do
     |> to(invitation.inviter.email)
     |> tag("invitation-rejected")
     |> subject(
-      "[Plausible Analytics] #{invitation.email} rejected your invitation to #{
-        invitation.site.domain
-      }"
+      "[Plausible Analytics] #{invitation.email} rejected your invitation to #{invitation.site.domain}"
     )
     |> render("invitation_rejected.html",
       invitation: invitation
@@ -228,9 +224,7 @@ defmodule PlausibleWeb.Email do
     |> to(invitation.inviter.email)
     |> tag("ownership-transfer-accepted")
     |> subject(
-      "[Plausible Analytics] #{invitation.email} accepted the ownership transfer of #{
-        invitation.site.domain
-      }"
+      "[Plausible Analytics] #{invitation.email} accepted the ownership transfer of #{invitation.site.domain}"
     )
     |> render("ownership_transfer_accepted.html",
       invitation: invitation
@@ -242,9 +236,7 @@ defmodule PlausibleWeb.Email do
     |> to(invitation.inviter.email)
     |> tag("ownership-transfer-rejected")
     |> subject(
-      "[Plausible Analytics] #{invitation.email} rejected the ownership transfer of #{
-        invitation.site.domain
-      }"
+      "[Plausible Analytics] #{invitation.email} rejected the ownership transfer of #{invitation.site.domain}"
     )
     |> render("ownership_transfer_rejected.html",
       invitation: invitation
diff --git a/test/plausible_web/controllers/api/stats_controller/suggestions_test.exs b/test/plausible_web/controllers/api/stats_controller/suggestions_test.exs
index 48f009a1f2041e3a8008db52d6f9a2b04d3d8276..d34e497887df4d8ad59fa9e4e78db369ef2283e1 100644
--- a/test/plausible_web/controllers/api/stats_controller/suggestions_test.exs
+++ b/test/plausible_web/controllers/api/stats_controller/suggestions_test.exs
@@ -81,9 +81,7 @@ defmodule PlausibleWeb.Api.StatsController.SuggestionsTest do
       conn =
         get(
           conn,
-          "/api/stats/#{site.domain}/suggestions/browser_version?period=month&date=2019-01-01&filters=#{
-            filters
-          }"
+          "/api/stats/#{site.domain}/suggestions/browser_version?period=month&date=2019-01-01&filters=#{filters}"
         )
 
       assert json_response(conn, 200) == ["78.0"]
@@ -101,9 +99,7 @@ defmodule PlausibleWeb.Api.StatsController.SuggestionsTest do
       conn =
         get(
           conn,
-          "/api/stats/#{site.domain}/suggestions/os_version?period=month&date=2019-01-01&filters=#{
-            filters
-          }"
+          "/api/stats/#{site.domain}/suggestions/os_version?period=month&date=2019-01-01&filters=#{filters}"
         )
 
       assert json_response(conn, 200) == ["10.15"]
@@ -115,9 +111,7 @@ defmodule PlausibleWeb.Api.StatsController.SuggestionsTest do
       conn =
         get(
           conn,
-          "/api/stats/#{site.domain}/suggestions/os_version?period=month&date=2019-01-01&filters=#{
-            filters
-          }&q=11"
+          "/api/stats/#{site.domain}/suggestions/os_version?period=month&date=2019-01-01&filters=#{filters}&q=11"
         )
 
       assert json_response(conn, 200) == []