diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0fc9d64668dbee9b48bff52d1178f9a0d72c7b83
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,29 @@
+image: briar/ci-image-android:latest
+
+stages:
+  - test
+
+workflow:
+  # when to create a CI pipeline
+  rules:
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+    - if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS'
+      when: never # avoids duplicate jobs for branch and MR
+    - if: '$CI_COMMIT_BRANCH'
+    - if: '$CI_COMMIT_TAG'
+
+test:
+  stage: test
+  before_script:
+    - set -e
+    - export GRADLE_USER_HOME=$PWD/.gradle
+  script:
+    - ./gradlew --no-daemon check
+  after_script:
+    # these file change every time and should not be cached
+    - rm -f $GRADLE_USER_HOME/caches/modules-2/modules-2.lock
+    - rm -fr $GRADLE_USER_HOME/caches/*/plugin-resolution/
+  rules:
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+      when: always
+    - when: always
diff --git a/gradle/ktlint.gradle b/gradle/ktlint.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..fc85b5b6346ea276afea729c65137880cf8a3c1c
--- /dev/null
+++ b/gradle/ktlint.gradle
@@ -0,0 +1,11 @@
+ktlint {
+    version = "0.44.0"
+    android = true
+    enableExperimentalRules = false
+    verbose = true
+    disabledRules = [
+            "indent",
+            "import-ordering",
+            "no-blank-line-before-rbrace",
+    ]
+}
diff --git a/lib/build.gradle b/lib/build.gradle
index e970b5fa3384a14db760f82783e719d73bfaeb05..93a425fa5e2fd91135d0b05eeb7035c2650ffa7d 100644
--- a/lib/build.gradle
+++ b/lib/build.gradle
@@ -1,6 +1,7 @@
 plugins {
     id 'com.android.library'
     id 'kotlin-android'
+    id 'org.jlleitschuh.gradle.ktlint' version '10.2.1'
     id 'com.vanniktech.maven.publish'
 }
 
@@ -35,4 +36,6 @@ kotlin {
 
 dependencies {
     implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
-}
\ No newline at end of file
+}
+
+apply from: "${rootProject.rootDir}/gradle/ktlint.gradle"
diff --git a/lib/src/main/java/org/briarproject/android/dontkillmelib/HuaweiUtils.kt b/lib/src/main/java/org/briarproject/android/dontkillmelib/HuaweiUtils.kt
index 0bca22621a449bd8ba89f89b9352ef21c1127e44..1f891679efcd5f8517594ea2291598a88c3664b0 100644
--- a/lib/src/main/java/org/briarproject/android/dontkillmelib/HuaweiUtils.kt
+++ b/lib/src/main/java/org/briarproject/android/dontkillmelib/HuaweiUtils.kt
@@ -9,9 +9,9 @@ public object HuaweiUtils {
 
     private const val PACKAGE_NAME_HUAWEI = "com.huawei.systemmanager"
     private const val CLASS_NAME_POWER_MANAGER =
-        "${PACKAGE_NAME_HUAWEI}.power.ui.HwPowerManagerActivity"
+        "$PACKAGE_NAME_HUAWEI.power.ui.HwPowerManagerActivity"
     private const val CLASS_NAME_PROTECTED_APPS =
-        "${PACKAGE_NAME_HUAWEI}.optimize.process.ProtectActivity"
+        "$PACKAGE_NAME_HUAWEI.optimize.process.ProtectActivity"
 
     /**
      * Determine whether a Huawei "Protected apps" feature is available on the