diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 95aa661d85259498eab439165df9920b9afe3b90..ca21689b8a65ba7c4b73da897af9490b3018f77b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -172,7 +172,8 @@ linting:
   tags: [docker]
   needs: []
   before_script:
-    - apk update && apk add clang-extra-tools make git
+    - apk update && apk add make git python3 py3-pip
+    - apk add clang-extra-tools --repository=http://dl-cdn.alpinelinux.org/alpine/edge/main
   script:
     - make lint
 
diff --git a/include/mtx/events_impl.hpp b/include/mtx/events_impl.hpp
index e8e3a6fe10fe51c18ddfff3f1ed81384886830e0..fca8e289b1d3c6fd8d8883c727b65af164b5ca36 100644
--- a/include/mtx/events_impl.hpp
+++ b/include/mtx/events_impl.hpp
@@ -10,12 +10,14 @@ namespace detail {
 
 template<typename, typename = void>
 struct can_edit : std::false_type
-{};
+{
+};
 
 template<typename Content>
 struct can_edit<Content, std::void_t<decltype(Content::relations)>>
   : std::is_same<decltype(Content::relations), mtx::common::Relations>
-{};
+{
+};
 }
 
 template<class Content>
diff --git a/include/mtxclient/crypto/client.hpp b/include/mtxclient/crypto/client.hpp
index 64f26875bc0dd93c4bc82b532d14dcf3566af0e0..77c5274761acbda621f86ede918b0709b36b7db4 100644
--- a/include/mtxclient/crypto/client.hpp
+++ b/include/mtxclient/crypto/client.hpp
@@ -59,44 +59,53 @@ class olm_exception : public std::exception
 public:
     olm_exception(std::string func, OlmSession *s)
       : olm_exception(std::move(func), std::string(olm_session_last_error(s)))
-    {}
+    {
+    }
 
     olm_exception(std::string func, OlmAccount *acc)
       : olm_exception(std::move(func),
                       std::string(acc ? olm_account_last_error(acc) : "account == nullptr"))
-    {}
+    {
+    }
 
     olm_exception(std::string func, OlmUtility *util)
       : olm_exception(std::move(func), std::string(olm_utility_last_error(util)))
-    {}
+    {
+    }
 
     olm_exception(std::string func, OlmPkDecryption *s)
       : olm_exception(std::move(func), std::string(olm_pk_decryption_last_error(s)))
-    {}
+    {
+    }
 
     olm_exception(std::string func, OlmPkEncryption *s)
       : olm_exception(std::move(func), std::string(olm_pk_encryption_last_error(s)))
-    {}
+    {
+    }
 
     olm_exception(std::string func, OlmPkSigning *s)
       : olm_exception(std::move(func), std::string(olm_pk_signing_last_error(s)))
-    {}
+    {
+    }
 
     olm_exception(std::string func, OlmOutboundGroupSession *s)
       : olm_exception(
           std::move(func),
           std::string(s ? olm_outbound_group_session_last_error(s) : "session == nullptr"))
-    {}
+    {
+    }
 
     olm_exception(std::string func, OlmInboundGroupSession *s)
       : olm_exception(
           std::move(func),
           std::string(s ? olm_inbound_group_session_last_error(s) : "session == nullptr"))
-    {}
+    {
+    }
 
     olm_exception(std::string func, OlmSAS *s)
       : olm_exception(std::move(func), std::string(olm_sas_last_error(s)))
-    {}
+    {
+    }
 
     //! Returns a description of the olm error.
     const char *what() const noexcept override { return msg_.c_str(); }
@@ -108,7 +117,8 @@ private:
     olm_exception(std::string &&func, std::string error_string)
       : msg_(func + ": " + error_string)
       , ec_(ec_from_string(error_string))
-    {}
+    {
+    }
 
     OlmErrorCode ec_from_string(std::string_view);
 
@@ -216,7 +226,8 @@ public:
     OlmClient(std::string user_id, std::string device_id)
       : user_id_(std::move(user_id))
       , device_id_(std::move(device_id))
-    {}
+    {
+    }
 
     //! Base64 encoded string
     using Base64String = std::string;
diff --git a/include/mtxclient/crypto/types.hpp b/include/mtxclient/crypto/types.hpp
index 6b87c1a8b7621292c8d30d2c0137885b079bd9ac..626bf667620544c870943e90d5c1e8b739ea9778 100644
--- a/include/mtxclient/crypto/types.hpp
+++ b/include/mtxclient/crypto/types.hpp
@@ -88,10 +88,12 @@ public:
     strong_type() = default;
     explicit strong_type(const T &value)
       : value_(value)
-    {}
+    {
+    }
     explicit strong_type(T &&value)
       : value_(std::forward<T>(value))
-    {}
+    {
+    }
 
     operator T &() noexcept { return value_; }
     constexpr operator const T &() const noexcept { return value_; }
diff --git a/include/mtxclient/crypto/utils.hpp b/include/mtxclient/crypto/utils.hpp
index 6a2e95b8b67f7fa5a87e04e896acb894c44f4b86..361ffe36f0aa50e1448df4958711d0f80b5a4ada 100644
--- a/include/mtxclient/crypto/utils.hpp
+++ b/include/mtxclient/crypto/utils.hpp
@@ -19,7 +19,8 @@ class crypto_exception : public std::exception
 public:
     crypto_exception(std::string func, const char *msg)
       : msg_(func + ": " + std::string(msg))
-    {}
+    {
+    }
 
     //! Describes the error
     const char *what() const noexcept override { return msg_.c_str(); }
diff --git a/include/mtxclient/http/client.hpp b/include/mtxclient/http/client.hpp
index 2ca1c7e95da53765023f4b8825c5276a152aa9e6..8e0907d530307cb0aa7778fe6fd268eff4f59bb5 100644
--- a/include/mtxclient/http/client.hpp
+++ b/include/mtxclient/http/client.hpp
@@ -140,7 +140,8 @@ public:
     //! Create a new UIA handler. Pass a callback for when a new stage needs to be completed.
     UIAHandler(UIAPrompt prompt_)
       : prompt(std::move(prompt_))
-    {}
+    {
+    }
 
     void next(const user_interactive::Auth &auth) const;
 
diff --git a/lib/structs/events/encrypted.cpp b/lib/structs/events/encrypted.cpp
index 9d8541947fd11db3a2cafb239ccd84b20899d3c3..e8f1323b165ea1862877cb237c5377367768c618 100644
--- a/lib/structs/events/encrypted.cpp
+++ b/lib/structs/events/encrypted.cpp
@@ -126,7 +126,8 @@ to_json(nlohmann::json &obj, const Encrypted &content)
 
 void
 from_json(const nlohmann::json &, Dummy &)
-{}
+{
+}
 
 void
 to_json(nlohmann::json &obj, const Dummy &)
diff --git a/lib/structs/responses/empty.cpp b/lib/structs/responses/empty.cpp
index 0508dc8b397e7c7247e53531bc69c473c74c5d4b..460f8cb644589367aa3911c42f9417c04f766cad 100644
--- a/lib/structs/responses/empty.cpp
+++ b/lib/structs/responses/empty.cpp
@@ -6,6 +6,7 @@ namespace responses {
 // Provides a deserialization function to use when empty responses are returned from the server
 void
 from_json(const nlohmann::json &, Empty &)
-{}
+{
+}
 }
 }
diff --git a/tests/crypto.cpp b/tests/crypto.cpp
index 62d586b41903c09b96e352eae78dfb2f299e0602..cc6b9cca1f4a71e8e14f6b0dc839a39433034917 100644
--- a/tests/crypto.cpp
+++ b/tests/crypto.cpp
@@ -30,7 +30,7 @@ TEST(Crypto, DeviceKeys)
     device1.user_id    = "@alice:example.com";
     device1.device_id  = "JLAFKJWSCS";
     device1.keys       = {{"curve25519:JLAFKJWSCS", "3C5BFWi2Y8MaVvjM8M22DBmh24PmgR0nPvJOIArzgyI"},
-                    {"ed25519:JLAFKJWSCS", "lEuiRJBit0IG6nUf5pUzWTUEsRVVe/HJkoKuEww9ULI"}};
+                          {"ed25519:JLAFKJWSCS", "lEuiRJBit0IG6nUf5pUzWTUEsRVVe/HJkoKuEww9ULI"}};
     device1.signatures = {{"@alice:example.com",
                            {{"ed25519:JLAFKJWSCS",
                              "dSO80A01XiigH3uBiDVx/EjzaoycHcjq9lfQX0uWsqxl2giMIiSPR8a4d291W1ihKJL/"