diff --git a/lib/mix/pleroma.ex b/lib/mix/pleroma.ex
index 3ad6edbfb..553c74c25 100644
--- a/lib/mix/pleroma.ex
+++ b/lib/mix/pleroma.ex
@@ -3,6 +3,8 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Mix.Pleroma do
+  @apps [:restarter, :ecto, :ecto_sql, :postgrex, :db_connection, :cachex]
+  @cachex_childs ["object", "user"]
   @doc "Common functions to be reused in mix tasks"
   def start_pleroma do
     Application.put_env(:phoenix, :serve_endpoints, false, persistent: true)
@@ -11,7 +13,23 @@ defmodule Mix.Pleroma do
       Application.put_env(:logger, :console, level: :debug)
     end
 
-    {:ok, _} = Application.ensure_all_started(:pleroma)
+    apps =
+      if Application.get_env(:tesla, :adapter) == Tesla.Adapter.Gun do
+        [:gun | @apps]
+      else
+        [:hackney | @apps]
+      end
+
+    Enum.each(apps, &Application.ensure_all_started/1)
+
+    childs = [Pleroma.Repo, Pleroma.Config.TransferTask, Pleroma.Web.Endpoint]
+
+    cachex_childs = Enum.map(@cachex_childs, &Pleroma.Application.build_cachex(&1, []))
+
+    Supervisor.start_link(childs ++ cachex_childs,
+      strategy: :one_for_one,
+      name: Pleroma.Supervisor
+    )
 
     if Pleroma.Config.get(:env) not in [:test, :benchmark] do
       pleroma_rebooted?()
diff --git a/lib/mix/tasks/pleroma/digest.ex b/lib/mix/tasks/pleroma/digest.ex
index 3595f912d..8bde2d4f2 100644
--- a/lib/mix/tasks/pleroma/digest.ex
+++ b/lib/mix/tasks/pleroma/digest.ex
@@ -7,6 +7,8 @@ defmodule Mix.Tasks.Pleroma.Digest do
 
   def run(["test", nickname | opts]) do
     Mix.Pleroma.start_pleroma()
+    Application.ensure_all_started(:timex)
+    Application.ensure_all_started(:swoosh)
 
     user = Pleroma.User.get_by_nickname(nickname)
 
diff --git a/lib/mix/tasks/pleroma/email.ex b/lib/mix/tasks/pleroma/email.ex
index d3fac6ec8..16fe31431 100644
--- a/lib/mix/tasks/pleroma/email.ex
+++ b/lib/mix/tasks/pleroma/email.ex
@@ -7,6 +7,7 @@ defmodule Mix.Tasks.Pleroma.Email do
 
   def run(["test" | args]) do
     Mix.Pleroma.start_pleroma()
+    Application.ensure_all_started(:swoosh)
 
     {options, [], []} =
       OptionParser.parse(
diff --git a/lib/mix/tasks/pleroma/relay.ex b/lib/mix/tasks/pleroma/relay.ex
index c3312507e..b67d256c3 100644
--- a/lib/mix/tasks/pleroma/relay.ex
+++ b/lib/mix/tasks/pleroma/relay.ex
@@ -12,6 +12,7 @@ defmodule Mix.Tasks.Pleroma.Relay do
 
   def run(["follow", target]) do
     start_pleroma()
+    Application.ensure_all_started(:flake_id)
 
     with {:ok, _activity} <- Relay.follow(target) do
       # put this task to sleep to allow the genserver to push out the messages
@@ -23,6 +24,7 @@ defmodule Mix.Tasks.Pleroma.Relay do
 
   def run(["unfollow", target]) do
     start_pleroma()
+    Application.ensure_all_started(:flake_id)
 
     with {:ok, _activity} <- Relay.unfollow(target) do
       # put this task to sleep to allow the genserver to push out the messages
@@ -34,6 +36,7 @@ defmodule Mix.Tasks.Pleroma.Relay do
 
   def run(["list"]) do
     start_pleroma()
+    Application.ensure_all_started(:flake_id)
 
     with {:ok, list} <- Relay.list(true) do
       list |> Enum.each(&shell_info(&1))
diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex
index 9615af122..7eb629abf 100644
--- a/lib/pleroma/application.ex
+++ b/lib/pleroma/application.ex
@@ -162,7 +162,8 @@ defmodule Pleroma.Application do
   defp seconds_valid_interval,
     do: :timer.seconds(Config.get!([Pleroma.Captcha, :seconds_valid]))
 
-  defp build_cachex(type, opts),
+  @spec build_cachex(String.t(), keyword()) :: map()
+  def build_cachex(type, opts),
     do: %{
       id: String.to_atom("cachex_" <> type),
       start: {Cachex, :start_link, [String.to_atom(type <> "_cache"), opts]},