Repository: wix/Detox
Pull request #3715 (2022-11-17 17:16:07)

refactor(trace): simpler primary PID detection
## Description

In this PR, I make it simpler to infer which PID is primary (when creating a Detox trace file).

Instead of making this logic tightly coupled with `process.pid`, I check which PID appears first.

That simplifies unit tests and makes the code more generic and reusable.


Patch:
diff --git a/.buildkite/jobs/pipeline.android_demo_app_rn_68.yml b/.buildkite/jobs/pipeline.android_demo_app_rn_68.yml
index 746373799..0a82faf7f 100644
--- a/.buildkite/jobs/pipeline.android_demo_app_rn_68.yml
+++ b/.buildkite/jobs/pipeline.android_demo_app_rn_68.yml
@@ -1,7 +1,7 @@
   - label: ":android::react: RN.68 + Android: Demo app"
     command:
       - "nvm install"
-      - "JAVA_HOME=/usr/local/opt/openjdk@11/ ./scripts/demo-projects.android.sh"
+      - "./scripts/demo-projects.android.sh"
     env:
       REACT_NATIVE_VERSION: 0.68.5
       REACT_NATIVE_COMPAT_TEST: true
diff --git a/.buildkite/jobs/pipeline.android_demo_app_rn_69.yml b/.buildkite/jobs/pipeline.android_demo_app_rn_69.yml
index 818ddbc53..7dbb2a7b0 100644
--- a/.buildkite/jobs/pipeline.android_demo_app_rn_69.yml
+++ b/.buildkite/jobs/pipeline.android_demo_app_rn_69.yml
@@ -1,7 +1,7 @@
   - label: ":android::react: RN.69 + Android: Demo app"
     command:
       - "nvm install"
-      - "JAVA_HOME=/usr/local/opt/openjdk@11/ ./scripts/demo-projects.android.sh"
+      - "./scripts/demo-projects.android.sh"
     env:
       REACT_NATIVE_VERSION: 0.69.7
       DETOX_DISABLE_POD_INSTALL: true
diff --git a/.buildkite/jobs/pipeline.android_rn_68.yml b/.buildkite/jobs/pipeline.android_rn_68.yml
index d359840d9..9e116780e 100644
--- a/.buildkite/jobs/pipeline.android_rn_68.yml
+++ b/.buildkite/jobs/pipeline.android_rn_68.yml
@@ -1,7 +1,7 @@
   - label: ":android::detox: RN.68 + Android: Tests app"
     command:
       - "nvm install"
-      - "JAVA_HOME=/usr/local/opt/openjdk@11/ ./scripts/ci.android.sh"
+      - "./scripts/ci.android.sh"
     env:
       REACT_NATIVE_VERSION: 0.68.5
       DETOX_DISABLE_POD_INSTALL: true
diff --git a/.buildkite/jobs/pipeline.android_rn_69.yml b/.buildkite/jobs/pipeline.android_rn_69.yml
index b58100b06..03f75e7e6 100644
--- a/.buildkite/jobs/pipeline.android_rn_69.yml
+++ b/.buildkite/jobs/pipeline.android_rn_69.yml
@@ -1,7 +1,7 @@
   - label: ":android::detox: RN.69 + Android: Tests app"
     command:
       - "nvm install"
-      - "JAVA_HOME=/usr/local/opt/openjdk@11/ ./scripts/ci.android.sh"
+      - "./scripts/ci.android.sh"
     env:
       REACT_NATIVE_VERSION: 0.69.7
       DETOX_DISABLE_POD_INSTALL: true
diff --git a/.buildkite/jobs/pipeline.ios_demo_app_rn_69.yml b/.buildkite/jobs/pipeline.ios_demo_app_rn_69.yml
index baec66e63..e61e6f93c 100644
--- a/.buildkite/jobs/pipeline.ios_demo_app_rn_69.yml
+++ b/.buildkite/jobs/pipeline.ios_demo_app_rn_69.yml
@@ -1,7 +1,7 @@
   - label: ":ios::react: RN.69 + iOS: Demo app"
     command:
       - "nvm install"
-      - "JAVA_HOME=/usr/local/opt/openjdk@11/ ./scripts/demo-projects.ios.sh"
+      - "./scripts/demo-projects.ios.sh"
     env:
       REACT_NATIVE_VERSION: 0.69.7
     artifact_paths:
diff --git a/detox/android/detox/src/full/java/com/wix/detox/adapters/server/QueryStatusActionHandler.kt b/detox/android/detox/src/full/java/com/wix/detox/adapters/server/QueryStatusActionHandler.kt
index 2e942e1bb..971bd9c26 100644
--- a/detox/android/detox/src/full/java/com/wix/detox/adapters/server/QueryStatusActionHandler.kt
+++ b/detox/android/detox/src/full/java/com/wix/detox/adapters/server/QueryStatusActionHandler.kt
@@ -1,96 +1,28 @@
 package com.wix.detox.adapters.server
 
-import androidx.test.espresso.IdlingResource
 import com.wix.detox.TestEngineFacade
-import com.wix.detox.reactnative.idlingresources.DescriptiveIdlingResource
+import com.wix.detox.inquiry.DetoxBusyResource
 
 class QueryStatusActionHandler(
     private val outboundServerAdapter: OutboundServerAdapter,
     private val testEngineFacade: TestEngineFacade
-)
-    : DetoxActionHandler {
+) : DetoxActionHandler {
 
     override fun handle(params: String, messageId: Long) {
-        val data = mutableMapOf<String, Any?>()
-        data["status"] = formatStatus(testEngineFacade.getBusyIdlingResources())
-
+        val busyResources = testEngineFacade.getAllBusyResources()
+        val data = mapOf<String, Any?>(
+            "status" to formatStatus(busyResources)
+        )
         outboundServerAdapter.sendMessage("currentStatusResult", data, messageId)
     }
 
-    private fun formatStatus(busyResources: List<IdlingResource>): Map<String, Any> {
+    private fun formatStatus(busyResources: List<DetoxBusyResource>): Map<String, Any> =
         if (busyResources.isEmpty()) {
-            return mapOf("app_status" to "idle")
-        }
-
-        val status = mutableMapOf<String, Any>()
-        status["app_status"] = "busy"
-        status["busy_resources"] = busyResources.map{ formatResource(it) }
-
-        return status
-    }
-
-    private fun formatResource(resource: IdlingResource): Map<String, Any> {
-        if (resource is DescriptiveIdlingResource) {
-            return resource.getDescription().json()
-        }
-
-        if (resource.javaClass.name.contains("LooperIdlingResource")) {
-            return formatLooperResourceFromName(resource.name)
-        }
-
-        return mapOf<String, Any>(
-            "name" to "unknown",
-            "description" to mapOf<String, Any>(
-                "identifier" to resource.name
+            mapOf("app_status" to "idle")
+        } else {
+            mapOf(
+                "app_status" to "busy",
+                "busy_resources" to busyResources.map { it.getDescription().json() }
             )
-        )
-    }
-
-    private fun formatLooperResourceFromName(resourceName: String): Map<String, Any> {
-        return when {
-            isJSCodeExecution(resourceName) -> {
-                formatLooperResource(
-                    "\"${resourceName}\" (JS Thread)",
-                    "JavaScript code"
-                )
-            }
-            isNativeCodeExecution(resourceName) -> {
-                formatLooperResource(
-                    "\"${resourceName}\" (Native Modules Thread)",
-                    "native module calls"
-                )
-            }
-            else -> {
-                formatLooperResource(
-                    "\"${resourceName}\""
-                )
-            }
         }
-    }
-
-    /**
-     * @see URL https://reactnative.dev/docs/profiling
-     */
-    private fun isJSCodeExecution(looperName: String): Boolean {
-        return looperName.contains("mqt_js")
-    }
-
-    private fun formatLooperResource(thread: String, executionType: String? = null): Map<String, Any> {
-        return mapOf<String, Any>(
-            "name" to "looper",
-            "description" to
-                    mutableMapOf<String, Any>(
-                        "thread" to thread
-                    ).apply {
-                        if (executionType != null) put("execution_type", executionType)
-                    }
-        )
-    }
-
-    /**
-     * @see URL https://reactnative.dev/docs/profiling
-     */
-    private fun isNativeCodeExecution(looperName: String): Boolean {
-        return looperName.contains("mqt_native")
-    }
 }
diff --git a/detox/android/detox/src/full/java/com/wix/detox/espresso/common/UiControllerImplReflected.kt b/detox/android/detox/src/full/java/com/wix/detox/espresso/common/UiControllerImplReflected.kt
new file mode 100644
index 000000000..4003dc4c1
--- /dev/null
+++ b/detox/android/detox/src/full/java/com/wix/detox/espresso/common/UiControllerImplReflected.kt
@@ -0,0 +1,16 @@
+package com.wix.detox.espresso.common
+
+import com.wix.detox.espresso.action.common.utils.getUiController
+import org.joor.Reflect
+
+private const val FIELD_ASYNC_IDLE = "asyncIdle"
+private const val FIELD_COMPAT_IDLE = "compatIdle"
+private const val METHOD_IS_IDLE_NOW = "isIdleNow"
+
+class UiControllerImplReflected {
+    fun isAsyncIdleNow(): Boolean =
+        Reflect.on(getUiController()).field(FIELD_ASYNC_IDLE).call(METHOD_IS_IDLE_NOW).get()
+
+    fun isCompatIdleNow(): Boolean =
+        Reflect.on(getUiController()).field(FIELD_COMPAT_IDLE).call(METHOD_IS_IDLE_NOW).get()
+}
diff --git a/detox/android/detox/src/full/java/com/wix/detox/espresso/idlingresources/DescriptiveIdlingResource.kt b/detox/android/detox/src/full/java/com/wix/detox/espresso/idlingresources/DescriptiveIdlingResource.kt
new file mode 100644
index 000000000..605d3ef0f
--- /dev/null
+++ b/detox/android/detox/src/full/java/com/wix/detox/espresso/idlingresources/DescriptiveIdlingResource.kt
@@ -0,0 +1,8 @@
+package com.wix.detox.espresso.idlingresources
+
+import androidx.test.espresso.IdlingResource
+
+interface DescriptiveIdlingResource: IdlingResource {
+    fun getDebugName(): String
+    fun getBusyHint(): Map<String, Any>? = null
+}
diff --git a/detox/android/detox/src/full/java/com/wix/detox/espresso/registry/BusyResourcesInquirer.kt b/detox/android/detox/src/full/java/com/wix/detox/espresso/registry/BusyResourcesInquirer.kt
new file mode 100644
index 000000000..0a6ce0470
--- /dev/null
+++ b/detox/android/detox/src/full/java/com/wix/detox/espresso/registry/BusyResourcesInquirer.kt
@@ -0,0 +1,48 @@
+package com.wix.detox.espresso.registry
+
+import androidx.test.espresso.Espresso
+import androidx.test.espresso.base.IdlingResourceRegistry
+import com.wix.detox.common.UIThread
+import com.wix.detox.espresso.common.UiControllerImplReflected
+import com.wix.detox.inquiry.DetoxBusyResource
+import com.wix.detox.inquiry.DetoxBusyResource.BusyAsyncTasks
+import com.wix.detox.inquiry.DetoxBusyResource.BusyIdlingResource
+import org.joor.Reflect
+import java.util.concurrent.Callable
+
+// TODO Better to split inquiry to two separate classes running under the single `UIThread.postFirstSync()` we have here.
+class BusyResourcesInquirer(
+    private val registry: IdlingResourceRegistry,
+    private val uiControllerImplReflected: UiControllerImplReflected
+) {
+    fun getAllBusyResources(): List<DetoxBusyResource> {
+        return UIThread.postFirstSync(Callable<List<DetoxBusyResource>> {
+            mutableListOf<DetoxBusyResource>().apply {
+                addAll(getBusyIdlingResources())
+                addAll(getAsyncTasksResource()?.let { listOf(it) } ?: emptyList())
+            }
+        })
+    }
+
+    private fun getBusyIdlingResources(): List<BusyIdlingResource> =
+        registry.resources
+            .filter { !it.isIdleNow }
+            .map { BusyIdlingResource(it) }
+
+    private fun getAsyncTasksResource(): BusyAsyncTasks? {
+        // Mind the implicit optimization:
+        // Don't inspect both resources if not necessary (async-tasks is not idle).
+        if (uiControllerImplReflected.isAsyncIdleNow() &&
+            uiControllerImplReflected.isCompatIdleNow()) {
+            return null
+        }
+        return BusyAsyncTasks
+    }
+
+    companion object {
+        val INSTANCE = BusyResourcesInquirer(getRegistryDefault(), UiControllerImplReflected())
+    }
+}
+
+private fun getRegistryDefault() =
+    Reflect.on(Espresso::class.java).get<IdlingResourceRegistry>("baseRegistry")
diff --git a/detox/android/detox/src/full/java/com/wix/detox/espresso/registry/IRStatusInquirer.kt b/detox/android/detox/src/full/java/com/wix/detox/espresso/registry/IRStatusInquirer.kt
deleted file mode 100644
index ccefdca9e..000000000
--- a/detox/android/detox/src/full/java/com/wix/detox/espresso/registry/IRStatusInquirer.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.wix.detox.espresso.registry
-
-import androidx.test.espresso.Espresso
-import androidx.test.espresso.IdlingResource
-import androidx.test.espresso.base.IdlingResourceRegistry
-import com.wix.detox.common.UIThread
-import org.joor.Reflect
-import java.util.concurrent.Callable
-
-class IRStatusInquirer(private val registry: IdlingResourceRegistry) {
-    fun getAllBusyResources(): List<IdlingResource> {
-        return UIThread.postFirstSync(Callable<List<IdlingResource>> {
-            registry.resources.filter { resource ->
-                !resource.isIdleNow
-            }
-        })
-    }
-
-    companion object {
-        val INSTANCE = IRStatusInquirer(getRegistryDefault())
-    }
-}
-
-private fun getRegistryDefault() = Reflect.on(Espresso::class.java).get<IdlingResourceRegistry>("baseRegistry")
diff --git a/detox/android/detox/src/full/java/com/wix/detox/inquiry/DetoxBusyResource.kt b/detox/android/detox/src/full/java/com/wix/detox/inquiry/DetoxBusyResource.kt
new file mode 100644
index 000000000..9dcaa418d
--- /dev/null
+++ b/detox/android/detox/src/full/java/com/wix/detox/inquiry/DetoxBusyResource.kt
@@ -0,0 +1,92 @@
+package com.wix.detox.inquiry
+
+import androidx.test.espresso.IdlingResource
+import com.wix.detox.espresso.idlingresources.DescriptiveIdlingResource
+
+sealed class DetoxBusyResource {
+    abstract fun getDescription(): DetoxBusyResourceDescription
+
+    class BusyIdlingResource(val resource: IdlingResource): DetoxBusyResource() {
+        override fun getDescription() =
+            when {
+                (resource is DescriptiveIdlingResource) ->
+                    getIRDescription(resource)
+
+                (resource.javaClass.name.contains("LooperIdlingResource")) ->
+                    getLooperResourceDescriptionByName(resource.name)
+
+                else ->
+                    getUnspecifiedResourceDescription(resource)
+            }
+
+        private fun getIRDescription(resource: DescriptiveIdlingResource) =
+            DetoxBusyResourceDescription.Builder()
+                .name(resource.getDebugName())
+                .apply {
+                    resource.getBusyHint()?.let {
+                        it.forEach { hint -> addDescription(hint.key, hint.value) }
+                    }
+                }
+                .build()
+
+        private fun getLooperResourceDescriptionByName(resourceName: String) =
+            when {
+                isJSCodeExecution(resourceName) -> {
+                    getLooperResourceDesc(
+                        thread = "\"${resourceName}\" (JS Thread)",
+                        executionType = "JavaScript code"
+                    )
+                }
+                isNativeCodeExecution(resourceName) -> {
+                    getLooperResourceDesc(
+                        thread = "\"${resourceName}\" (Native Modules Thread)",
+                        executionType = "native module calls"
+                    )
+                }
+                else -> {
+                    getLooperResourceDesc(
+                        thread = "\"${resourceName}\""
+                    )
+                }
+            }
+
+        private fun getUnspecifiedResourceDescription(resource: IdlingResource) =
+            DetoxBusyResourceDescription.Builder()
+                .name("unknown")
+                .addDescription("identifier", resource.name)
+                .build()
+
+        /**
+         * @see URL https://reactnative.dev/docs/profiling
+         */
+        private fun isJSCodeExecution(looperName: String): Boolean {
+            return looperName.contains("mqt_js")
+        }
+
+        private fun getLooperResourceDesc(thread: String, executionType: String? = null) =
+            DetoxBusyResourceDescription.Builder()
+                .name("looper")
+                .addDescription("thread", thread)
+                .apply {
+                    executionType?.let { addDescription("execution_type", executionType) }
+                }
+                .build()
+
+        /**
+         * @see URL https://reactnative.dev/docs/profiling
+         */
+        private fun isNativeCodeExecution(looperName: String): Boolean {
+            return looperName.contains("mqt_native")
+        }
+
+    }
+
+    object BusyAsyncTasks: DetoxBusyResource() {
+        override fun getDescription() =
+            DetoxBusyResourceDescription.Builder()
+                .name("bg")
+                .addDescription("reason", "native async-tasks")
+                .build()
+
+    }
+}
diff --git a/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/IdlingResourceDescription.kt b/detox/android/detox/src/full/java/com/wix/detox/inquiry/DetoxBusyResourceDescription.kt
similarity index 69%
rename from detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/IdlingResourceDescription.kt
rename to detox/android/detox/src/full/java/com/wix/detox/inquiry/DetoxBusyResourceDescription.kt
index 12a21e538..dd1bbf237 100644
--- a/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/IdlingResourceDescription.kt
+++ b/detox/android/detox/src/full/java/com/wix/detox/inquiry/DetoxBusyResourceDescription.kt
@@ -1,17 +1,17 @@
-package com.wix.detox.reactnative.idlingresources
+package com.wix.detox.inquiry
 
-class IdlingResourceDescription private constructor(
+class DetoxBusyResourceDescription private constructor(
     private val name: String,
     private val description: Map<String, Any>) {
 
-    fun json() =
+    fun json(): Map<String, Any> =
         mutableMapOf<String, Any>("name" to name)
           .apply {
             if (description.isNotEmpty()) put("description", description)
-          }.toMap()
+          }
 
     override fun equals(other: Any?) =
-      (other is IdlingResourceDescription && other.json() == this.json())
+      (other is DetoxBusyResourceDescription && other.json() == this.json())
 
     override fun hashCode(): Int =
       (31 * name.hashCode() + description.hashCode())
@@ -21,6 +21,6 @@ class IdlingResourceDescription private constructor(
         var description: MutableMap<String, Any> = mutableMapOf()) {
             fun name(value: String) = apply { name = value }
             fun addDescription(key: String, value: Any) = apply { description[key] = value }
-            fun build() = IdlingResourceDescription(name, description)
+            fun build() = DetoxBusyResourceDescription(name, description)
       }
 }
diff --git a/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/AnimatedModuleIdlingResource.java b/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/AnimatedModuleIdlingResource.java
index f77f37506..738131297 100644
--- a/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/AnimatedModuleIdlingResource.java
+++ b/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/AnimatedModuleIdlingResource.java
@@ -3,13 +3,17 @@ package com.wix.detox.reactnative.idlingresources;
 import android.util.Log;
 import android.view.Choreographer;
 
+import com.wix.detox.espresso.idlingresources.DescriptiveIdlingResource;
 import com.wix.detox.reactnative.ReactNativeInfo;
 
-import org.jetbrains.annotations.NotNull;
 import org.joor.Reflect;
 import org.joor.ReflectException;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 /**
  * Created by simonracz on 25/08/2017.
@@ -51,6 +55,10 @@ public class AnimatedModuleIdlingResource implements DescriptiveIdlingResource,
 
     private final static String METHOD_HAS_ACTIVE_ANIMATIONS = "hasActiveAnimations";
 
+    private final static Map<String, Object> busyHint = new HashMap<String, Object>() {{
+        put("reason", "Animations running on screen");
+    }};
+
     private ResourceCallback callback = null;
     private Object reactContext = null;
 
@@ -63,13 +71,16 @@ public class AnimatedModuleIdlingResource implements DescriptiveIdlingResource,
         return AnimatedModuleIdlingResource.class.getName();
     }
 
-    @NotNull
+    @NonNull
+    @Override
+    public String getDebugName() {
+        return "ui";
+    }
+
+    @Nullable
     @Override
-    public IdlingResourceDescription getDescription() {
-        return new IdlingResourceDescription.Builder()
-                .name("ui")
-                .addDescription("reason", "Animations running on screen")
-                .build();
+    public Map<String, Object> getBusyHint() {
+        return busyHint;
     }
 
     @Override
diff --git a/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/AsyncStorageIdlingResource.kt b/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/AsyncStorageIdlingResource.kt
index e1cfcdb3c..a05183072 100644
--- a/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/AsyncStorageIdlingResource.kt
+++ b/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/AsyncStorageIdlingResource.kt
@@ -4,6 +4,7 @@ import android.util.Log
 import androidx.test.espresso.IdlingResource
 import com.facebook.react.bridge.NativeModule
 import com.facebook.react.bridge.ReactContext
+import com.wix.detox.espresso.idlingresources.DescriptiveIdlingResource
 import com.wix.detox.reactnative.helpers.RNHelpers
 import org.joor.Reflect
 import java.util.concurrent.Executor
@@ -50,10 +51,7 @@ open class AsyncStorageIdlingResource
     }
 
     override fun getName(): String = javaClass.name
-
-    override fun getDescription(): IdlingResourceDescription {
-        return IdlingResourceDescription.Builder().name("io").build()
-    }
+    override fun getDebugName() = "io"
 
     override fun isIdleNow(): Boolean =
         checkIdle().also { idle ->
diff --git a/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/BridgeIdlingResource.java b/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/BridgeIdlingResource.java
index 69ba3cc63..cbb097931 100644
--- a/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/BridgeIdlingResource.java
+++ b/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/BridgeIdlingResource.java
@@ -5,12 +5,12 @@ import android.util.Log;
 import com.facebook.react.bridge.NotThreadSafeBridgeIdleDebugListener;
 import com.facebook.react.bridge.ReactContext;
 
-import org.jetbrains.annotations.NotNull;
-
-import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
 /**
  * Created by simonracz on 01/06/2017.
  */
@@ -42,10 +42,10 @@ public class BridgeIdlingResource extends DetoxBaseIdlingResource implements Not
         return BridgeIdlingResource.class.getName();
     }
 
-    @NotNull
+    @NonNull
     @Override
-    public IdlingResourceDescription getDescription() {
-        return new IdlingResourceDescription.Builder().name("bridge").build();
+    public String getDebugName() {
+        return "bridge";
     }
 
     @Override
@@ -85,4 +85,10 @@ public class BridgeIdlingResource extends DetoxBaseIdlingResource implements Not
             callback.onTransitionToIdle();
         }
     }
+
+    @Nullable
+    @Override
+    public Map<String, Object> getBusyHint() {
+        return null;
+    }
 }
diff --git a/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/DescriptiveIdlingResource.kt b/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/DescriptiveIdlingResource.kt
deleted file mode 100644
index a2f2d6f44..000000000
--- a/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/DescriptiveIdlingResource.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.wix.detox.reactnative.idlingresources
-
-import androidx.test.espresso.IdlingResource
-
-interface DescriptiveIdlingResource: IdlingResource {
-    /**
-     * Returns a descriptive representation of the resource.
-     */
-    fun getDescription(): IdlingResourceDescription
-}
diff --git a/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/DetoxBaseIdlingResource.java b/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/DetoxBaseIdlingResource.java
index 168f7c5ff..4e76f7530 100644
--- a/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/DetoxBaseIdlingResource.java
+++ b/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/DetoxBaseIdlingResource.java
@@ -1,5 +1,7 @@
 package com.wix.detox.reactnative.idlingresources;
 
+import com.wix.detox.espresso.idlingresources.DescriptiveIdlingResource;
+
 import java.util.concurrent.atomic.AtomicBoolean;
 
 public abstract class DetoxBaseIdlingResource implements DescriptiveIdlingResource {
diff --git a/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/NetworkIdlingResource.java b/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/NetworkIdlingResource.java
index 93cd62f34..219010fa7 100644
--- a/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/NetworkIdlingResource.java
+++ b/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/NetworkIdlingResource.java
@@ -5,16 +5,17 @@ import android.view.Choreographer;
 
 import com.facebook.react.bridge.ReactContext;
 
-import org.jetbrains.annotations.NotNull;
-
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import okhttp3.Call;
 import okhttp3.Dispatcher;
 
@@ -67,13 +68,18 @@ public class NetworkIdlingResource extends DetoxBaseIdlingResource implements Ch
         return NetworkIdlingResource.class.getName();
     }
 
-    @NotNull
+    @NonNull
+    @Override
+    public String getDebugName() {
+        return "network";
+    }
+
+    @Nullable
     @Override
-    public synchronized IdlingResourceDescription getDescription() {
-        return new IdlingResourceDescription.Builder()
-                .name("network")
-                .addDescription("urls", new ArrayList<>(busyResources))
-                .build();
+    public synchronized Map<String, Object> getBusyHint() {
+        return new HashMap<String, Object>() {{
+            put("urls", new ArrayList<>(busyResources));
+        }};
     }
 
     @Override
diff --git a/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/TimersIdlingResource.kt b/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/TimersIdlingResource.kt
index ad3229f0e..824bb8d57 100644
--- a/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/TimersIdlingResource.kt
+++ b/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/TimersIdlingResource.kt
@@ -2,9 +2,7 @@ package com.wix.detox.reactnative.idlingresources.timers
 
 import android.view.Choreographer
 import androidx.test.espresso.IdlingResource
-
 import com.wix.detox.reactnative.idlingresources.DetoxBaseIdlingResource
-import com.wix.detox.reactnative.idlingresources.IdlingResourceDescription
 
 class TimersIdlingResource @JvmOverloads constructor(
         private val interrogationStrategy: IdleInterrogationStrategy,
@@ -14,10 +12,7 @@ class TimersIdlingResource @JvmOverloads constructor(
     private var callback: IdlingResource.ResourceCallback? = null
 
     override fun getName(): String = this.javaClass.name
-
-    override fun getDescription(): IdlingResourceDescription {
-        return IdlingResourceDescription.Builder().name("timers").build();
-    }
+    override fun getDebugName(): String = "timers"
 
     override fun registerIdleTransitionCallback(callback: IdlingResource.ResourceCallback?) {
         this.callback = callback
diff --git a/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/uimodule/UIManagerModuleReflected.kt b/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/uimodule/UIManagerModuleReflected.kt
index fb095ec78..b93ef51c2 100644
--- a/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/uimodule/UIManagerModuleReflected.kt
+++ b/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/uimodule/UIManagerModuleReflected.kt
@@ -9,12 +9,12 @@ import org.joor.Reflect
 private const val CLASS_UI_MANAGER_MODULE = "com.facebook.react.uimanager.UIManagerModule"
 private const val METHOD_GET_NATIVE_MODULE = "getNativeModule"
 private const val METHOD_GET_UI_IMPLEMENTATION = "getUIImplementation"
+private const val METHOD_IS_EMPTY = "isEmpty"
 private const val FIELD_UI_OPERATION_QUEUE = "mOperationsQueue"
 private const val FIELD_DISPATCH_RUNNABLES = "mDispatchUIRunnables"
 private const val FIELD_DISPATCH_RUNNABLES_LOCK = "mDispatchRunnablesLock"
 private const val FIELD_NON_BATCHED_OPS = "mNonBatchedOperations"
 private const val FIELD_NON_BATCHED_OPS_LOCK = "mNonBatchedOperationsLock"
-private const val METHOD_IS_EMPTY = "isEmpty"
 
 class UIManagerModuleReflected(private val reactContext: ReactContext) {
 
diff --git a/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/uimodule/UIModuleIdlingResource.kt b/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/uimodule/UIModuleIdlingResource.kt
index fb4b82002..0722d49a1 100644
--- a/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/uimodule/UIModuleIdlingResource.kt
+++ b/detox/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/uimodule/UIModuleIdlingResource.kt
@@ -6,7 +6,6 @@ import androidx.test.espresso.IdlingResource.ResourceCallback
 import com.facebook.react.bridge.ReactContext
 import com.wix.detox.reactnative.helpers.RNHelpers
 import com.wix.detox.reactnative.idlingresources.DetoxBaseIdlingResource
-import com.wix.detox.reactnative.idlingresources.IdlingResourceDescription
 import org.joor.ReflectException
 
 /**
@@ -21,11 +20,10 @@ class UIModuleIdlingResource(private val reactContext: ReactContext)
     private var callback: ResourceCallback? = null
 
     override fun getName(): String = UIModuleIdlingResource::class.java.name
-    override fun getDescription() =
-            IdlingResourceDescription.Builder()
-                .name("ui")
-                .addDescription("reason", "UI rendering activity")
-                .build()
+    override fun getDebugName(): String = " ui"
+    override fun getBusyHint(): Map<String, Any> {
+        return mapOf("reason" to "UI rendering activity")
+    }
 
     override fun checkIdle(): Boolean {
         try {
diff --git a/detox/ios/Detox/Utilities/UIView+DetoxUtils.m b/detox/ios/Detox/Utilities/UIView+DetoxUtils.m
index d838edf92..12c39c107 100644
--- a/detox/ios/Detox/Utilities/UIView+DetoxUtils.m
+++ b/detox/ios/Detox/Utilities/UIView+DetoxUtils.m
@@ -394,21 +394,25 @@ DTX_DIRECT_MEMBERS
 
 	CGPoint absPoint = [self calcAbsPointFromLocalPoint:viewPoint];
 
-	UIViewController * _Nullable topMostViewController = [self _topMostViewControllerAtPoint:absPoint];
-	if (!topMostViewController) {
-		if (error) {
-			NSString *description = [NSString stringWithFormat:@"Failed to interact with the screen "
-															 "at point: %@.", NSStringFromCGPoint(viewPoint)];
-			*error = [NSError
-								errorWithDomain:@"Detox" code:0
-								userInfo:@{NSLocalizedDescriptionKey:description}];
+	UIView * _Nullable visibleContainer = [self _topMostViewOverlayAtPoint:absPoint];
+
+	if (!visibleContainer) {
+		UIViewController * _Nullable topMostViewController = [self _topMostViewControllerAtPoint:absPoint];
+		if (!topMostViewController) {
+			if (error) {
+				NSString *description = [NSString stringWithFormat:@"Failed to interact with the screen "
+																 "at point: %@.", NSStringFromCGPoint(viewPoint)];
+				*error = [NSError
+									errorWithDomain:@"Detox" code:0
+									userInfo:@{NSLocalizedDescriptionKey:description}];
+			}
+
+			return NO;
 		}
 
-		return NO;
+		visibleContainer = topMostViewController.view;
 	}
 
-	UIView *visibleContainer = topMostViewController.view;
-
 	if ([self isDescendantOfView:visibleContainer]) {
 		return [self _canHitFromView:self atAbsPoint:absPoint error:error];
 	}
@@ -421,6 +425,40 @@ DTX_DIRECT_MEMBERS
 	return [self _canHitFromView:visibleContainer atAbsPoint:absPoint error:error];
 }
 
+- (nullable UIView *)_topMostViewOverlayAtPoint:(CGPoint)point {
+	UIWindow * _Nullable topMostWindow = [UIWindow dtx_topMostWindowAtPoint:point];
+	if (!topMostWindow) {
+		return nil;
+	}
+
+	NSArray<UIView *> *viewsAtPoint =
+			[topMostWindow.subviews filteredArrayUsingPredicate:[NSPredicate
+					predicateWithBlock:^BOOL(UIView *view,
+																	 NSDictionary<NSString *, id> * _Nullable __unused bindings) {
+		if (!CGRectContainsPoint(view.frame, point)) {
+			return NO;
+		}
+
+		if (![view isVisibleAroundPoint:point]) {
+			return NO;
+		}
+
+		UIView * _Nullable hit = [view hitTest:point withEvent:nil];
+		if (!hit) {
+			// The point lies completely outside the view's hierarchy.
+			return NO;
+		}
+
+		return YES;
+	}]];
+
+	if (!viewsAtPoint.count) {
+		return nil;
+	}
+
+	return viewsAtPoint.lastObject;
+}
+
 - (BOOL)isVisibleAroundPoint:(CGPoint)point {
 	return [self _isVisibleAroundPoint:point error:nil];
 }
diff --git a/detox/src/client/actions/SyncStatusSchema.json b/detox/src/client/actions/SyncStatusSchema.json
index 3d0203ff5..5d484ed63 100644
--- a/detox/src/client/actions/SyncStatusSchema.json
+++ b/detox/src/client/actions/SyncStatusSchema.json
@@ -232,6 +232,27 @@
                 ],
                 "additionalProperties":false
               },
+              {
+                "properties":{
+                  "name":{
+                    "const":"bg"
+                  },
+                  "description":{
+                    "type":"object",
+                    "properties":{
+                      "reason":{
+                        "type":"string"
+                      }
+                    },
+                    "additionalProperties":false
+                  }
+                },
+                "required":[
+                  "name",
+                  "description"
+                ],
+                "additionalProperties":false
+              },
               {
                 "properties":{
                   "name":{
diff --git a/detox/src/client/actions/formatters/SyncStatusFormatter.js b/detox/src/client/actions/formatters/SyncStatusFormatter.js
index b3a5ed1dd..faa9c02df 100644
--- a/detox/src/client/actions/formatters/SyncStatusFormatter.js
+++ b/detox/src/client/actions/formatters/SyncStatusFormatter.js
@@ -4,6 +4,7 @@ const Ajv = require('ajv');
 const DetoxInternalError = require('../../../errors/DetoxInternalError');
 const statusSchema = require('../SyncStatusSchema.json');
 
+const bgThreadFormatter = require('./sync-resources/BgThreadFormatter');
 const delayedPerformSelectorFormatter = require('./sync-resources/DelayedPerformSelectorFormatter');
 const dispatchQueueFormatter = require('./sync-resources/DispatchQueueFormatter');
 const jsTimersFormatter = require('./sync-resources/JavaScriptTimersFormatter');
@@ -51,6 +52,7 @@ function resourcesDescriptionsFromJSON(jsonDescriptions) {
 }
 
 const resourceFormatters = {
+  bg: bgThreadFormatter,
   delayed_perform_selector: delayedPerformSelectorFormatter,
   dispatch_queue: dispatchQueueFormatter,
   run_loop: runLoopFormatter,
diff --git a/detox/src/client/actions/formatters/sync-resources/BgThreadFormatter.js b/detox/src/client/actions/formatters/sync-resources/BgThreadFormatter.js
new file mode 100644
index 000000000..479cf336c
--- /dev/null
+++ b/detox/src/client/actions/formatters/sync-resources/BgThreadFormatter.js
@@ -0,0 +1,5 @@
+const { makeResourceTitle } = require('./utils');
+
+module.exports = function(properties) {
+  return `${makeResourceTitle(`Background work taking place in ${properties.reason}.`)}`;
+};
diff --git a/detox/src/logger/utils/DetoxLogFinalizer.js b/detox/src/logger/utils/DetoxLogFinalizer.js
index 5d56bbd77..06c72d2da 100644
--- a/detox/src/logger/utils/DetoxLogFinalizer.js
+++ b/detox/src/logger/utils/DetoxLogFinalizer.js
@@ -37,7 +37,7 @@ class DetoxLogFinalizer {
       return;
     }
 
-    if (this._areLogsEnabled()) {
+    if (this._shouldSaveLogs()) {
       const rootDir = this._config.artifacts.rootDir;
 
       await fs.mkdirp(rootDir);
@@ -69,14 +69,14 @@ class DetoxLogFinalizer {
       return;
     }
 
-    const logsEnabled = this._areLogsEnabled();
-    const rootDir = logsEnabled ? this._config.artifacts.rootDir : '';
-    if (logsEnabled) {
+    const shouldSaveLogs = this._shouldSaveLogs(true);
+    const rootDir = shouldSaveLogs ? this._config.artifacts.rootDir : '';
+    if (shouldSaveLogs) {
       fs.mkdirpSync(rootDir);
     }
 
     for (const log of logs) {
-      if (logsEnabled) {
+      if (shouldSaveLogs) {
         const dest = path.join(rootDir, path.basename(log));
         this._safeMoveSync(log, dest);
       } else {
@@ -137,7 +137,7 @@ class DetoxLogFinalizer {
   }
 
   /** @private */
-  _areLogsEnabled() {
+  _shouldSaveLogs(isEmergencyExit = false) {
     if (!this._config) {
       return false;
     }
@@ -155,6 +155,10 @@ class DetoxLogFinalizer {
       return true;
     }
 
+    if (isEmergencyExit) {
+      return true;
+    }
+
     return this._session.testResults.some(r => !r.success);
   }
 }
diff --git a/detox/src/logger/utils/streams/ChromeTraceTransformer.js b/detox/src/logger/utils/streams/ChromeTraceTransformer.js
index 3f34f3e4a..442642586 100644
--- a/detox/src/logger/utils/streams/ChromeTraceTransformer.js
+++ b/detox/src/logger/utils/streams/ChromeTraceTransformer.js
@@ -47,6 +47,7 @@ class ChromeTraceTransformer {
    */
   createStream() {
     const transformFn = this._transformBunyanRecord.bind(this, {
+      primaryPid: NaN,
       knownPids: new Set(),
       knownTids: new Set(),
     });
@@ -62,7 +63,7 @@ class ChromeTraceTransformer {
   }
 
   /**
-   * @param {{ knownPids: Set<number>, knownTids: Set<number> }} state
+   * @param {{ knownPids: Set<number>; knownTids: Set<number>; primaryPid: number; }} state
    * @param {*} bunyanLogRecord
    * @returns {import('trace-event-lib').Event[]}
    * @private
@@ -76,7 +77,11 @@ class ChromeTraceTransformer {
 
     const builder = new SimpleEventBuilder();
     if (!state.knownPids.has(pid)) {
-      builder.metadata({ pid, ts, name: 'process_name', args: { name: pid === process.pid ? 'primary' : 'secondary' } });
+      if (Number.isNaN(state.primaryPid)) {
+        state.primaryPid = pid;
+      }
+
+      builder.metadata({ pid, ts, name: 'process_name', args: { name: pid === state.primaryPid ? 'primary' : 'secondary' } });
       builder.metadata({ pid, ts, name: 'process_sort_index', args: { sort_index: state.knownPids.size } });
       state.knownPids.add(pid);
     }
diff --git a/docs/guide/migration.md b/docs/guide/migration.md
index 617453e24..3feb83994 100644
--- a/docs/guide/migration.md
+++ b/docs/guide/migration.md
@@ -239,7 +239,7 @@ See comments line by line:
 
 2\. If you don’t have `maxWorkers: 1` configured, please add it.
 
-3\. If you removed your test environment in the previous step, `testEnvironment` property.
+3\. If you removed your test environment in the previous step, remove the `testEnvironment` property.
 
 4\. Remove `testRunner` since it is already `jest-circus` by default in Jest 27.x and higher.
 
diff --git a/docs/introduction/project-setup.mdx b/docs/introduction/project-setup.mdx
index 3b6730355..1b8c9a31f 100644
--- a/docs/introduction/project-setup.mdx
+++ b/docs/introduction/project-setup.mdx
@@ -123,12 +123,12 @@ Here's how you can check they are correct and change them if you need something
     </TabItem>
 </Tabs>
 
-## Step 4: Android configuration
+## Step 4: Additional Android configuration
 
 :::tip
 
 If you want to try out your tests right away on iOS,
-you can skip to [Step 5: Build Your App](#step-4-build-your-app)
+you can skip to [Step 5: Build the app](#step-5-build-the-app)
 and revisit it when you're ready to move forward with Android.
 
 :::
@@ -145,7 +145,7 @@ patch or create if they are missing:
     * `android/app/src/main/AndroidManifest.xml`
     * `android/app/src/main/res/xml/network_security_config.xml`
 
-### 3.1. Patching build scripts
+### 4.1. Patching build scripts
 
 Open your main build script and apply the suggested changes:
 
@@ -215,7 +215,7 @@ Now let's move on to the next build script and prepare it:
      release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
-+      proguardFile "${project(':detox').projectDir}/proguard-rules-app.pro"
++      proguardFile "${rootProject.projectDir}/../node_modules/detox/android/detox/proguard-rules-app.pro"
 
        signingConfig signingConfigs.release
      }
@@ -239,7 +239,7 @@ run tests with your app built in **release mode**.
 
 :::
 
-### 3.2. Adding an auxiliary Android test
+### 4.2. Adding an auxiliary Android test
 
 Detox requires that your project has a single dummy native Android test with some special content,
 which will be picked up by `testRunner` that you just added in the previous step, so let's create it now.
@@ -296,7 +296,7 @@ and check what your main activity is called:
     android:launchMode="standard"
 ```
 
-### 3.3. Enabling unencrypted traffic for Detox
+### 4.3. Enabling unencrypted traffic for Detox
 
 :::info
 
diff --git a/scripts/ci.android.sh b/scripts/ci.android.sh
index 77ecabb21..f7eb7c49c 100755
--- a/scripts/ci.android.sh
+++ b/scripts/ci.android.sh
@@ -28,8 +28,6 @@ fi
 
 mkdir -p coverage
 
-run_f "scripts/ci.genycloud-login.sh"
-
 pushd detox/test
 
 run_f "npm run build:android"
diff --git a/scripts/ci.genycloud-login.sh b/scripts/ci.genycloud-login.sh
deleted file mode 100755
index a4ffe82a4..000000000
--- a/scripts/ci.genycloud-login.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/bash -ex
-
-which gmsaas
-gmsaas --version
-gmsaas auth login "$GENYCLOUD_USERNAME" "$GENYCLOUD_PASSWORD"
diff --git a/website/package.json b/website/package.json
index f616676a2..f1efea809 100644
--- a/website/package.json
+++ b/website/package.json
@@ -14,10 +14,10 @@
     "write-heading-ids": "docusaurus write-heading-ids"
   },
   "dependencies": {
-    "@docusaurus/core": "^2.0.0",
-    "@docusaurus/preset-classic": "^2.0.0",
-    "@docusaurus/remark-plugin-npm2yarn": "^2.0.0",
-    "@docusaurus/theme-search-algolia": "^2.0.0",
+    "@docusaurus/core": "^2.2.0",
+    "@docusaurus/preset-classic": "^2.2.0",
+    "@docusaurus/remark-plugin-npm2yarn": "^2.2.0",
+    "@docusaurus/theme-search-algolia": "^2.2.0",
     "@mdx-js/react": "^1.6.21",
     "@svgr/webpack": "^5.5.0",
     "clsx": "^1.1.1",
diff --git a/website/src/components/Homepage/Features/FeatureList.js b/website/src/components/Homepage/Features/FeatureList.js
index b75fc178e..a239f136a 100644
--- a/website/src/components/Homepage/Features/FeatureList.js
+++ b/website/src/components/Homepage/Features/FeatureList.js
@@ -3,32 +3,32 @@ import React from 'react';
 const FeatureList = [
   {
     title: 'Cross Platform',
-    Svg: require('@site/static/img/homepage/cross-platform-light.svg').default, // taken from: https://uxwing.com/magic-icon/
+    Svg: require('@site/static/img/homepage/cross-platform.svg').default, // taken from: https://uxwing.com/magic-icon/
     description: <>Write cross-platform end-to-end tests in JavaScript. Currently supports iOS and Android.</>
   },
   {
     title: 'Debuggable',
-    Svg: require('@site/static/img/homepage/debug-light.svg').default, // taken from: https://uxwing.com/bug-icon/
+    Svg: require('@site/static/img/homepage/debug.svg').default, // taken from: https://uxwing.com/bug-icon/
     description: <>Modern async-await API allows breakpoints in asynchronous tests to work as expected.</>
   },
   {
     title: 'Automatically Synchronized',
-    Svg: require('@site/static/img/homepage/sync-light.svg').default, // taken from: https://uxwing.com/wait-sandclock-icon/
+    Svg: require('@site/static/img/homepage/sync.svg').default, // taken from: https://uxwing.com/wait-sandclock-icon/
     description: <>Stops flakiness at the core by monitoring asynchronous operations in your app.</>
   },
   {
     title: 'Made For CI',
-    Svg: require('@site/static/img/homepage/ci-light.svg').default, // taken from: https://iconarchive.com/show/flatastic-9-icons-by-custom-icon-design/Semi-success-icon.html
+    Svg: require('@site/static/img/homepage/ci.svg').default, // taken from: https://iconarchive.com/show/flatastic-9-icons-by-custom-icon-design/Semi-success-icon.html
     description: <>Execute your E2E tests on CI platforms like Travis CI, CircleCI or Jenkins without grief.</>
   },
   {
     title: 'Runs on Devices',
-    Svg: require('@site/static/img/homepage/devices-light.svg').default, // taken from: https://uxwing.com/mobile-phone-icon/
+    Svg: require('@site/static/img/homepage/devices.svg').default, // taken from: https://uxwing.com/mobile-phone-icon/
     description: <>Gain confidence to ship by testing your app on a device/simulator just like a real user (not yet supported on iOS).</>
   },
   {
     title: 'Test Runner Agnostic',
-    Svg: require('@site/static/img/homepage/test-runner-light.svg').default, // taken from: https://uxwing.com/testing-icon/
+    Svg: require('@site/static/img/homepage/test-runner.svg').default, // taken from: https://uxwing.com/testing-icon/
     description: (
       <>
         Detox provides a set of APIs to use with any test runner or without it. It comes with{' '}
diff --git a/website/src/components/Homepage/Features/Features.css b/website/src/components/Homepage/Features/Features.css
index ad7cd395f..3700d7fe9 100644
--- a/website/src/components/Homepage/Features/Features.css
+++ b/website/src/components/Homepage/Features/Features.css
@@ -2,8 +2,6 @@
   height: 60px;
   width: 60px;
   margin-bottom: 10px;
-  stroke: white;
-  stroke-width: 2px;
 }
 
 .features-gap {
diff --git a/website/src/components/Homepage/Features/Features.js b/website/src/components/Homepage/Features/Features.js
index 4edab7ef0..131320412 100644
--- a/website/src/components/Homepage/Features/Features.js
+++ b/website/src/components/Homepage/Features/Features.js
@@ -4,9 +4,7 @@ import './Features.css';
 const Features = ({ Svg, title, description }) => {
   return (
     <div className="col col--4 features-gap">
-      <div>
-        <Svg className="feature-image" alt={title} />
-      </div>
+      <Svg className="feature-image" alt={title} />
       <div>
         <h3>{title}</h3>
         <p>{description}</p>
diff --git a/website/static/img/homepage/ci-light.svg b/website/static/img/homepage/ci-light.svg
deleted file mode 100644
index 34c69cb3d..000000000
--- a/website/static/img/homepage/ci-light.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-<svg width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg">
-<g clip-path="url(#clip0_160_5248)">
-<path d="M23.8746 29.5401L27.8891 33.5543L37.0988 24.3453M48.9723 7.94367C48.7115 7.67344 48.399 7.45851 48.0533 7.31172C47.7076 7.16492 47.3359 7.08927 46.9603 7.08927C46.5848 7.08927 46.2131 7.16492 45.8674 7.31172C45.5217 7.45851 45.2092 7.67344 44.9484 7.94367L41.8832 10.9991C41.0521 10.4631 40.1822 9.98953 39.2809 9.58239C38.376 9.17746 37.4488 8.82427 36.5038 8.52454V3.802C36.5122 3.42823 36.4435 3.05674 36.3021 2.71063C36.1608 2.36453 35.9497 2.05122 35.682 1.79019C35.4211 1.52231 35.1078 1.31109 34.7617 1.1697C34.4155 1.02832 34.0439 0.959818 33.67 0.968472H27.7711C27.4023 0.965611 27.0366 1.03687 26.6959 1.17803C26.3551 1.31919 26.0462 1.52736 25.7875 1.79019C25.5164 2.04959 25.3018 2.36217 25.1571 2.70835C25.0125 3.05453 24.9409 3.42686 24.9468 3.802V8.10423C23.9727 8.33311 23.0162 8.63139 22.0847 8.99679C21.1781 9.3427 20.296 9.74978 19.4446 10.2152L16.0488 6.86693C15.8005 6.59378 15.4969 6.37668 15.1581 6.23011C14.8193 6.08353 14.4532 6.01083 14.0841 6.01687C13.7087 6.01522 13.3368 6.0897 12.991 6.23581C12.6452 6.38191 12.3326 6.59661 12.0721 6.86693L7.94426 11.0086C7.67401 11.2694 7.45907 11.5819 7.31227 11.9275C7.16546 12.2732 7.0898 12.6449 7.0898 13.0204C7.0898 13.3959 7.16546 13.7676 7.31227 14.1133C7.45907 14.4589 7.67401 14.7714 7.94426 15.0322L11 18.0971C10.4639 18.9282 9.9903 19.798 9.58312 20.6992C9.17648 21.6002 8.82322 22.5242 8.52518 23.4667H3.80226C3.42846 23.4583 3.05694 23.5269 2.71081 23.6683C2.36467 23.8097 2.05134 24.0207 1.79029 24.2884C1.52239 24.5492 1.31115 24.8625 1.16975 25.2087C1.02836 25.5548 0.959848 25.9264 0.968502 26.3002V32.1986C0.965642 32.5674 1.03691 32.933 1.17808 33.2738C1.31925 33.6145 1.52744 33.9234 1.79029 34.1821C2.04901 34.4541 2.36148 34.6693 2.70786 34.814C3.05423 34.9587 3.42693 35.0298 3.80226 35.0227H8.10957C8.33689 35.9966 8.63361 36.953 8.99748 37.8846C9.35347 38.8068 9.76026 39.7086 10.216 40.5859L6.85799 43.9436C6.58482 44.1919 6.36771 44.4955 6.22112 44.8342C6.07453 45.173 6.00183 45.5391 6.00786 45.9082C6.00622 46.2836 6.0807 46.6554 6.22682 47.0012C6.37294 47.3469 6.58765 47.6595 6.85799 47.92L11 52.1089C11.5458 52.6188 12.265 52.9024 13.012 52.9024C13.759 52.9024 14.4781 52.6188 15.0239 52.1089L18.0891 48.9967C18.9218 49.5301 19.7915 50.0035 20.6914 50.4135C21.5966 50.8259 22.5237 51.1885 23.4685 51.4997V56.1986C23.4647 56.5718 23.5354 56.9419 23.6765 57.2874C23.8176 57.6329 24.0262 57.9468 24.2901 58.2106C24.554 58.4745 24.8679 58.6831 25.2134 58.8241C25.5589 58.9652 25.9291 59.0359 26.3023 59.0321H32.2012C32.57 59.035 32.9357 58.9637 33.2764 58.8226C33.6172 58.6814 33.9261 58.4732 34.1848 58.2104C34.4568 57.9517 34.6721 57.6393 34.8168 57.2929C34.9615 56.9466 35.0326 56.5739 35.0255 56.1986V51.8964C35.9994 51.6706 36.9558 51.3754 37.8876 51.0132C38.8107 50.6593 39.7127 50.2525 40.5891 49.7948L43.9471 53.1101C44.2038 53.3789 44.5123 53.593 44.8541 53.7392C45.1959 53.8854 45.5637 53.9608 45.9355 53.9608C46.3072 53.9608 46.6751 53.8854 47.0168 53.7392C47.3586 53.593 47.6672 53.3789 47.9238 53.1101L52.1131 48.9731C52.6234 48.4265 52.9072 47.7067 52.9072 46.9589C52.9072 46.2112 52.6234 45.4914 52.1131 44.9448L48.9959 41.8798C49.532 41.0488 50.0056 40.179 50.4128 39.2777C50.8253 38.3726 51.1879 37.4456 51.4991 36.5009H56.1984C56.5716 36.5047 56.9418 36.434 57.2873 36.2929C57.6328 36.1518 57.9467 35.9433 58.2106 35.6794C58.4745 35.4155 58.6831 35.1016 58.8242 34.7562C58.9652 34.4107 59.0359 34.0405 59.0321 33.6673V27.7689C59.035 27.4001 58.9637 27.0345 58.8226 26.6938C58.6814 26.353 58.4732 26.0441 58.2104 25.7854C57.9516 25.5134 57.6392 25.2982 57.2928 25.1535C56.9464 25.0088 56.5737 24.9377 56.1984 24.9448H51.8958C51.659 23.9833 51.3641 23.0371 51.0126 22.1113C50.6694 21.1929 50.2622 20.2998 49.7941 19.4383L53.1427 16.0475C53.4158 15.7993 53.6329 15.4957 53.7795 15.1569C53.9261 14.8181 53.9988 14.452 53.9928 14.083C53.9944 13.7076 53.9199 13.3358 53.7738 12.99C53.6277 12.6442 53.413 12.3316 53.1427 12.0712L49.0007 7.94367H48.9723ZM29.9862 12.6662C33.9881 12.6659 37.8663 14.0529 40.9602 16.591C44.0542 19.1291 46.1724 22.6612 46.9542 26.5857C47.7359 30.5102 47.1328 34.5843 45.2476 38.114C43.3623 41.6438 40.3116 44.4108 36.615 45.9438C32.9184 47.4768 28.8046 47.6809 24.9744 46.5214C21.1442 45.3619 17.8345 42.9104 15.609 39.5846C13.3836 36.2589 12.38 32.2645 12.7694 28.2819C13.1587 24.2993 14.9169 20.5748 17.7443 17.7429C19.3502 16.1333 21.2585 14.8571 23.3594 13.9874C25.4603 13.1178 27.7124 12.672 29.9862 12.6757V12.6662Z" stroke="url(#paint0_linear_160_5248)"/>
-</g>
-<defs>
-<linearGradient id="paint0_linear_160_5248" x1="15.9678" y1="5.32258" x2="42.0968" y2="57.0968" gradientUnits="userSpaceOnUse">
-<stop stop-color="#9934BD"/>
-<stop offset="1" stop-color="#4479E0"/>
-</linearGradient>
-<clipPath id="clip0_160_5248">
-<rect width="60" height="60" fill="white"/>
-</clipPath>
-</defs>
-</svg>
diff --git a/website/static/img/homepage/ci.svg b/website/static/img/homepage/ci.svg
new file mode 100644
index 000000000..151461d5d
--- /dev/null
+++ b/website/static/img/homepage/ci.svg
@@ -0,0 +1,10 @@
+<svg width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M26.4834 0.193163C26.178 0.300707 25.7883 0.583336 25.3756 0.996442C24.4423 1.93104 24.3891 2.14633 24.3891 4.98729V7.30864L23.5776 7.54289C22.6108 7.82196 20.6564 8.57372 19.8966 8.95876L19.3534 9.23406L17.52 7.47588C15.3103 5.35694 15.1131 5.22657 14.0226 5.16342C12.5087 5.07578 12.4729 5.09892 9.43592 8.11412C6.34658 11.1814 6.2183 11.3661 6.22731 12.7338C6.23558 13.9924 6.42637 14.3082 8.37713 16.2941L10.0231 17.9696L9.56169 18.7526C9.09895 19.538 8.1788 21.6105 7.94193 22.4011L7.81533 22.8235L5.13323 22.8575L2.45102 22.8913L1.85822 23.1824C1.20731 23.5021 0.652832 24.0521 0.282659 24.7453C-0.09788 25.4581 -0.0926445 32.8814 0.289047 33.6494C1.06521 35.2113 1.8421 35.5386 4.94474 35.611L7.33384 35.6667L7.72674 36.8709C7.94288 37.5333 8.36949 38.657 8.67463 39.3681L9.22963 40.661L7.44935 42.4572C5.419 44.5057 5.21292 44.8211 5.146 45.9813C5.0615 47.4484 5.17187 47.6202 8.09241 50.5664C11.0783 53.5785 11.2259 53.6779 12.7132 53.6779C14.0717 53.6779 14.5185 53.4122 16.4391 51.4629L17.9314 49.9484L18.5162 50.2742C19.3775 50.754 20.7065 51.3699 21.8206 51.8054L22.8026 52.1893L22.8432 54.7661C22.8893 57.6891 22.9495 57.9813 23.6743 58.8048C24.6721 59.9384 25.1805 60.0405 29.5726 59.9899C33.5057 59.9446 33.6036 59.9246 34.5544 58.9738C35.4495 58.0787 35.5184 57.8081 35.5703 54.9869L35.6136 52.6307L37.1483 52.1252C37.9923 51.847 39.1278 51.4102 39.6716 51.1542L40.6604 50.6889L42.4466 52.4593C44.5132 54.5076 44.7947 54.688 46.0286 54.7558C47.4445 54.8335 47.6447 54.7025 50.6026 51.7611C53.5804 48.8 53.6568 48.6866 53.6553 47.2378C53.6536 45.784 53.5147 45.5468 51.5391 43.6232L49.924 42.0506L50.5982 40.7435C50.969 40.0247 51.4755 38.9092 51.7238 38.2648L52.1752 37.0931L54.8012 37.0606C58.1922 37.0185 58.9 36.7332 59.666 35.0998L59.9403 34.5148V30.6927C59.9403 26.386 59.9427 26.4005 59.0904 25.4571C58.2668 24.5455 57.9789 24.4692 55.1359 24.4097L52.6353 24.3573L52.1922 22.996C51.9484 22.2473 51.514 21.1087 51.2268 20.4658L50.7046 19.2971L52.4725 17.5338C54.5988 15.4133 54.8121 15.0699 54.804 13.781C54.7954 12.4165 54.6326 12.1788 51.7283 9.29061C48.8197 6.39824 48.5775 6.23677 47.1649 6.24808C45.9067 6.25823 45.5862 6.45091 43.6336 8.37183L41.9872 9.99158L40.7518 9.35302C40.0723 9.0018 38.9755 8.50272 38.3143 8.24397L37.1122 7.77348L37.0598 5.07023C37.0078 2.38331 37.0058 2.36362 36.7252 1.83197C36.3669 1.15278 35.5256 0.392752 34.8938 0.177455C34.1732 -0.0681047 27.1885 -0.055015 26.4834 0.193163ZM34.5761 1.09435C35.9069 1.65207 36.0542 2.08287 36.1174 5.59852L36.1697 8.51602L37.3216 8.92096C38.5912 9.36737 40.2883 10.1594 41.3787 10.8144L42.0849 11.2387L42.8971 10.5016C43.3438 10.0961 44.1805 9.28632 44.7565 8.7021C45.9914 7.44928 46.4103 7.19335 47.218 7.19848C48.1515 7.20456 48.4543 7.42278 50.9717 9.90352C53.6113 12.5048 53.8503 12.8253 53.8554 13.7698C53.8603 14.6937 53.7147 14.9014 51.495 17.1387L49.5142 19.1352L50.1434 20.4373C50.7372 21.6662 51.6137 24.0957 51.7749 24.9594L51.8482 25.3521H54.5101C57.3804 25.3521 57.5407 25.377 58.1909 25.9253C58.9762 26.5876 58.994 26.6837 59.0307 30.46C59.0677 34.2863 59.0201 34.6425 58.3794 35.3209C57.666 36.0764 57.6507 36.0797 54.4084 36.1379L51.4943 36.1903L50.994 37.4992C50.4526 38.9155 49.607 40.6655 49.0218 41.5812L48.6549 42.1552L50.497 43.9373C52.5291 45.9033 52.7627 46.2436 52.7627 47.2378C52.7627 48.1919 52.5652 48.4594 49.9254 51.0807C47.329 53.659 47.0891 53.835 46.1701 53.835C45.2721 53.835 44.992 53.6388 42.8606 51.5176L40.8583 49.5249L40.0324 49.9391C38.8304 50.5419 36.9538 51.2623 35.7319 51.59L34.6667 51.8756L34.6328 54.5569C34.5959 57.4755 34.5775 57.5736 33.9325 58.2689C33.2413 59.014 33.2135 59.0184 29.2061 59.0184C25.1987 59.0184 25.1708 59.014 24.4796 58.2689C23.8279 57.5663 23.8162 57.5002 23.7796 54.3324C23.7589 52.5414 23.707 51.4265 23.6442 51.4265C23.1707 51.4265 19.967 50.0068 18.6453 49.2113L17.7467 48.6706L15.963 50.5072C14.0435 52.4836 13.7776 52.6777 12.8756 52.7594C11.8119 52.8559 11.536 52.665 8.86281 49.9815C5.13501 46.2394 5.12841 46.124 8.45138 42.8068L10.4251 40.8365L9.97804 39.9271C9.31194 38.5721 8.69516 36.9552 8.37284 35.719L8.08623 34.6195L5.32098 34.5672C2.23499 34.5087 2.22264 34.506 1.53381 33.7437C0.964154 33.1131 0.933786 32.8788 0.934205 29.1219C0.934624 25.7566 0.937451 25.7127 1.18416 25.1828C1.75434 23.9583 2.33992 23.7814 5.82184 23.7814C7.85418 23.7814 8.48908 23.7506 8.52269 23.6505C9.14366 21.7975 10.0258 19.8142 10.7589 18.6222C10.9987 18.2324 11.1948 17.8818 11.1948 17.8429C11.1948 17.8042 10.3707 16.94 9.36335 15.9228C7.40537 13.9456 7.18892 13.6282 7.18693 12.7303C7.18473 11.7665 7.40809 11.4661 10.1087 8.7997C13.781 5.1741 13.731 5.17683 17.0595 8.41769L19.1368 10.4403L20.3553 9.84655C21.5395 9.26946 23.5334 8.53917 24.7033 8.25392L25.2792 8.11349L25.3316 5.3449C25.3892 2.30152 25.3951 2.27136 26.0819 1.61322C26.7528 0.970054 26.811 0.961781 30.7016 0.957278C33.4405 0.954137 34.3153 0.985028 34.5761 1.09435ZM28.2393 11.9601C20.2957 12.7264 13.948 18.4497 12.2249 26.3993C11.8759 28.0099 11.8729 31.9088 12.2196 33.4676C14.1977 42.3623 21.5311 48.1795 30.4627 47.9389C43.9002 47.577 52.1384 33.4609 45.9013 21.4848C42.5556 15.0605 35.5068 11.2593 28.2393 11.9601ZM33.4221 13.1964C47.3394 16.2301 51.8069 33.4768 41.1146 42.8931C36.1246 47.2876 28.622 48.2834 22.5541 45.3566C18.4274 43.3662 15.1142 39.6032 13.7131 35.3156C12.5957 31.8965 12.5986 27.933 13.7206 24.5667C15.7115 18.5941 21.0505 14.0474 27.2373 13.0558C28.6912 12.8228 32.0594 12.8993 33.4221 13.1964ZM32.2949 28.3892L27.7939 32.8911L25.9349 31.0342L24.0759 29.1774L23.7362 29.517L23.3966 29.8566L25.6208 32.0808L27.845 34.305L32.6871 29.4629L37.5291 24.6207L37.1624 24.2541L36.7958 23.8873L32.2949 28.3892Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M26.4834 0.193163C26.178 0.300707 25.7883 0.583336 25.3756 0.996442C24.4423 1.93104 24.3891 2.14633 24.3891 4.98729V7.30864L23.5776 7.54289C22.6108 7.82196 20.6564 8.57372 19.8966 8.95876L19.3534 9.23406L17.52 7.47588C15.3103 5.35694 15.1131 5.22657 14.0226 5.16342C12.5087 5.07578 12.4729 5.09892 9.43592 8.11412C6.34658 11.1814 6.2183 11.3661 6.22731 12.7338C6.23558 13.9924 6.42637 14.3082 8.37713 16.2941L10.0231 17.9696L9.56169 18.7526C9.09895 19.538 8.1788 21.6105 7.94193 22.4011L7.81533 22.8235L5.13323 22.8575L2.45102 22.8913L1.85822 23.1824C1.20731 23.5021 0.652832 24.0521 0.282659 24.7453C-0.09788 25.4581 -0.0926445 32.8814 0.289047 33.6494C1.06521 35.2113 1.8421 35.5386 4.94474 35.611L7.33384 35.6667L7.72674 36.8709C7.94288 37.5333 8.36949 38.657 8.67463 39.3681L9.22963 40.661L7.44935 42.4572C5.419 44.5057 5.21292 44.8211 5.146 45.9813C5.0615 47.4484 5.17187 47.6202 8.09241 50.5664C11.0783 53.5785 11.2259 53.6779 12.7132 53.6779C14.0717 53.6779 14.5185 53.4122 16.4391 51.4629L17.9314 49.9484L18.5162 50.2742C19.3775 50.754 20.7065 51.3699 21.8206 51.8054L22.8026 52.1893L22.8432 54.7661C22.8893 57.6891 22.9495 57.9813 23.6743 58.8048C24.6721 59.9384 25.1805 60.0405 29.5726 59.9899C33.5057 59.9446 33.6036 59.9246 34.5544 58.9738C35.4495 58.0787 35.5184 57.8081 35.5703 54.9869L35.6136 52.6307L37.1483 52.1252C37.9923 51.847 39.1278 51.4102 39.6716 51.1542L40.6604 50.6889L42.4466 52.4593C44.5132 54.5076 44.7947 54.688 46.0286 54.7558C47.4445 54.8335 47.6447 54.7025 50.6026 51.7611C53.5804 48.8 53.6568 48.6866 53.6553 47.2378C53.6536 45.784 53.5147 45.5468 51.5391 43.6232L49.924 42.0506L50.5982 40.7435C50.969 40.0247 51.4755 38.9092 51.7238 38.2648L52.1752 37.0931L54.8012 37.0606C58.1922 37.0185 58.9 36.7332 59.666 35.0998L59.9403 34.5148V30.6927C59.9403 26.386 59.9427 26.4005 59.0904 25.4571C58.2668 24.5455 57.9789 24.4692 55.1359 24.4097L52.6353 24.3573L52.1922 22.996C51.9484 22.2473 51.514 21.1087 51.2268 20.4658L50.7046 19.2971L52.4725 17.5338C54.5988 15.4133 54.8121 15.0699 54.804 13.781C54.7954 12.4165 54.6326 12.1788 51.7283 9.29061C48.8197 6.39824 48.5775 6.23677 47.1649 6.24808C45.9067 6.25823 45.5862 6.45091 43.6336 8.37183L41.9872 9.99158L40.7518 9.35302C40.0723 9.0018 38.9755 8.50272 38.3143 8.24397L37.1122 7.77348L37.0598 5.07023C37.0078 2.38331 37.0058 2.36362 36.7252 1.83197C36.3669 1.15278 35.5256 0.392752 34.8938 0.177455C34.1732 -0.0681047 27.1885 -0.055015 26.4834 0.193163ZM34.5761 1.09435C35.9069 1.65207 36.0542 2.08287 36.1174 5.59852L36.1697 8.51602L37.3216 8.92096C38.5912 9.36737 40.2883 10.1594 41.3787 10.8144L42.0849 11.2387L42.8971 10.5016C43.3438 10.0961 44.1805 9.28632 44.7565 8.7021C45.9914 7.44928 46.4103 7.19335 47.218 7.19848C48.1515 7.20456 48.4543 7.42278 50.9717 9.90352C53.6113 12.5048 53.8503 12.8253 53.8554 13.7698C53.8603 14.6937 53.7147 14.9014 51.495 17.1387L49.5142 19.1352L50.1434 20.4373C50.7372 21.6662 51.6137 24.0957 51.7749 24.9594L51.8482 25.3521H54.5101C57.3804 25.3521 57.5407 25.377 58.1909 25.9253C58.9762 26.5876 58.994 26.6837 59.0307 30.46C59.0677 34.2863 59.0201 34.6425 58.3794 35.3209C57.666 36.0764 57.6507 36.0797 54.4084 36.1379L51.4943 36.1903L50.994 37.4992C50.4526 38.9155 49.607 40.6655 49.0218 41.5812L48.6549 42.1552L50.497 43.9373C52.5291 45.9033 52.7627 46.2436 52.7627 47.2378C52.7627 48.1919 52.5652 48.4594 49.9254 51.0807C47.329 53.659 47.0891 53.835 46.1701 53.835C45.2721 53.835 44.992 53.6388 42.8606 51.5176L40.8583 49.5249L40.0324 49.9391C38.8304 50.5419 36.9538 51.2623 35.7319 51.59L34.6667 51.8756L34.6328 54.5569C34.5959 57.4755 34.5775 57.5736 33.9325 58.2689C33.2413 59.014 33.2135 59.0184 29.2061 59.0184C25.1987 59.0184 25.1708 59.014 24.4796 58.2689C23.8279 57.5663 23.8162 57.5002 23.7796 54.3324C23.7589 52.5414 23.707 51.4265 23.6442 51.4265C23.1707 51.4265 19.967 50.0068 18.6453 49.2113L17.7467 48.6706L15.963 50.5072C14.0435 52.4836 13.7776 52.6777 12.8756 52.7594C11.8119 52.8559 11.536 52.665 8.86281 49.9815C5.13501 46.2394 5.12841 46.124 8.45138 42.8068L10.4251 40.8365L9.97804 39.9271C9.31194 38.5721 8.69516 36.9552 8.37284 35.719L8.08623 34.6195L5.32098 34.5672C2.23499 34.5087 2.22264 34.506 1.53381 33.7437C0.964154 33.1131 0.933786 32.8788 0.934205 29.1219C0.934624 25.7566 0.937451 25.7127 1.18416 25.1828C1.75434 23.9583 2.33992 23.7814 5.82184 23.7814C7.85418 23.7814 8.48908 23.7506 8.52269 23.6505C9.14366 21.7975 10.0258 19.8142 10.7589 18.6222C10.9987 18.2324 11.1948 17.8818 11.1948 17.8429C11.1948 17.8042 10.3707 16.94 9.36335 15.9228C7.40537 13.9456 7.18892 13.6282 7.18693 12.7303C7.18473 11.7665 7.40809 11.4661 10.1087 8.7997C13.781 5.1741 13.731 5.17683 17.0595 8.41769L19.1368 10.4403L20.3553 9.84655C21.5395 9.26946 23.5334 8.53917 24.7033 8.25392L25.2792 8.11349L25.3316 5.3449C25.3892 2.30152 25.3951 2.27136 26.0819 1.61322C26.7528 0.970054 26.811 0.961781 30.7016 0.957278C33.4405 0.954137 34.3153 0.985028 34.5761 1.09435ZM28.2393 11.9601C20.2957 12.7264 13.948 18.4497 12.2249 26.3993C11.8759 28.0099 11.8729 31.9088 12.2196 33.4676C14.1977 42.3623 21.5311 48.1795 30.4627 47.9389C43.9002 47.577 52.1384 33.4609 45.9013 21.4848C42.5556 15.0605 35.5068 11.2593 28.2393 11.9601ZM33.4221 13.1964C47.3394 16.2301 51.8069 33.4768 41.1146 42.8931C36.1246 47.2876 28.622 48.2834 22.5541 45.3566C18.4274 43.3662 15.1142 39.6032 13.7131 35.3156C12.5957 31.8965 12.5986 27.933 13.7206 24.5667C15.7115 18.5941 21.0505 14.0474 27.2373 13.0558C28.6912 12.8228 32.0594 12.8993 33.4221 13.1964ZM32.2949 28.3892L27.7939 32.8911L25.9349 31.0342L24.0759 29.1774L23.7362 29.517L23.3966 29.8566L25.6208 32.0808L27.845 34.305L32.6871 29.4629L37.5291 24.6207L37.1624 24.2541L36.7958 23.8873L32.2949 28.3892Z" fill="url(#paint0_linear_965_2947)"/>
+<defs>
+<linearGradient id="paint0_linear_965_2947" x1="15.4846" y1="4.5" x2="42.5005" y2="57.9784" gradientUnits="userSpaceOnUse">
+<stop stop-color="#9934BD"/>
+<stop offset="1" stop-color="#4479E0"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/website/static/img/homepage/cross-platform-light.svg b/website/static/img/homepage/cross-platform-light.svg
deleted file mode 100644
index 3fc8926b3..000000000
--- a/website/static/img/homepage/cross-platform-light.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-<svg width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path fill-rule="evenodd" clip-rule="evenodd" d="M23.6649 9.62362L26.7284 24.1426L41.3096 27.3146L28.3623 34.6968L29.8299 49.4565L18.7634 39.5019L5.09413 45.4539L11.2021 31.9167L1.28022 20.8339L16.1226 22.4245L23.6649 9.62362ZM31.9814 45.9684L44.6438 58.7693C44.9478 59.0761 45.4512 59.0761 45.7599 58.774L50.6805 53.9265C50.9892 53.6244 50.9892 53.1241 50.6852 52.8173L33.3778 35.3765C33.0738 35.0697 32.2712 34.9422 32.2617 35.3718L31.9814 45.9684ZM8.6658 16.6094H8.42357C8.42357 14.6364 7.68264 12.9135 6.20078 11.4409C4.71416 9.97291 2.98057 9.23658 1 9.23658V8.99585C2.98057 8.99585 4.71416 8.25951 6.19603 6.78684C7.67789 5.30945 8.41883 3.58661 8.41883 1.62305H8.66105C8.66105 3.59133 9.40199 5.31417 10.8839 6.78684C12.3657 8.25951 14.0993 8.99585 16.0799 8.99585V9.23658C14.0993 9.23658 12.3657 9.97291 10.8839 11.4456C9.40674 12.9183 8.6658 14.6364 8.6658 16.6094ZM44.5725 24.086H44.1973C44.1973 21.051 43.0574 18.3983 40.7729 16.1326C38.4883 13.867 35.8238 12.7342 32.7699 12.7342V12.3613C35.8238 12.3613 38.4931 11.2285 40.7729 8.95337C43.0574 6.67356 44.1973 4.02558 44.1973 1H44.5725C44.5725 4.03502 45.7124 6.68772 47.997 8.95337C50.2815 11.219 52.946 12.3566 56 12.3566V12.7294C52.946 12.7294 50.2815 13.8623 47.997 16.1279C45.7124 18.3983 44.5725 21.051 44.5725 24.086Z" stroke="black"/>
-<path fill-rule="evenodd" clip-rule="evenodd" d="M23.6649 9.62362L26.7284 24.1426L41.3096 27.3146L28.3623 34.6968L29.8299 49.4565L18.7634 39.5019L5.09413 45.4539L11.2021 31.9167L1.28022 20.8339L16.1226 22.4245L23.6649 9.62362ZM31.9814 45.9684L44.6438 58.7693C44.9478 59.0761 45.4512 59.0761 45.7599 58.774L50.6805 53.9265C50.9892 53.6244 50.9892 53.1241 50.6852 52.8173L33.3778 35.3765C33.0738 35.0697 32.2712 34.9422 32.2617 35.3718L31.9814 45.9684ZM8.6658 16.6094H8.42357C8.42357 14.6364 7.68264 12.9135 6.20078 11.4409C4.71416 9.97291 2.98057 9.23658 1 9.23658V8.99585C2.98057 8.99585 4.71416 8.25951 6.19603 6.78684C7.67789 5.30945 8.41883 3.58661 8.41883 1.62305H8.66105C8.66105 3.59133 9.40199 5.31417 10.8839 6.78684C12.3657 8.25951 14.0993 8.99585 16.0799 8.99585V9.23658C14.0993 9.23658 12.3657 9.97291 10.8839 11.4456C9.40674 12.9183 8.6658 14.6364 8.6658 16.6094ZM44.5725 24.086H44.1973C44.1973 21.051 43.0574 18.3983 40.7729 16.1326C38.4883 13.867 35.8238 12.7342 32.7699 12.7342V12.3613C35.8238 12.3613 38.4931 11.2285 40.7729 8.95337C43.0574 6.67356 44.1973 4.02558 44.1973 1H44.5725C44.5725 4.03502 45.7124 6.68772 47.997 8.95337C50.2815 11.219 52.946 12.3566 56 12.3566V12.7294C52.946 12.7294 50.2815 13.8623 47.997 16.1279C45.7124 18.3983 44.5725 21.051 44.5725 24.086Z" stroke="url(#paint0_linear_160_5240)"/>
-<defs>
-<linearGradient id="paint0_linear_160_5240" x1="15.2083" y1="5.35" x2="42.1198" y2="55.9164" gradientUnits="userSpaceOnUse">
-<stop stop-color="#9934BD"/>
-<stop offset="1" stop-color="#4479E0"/>
-</linearGradient>
-</defs>
-</svg>
diff --git a/website/static/img/homepage/cross-platform.svg b/website/static/img/homepage/cross-platform.svg
new file mode 100644
index 000000000..9d55ded84
--- /dev/null
+++ b/website/static/img/homepage/cross-platform.svg
@@ -0,0 +1,10 @@
+<svg width="60" height="54" viewBox="0 0 60 54" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M46.8593 0.679394C46.8593 6.55388 41.6445 11.954 35.7044 12.2307L34.5031 12.2867V12.9588V13.631L35.067 13.6313C41.2368 13.6344 46.8593 19.113 46.8593 25.1219V25.8892H47.5457H48.2322L48.2342 25.2272C48.2508 19.5497 53.084 14.3229 58.8874 13.7066L60 13.5885V12.9381V12.2877L59.0929 12.2275C53.5002 11.8565 48.5738 6.77511 48.2605 1.0542L48.2028 0H47.531H46.8593V0.679394ZM8.28738 1.54452C8.01084 5.38544 4.6731 8.62972 0.998214 8.62972H0.278417V9.2543V9.87887L1.28358 9.92663C5.00005 10.1033 8.30778 13.5398 8.31808 17.2349L8.31975 17.8478H8.8899H9.46014L9.57292 16.7694C9.9694 12.977 13.186 9.9129 16.7779 9.90604L17.5379 9.90456V9.28136V8.65826L16.5817 8.60344C12.9023 8.3925 9.84534 5.31816 9.53703 1.51863L9.46956 0.686455H8.90931H8.34907L8.28738 1.54452ZM48.5234 5.83487C50.0729 8.98305 52.9296 11.503 56.1883 12.5964C57.3527 12.9869 57.3702 12.9992 56.891 13.0884C53.268 13.7635 49.007 17.8413 47.8339 21.7562C47.5439 22.7238 47.5352 22.7258 47.3165 21.877C46.3951 18.3004 42.7473 14.5826 38.8894 13.2882C38.342 13.1045 37.9585 12.9335 38.0373 12.9081C38.1161 12.8827 38.4894 12.7644 38.867 12.6454C42.5791 11.4745 46.0756 7.97798 47.2465 4.26583C47.3656 3.88828 47.4864 3.51318 47.5149 3.43227C47.5435 3.35137 47.6518 3.59408 47.7555 3.97163C47.8593 4.34918 48.2048 5.18764 48.5234 5.83487ZM9.13604 4.19228C9.81475 6.02825 11.9112 8.14822 13.8726 8.98177L14.5041 9.25018L13.7276 9.61517C11.6972 10.5695 10.0068 12.2802 9.19674 14.2002L8.92089 14.8541L8.81321 14.5709C7.98005 12.3795 5.88116 10.2494 3.77934 9.4621L3.30863 9.28578L4.08687 8.91989C5.5449 8.23462 6.73325 7.26269 7.67919 5.98196C8.14245 5.35464 8.81007 4.09716 8.81007 3.8518C8.81007 3.58026 8.97257 3.74991 9.13604 4.19228ZM21.1697 15.7381C18.8295 19.7138 16.8513 22.991 16.7737 23.0208C16.6963 23.0506 12.8982 22.6744 8.33377 22.1849C3.76934 21.6954 0.0191334 21.3106 0.0001088 21.3296C-0.0190139 21.3487 2.48508 24.178 5.56451 27.6171C8.64405 31.0562 11.1633 33.9167 11.163 33.9737C11.1627 34.0309 9.62009 37.4958 7.73508 41.6738C5.85008 45.8517 4.31977 49.2821 4.33458 49.2968C4.34929 49.3115 7.80049 47.8268 12.0039 45.9973C16.2071 44.1678 19.6949 42.6571 19.7543 42.6401C19.8137 42.6232 22.6477 45.1136 26.0521 48.1744C29.4565 51.2352 32.2876 53.7396 32.3436 53.7396C32.4082 53.7396 32.4247 53.5516 32.3887 53.2248C31.7971 47.8548 30.8129 37.1061 30.9073 37.0452C30.9702 37.0045 34.2793 35.1133 38.2607 32.8424C42.2421 30.5716 45.4856 28.7003 45.4684 28.684C45.4514 28.6678 41.7305 27.8502 37.1999 26.8672C32.6693 25.8841 28.9543 25.0736 28.9444 25.066C28.9346 25.0584 28.1507 21.3683 27.2027 16.8655C26.2546 12.3628 25.4667 8.6407 25.4518 8.59412C25.4369 8.54754 23.5099 11.7623 21.1697 15.7381ZM25.6671 14.2439C26.9856 20.5317 28.1133 25.8081 28.1449 25.8387C28.1723 25.8652 41.5023 28.7857 42.5272 28.9898C42.991 29.0822 43.265 28.9111 36.3579 32.8396C32.9283 34.7901 30.0455 36.4422 29.9516 36.5109C29.7907 36.6286 29.8231 37.0578 30.5216 44.0296C30.9289 48.0963 31.2453 51.4405 31.2245 51.4612C31.2038 51.4819 28.7446 49.3043 25.7598 46.6222C22.7749 43.9401 20.2617 41.6849 20.1749 41.6108C20.0374 41.4935 19.1288 41.8629 13.1285 44.4758C9.33972 46.1257 6.22782 47.4618 6.21321 47.445C6.1986 47.4282 7.57445 44.3397 9.27068 40.5817L12.3548 33.749L7.36312 28.1765C4.05264 24.4808 2.42447 22.5944 2.52881 22.5755C2.61521 22.5599 5.97148 22.9013 9.98715 23.3343C15.7543 23.956 17.3113 24.0959 17.3977 24.0001C17.4579 23.9334 19.174 21.0436 21.2112 17.5781C23.2483 14.1127 24.9443 11.2775 24.98 11.2775C25.0157 11.2775 25.3248 12.6124 25.6671 14.2439Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M46.8593 0.679394C46.8593 6.55388 41.6445 11.954 35.7044 12.2307L34.5031 12.2867V12.9588V13.631L35.067 13.6313C41.2368 13.6344 46.8593 19.113 46.8593 25.1219V25.8892H47.5457H48.2322L48.2342 25.2272C48.2508 19.5497 53.084 14.3229 58.8874 13.7066L60 13.5885V12.9381V12.2877L59.0929 12.2275C53.5002 11.8565 48.5738 6.77511 48.2605 1.0542L48.2028 0H47.531H46.8593V0.679394ZM8.28738 1.54452C8.01084 5.38544 4.6731 8.62972 0.998214 8.62972H0.278417V9.2543V9.87887L1.28358 9.92663C5.00005 10.1033 8.30778 13.5398 8.31808 17.2349L8.31975 17.8478H8.8899H9.46014L9.57292 16.7694C9.9694 12.977 13.186 9.9129 16.7779 9.90604L17.5379 9.90456V9.28136V8.65826L16.5817 8.60344C12.9023 8.3925 9.84534 5.31816 9.53703 1.51863L9.46956 0.686455H8.90931H8.34907L8.28738 1.54452ZM48.5234 5.83487C50.0729 8.98305 52.9296 11.503 56.1883 12.5964C57.3527 12.9869 57.3702 12.9992 56.891 13.0884C53.268 13.7635 49.007 17.8413 47.8339 21.7562C47.5439 22.7238 47.5352 22.7258 47.3165 21.877C46.3951 18.3004 42.7473 14.5826 38.8894 13.2882C38.342 13.1045 37.9585 12.9335 38.0373 12.9081C38.1161 12.8827 38.4894 12.7644 38.867 12.6454C42.5791 11.4745 46.0756 7.97798 47.2465 4.26583C47.3656 3.88828 47.4864 3.51318 47.5149 3.43227C47.5435 3.35137 47.6518 3.59408 47.7555 3.97163C47.8593 4.34918 48.2048 5.18764 48.5234 5.83487ZM9.13604 4.19228C9.81475 6.02825 11.9112 8.14822 13.8726 8.98177L14.5041 9.25018L13.7276 9.61517C11.6972 10.5695 10.0068 12.2802 9.19674 14.2002L8.92089 14.8541L8.81321 14.5709C7.98005 12.3795 5.88116 10.2494 3.77934 9.4621L3.30863 9.28578L4.08687 8.91989C5.5449 8.23462 6.73325 7.26269 7.67919 5.98196C8.14245 5.35464 8.81007 4.09716 8.81007 3.8518C8.81007 3.58026 8.97257 3.74991 9.13604 4.19228ZM21.1697 15.7381C18.8295 19.7138 16.8513 22.991 16.7737 23.0208C16.6963 23.0506 12.8982 22.6744 8.33377 22.1849C3.76934 21.6954 0.0191334 21.3106 0.0001088 21.3296C-0.0190139 21.3487 2.48508 24.178 5.56451 27.6171C8.64405 31.0562 11.1633 33.9167 11.163 33.9737C11.1627 34.0309 9.62009 37.4958 7.73508 41.6738C5.85008 45.8517 4.31977 49.2821 4.33458 49.2968C4.34929 49.3115 7.80049 47.8268 12.0039 45.9973C16.2071 44.1678 19.6949 42.6571 19.7543 42.6401C19.8137 42.6232 22.6477 45.1136 26.0521 48.1744C29.4565 51.2352 32.2876 53.7396 32.3436 53.7396C32.4082 53.7396 32.4247 53.5516 32.3887 53.2248C31.7971 47.8548 30.8129 37.1061 30.9073 37.0452C30.9702 37.0045 34.2793 35.1133 38.2607 32.8424C42.2421 30.5716 45.4856 28.7003 45.4684 28.684C45.4514 28.6678 41.7305 27.8502 37.1999 26.8672C32.6693 25.8841 28.9543 25.0736 28.9444 25.066C28.9346 25.0584 28.1507 21.3683 27.2027 16.8655C26.2546 12.3628 25.4667 8.6407 25.4518 8.59412C25.4369 8.54754 23.5099 11.7623 21.1697 15.7381ZM25.6671 14.2439C26.9856 20.5317 28.1133 25.8081 28.1449 25.8387C28.1723 25.8652 41.5023 28.7857 42.5272 28.9898C42.991 29.0822 43.265 28.9111 36.3579 32.8396C32.9283 34.7901 30.0455 36.4422 29.9516 36.5109C29.7907 36.6286 29.8231 37.0578 30.5216 44.0296C30.9289 48.0963 31.2453 51.4405 31.2245 51.4612C31.2038 51.4819 28.7446 49.3043 25.7598 46.6222C22.7749 43.9401 20.2617 41.6849 20.1749 41.6108C20.0374 41.4935 19.1288 41.8629 13.1285 44.4758C9.33972 46.1257 6.22782 47.4618 6.21321 47.445C6.1986 47.4282 7.57445 44.3397 9.27068 40.5817L12.3548 33.749L7.36312 28.1765C4.05264 24.4808 2.42447 22.5944 2.52881 22.5755C2.61521 22.5599 5.97148 22.9013 9.98715 23.3343C15.7543 23.956 17.3113 24.0959 17.3977 24.0001C17.4579 23.9334 19.174 21.0436 21.2112 17.5781C23.2483 14.1127 24.9443 11.2775 24.98 11.2775C25.0157 11.2775 25.3248 12.6124 25.6671 14.2439Z" fill="url(#paint0_linear_965_2940)"/>
+<defs>
+<linearGradient id="paint0_linear_965_2940" x1="15.5" y1="4.03047" x2="38.0656" y2="53.9527" gradientUnits="userSpaceOnUse">
+<stop stop-color="#9934BD"/>
+<stop offset="1" stop-color="#4479E0"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/website/static/img/homepage/debug-light.svg b/website/static/img/homepage/debug-light.svg
deleted file mode 100644
index 7dd564dcc..000000000
--- a/website/static/img/homepage/debug-light.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-<svg width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path fill-rule="evenodd" clip-rule="evenodd" d="M44.0425 32.6565C44.0566 33.0578 44.0661 33.4638 44.0661 33.8746C44.0661 34.9982 44.0096 36.0983 43.8921 37.1747L50.9082 40.7487C51.6512 41.1264 52.1402 41.8157 52.286 42.5806L55.2768 55.8378C55.4094 56.5044 55.2771 57.1967 54.9081 57.7667C54.5392 58.3367 53.9629 58.7393 53.3023 58.8885C52.6417 59.0376 51.9492 58.9216 51.3727 58.565C50.7962 58.2085 50.3814 57.6398 50.2169 56.9804L47.4801 44.8468L42.834 42.4814C40.4922 50.2856 35.0655 55.7528 28.7453 55.7528C22.3875 55.7528 16.9373 50.2195 14.619 42.3398L9.54031 44.6532L7.21258 56.9001C7.07913 57.5751 6.68528 58.1698 6.11689 58.5545C5.54851 58.9392 4.8517 59.0828 4.17836 58.9538C3.50503 58.8248 2.90978 58.4338 2.5224 57.866C2.13501 57.2983 1.98691 56.5998 2.11037 55.9228L4.68263 42.4011C4.82371 41.5749 5.35979 40.8337 6.17333 40.4654L13.5892 37.085C13.481 36.0275 13.4246 34.9463 13.4246 33.8793V33.8746C13.4246 33.4638 13.434 33.0531 13.4481 32.6423L5.62313 29.9276C5.23363 29.7929 4.88187 29.5667 4.59719 29.2677C4.31251 28.9688 4.10318 28.6058 3.98667 28.2091H3.97726L1.10874 18.6674C0.69962 17.2888 1.48023 15.8347 2.85807 15.4239C4.2312 15.0132 5.67956 15.7969 6.08868 17.1803L8.5716 25.4424L14.84 27.6142H42.6882L48.43 25.6266L50.9129 17.3644C51.1099 16.7018 51.5608 16.1447 52.1664 15.8155C52.7721 15.4862 53.4831 15.4116 54.1435 15.6081C54.8035 15.8059 55.3583 16.2585 55.6863 16.8666C56.0142 17.4747 56.0885 18.1886 55.8928 18.8516L53.0243 28.3932H53.0149C52.8975 28.7889 52.6878 29.1508 52.4032 29.4489C52.1186 29.7469 51.7673 29.9726 51.3784 30.107L44.0425 32.6565V32.6565ZM28.5854 13.0633C29.5588 13.0633 30.5088 13.2475 31.421 13.5874C31.7549 12.8461 32.0559 12.1521 32.3333 11.5195C35.2395 4.88613 35.6157 4.02214 45.6273 1.07136C46.5631 0.797528 47.5459 1.33575 47.8233 2.27528C48.1008 3.21481 47.56 4.20155 46.6242 4.4801C38.1926 6.96348 37.8917 7.65278 35.5733 12.9547C35.2489 13.6913 34.8915 14.508 34.4683 15.4428C37.1064 17.7279 39.1802 21.5049 40.2429 26.0704H16.9279C17.9954 21.5049 20.0645 17.7279 22.7026 15.4428C22.2747 14.508 21.9173 13.6913 21.5975 12.9547C19.2792 7.65278 18.9735 6.96348 10.5466 4.4801C9.61085 4.20627 9.07477 3.21481 9.34751 2.27528C9.48043 1.82373 9.78619 1.44347 10.1978 1.21781C10.6094 0.992157 11.0934 0.939493 11.5436 1.07136C21.5505 4.02214 21.9267 4.88613 24.8328 11.5195C25.1103 12.1521 25.4159 12.8461 25.7498 13.5874C26.6561 13.2434 27.6166 13.0659 28.5854 13.0633V13.0633ZM32.9729 18.2803C34.2755 18.2803 35.3335 19.3426 35.3335 20.6504C35.3335 21.9582 34.2755 23.0204 32.9729 23.0204C31.6703 23.0204 30.6122 21.9582 30.6122 20.6504C30.6122 19.3426 31.6703 18.2803 32.9729 18.2803ZM24.1933 18.2803C25.4959 18.2803 26.554 19.3426 26.554 20.6504C26.554 21.9582 25.4959 23.0204 24.1933 23.0204C22.8907 23.0204 21.8326 21.9582 21.8326 20.6504C21.8326 19.3426 22.8907 18.2803 24.1933 18.2803Z" stroke="black"/>
-<path fill-rule="evenodd" clip-rule="evenodd" d="M44.0425 32.6565C44.0566 33.0578 44.0661 33.4638 44.0661 33.8746C44.0661 34.9982 44.0096 36.0983 43.8921 37.1747L50.9082 40.7487C51.6512 41.1264 52.1402 41.8157 52.286 42.5806L55.2768 55.8378C55.4094 56.5044 55.2771 57.1967 54.9081 57.7667C54.5392 58.3367 53.9629 58.7393 53.3023 58.8885C52.6417 59.0376 51.9492 58.9216 51.3727 58.565C50.7962 58.2085 50.3814 57.6398 50.2169 56.9804L47.4801 44.8468L42.834 42.4814C40.4922 50.2856 35.0655 55.7528 28.7453 55.7528C22.3875 55.7528 16.9373 50.2195 14.619 42.3398L9.54031 44.6532L7.21258 56.9001C7.07913 57.5751 6.68528 58.1698 6.11689 58.5545C5.54851 58.9392 4.8517 59.0828 4.17836 58.9538C3.50503 58.8248 2.90978 58.4338 2.5224 57.866C2.13501 57.2983 1.98691 56.5998 2.11037 55.9228L4.68263 42.4011C4.82371 41.5749 5.35979 40.8337 6.17333 40.4654L13.5892 37.085C13.481 36.0275 13.4246 34.9463 13.4246 33.8793V33.8746C13.4246 33.4638 13.434 33.0531 13.4481 32.6423L5.62313 29.9276C5.23363 29.7929 4.88187 29.5667 4.59719 29.2677C4.31251 28.9688 4.10318 28.6058 3.98667 28.2091H3.97726L1.10874 18.6674C0.69962 17.2888 1.48023 15.8347 2.85807 15.4239C4.2312 15.0132 5.67956 15.7969 6.08868 17.1803L8.5716 25.4424L14.84 27.6142H42.6882L48.43 25.6266L50.9129 17.3644C51.1099 16.7018 51.5608 16.1447 52.1664 15.8155C52.7721 15.4862 53.4831 15.4116 54.1435 15.6081C54.8035 15.8059 55.3583 16.2585 55.6863 16.8666C56.0142 17.4747 56.0885 18.1886 55.8928 18.8516L53.0243 28.3932H53.0149C52.8975 28.7889 52.6878 29.1508 52.4032 29.4489C52.1186 29.7469 51.7673 29.9726 51.3784 30.107L44.0425 32.6565V32.6565ZM28.5854 13.0633C29.5588 13.0633 30.5088 13.2475 31.421 13.5874C31.7549 12.8461 32.0559 12.1521 32.3333 11.5195C35.2395 4.88613 35.6157 4.02214 45.6273 1.07136C46.5631 0.797528 47.5459 1.33575 47.8233 2.27528C48.1008 3.21481 47.56 4.20155 46.6242 4.4801C38.1926 6.96348 37.8917 7.65278 35.5733 12.9547C35.2489 13.6913 34.8915 14.508 34.4683 15.4428C37.1064 17.7279 39.1802 21.5049 40.2429 26.0704H16.9279C17.9954 21.5049 20.0645 17.7279 22.7026 15.4428C22.2747 14.508 21.9173 13.6913 21.5975 12.9547C19.2792 7.65278 18.9735 6.96348 10.5466 4.4801C9.61085 4.20627 9.07477 3.21481 9.34751 2.27528C9.48043 1.82373 9.78619 1.44347 10.1978 1.21781C10.6094 0.992157 11.0934 0.939493 11.5436 1.07136C21.5505 4.02214 21.9267 4.88613 24.8328 11.5195C25.1103 12.1521 25.4159 12.8461 25.7498 13.5874C26.6561 13.2434 27.6166 13.0659 28.5854 13.0633V13.0633ZM32.9729 18.2803C34.2755 18.2803 35.3335 19.3426 35.3335 20.6504C35.3335 21.9582 34.2755 23.0204 32.9729 23.0204C31.6703 23.0204 30.6122 21.9582 30.6122 20.6504C30.6122 19.3426 31.6703 18.2803 32.9729 18.2803ZM24.1933 18.2803C25.4959 18.2803 26.554 19.3426 26.554 20.6504C26.554 21.9582 25.4959 23.0204 24.1933 23.0204C22.8907 23.0204 21.8326 21.9582 21.8326 20.6504C21.8326 19.3426 22.8907 18.2803 24.1933 18.2803Z" stroke="url(#paint0_linear_160_5238)"/>
-<defs>
-<linearGradient id="paint0_linear_160_5238" x1="15.2083" y1="5.35" x2="42.1198" y2="55.9164" gradientUnits="userSpaceOnUse">
-<stop stop-color="#9934BD"/>
-<stop offset="1" stop-color="#4479E0"/>
-</linearGradient>
-</defs>
-</svg>
diff --git a/website/static/img/homepage/debug.svg b/website/static/img/homepage/debug.svg
new file mode 100644
index 000000000..228ea67ee
--- /dev/null
+++ b/website/static/img/homepage/debug.svg
@@ -0,0 +1,10 @@
+<svg width="57" height="60" viewBox="0 0 57 60" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10.4539 0.237546C8.97793 0.984117 8.78911 3.09872 10.1141 4.04224C10.2997 4.1743 11.2751 4.53709 12.282 4.84834C18.6466 6.81649 19.2308 7.31459 21.6661 12.8511L22.5052 14.7588L21.7519 15.5784C19.7234 17.7849 17.9303 21.29 17.0646 24.7403C16.9347 25.2584 16.8013 25.7737 16.7681 25.8853C16.7111 26.0778 17.3458 26.0884 28.9595 26.0884C40.0591 26.0884 41.2109 26.0711 41.2109 25.9047C41.2109 25.585 40.765 23.9589 40.3346 22.7094C39.4236 20.0641 38.0306 17.5917 36.4013 15.7281L35.5223 14.7226L36.516 12.4849C38.8073 7.32492 39.7345 6.58659 46.3173 4.67925C47.6938 4.28038 48.0958 4.03922 48.4819 3.38038C49.3267 1.93877 48.3973 0.132634 46.7455 0.00636849C46.2512 -0.0314649 45.7373 0.0879539 43.8801 0.67205C36.4268 3.01621 35.2713 4.01972 32.3868 10.6533C31.9843 11.5789 31.64 12.3557 31.6217 12.3796C31.6033 12.4035 31.1672 12.3382 30.6526 12.2346C29.4798 11.9982 28.6172 11.9962 27.4009 12.2269C26.8764 12.3264 26.4335 12.3917 26.4168 12.372C26.4002 12.3522 26.0069 11.4744 25.5429 10.4212C22.6785 3.91887 21.4525 2.89447 13.73 0.550426C11.6031 -0.0951786 11.1897 -0.134637 10.4539 0.237546ZM12.9155 1.31754C20.9747 3.72704 21.8775 4.48161 24.8491 11.2916C26.0065 13.9441 25.8196 13.7193 26.6307 13.4343C28.1054 12.916 29.897 12.92 31.4231 13.445C31.7848 13.5695 32.0982 13.654 32.1193 13.6328C32.1405 13.6115 32.5532 12.6845 33.0364 11.5725C35.8743 5.04134 36.741 4.14947 42.0233 2.32546C45.3216 1.18651 46.5109 0.874214 46.9707 1.0259C47.694 1.26462 48.028 2.15045 47.6617 2.85861C47.4442 3.2793 47.2958 3.3458 44.9217 4.08669C40.2091 5.55731 38.5105 6.60725 37.1566 8.8863C36.7786 9.52262 34.3638 14.815 34.3638 15.0071C34.3638 15.0372 34.7212 15.4148 35.158 15.846C37.24 17.9012 39.2197 21.5475 39.9785 24.7248L40.0548 25.0439H29.0275C21.6295 25.0439 18.0003 25.0051 18.0003 24.9259C18.0003 24.8609 18.2137 24.169 18.4745 23.3882C19.4691 20.4104 20.9712 17.7979 22.7232 15.9986L23.6903 15.0053L22.8011 12.9744C20.0035 6.58496 19.3303 6.00098 12.2295 3.80305C10.4985 3.26723 10.2247 3.05845 10.2247 2.27416C10.2247 1.69599 10.3765 1.41467 10.8414 1.13116C11.3227 0.837773 11.306 0.836265 12.9155 1.31754ZM2.98761 15.4779C1.84472 15.843 0.94043 17.1385 0.94043 18.4107C0.94043 19.139 3.89735 29.0113 4.29704 29.6174C4.87301 30.4908 5.20434 30.6534 9.29626 32.0717C11.4345 32.8128 13.2174 33.454 13.2582 33.4966C13.2989 33.539 13.3512 34.4245 13.3743 35.4644L13.4162 37.3549L9.77011 39.0194C5.99211 40.7442 5.54415 41.0036 5.04767 41.7539C4.77367 42.1679 1.98491 56.0544 1.98491 57.0048C1.98491 59.1841 4.45069 60.6705 6.44623 59.6942C7.83167 59.0164 7.79001 59.137 9.19495 51.7362C9.83115 48.3851 10.4144 45.5864 10.4913 45.5167C10.7918 45.2438 14.6423 43.5742 14.7309 43.6782C14.7816 43.7378 14.9952 44.2565 15.2053 44.831C20.9703 60.5886 37.0358 60.7057 43.0745 45.0341C43.3512 44.3161 43.6065 43.7316 43.6418 43.7353C43.6772 43.7392 44.5648 44.1961 45.6146 44.7508L47.523 45.7594L48.8896 51.8273C50.3178 58.1697 50.3948 58.4338 50.9876 59.0403C52.8758 60.9716 56.2091 59.662 56.205 56.9906C56.2042 56.4041 53.425 43.67 53.0406 42.4907C52.7362 41.5571 52.2027 41.1797 48.5485 39.3136C46.6511 38.3446 45.0465 37.4923 44.9826 37.4196C44.9101 37.3371 44.8884 36.5749 44.9246 35.3894L44.9826 33.4912L48.6383 32.2251C52.4673 30.8988 53.0066 30.6372 53.5238 29.8556C54.0852 29.0075 56.9151 19.2717 56.8557 18.393C56.6908 15.9499 53.9936 14.6798 52.0147 16.1134C51.2848 16.642 51.0743 17.1458 49.742 21.5505L48.4642 25.7745L45.853 26.6794L43.2418 27.5843L29.1994 27.5847L15.157 27.5849L12.2707 26.5739L9.38447 25.5628L8.08455 21.242C6.64862 16.4696 6.59443 16.3542 5.49308 15.7319C4.74605 15.3098 3.81043 15.215 2.98761 15.4779ZM4.96226 16.5304C5.70592 16.8832 5.8525 17.2239 7.20394 21.7406C7.90989 24.1 8.52764 26.1025 8.57662 26.1905C8.62559 26.2786 10.1524 26.865 11.9693 27.4935L15.273 28.6362L29.1994 28.6325L43.1258 28.6289L46.1926 27.5618L49.2594 26.4946L50.5826 22.0846C52.022 17.2873 52.1248 17.059 53.0242 16.6612C54.3603 16.0701 55.9497 17.0827 55.9497 18.5251C55.9497 18.9343 53.088 28.7178 52.8283 29.1964C52.4842 29.8308 52.0506 30.0336 48.0632 31.4251C45.8707 32.1901 44.0657 32.8299 44.052 32.8468C44.0382 32.8637 43.999 34.0365 43.9646 35.4532L43.9023 38.0289L47.3699 39.7887C51.4432 41.856 51.787 42.062 52.0313 42.5813C52.3991 43.3636 55.2791 56.499 55.2262 57.1533C55.0999 58.7145 53.3365 59.537 52.005 58.6559C51.3032 58.1915 51.2537 58.0307 49.7501 51.3315L48.3432 45.0631L45.6777 43.7125L43.0122 42.362L42.5383 43.7125C40.4614 49.6329 36.9355 53.7431 32.661 55.2267C25.8696 57.5839 18.8212 52.7338 15.7828 43.6124C15.4925 42.7408 15.2867 42.2908 15.1896 42.3152C14.9369 42.3786 9.70814 44.7808 9.60903 44.8789C9.55762 44.9298 8.97352 47.8212 8.31097 51.3042C7.64854 54.7873 7.02475 57.795 6.92495 57.9881C6.06464 59.6517 3.53515 59.3009 3.03647 57.4489C2.91055 56.9814 5.33409 43.4893 5.71439 42.5402C5.98248 41.8712 6.64259 41.4848 10.6013 39.6802L14.5174 37.8949L14.4344 37.069C14.3888 36.6147 14.3499 35.4729 14.3481 34.5316C14.3461 33.5902 14.3402 32.82 14.3348 32.8198C14.3295 32.8196 12.9194 32.328 11.2014 31.7273C9.48334 31.1266 7.58819 30.465 6.98982 30.257C5.84008 29.8576 5.33676 29.5244 5.05255 28.9748C4.8491 28.5812 1.86851 18.7194 1.86955 18.4427C1.87477 16.9122 3.56486 15.8673 4.96226 16.5304ZM23.6782 17.4481C21.8494 18.0116 21.1947 20.4957 22.475 22.0141C23.5028 23.2332 25.7227 23.2409 26.7423 22.0291C28.6227 19.7944 26.4766 16.586 23.6782 17.4481ZM32.6504 17.3754C30.669 17.8801 29.9118 20.4876 31.3004 22.0246C32.9623 23.8641 36.0216 22.8426 36.199 20.3888C36.342 18.4136 34.5494 16.8915 32.6504 17.3754ZM25.6707 18.606C27.2013 19.5837 26.4528 21.9685 24.6153 21.9685C24.1078 21.9685 23.8531 21.9071 23.6083 21.7257C21.5826 20.2247 23.5486 17.2505 25.6707 18.606ZM33.9047 18.3124C34.6425 18.5173 35.2922 19.3927 35.2922 20.1819C35.2922 21.4264 33.7335 22.4267 32.6594 21.8713C30.6025 20.8076 31.6907 17.6973 33.9047 18.3124Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10.4539 0.237546C8.97793 0.984117 8.78911 3.09872 10.1141 4.04224C10.2997 4.1743 11.2751 4.53709 12.282 4.84834C18.6466 6.81649 19.2308 7.31459 21.6661 12.8511L22.5052 14.7588L21.7519 15.5784C19.7234 17.7849 17.9303 21.29 17.0646 24.7403C16.9347 25.2584 16.8013 25.7737 16.7681 25.8853C16.7111 26.0778 17.3458 26.0884 28.9595 26.0884C40.0591 26.0884 41.2109 26.0711 41.2109 25.9047C41.2109 25.585 40.765 23.9589 40.3346 22.7094C39.4236 20.0641 38.0306 17.5917 36.4013 15.7281L35.5223 14.7226L36.516 12.4849C38.8073 7.32492 39.7345 6.58659 46.3173 4.67925C47.6938 4.28038 48.0958 4.03922 48.4819 3.38038C49.3267 1.93877 48.3973 0.132634 46.7455 0.00636849C46.2512 -0.0314649 45.7373 0.0879539 43.8801 0.67205C36.4268 3.01621 35.2713 4.01972 32.3868 10.6533C31.9843 11.5789 31.64 12.3557 31.6217 12.3796C31.6033 12.4035 31.1672 12.3382 30.6526 12.2346C29.4798 11.9982 28.6172 11.9962 27.4009 12.2269C26.8764 12.3264 26.4335 12.3917 26.4168 12.372C26.4002 12.3522 26.0069 11.4744 25.5429 10.4212C22.6785 3.91887 21.4525 2.89447 13.73 0.550426C11.6031 -0.0951786 11.1897 -0.134637 10.4539 0.237546ZM12.9155 1.31754C20.9747 3.72704 21.8775 4.48161 24.8491 11.2916C26.0065 13.9441 25.8196 13.7193 26.6307 13.4343C28.1054 12.916 29.897 12.92 31.4231 13.445C31.7848 13.5695 32.0982 13.654 32.1193 13.6328C32.1405 13.6115 32.5532 12.6845 33.0364 11.5725C35.8743 5.04134 36.741 4.14947 42.0233 2.32546C45.3216 1.18651 46.5109 0.874214 46.9707 1.0259C47.694 1.26462 48.028 2.15045 47.6617 2.85861C47.4442 3.2793 47.2958 3.3458 44.9217 4.08669C40.2091 5.55731 38.5105 6.60725 37.1566 8.8863C36.7786 9.52262 34.3638 14.815 34.3638 15.0071C34.3638 15.0372 34.7212 15.4148 35.158 15.846C37.24 17.9012 39.2197 21.5475 39.9785 24.7248L40.0548 25.0439H29.0275C21.6295 25.0439 18.0003 25.0051 18.0003 24.9259C18.0003 24.8609 18.2137 24.169 18.4745 23.3882C19.4691 20.4104 20.9712 17.7979 22.7232 15.9986L23.6903 15.0053L22.8011 12.9744C20.0035 6.58496 19.3303 6.00098 12.2295 3.80305C10.4985 3.26723 10.2247 3.05845 10.2247 2.27416C10.2247 1.69599 10.3765 1.41467 10.8414 1.13116C11.3227 0.837773 11.306 0.836265 12.9155 1.31754ZM2.98761 15.4779C1.84472 15.843 0.94043 17.1385 0.94043 18.4107C0.94043 19.139 3.89735 29.0113 4.29704 29.6174C4.87301 30.4908 5.20434 30.6534 9.29626 32.0717C11.4345 32.8128 13.2174 33.454 13.2582 33.4966C13.2989 33.539 13.3512 34.4245 13.3743 35.4644L13.4162 37.3549L9.77011 39.0194C5.99211 40.7442 5.54415 41.0036 5.04767 41.7539C4.77367 42.1679 1.98491 56.0544 1.98491 57.0048C1.98491 59.1841 4.45069 60.6705 6.44623 59.6942C7.83167 59.0164 7.79001 59.137 9.19495 51.7362C9.83115 48.3851 10.4144 45.5864 10.4913 45.5167C10.7918 45.2438 14.6423 43.5742 14.7309 43.6782C14.7816 43.7378 14.9952 44.2565 15.2053 44.831C20.9703 60.5886 37.0358 60.7057 43.0745 45.0341C43.3512 44.3161 43.6065 43.7316 43.6418 43.7353C43.6772 43.7392 44.5648 44.1961 45.6146 44.7508L47.523 45.7594L48.8896 51.8273C50.3178 58.1697 50.3948 58.4338 50.9876 59.0403C52.8758 60.9716 56.2091 59.662 56.205 56.9906C56.2042 56.4041 53.425 43.67 53.0406 42.4907C52.7362 41.5571 52.2027 41.1797 48.5485 39.3136C46.6511 38.3446 45.0465 37.4923 44.9826 37.4196C44.9101 37.3371 44.8884 36.5749 44.9246 35.3894L44.9826 33.4912L48.6383 32.2251C52.4673 30.8988 53.0066 30.6372 53.5238 29.8556C54.0852 29.0075 56.9151 19.2717 56.8557 18.393C56.6908 15.9499 53.9936 14.6798 52.0147 16.1134C51.2848 16.642 51.0743 17.1458 49.742 21.5505L48.4642 25.7745L45.853 26.6794L43.2418 27.5843L29.1994 27.5847L15.157 27.5849L12.2707 26.5739L9.38447 25.5628L8.08455 21.242C6.64862 16.4696 6.59443 16.3542 5.49308 15.7319C4.74605 15.3098 3.81043 15.215 2.98761 15.4779ZM4.96226 16.5304C5.70592 16.8832 5.8525 17.2239 7.20394 21.7406C7.90989 24.1 8.52764 26.1025 8.57662 26.1905C8.62559 26.2786 10.1524 26.865 11.9693 27.4935L15.273 28.6362L29.1994 28.6325L43.1258 28.6289L46.1926 27.5618L49.2594 26.4946L50.5826 22.0846C52.022 17.2873 52.1248 17.059 53.0242 16.6612C54.3603 16.0701 55.9497 17.0827 55.9497 18.5251C55.9497 18.9343 53.088 28.7178 52.8283 29.1964C52.4842 29.8308 52.0506 30.0336 48.0632 31.4251C45.8707 32.1901 44.0657 32.8299 44.052 32.8468C44.0382 32.8637 43.999 34.0365 43.9646 35.4532L43.9023 38.0289L47.3699 39.7887C51.4432 41.856 51.787 42.062 52.0313 42.5813C52.3991 43.3636 55.2791 56.499 55.2262 57.1533C55.0999 58.7145 53.3365 59.537 52.005 58.6559C51.3032 58.1915 51.2537 58.0307 49.7501 51.3315L48.3432 45.0631L45.6777 43.7125L43.0122 42.362L42.5383 43.7125C40.4614 49.6329 36.9355 53.7431 32.661 55.2267C25.8696 57.5839 18.8212 52.7338 15.7828 43.6124C15.4925 42.7408 15.2867 42.2908 15.1896 42.3152C14.9369 42.3786 9.70814 44.7808 9.60903 44.8789C9.55762 44.9298 8.97352 47.8212 8.31097 51.3042C7.64854 54.7873 7.02475 57.795 6.92495 57.9881C6.06464 59.6517 3.53515 59.3009 3.03647 57.4489C2.91055 56.9814 5.33409 43.4893 5.71439 42.5402C5.98248 41.8712 6.64259 41.4848 10.6013 39.6802L14.5174 37.8949L14.4344 37.069C14.3888 36.6147 14.3499 35.4729 14.3481 34.5316C14.3461 33.5902 14.3402 32.82 14.3348 32.8198C14.3295 32.8196 12.9194 32.328 11.2014 31.7273C9.48334 31.1266 7.58819 30.465 6.98982 30.257C5.84008 29.8576 5.33676 29.5244 5.05255 28.9748C4.8491 28.5812 1.86851 18.7194 1.86955 18.4427C1.87477 16.9122 3.56486 15.8673 4.96226 16.5304ZM23.6782 17.4481C21.8494 18.0116 21.1947 20.4957 22.475 22.0141C23.5028 23.2332 25.7227 23.2409 26.7423 22.0291C28.6227 19.7944 26.4766 16.586 23.6782 17.4481ZM32.6504 17.3754C30.669 17.8801 29.9118 20.4876 31.3004 22.0246C32.9623 23.8641 36.0216 22.8426 36.199 20.3888C36.342 18.4136 34.5494 16.8915 32.6504 17.3754ZM25.6707 18.606C27.2013 19.5837 26.4528 21.9685 24.6153 21.9685C24.1078 21.9685 23.8531 21.9071 23.6083 21.7257C21.5826 20.2247 23.5486 17.2505 25.6707 18.606ZM33.9047 18.3124C34.6425 18.5173 35.2922 19.3927 35.2922 20.1819C35.2922 21.4264 33.7335 22.4267 32.6594 21.8713C30.6025 20.8076 31.6907 17.6973 33.9047 18.3124Z" fill="url(#paint0_linear_965_2942)"/>
+<defs>
+<linearGradient id="paint0_linear_965_2942" x1="15.3854" y1="4.5" x2="43.4935" y2="56.4048" gradientUnits="userSpaceOnUse">
+<stop stop-color="#9934BD"/>
+<stop offset="1" stop-color="#4479E0"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/website/static/img/homepage/devices-light.svg b/website/static/img/homepage/devices-light.svg
deleted file mode 100644
index 96a37ffa7..000000000
--- a/website/static/img/homepage/devices-light.svg
+++ /dev/null
@@ -1,22 +0,0 @@
-<svg width="61" height="62" viewBox="0 0 61 62" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path d="M1 4.69231C1 2.6531 2.6531 1 4.69231 1H29.6154C31.6546 1 33.3077 2.6531 33.3077 4.69231V57.3077C33.3077 59.3469 31.6546 61 29.6154 61H4.69231C2.6531 61 1 59.3469 1 57.3077V4.69231Z" stroke="black"/>
-<path d="M1 4.69231C1 2.6531 2.6531 1 4.69231 1H29.6154C31.6546 1 33.3077 2.6531 33.3077 4.69231V57.3077C33.3077 59.3469 31.6546 61 29.6154 61H4.69231C2.6531 61 1 59.3469 1 57.3077V4.69231Z" stroke="url(#paint0_linear_160_5250)"/>
-<path d="M13 56.3846H22.2308V57.3077H13V56.3846Z" stroke="black"/>
-<path d="M13 56.3846H22.2308V57.3077H13V56.3846Z" stroke="url(#paint1_linear_160_5250)"/>
-<path d="M11.1538 1H17.6154H20.8462H24.0769C24.0769 2.0196 23.2504 1.92308 22.2308 1.92308H13C11.9804 1.92308 11.1538 2.0196 11.1538 1Z" stroke="black"/>
-<path d="M11.1538 1H17.6154H20.8462H24.0769C24.0769 2.0196 23.2504 1.92308 22.2308 1.92308H13C11.9804 1.92308 11.1538 2.0196 11.1538 1Z" stroke="url(#paint2_linear_160_5250)"/>
-<defs>
-<linearGradient id="paint0_linear_160_5250" x1="9.34615" y1="5.5" x2="42.8389" y2="41.2351" gradientUnits="userSpaceOnUse">
-<stop stop-color="#9934BD"/>
-<stop offset="1" stop-color="#4479E0"/>
-</linearGradient>
-<linearGradient id="paint1_linear_160_5250" x1="9.34615" y1="5.5" x2="42.8389" y2="41.2351" gradientUnits="userSpaceOnUse">
-<stop stop-color="#9934BD"/>
-<stop offset="1" stop-color="#4479E0"/>
-</linearGradient>
-<linearGradient id="paint2_linear_160_5250" x1="9.34615" y1="5.5" x2="42.8389" y2="41.2351" gradientUnits="userSpaceOnUse">
-<stop stop-color="#9934BD"/>
-<stop offset="1" stop-color="#4479E0"/>
-</linearGradient>
-</defs>
-</svg>
diff --git a/website/static/img/homepage/devices.svg b/website/static/img/homepage/devices.svg
new file mode 100644
index 000000000..cbf0d68e8
--- /dev/null
+++ b/website/static/img/homepage/devices.svg
@@ -0,0 +1,10 @@
+<svg width="61" height="60" viewBox="0 0 61 60" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M3.93909 0.0809616C2.99715 0.304842 2.08128 0.982945 1.50224 1.88536C0.794957 2.98753 0.839863 0.975622 0.870661 30.2314L0.89866 56.7694L1.14472 57.3782C1.62641 58.5693 2.48122 59.3874 3.68247 59.8065C4.20432 59.9886 5.00723 60 17.3209 60H30.4048L31.0278 59.7486C32.3424 59.2179 33.3499 57.934 33.5768 56.5002C33.7323 55.5178 33.7302 4.37303 33.5747 3.4143C33.3539 2.054 32.5175 0.95064 31.2258 0.316042L30.6202 0.0185033L17.4824 0.00159655C10.0575 -0.00798757 4.16835 0.0264721 3.93909 0.0809616ZM11.2268 1.33767L11.5968 1.74149L17.523 1.77197C23.9766 1.80503 24.0693 1.79738 24.3375 1.20866L24.4628 0.93384L27.38 0.934917C31.0394 0.93621 31.6319 1.14964 32.4207 2.75084L32.6662 3.2491V30.0093V56.7694L32.3752 57.3211C32.2151 57.6245 31.8611 58.0692 31.5885 58.3091C30.6483 59.1368 31.6104 59.0847 17.267 59.0847C2.60916 59.0847 3.81643 59.1648 2.77521 58.1235C1.71094 57.0592 1.814 60.0747 1.814 29.9941C1.814 -0.0128331 1.72343 2.89697 2.68874 1.90227C3.5904 0.973146 3.77648 0.936102 7.54691 0.934917L10.8568 0.93384L11.2268 1.33767ZM12.6904 55.4772V56.3925H17.6978H22.7052V55.4772V54.5618H17.6978H12.6904V55.4772Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M3.93909 0.0809616C2.99715 0.304842 2.08128 0.982945 1.50224 1.88536C0.794957 2.98753 0.839863 0.975622 0.870661 30.2314L0.89866 56.7694L1.14472 57.3782C1.62641 58.5693 2.48122 59.3874 3.68247 59.8065C4.20432 59.9886 5.00723 60 17.3209 60H30.4048L31.0278 59.7486C32.3424 59.2179 33.3499 57.934 33.5768 56.5002C33.7323 55.5178 33.7302 4.37303 33.5747 3.4143C33.3539 2.054 32.5175 0.95064 31.2258 0.316042L30.6202 0.0185033L17.4824 0.00159655C10.0575 -0.00798757 4.16835 0.0264721 3.93909 0.0809616ZM11.2268 1.33767L11.5968 1.74149L17.523 1.77197C23.9766 1.80503 24.0693 1.79738 24.3375 1.20866L24.4628 0.93384L27.38 0.934917C31.0394 0.93621 31.6319 1.14964 32.4207 2.75084L32.6662 3.2491V30.0093V56.7694L32.3752 57.3211C32.2151 57.6245 31.8611 58.0692 31.5885 58.3091C30.6483 59.1368 31.6104 59.0847 17.267 59.0847C2.60916 59.0847 3.81643 59.1648 2.77521 58.1235C1.71094 57.0592 1.814 60.0747 1.814 29.9941C1.814 -0.0128331 1.72343 2.89697 2.68874 1.90227C3.5904 0.973146 3.77648 0.936102 7.54691 0.934917L10.8568 0.93384L11.2268 1.33767ZM12.6904 55.4772V56.3925H17.6978H22.7052V55.4772V54.5618H17.6978H12.6904V55.4772Z" fill="url(#paint0_linear_965_2943)"/>
+<defs>
+<linearGradient id="paint0_linear_965_2943" x1="9.33906" y1="4.5" x2="42.7923" y2="40.7766" gradientUnits="userSpaceOnUse">
+<stop stop-color="#9934BD"/>
+<stop offset="1" stop-color="#4479E0"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/website/static/img/homepage/sync-light.svg b/website/static/img/homepage/sync-light.svg
deleted file mode 100644
index 499e268cf..000000000
--- a/website/static/img/homepage/sync-light.svg
+++ /dev/null
@@ -1,15 +0,0 @@
-<svg width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg">
-<g clip-path="url(#clip0_160_5242)">
-<path d="M30.6773 5.02133C30.1564 5.02133 29.6568 4.80949 29.2885 4.43242C28.9201 4.05535 28.7132 3.54393 28.7132 3.01067C28.7132 2.4774 28.9201 1.96598 29.2885 1.58891C29.6568 1.21184 30.1564 1 30.6773 1C36.908 1.00128 42.9644 3.10539 47.9089 6.98653C52.8534 10.8677 56.41 16.3093 58.0281 22.4689C59.6461 28.6284 59.2354 35.1622 56.8594 41.0587C54.4835 46.9551 50.2748 51.8851 44.8852 55.0854C39.4955 58.2858 33.2256 59.5778 27.0461 58.7615C20.8667 57.9452 15.1225 55.0661 10.703 50.57C6.28355 46.0739 3.43532 40.2116 2.59935 33.8909C1.76339 27.5702 2.98634 21.1436 6.07883 15.6063L4.24693 16.3217C3.65339 16.553 2.99437 16.5336 2.41485 16.2675C1.83534 16.0015 1.38279 15.5107 1.15677 14.9031C0.930751 14.2955 0.94977 13.6208 1.20964 13.0276C1.46952 12.4343 1.94896 11.971 2.5425 11.7397L8.77475 9.32299C9.00495 9.22517 9.24869 9.16483 9.49712 9.14416C10.0681 9.04457 10.655 9.16339 11.146 9.47799C11.637 9.79259 11.9979 10.281 12.16 10.8503L14.1146 17.3802C14.273 17.9928 14.1929 18.6444 13.8912 19.1978C13.5895 19.7511 13.0897 20.163 12.4972 20.3466C11.9047 20.5301 11.2658 20.4711 10.7149 20.182C10.1641 19.8928 9.74443 19.396 9.54433 18.7963L9.29882 17.9167C6.70463 22.715 5.72347 28.2533 6.5065 33.6786C7.28952 39.1039 9.79328 44.1152 13.6321 47.9405C17.4709 51.7658 22.4318 54.1929 27.7507 54.848C33.0695 55.503 38.4512 54.3497 43.0668 51.5656C47.6823 48.7816 51.2757 44.5212 53.2933 39.4408C55.311 34.3605 55.641 28.7419 54.2326 23.4506C52.8241 18.1594 49.7553 13.4889 45.4989 10.1588C41.2424 6.82859 36.0345 5.02342 30.6773 5.02133V5.02133ZM20.3799 41.6241C19.3507 41.6241 18.515 40.9136 18.515 40.0388C18.515 39.164 19.3507 38.4535 20.3799 38.4535H22.1694C22.4339 36.19 23.3232 34.0507 24.7331 32.2861C25.435 31.3937 26.2718 30.6219 27.2118 30C26.271 29.3675 25.4343 28.586 24.7331 27.6848C23.3241 25.9216 22.4348 23.7841 22.1694 21.5223H20.3799C19.3507 21.5223 18.515 20.8118 18.515 19.9322C18.515 19.0525 19.3507 18.3468 20.3799 18.3468H40.9227C41.952 18.3468 42.8113 19.0573 42.8113 19.9322C42.8113 20.807 41.9756 21.5223 40.9227 21.5223H39.1286C38.8648 23.7836 37.9772 25.9212 36.5696 27.6848C35.8667 28.5862 35.0284 29.3676 34.0862 30C35.0294 30.6291 35.8679 31.4091 36.5696 32.3103C37.9782 34.0751 38.8659 36.2146 39.1286 38.4776H40.9227C41.952 38.4776 42.8113 39.1881 42.8113 40.063C42.8113 40.9378 41.9756 41.6483 40.9227 41.6483L20.3799 41.6241ZM36.8812 38.323C36.6116 36.6293 35.9096 35.0386 34.8463 33.712C33.6282 32.1653 32.0701 31.1116 30.6537 31.1116C29.2373 31.1116 27.6839 32.1653 26.4658 33.712C25.401 35.0382 24.6974 36.6289 24.4262 38.323H36.8812ZM34.8463 26.2396C35.9088 24.9107 36.6107 23.3187 36.8812 21.6238H24.4215C24.6936 23.3191 25.3971 24.9111 26.4611 26.2396C27.6792 27.7863 29.2326 28.8351 30.649 28.8351C32.0654 28.8351 33.6235 27.7863 34.8416 26.2396H34.8463Z" stroke="black"/>
-<path d="M30.6773 5.02133C30.1564 5.02133 29.6568 4.80949 29.2885 4.43242C28.9201 4.05535 28.7132 3.54393 28.7132 3.01067C28.7132 2.4774 28.9201 1.96598 29.2885 1.58891C29.6568 1.21184 30.1564 1 30.6773 1C36.908 1.00128 42.9644 3.10539 47.9089 6.98653C52.8534 10.8677 56.41 16.3093 58.0281 22.4689C59.6461 28.6284 59.2354 35.1622 56.8594 41.0587C54.4835 46.9551 50.2748 51.8851 44.8852 55.0854C39.4955 58.2858 33.2256 59.5778 27.0461 58.7615C20.8667 57.9452 15.1225 55.0661 10.703 50.57C6.28355 46.0739 3.43532 40.2116 2.59935 33.8909C1.76339 27.5702 2.98634 21.1436 6.07883 15.6063L4.24693 16.3217C3.65339 16.553 2.99437 16.5336 2.41485 16.2675C1.83534 16.0015 1.38279 15.5107 1.15677 14.9031C0.930751 14.2955 0.94977 13.6208 1.20964 13.0276C1.46952 12.4343 1.94896 11.971 2.5425 11.7397L8.77475 9.32299C9.00495 9.22517 9.24869 9.16483 9.49712 9.14416C10.0681 9.04457 10.655 9.16339 11.146 9.47799C11.637 9.79259 11.9979 10.281 12.16 10.8503L14.1146 17.3802C14.273 17.9928 14.1929 18.6444 13.8912 19.1978C13.5895 19.7511 13.0897 20.163 12.4972 20.3466C11.9047 20.5301 11.2658 20.4711 10.7149 20.182C10.1641 19.8928 9.74443 19.396 9.54433 18.7963L9.29882 17.9167C6.70463 22.715 5.72347 28.2533 6.5065 33.6786C7.28952 39.1039 9.79328 44.1152 13.6321 47.9405C17.4709 51.7658 22.4318 54.1929 27.7507 54.848C33.0695 55.503 38.4512 54.3497 43.0668 51.5656C47.6823 48.7816 51.2757 44.5212 53.2933 39.4408C55.311 34.3605 55.641 28.7419 54.2326 23.4506C52.8241 18.1594 49.7553 13.4889 45.4989 10.1588C41.2424 6.82859 36.0345 5.02342 30.6773 5.02133V5.02133ZM20.3799 41.6241C19.3507 41.6241 18.515 40.9136 18.515 40.0388C18.515 39.164 19.3507 38.4535 20.3799 38.4535H22.1694C22.4339 36.19 23.3232 34.0507 24.7331 32.2861C25.435 31.3937 26.2718 30.6219 27.2118 30C26.271 29.3675 25.4343 28.586 24.7331 27.6848C23.3241 25.9216 22.4348 23.7841 22.1694 21.5223H20.3799C19.3507 21.5223 18.515 20.8118 18.515 19.9322C18.515 19.0525 19.3507 18.3468 20.3799 18.3468H40.9227C41.952 18.3468 42.8113 19.0573 42.8113 19.9322C42.8113 20.807 41.9756 21.5223 40.9227 21.5223H39.1286C38.8648 23.7836 37.9772 25.9212 36.5696 27.6848C35.8667 28.5862 35.0284 29.3676 34.0862 30C35.0294 30.6291 35.8679 31.4091 36.5696 32.3103C37.9782 34.0751 38.8659 36.2146 39.1286 38.4776H40.9227C41.952 38.4776 42.8113 39.1881 42.8113 40.063C42.8113 40.9378 41.9756 41.6483 40.9227 41.6483L20.3799 41.6241ZM36.8812 38.323C36.6116 36.6293 35.9096 35.0386 34.8463 33.712C33.6282 32.1653 32.0701 31.1116 30.6537 31.1116C29.2373 31.1116 27.6839 32.1653 26.4658 33.712C25.401 35.0382 24.6974 36.6289 24.4262 38.323H36.8812ZM34.8463 26.2396C35.9088 24.9107 36.6107 23.3187 36.8812 21.6238H24.4215C24.6936 23.3191 25.3971 24.9111 26.4611 26.2396C27.6792 27.7863 29.2326 28.8351 30.649 28.8351C32.0654 28.8351 33.6235 27.7863 34.8416 26.2396H34.8463Z" stroke="url(#paint0_linear_160_5242)"/>
-</g>
-<defs>
-<linearGradient id="paint0_linear_160_5242" x1="15.9833" y1="5.35" x2="42.0833" y2="57.0667" gradientUnits="userSpaceOnUse">
-<stop stop-color="#9934BD"/>
-<stop offset="1" stop-color="#4479E0"/>
-</linearGradient>
-<clipPath id="clip0_160_5242">
-<rect width="60" height="60" fill="white"/>
-</clipPath>
-</defs>
-</svg>
diff --git a/website/static/img/homepage/sync.svg b/website/static/img/homepage/sync.svg
new file mode 100644
index 000000000..6f51539f0
--- /dev/null
+++ b/website/static/img/homepage/sync.svg
@@ -0,0 +1,10 @@
+<svg width="60" height="61" viewBox="0 0 60 61" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M33.0267 4.03209C31.3169 4.37685 30.7262 6.71963 32.0432 7.933C32.5571 8.40649 32.9405 8.54339 34.1151 8.67274C42.2956 9.5737 49.1224 14.1751 52.7602 21.24C60.7071 36.6734 49.754 55.0612 32.4186 55.3887C16.845 55.683 5.39831 41.2256 9.25311 26.1302C9.75013 24.1838 11.0909 20.9261 11.2416 21.2989C11.2763 21.3847 11.6049 22.2339 11.9719 23.1861C12.7258 25.1425 12.8865 25.4275 13.4527 25.8129C15.2071 27.0065 17.633 25.4519 17.1755 23.427C17.0938 23.0652 13.919 14.7847 13.5257 13.9078C13.0503 12.8474 11.763 12.2581 10.6568 12.5945C9.8268 12.8468 1.23791 16.2353 0.984881 16.4102C-0.889207 17.7057 0.0956899 20.7409 2.38887 20.737C2.89204 20.7361 3.08688 20.677 4.87275 19.9844C5.93861 19.571 6.83755 19.2328 6.87039 19.2328C6.90323 19.2328 6.79083 19.5222 6.62056 19.876C0.716096 32.1445 4.5872 47.0323 15.7313 54.9155C25.4375 61.7814 38.5921 61.7506 48.245 54.8394C62.2411 44.8187 64.033 24.7655 52.0354 12.4201C48.1024 8.37312 43.0275 5.60239 37.5343 4.503C35.6715 4.13025 33.6088 3.91467 33.0267 4.03209ZM35.3436 5.09421C52.0678 7.10603 62.9898 24.2268 57.7919 40.2834C53.5328 53.4403 40.1049 61.3316 26.6104 58.6082C13.4274 55.9476 4.0554 43.885 4.84499 30.5939C5.12516 25.8785 6.34023 21.9647 8.8412 17.7222C8.96444 17.5131 9.01974 17.3602 8.96405 17.3825C7.45164 17.9855 2.85819 19.7425 2.65477 19.7958C1.54905 20.0855 0.559317 18.7366 1.10009 17.6769C1.34391 17.1993 1.462 17.1448 6.37611 15.2472C11.8673 13.1266 11.8456 13.1309 12.5115 14.0225C12.835 14.4556 16.256 23.4561 16.256 23.8738C16.2555 25.1749 14.6869 25.7976 13.7732 24.8594C13.5905 24.6718 13.2864 23.9684 12.4547 21.8101C11.86 20.2671 11.3461 19.0216 11.3127 19.0423C11.0469 19.2065 9.53009 22.2948 9.0174 23.7158C4.26264 36.8938 11.6227 51.4131 25.0602 55.3637C35.5829 58.4574 47.0385 54.0641 52.7 44.7637C62.0265 29.4429 52.3852 9.81236 34.535 7.7777C33.1851 7.62379 32.9135 7.53655 32.5906 7.15296C31.9792 6.42671 32.1928 5.41831 33.0394 5.03371C33.3861 4.87614 33.5714 4.88105 35.3436 5.09421ZM20.8585 20.5146C19.2019 21.0351 18.8513 23.0937 20.2665 23.9907C20.782 24.3175 21.0606 24.3776 22.0627 24.3781C22.9081 24.3785 22.94 24.3847 22.9755 24.5539C23.5897 27.4771 24.6212 29.4355 26.5508 31.3417C27.0201 31.8053 27.3916 32.1923 27.3763 32.2016C27.1132 32.3633 26.1583 33.2834 25.7529 33.766C24.4249 35.3471 23.4913 37.2448 23.1087 39.1409L22.9648 39.8546L21.9587 39.8946C20.7975 39.9406 20.4312 40.064 19.9106 40.5844C18.982 41.5126 19.2908 42.9538 20.5621 43.6247L20.9527 43.8309L31.4778 43.8518C40.8815 43.8704 42.0423 43.8595 42.3726 43.7499C44.2085 43.1403 44.3223 40.9152 42.5585 40.1143C42.236 39.9679 41.9997 39.9322 41.1931 39.9081L40.2177 39.879L40.0362 39.0482C39.5343 36.7504 38.4723 34.8303 36.7472 33.1014L35.7656 32.1175L36.3028 31.6652C38.045 30.1986 39.509 27.6721 40.051 25.1972L40.2216 24.4175L41.2341 24.3785C42.1423 24.3435 42.2925 24.3169 42.6934 24.1202C44.2567 23.3528 44.1801 21.3667 42.5585 20.6207L42.1685 20.4413L31.6776 20.4265C23.1647 20.4144 21.1248 20.431 20.8585 20.5146ZM42.1527 21.4432C42.811 21.7181 43.0799 22.3907 42.734 22.8973C42.4038 23.3807 42.1732 23.4429 40.712 23.4429H39.4091L39.3599 23.8133C38.9157 27.1605 37.3367 29.8424 34.6976 31.7322L34.0905 32.1669L34.6953 32.5748C37.23 34.2845 38.8179 36.9939 39.3617 40.5368L39.4066 40.8292H40.6587C42.0264 40.8292 42.235 40.8782 42.6316 41.2919C43.0795 41.7592 42.9197 42.4537 42.2867 42.7899C41.923 42.9831 21.496 43.0187 21.0477 42.8269C20.4091 42.5538 20.1358 41.9151 20.4441 41.4164C20.7571 40.9103 21.0401 40.8292 22.494 40.8292H23.7684L23.865 40.147C24.2966 37.1007 26.0295 34.2337 28.4198 32.6111L29.0983 32.1506L28.4575 31.7173C26.1003 30.1238 24.28 27.1227 23.876 24.1641L23.7775 23.4429L22.4821 23.4417C21.2855 23.4404 21.1635 23.4271 20.8828 23.2663C20.0847 22.8089 20.164 21.8351 21.0307 21.4484C21.3796 21.2927 41.7804 21.2878 42.1527 21.4432ZM25.0477 23.7497C25.0477 24.0351 25.2852 25.0425 25.5191 25.7488C26.5238 28.7827 29.1168 31.3124 31.3675 31.4543C34.0931 31.6263 37.2134 28.3708 37.9943 24.5405C38.0808 24.1163 38.1515 23.7309 38.1515 23.6841C38.1515 23.6231 36.2869 23.5989 31.5996 23.5989C25.1735 23.5989 25.0477 23.6018 25.0477 23.7497ZM37.0595 24.5694C37.0595 25.1032 36.1246 27.0931 35.4544 27.9857C32.937 31.3384 30.2478 31.3344 27.7162 27.974C27.044 27.0817 26.1396 25.1581 26.1396 24.6204C26.1396 24.5586 27.6733 24.5345 31.5996 24.5345C34.6026 24.5345 37.0595 24.5502 37.0595 24.5694ZM30.5076 32.9417C28.5522 33.5937 26.6818 35.5603 25.6977 37.9991C25.4327 38.6558 25.0498 40.1291 25.0484 40.4978L25.0477 40.6733H31.5996C37.405 40.6733 38.1515 40.6598 38.1515 40.555C38.1515 40.2997 37.8129 38.8932 37.6266 38.3749C36.7618 35.9688 34.9066 33.8392 32.9863 33.0487C32.3289 32.778 31.1512 32.7271 30.5076 32.9417ZM32.0337 33.7413C34.0353 34.1085 36.3944 36.8481 37.013 39.5233L37.0625 39.7377H31.6011C27.6737 39.7377 26.1396 39.7135 26.1396 39.6518C26.1396 39.6044 26.2439 39.2546 26.3715 38.8742C27.292 36.1277 29.4224 33.9742 31.5267 33.6629C31.5511 33.6594 31.7792 33.6946 32.0337 33.7413Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M33.0267 4.03209C31.3169 4.37685 30.7262 6.71963 32.0432 7.933C32.5571 8.40649 32.9405 8.54339 34.1151 8.67274C42.2956 9.5737 49.1224 14.1751 52.7602 21.24C60.7071 36.6734 49.754 55.0612 32.4186 55.3887C16.845 55.683 5.39831 41.2256 9.25311 26.1302C9.75013 24.1838 11.0909 20.9261 11.2416 21.2989C11.2763 21.3847 11.6049 22.2339 11.9719 23.1861C12.7258 25.1425 12.8865 25.4275 13.4527 25.8129C15.2071 27.0065 17.633 25.4519 17.1755 23.427C17.0938 23.0652 13.919 14.7847 13.5257 13.9078C13.0503 12.8474 11.763 12.2581 10.6568 12.5945C9.8268 12.8468 1.23791 16.2353 0.984881 16.4102C-0.889207 17.7057 0.0956899 20.7409 2.38887 20.737C2.89204 20.7361 3.08688 20.677 4.87275 19.9844C5.93861 19.571 6.83755 19.2328 6.87039 19.2328C6.90323 19.2328 6.79083 19.5222 6.62056 19.876C0.716096 32.1445 4.5872 47.0323 15.7313 54.9155C25.4375 61.7814 38.5921 61.7506 48.245 54.8394C62.2411 44.8187 64.033 24.7655 52.0354 12.4201C48.1024 8.37312 43.0275 5.60239 37.5343 4.503C35.6715 4.13025 33.6088 3.91467 33.0267 4.03209ZM35.3436 5.09421C52.0678 7.10603 62.9898 24.2268 57.7919 40.2834C53.5328 53.4403 40.1049 61.3316 26.6104 58.6082C13.4274 55.9476 4.0554 43.885 4.84499 30.5939C5.12516 25.8785 6.34023 21.9647 8.8412 17.7222C8.96444 17.5131 9.01974 17.3602 8.96405 17.3825C7.45164 17.9855 2.85819 19.7425 2.65477 19.7958C1.54905 20.0855 0.559317 18.7366 1.10009 17.6769C1.34391 17.1993 1.462 17.1448 6.37611 15.2472C11.8673 13.1266 11.8456 13.1309 12.5115 14.0225C12.835 14.4556 16.256 23.4561 16.256 23.8738C16.2555 25.1749 14.6869 25.7976 13.7732 24.8594C13.5905 24.6718 13.2864 23.9684 12.4547 21.8101C11.86 20.2671 11.3461 19.0216 11.3127 19.0423C11.0469 19.2065 9.53009 22.2948 9.0174 23.7158C4.26264 36.8938 11.6227 51.4131 25.0602 55.3637C35.5829 58.4574 47.0385 54.0641 52.7 44.7637C62.0265 29.4429 52.3852 9.81236 34.535 7.7777C33.1851 7.62379 32.9135 7.53655 32.5906 7.15296C31.9792 6.42671 32.1928 5.41831 33.0394 5.03371C33.3861 4.87614 33.5714 4.88105 35.3436 5.09421ZM20.8585 20.5146C19.2019 21.0351 18.8513 23.0937 20.2665 23.9907C20.782 24.3175 21.0606 24.3776 22.0627 24.3781C22.9081 24.3785 22.94 24.3847 22.9755 24.5539C23.5897 27.4771 24.6212 29.4355 26.5508 31.3417C27.0201 31.8053 27.3916 32.1923 27.3763 32.2016C27.1132 32.3633 26.1583 33.2834 25.7529 33.766C24.4249 35.3471 23.4913 37.2448 23.1087 39.1409L22.9648 39.8546L21.9587 39.8946C20.7975 39.9406 20.4312 40.064 19.9106 40.5844C18.982 41.5126 19.2908 42.9538 20.5621 43.6247L20.9527 43.8309L31.4778 43.8518C40.8815 43.8704 42.0423 43.8595 42.3726 43.7499C44.2085 43.1403 44.3223 40.9152 42.5585 40.1143C42.236 39.9679 41.9997 39.9322 41.1931 39.9081L40.2177 39.879L40.0362 39.0482C39.5343 36.7504 38.4723 34.8303 36.7472 33.1014L35.7656 32.1175L36.3028 31.6652C38.045 30.1986 39.509 27.6721 40.051 25.1972L40.2216 24.4175L41.2341 24.3785C42.1423 24.3435 42.2925 24.3169 42.6934 24.1202C44.2567 23.3528 44.1801 21.3667 42.5585 20.6207L42.1685 20.4413L31.6776 20.4265C23.1647 20.4144 21.1248 20.431 20.8585 20.5146ZM42.1527 21.4432C42.811 21.7181 43.0799 22.3907 42.734 22.8973C42.4038 23.3807 42.1732 23.4429 40.712 23.4429H39.4091L39.3599 23.8133C38.9157 27.1605 37.3367 29.8424 34.6976 31.7322L34.0905 32.1669L34.6953 32.5748C37.23 34.2845 38.8179 36.9939 39.3617 40.5368L39.4066 40.8292H40.6587C42.0264 40.8292 42.235 40.8782 42.6316 41.2919C43.0795 41.7592 42.9197 42.4537 42.2867 42.7899C41.923 42.9831 21.496 43.0187 21.0477 42.8269C20.4091 42.5538 20.1358 41.9151 20.4441 41.4164C20.7571 40.9103 21.0401 40.8292 22.494 40.8292H23.7684L23.865 40.147C24.2966 37.1007 26.0295 34.2337 28.4198 32.6111L29.0983 32.1506L28.4575 31.7173C26.1003 30.1238 24.28 27.1227 23.876 24.1641L23.7775 23.4429L22.4821 23.4417C21.2855 23.4404 21.1635 23.4271 20.8828 23.2663C20.0847 22.8089 20.164 21.8351 21.0307 21.4484C21.3796 21.2927 41.7804 21.2878 42.1527 21.4432ZM25.0477 23.7497C25.0477 24.0351 25.2852 25.0425 25.5191 25.7488C26.5238 28.7827 29.1168 31.3124 31.3675 31.4543C34.0931 31.6263 37.2134 28.3708 37.9943 24.5405C38.0808 24.1163 38.1515 23.7309 38.1515 23.6841C38.1515 23.6231 36.2869 23.5989 31.5996 23.5989C25.1735 23.5989 25.0477 23.6018 25.0477 23.7497ZM37.0595 24.5694C37.0595 25.1032 36.1246 27.0931 35.4544 27.9857C32.937 31.3384 30.2478 31.3344 27.7162 27.974C27.044 27.0817 26.1396 25.1581 26.1396 24.6204C26.1396 24.5586 27.6733 24.5345 31.5996 24.5345C34.6026 24.5345 37.0595 24.5502 37.0595 24.5694ZM30.5076 32.9417C28.5522 33.5937 26.6818 35.5603 25.6977 37.9991C25.4327 38.6558 25.0498 40.1291 25.0484 40.4978L25.0477 40.6733H31.5996C37.405 40.6733 38.1515 40.6598 38.1515 40.555C38.1515 40.2997 37.8129 38.8932 37.6266 38.3749C36.7618 35.9688 34.9066 33.8392 32.9863 33.0487C32.3289 32.778 31.1512 32.7271 30.5076 32.9417ZM32.0337 33.7413C34.0353 34.1085 36.3944 36.8481 37.013 39.5233L37.0625 39.7377H31.6011C27.6737 39.7377 26.1396 39.7135 26.1396 39.6518C26.1396 39.6044 26.2439 39.2546 26.3715 38.8742C27.292 36.1277 29.4224 33.9742 31.5267 33.6629C31.5511 33.6594 31.7792 33.6946 32.0337 33.7413Z" fill="url(#paint0_linear_965_2945)"/>
+<defs>
+<linearGradient id="paint0_linear_965_2945" x1="15.5" y1="8.2033" x2="39.6829" y2="59.5038" gradientUnits="userSpaceOnUse">
+<stop stop-color="#9934BD"/>
+<stop offset="1" stop-color="#4479E0"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/website/versioned_docs/version-20.x/introduction/project-setup.mdx b/website/versioned_docs/version-20.x/introduction/project-setup.mdx
index 3b6730355..240ae7bab 100644
--- a/website/versioned_docs/version-20.x/introduction/project-setup.mdx
+++ b/website/versioned_docs/version-20.x/introduction/project-setup.mdx
@@ -215,7 +215,7 @@ Now let's move on to the next build script and prepare it:
      release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
-+      proguardFile "${project(':detox').projectDir}/proguard-rules-app.pro"
++      proguardFile "${rootProject.projectDir}/../node_modules/detox/android/detox/proguard-rules-app.pro"
 
        signingConfig signingConfigs.release
      }


Test patch:
diff --git a/detox/android/detox/src/full/java/com/wix/detox/TestEngineFacade.kt b/detox/android/detox/src/full/java/com/wix/detox/TestEngineFacade.kt
index 7f6b65da1..b1635c2a0 100644
--- a/detox/android/detox/src/full/java/com/wix/detox/TestEngineFacade.kt
+++ b/detox/android/detox/src/full/java/com/wix/detox/TestEngineFacade.kt
@@ -5,16 +5,16 @@ import android.util.Log
 import androidx.test.espresso.Espresso
 import com.wix.detox.common.DetoxLog.Companion.LOG_TAG
 import com.wix.detox.espresso.UiAutomatorHelper
-import com.wix.detox.espresso.registry.IRStatusInquirer
+import com.wix.detox.espresso.registry.BusyResourcesInquirer
 import com.wix.detox.reactnative.ReactNativeExtension
 
 class TestEngineFacade {
-    fun awaitIdle(): Unit? = Espresso.onIdle() {
+    fun awaitIdle(): Unit? = Espresso.onIdle {
         Log.i(LOG_TAG, "Wait is over: App is now idle!")
         null
     }
     fun syncIdle() = UiAutomatorHelper.espressoSync() // TODO Check whether this can be replaced with #awaitIdle()
-    fun getBusyIdlingResources() = IRStatusInquirer.INSTANCE.getAllBusyResources()
+    fun getAllBusyResources() = BusyResourcesInquirer.INSTANCE.getAllBusyResources()
 
     // TODO Refactor RN related stuff away
     fun reloadReactNative(appContext: Context) = ReactNativeExtension.reloadReactNative(appContext)
diff --git a/detox/android/detox/src/testFull/java/com/wix/detox/adapters/server/QueryStatusActionHandlerSpec.kt b/detox/android/detox/src/testFull/java/com/wix/detox/adapters/server/QueryStatusActionHandlerSpec.kt
index 1299464e4..be74d5f69 100644
--- a/detox/android/detox/src/testFull/java/com/wix/detox/adapters/server/QueryStatusActionHandlerSpec.kt
+++ b/detox/android/detox/src/testFull/java/com/wix/detox/adapters/server/QueryStatusActionHandlerSpec.kt
@@ -1,9 +1,8 @@
 package com.wix.detox.adapters.server
 
-import androidx.test.espresso.IdlingResource
 import com.wix.detox.TestEngineFacade
-import com.wix.detox.reactnative.idlingresources.DescriptiveIdlingResource
-import com.wix.detox.reactnative.idlingresources.IdlingResourceDescription
+import com.wix.detox.inquiry.DetoxBusyResource
+import com.wix.detox.inquiry.DetoxBusyResourceDescription
 import org.mockito.kotlin.eq
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.verify
@@ -31,103 +30,45 @@ object QueryStatusActionHandlerSpec : Spek({
             }
         }
 
-        fun queryStatusHandler() = QueryStatusActionHandler(outboundServerAdapter, testEngineFacade)
+        fun uut() = QueryStatusActionHandler(outboundServerAdapter, testEngineFacade)
 
-        it("should return idle app status") {
-            queryStatusHandler().handle(params, messageId)
-            val expectedData =  mapOf("status" to mapOf("app_status" to "idle"))
-            verify(outboundServerAdapter).sendMessage(eq("currentStatusResult"), eq(expectedData), eq(messageId))
-        }
-
-        fun createMockedDescriptiveResource(description: IdlingResourceDescription):
-                DescriptiveIdlingResource {
-            val resource: DescriptiveIdlingResource = mock()
-            whenever(resource.getDescription()).thenReturn(description)
-            return resource
-        }
-
-        it("should return busy app status with descriptive resource") {
-            val fakeDescription = IdlingResourceDescription.Builder()
-                .name("foo")
-                .addDescription("bar", "baz")
-                .addDescription("qux", "quux")
-                .build()
-
-            val busyResources: List<IdlingResource> = listOf(
-                createMockedDescriptiveResource(fakeDescription)
-            )
-            whenever(testEngineFacade.getBusyIdlingResources()).thenReturn(busyResources)
+        describe("given an idle app") {
+            it("should send an idle status indication") {
+                val expectedData =  mapOf("status" to mapOf("app_status" to "idle"))
 
-            queryStatusHandler().handle(params, messageId)
-
-            val expectedBusyResourceDescription = listOf(
-                mapOf("name" to "foo", "description" to mapOf("bar" to "baz", "qux" to "quux"))
-            )
-            val expectedData =  mapOf("status" to mapOf("app_status" to "busy", "busy_resources" to expectedBusyResourceDescription))
-            verify(outboundServerAdapter).sendMessage(eq("currentStatusResult"), eq(expectedData), eq(messageId))
-        }
-
-        abstract class LooperIdlingResource: IdlingResource {}
-
-        fun createMockedLooperIdlingResource(resourceName: String): LooperIdlingResource {
-            val resource: LooperIdlingResource = mock()
-            whenever(resource.name).thenReturn(resourceName)
-            return resource
+                uut().handle(params, messageId)
+                verify(outboundServerAdapter).sendMessage(eq("currentStatusResult"), eq(expectedData), eq(messageId))
+            }
         }
 
-        it("should return busy app status with looper resources") {
-            val busyResources: List<IdlingResource> = listOf(
-                createMockedLooperIdlingResource("mqt_js"),
-                createMockedLooperIdlingResource("mqt_native"),
-                createMockedLooperIdlingResource("unmapped")
-            )
-            whenever(testEngineFacade.getBusyIdlingResources()).thenReturn(busyResources)
-
-            queryStatusHandler().handle(params, messageId)
+        describe("given a busy app") {
+            fun aBusyResourceDescription(description: Map<String, Any>): DetoxBusyResourceDescription =
+                mock {
+                    on { json() }.thenReturn(description)
+                }
+
+            fun aBusyResource(identifier: String): DetoxBusyResource {
+                val mockedDescription = aBusyResourceDescription(mapOf("mock" to identifier))
+                return mock {
+                    on { getDescription() }.thenReturn(mockedDescription)
+                }
+            }
 
-            val expectedBusyResourceDescription = listOf(
-                mapOf(
-                    "name" to "looper",
-                    "description" to mapOf(
-                        "thread" to "\"mqt_js\" (JS Thread)",
-                        "execution_type" to "JavaScript code"
-                    )
-                ),
-                mapOf(
-                    "name" to "looper",
-                    "description" to mapOf(
-                        "thread" to "\"mqt_native\" (Native Modules Thread)",
-                        "execution_type" to "native module calls"
+            it("should send a descriptive busy-status indication") {
+                val busyResource = aBusyResource("some-resource")
+                val busyResource2 = aBusyResource("yet-another-resource")
+                val expectedData =  mapOf<String, Any>("status" to mapOf(
+                    "app_status" to "busy",
+                    "busy_resources" to listOf(
+                        mapOf("mock" to "some-resource"),
+                        mapOf("mock" to "yet-another-resource"),
                     )
-                ),
-                mapOf(
-                    "name" to "looper",
-                    "description" to mapOf("thread" to "\"unmapped\"")
-                )
-            )
-            val expectedData =  mapOf("status" to mapOf("app_status" to "busy", "busy_resources" to expectedBusyResourceDescription))
-            verify(outboundServerAdapter).sendMessage(eq("currentStatusResult"), eq(expectedData), eq(messageId))
-        }
+                ))
+                whenever(testEngineFacade.getAllBusyResources()).thenReturn(listOf(busyResource, busyResource2))
 
-        fun createMockedIdlingResource(name: String): IdlingResource {
-            val resource: IdlingResource = mock()
-            whenever(resource.name).thenReturn(name)
-            return resource
-        }
-
-        it("should return busy app status with unknown resource") {
-            val busyResources: List<IdlingResource> = listOf(
-                createMockedIdlingResource( "quux")
-            )
-            whenever(testEngineFacade.getBusyIdlingResources()).thenReturn(busyResources)
-
-            queryStatusHandler().handle(params, messageId)
-
-            val expectedBusyResourceDescription = listOf(
-                mapOf("name" to "unknown", "description" to mapOf("identifier" to "quux"))
-            )
-            val expectedData =  mapOf("status" to mapOf("app_status" to "busy", "busy_resources" to expectedBusyResourceDescription))
-            verify(outboundServerAdapter).sendMessage(eq("currentStatusResult"), eq(expectedData), eq(messageId))
+                uut().handle(params, messageId)
+                verify(outboundServerAdapter).sendMessage(eq("currentStatusResult"), eq(expectedData), eq(messageId))
+            }
         }
-    }
+   }
 })
\ No newline at end of file
diff --git a/detox/android/detox/src/testFull/java/com/wix/detox/espresso/registry/IRStatusInquirerTest.kt b/detox/android/detox/src/testFull/java/com/wix/detox/espresso/registry/BusyResourcesInquirerTest.kt
similarity index 62%
rename from detox/android/detox/src/testFull/java/com/wix/detox/espresso/registry/IRStatusInquirerTest.kt
rename to detox/android/detox/src/testFull/java/com/wix/detox/espresso/registry/BusyResourcesInquirerTest.kt
index b2cf4c1b9..33a95cbaa 100644
--- a/detox/android/detox/src/testFull/java/com/wix/detox/espresso/registry/IRStatusInquirerTest.kt
+++ b/detox/android/detox/src/testFull/java/com/wix/detox/espresso/registry/BusyResourcesInquirerTest.kt
@@ -4,6 +4,8 @@ import android.os.Looper
 import androidx.test.espresso.IdlingResource
 import androidx.test.espresso.base.IdlingResourceRegistry
 import com.wix.detox.UTHelpers
+import com.wix.detox.espresso.common.UiControllerImplReflected
+import com.wix.detox.inquiry.DetoxBusyResource
 import org.assertj.core.api.Assertions.assertThat
 import org.junit.Before
 import org.junit.Test
@@ -21,10 +23,11 @@ import java.util.concurrent.Executors
 // Fixes: Hangs in UIThread.postFirstSync inside IRStatusInquirer.getAllBusyResources when upgrading robolectric 4.3.x -> 4.4
 // See http://robolectric.org/blog/2019/06/04/paused-looper/ (coming from https://github.com/robolectric/robolectric/releases/tag/robolectric-4.4)
 @LooperMode(LooperMode.Mode.LEGACY)
-class IRStatusInquirerTest {
+class BusyResourcesInquirerTest {
 
     lateinit var registry: IdlingResourceRegistry
-    lateinit var uut: IRStatusInquirer
+    lateinit var uiController: UiControllerImplReflected
+    lateinit var uut: BusyResourcesInquirer
 
     private fun anIdleResource() = mock<IdlingResource> {
         on { isIdleNow } doReturn true
@@ -38,10 +41,22 @@ class IRStatusInquirerTest {
         whenever(registry.resources).doReturn(resources.asList())
     }
 
+    private fun givenRunningAsyncTasks() {
+        whenever(uiController.isAsyncIdleNow()).doReturn(false)
+    }
+
+    private fun givenRunningCompatAsyncTasks() {
+        whenever(uiController.isCompatIdleNow()).doReturn(false)
+    }
+
     @Before
     fun setup() {
         registry = mock()
-        uut = IRStatusInquirer(registry)
+        uiController = mock() {
+            on { isAsyncIdleNow() } doReturn true
+            on { isCompatIdleNow() } doReturn true
+        }
+        uut = BusyResourcesInquirer(registry, uiController)
     }
 
     @Test
@@ -51,13 +66,33 @@ class IRStatusInquirerTest {
     }
 
     @Test
-    fun `should return busy resources if there are some`() {
+    fun `should return busy resources if there are some IR ones`() {
         val resourceIdle = anIdleResource()
         val resourceBusy = aBusyResource()
         givenIdlingResources(resourceIdle, resourceBusy)
 
         val result = uut.getAllBusyResources()
-        assertThat(result).isEqualTo(arrayListOf(resourceBusy))
+        assertThat(result.size).isEqualTo(1)
+        assertThat(result[0] is DetoxBusyResource.BusyIdlingResource)
+        assertThat((result[0] as DetoxBusyResource.BusyIdlingResource).resource).isEqualTo(resourceBusy)
+    }
+
+    @Test
+    fun `should return the async-task busy resource if some async-tasks are running`() {
+        givenRunningAsyncTasks()
+
+        val result = uut.getAllBusyResources()
+        assertThat(result.size).isEqualTo(1)
+        assertThat(result[0] is DetoxBusyResource.BusyAsyncTasks)
+    }
+
+    @Test
+    fun `should return the async-task busy resource if some legacy async-tasks are running`() {
+        givenRunningCompatAsyncTasks()
+
+        val result = uut.getAllBusyResources()
+        assertThat(result.size).isEqualTo(1)
+        assertThat(result[0] is DetoxBusyResource.BusyAsyncTasks)
     }
 
     @Test
@@ -79,13 +114,17 @@ class IRStatusInquirerTest {
         }
         givenIdlingResources(resource)
 
-        var result: List<IdlingResource>? = null
+        var result: List<DetoxBusyResource>? = null
         executor.execute {
             result = uut.getAllBusyResources()
         }
         Thread.sleep(100L) // Give time for the unit to actually post on the main thread (as it's suppose to...)
         Robolectric.flushForegroundThreadScheduler()
         UTHelpers.yieldToOtherThreads(executor)
-        assertThat(result).isEqualTo(arrayListOf(resource)) // Assert (2)
+
+        assertThat(result).isNotNull
+        assertThat(result!!.size).isEqualTo(1)
+        assertThat(result!![0] is DetoxBusyResource.BusyIdlingResource)
+        assertThat((result!![0] as DetoxBusyResource.BusyIdlingResource).resource).isEqualTo(resource)
     }
 }
diff --git a/detox/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/IdlingResourceDescriptionSpec.kt b/detox/android/detox/src/testFull/java/com/wix/detox/inquiry/DetoxBusyResourceDescriptionSpec.kt
similarity index 78%
rename from detox/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/IdlingResourceDescriptionSpec.kt
rename to detox/android/detox/src/testFull/java/com/wix/detox/inquiry/DetoxBusyResourceDescriptionSpec.kt
index 274faa660..5246fee9f 100644
--- a/detox/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/IdlingResourceDescriptionSpec.kt
+++ b/detox/android/detox/src/testFull/java/com/wix/detox/inquiry/DetoxBusyResourceDescriptionSpec.kt
@@ -1,16 +1,16 @@
-package com.wix.detox.reactnative.idlingresources
+package com.wix.detox.inquiry
 
 import org.assertj.core.api.Assertions
 import org.spekframework.spek2.Spek
 import org.spekframework.spek2.style.specification.describe
 
-class IdlingResourceDescriptionSpec: Spek({
+class DetoxBusyResourceDescriptionSpec: Spek({
     describe("Idling Resource Description Builder") {
-        lateinit var description: IdlingResourceDescription
+        lateinit var description: DetoxBusyResourceDescription
         lateinit var expectedJSON: Map<String, Any>
 
         it("should build with given description") {
-            description = IdlingResourceDescription.Builder()
+            description = DetoxBusyResourceDescription.Builder()
                 .name("foo")
                 .addDescription("bar", "baz")
                 .addDescription("qux", "quux")
@@ -24,14 +24,14 @@ class IdlingResourceDescriptionSpec: Spek({
         }
 
         it("should build without description") {
-            description = IdlingResourceDescription.Builder().name("foo").build()
+            description = DetoxBusyResourceDescription.Builder().name("foo").build()
 
             expectedJSON = mapOf("name" to "foo")
             Assertions.assertThat(description.json()).isEqualTo(expectedJSON)
         }
 
         it("should build without name") {
-            description = IdlingResourceDescription.Builder()
+            description = DetoxBusyResourceDescription.Builder()
                 .addDescription("bar", "baz")
                 .addDescription("qux", "quux")
                 .build()
diff --git a/detox/android/detox/src/testFull/java/com/wix/detox/inquiry/DetoxBusyResourceSpec.kt b/detox/android/detox/src/testFull/java/com/wix/detox/inquiry/DetoxBusyResourceSpec.kt
new file mode 100644
index 000000000..8daba2fc2
--- /dev/null
+++ b/detox/android/detox/src/testFull/java/com/wix/detox/inquiry/DetoxBusyResourceSpec.kt
@@ -0,0 +1,134 @@
+package com.wix.detox.inquiry
+
+import androidx.test.espresso.IdlingResource
+import com.wix.detox.espresso.idlingresources.DescriptiveIdlingResource
+import org.assertj.core.api.Assertions.assertThat
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
+import org.spekframework.spek2.Spek
+import org.spekframework.spek2.style.specification.describe
+
+class DetoxBusyResourceSpec: Spek({
+    describe("Detox busy resource") {
+        data class TestCase<in T: IdlingResource>(
+            val caseTitle: String,
+            val idlingResource: IdlingResource,
+            val expectedDescription: DetoxBusyResourceDescription
+        )
+
+        describe("given a descriptive idling resource") {
+            val mockedDebugName = "mock:debug-name"
+
+            fun aDescriptiveIdlingResource(busyHint: Map<String, Any>?): DescriptiveIdlingResource =
+                mock() {
+                    on { getDebugName() }.doReturn(mockedDebugName)
+                    on { getBusyHint() }.doReturn(busyHint)
+                }
+
+            listOf(
+                TestCase<IdlingResource>(
+                    caseTitle = "should return a description based on debug-name and busy-hint",
+                    idlingResource = aDescriptiveIdlingResource(mapOf("mocked" to "hint", "mocked2" to "hint2")),
+                    expectedDescription = DetoxBusyResourceDescription.Builder()
+                        .name(mockedDebugName)
+                        .addDescription("mocked", "hint")
+                        .addDescription("mocked2", "hint2")
+                        .build()
+                ),
+                TestCase(
+                    caseTitle = "should return a description even without a busy-hint",
+                    idlingResource = aDescriptiveIdlingResource(busyHint = null),
+                    expectedDescription = DetoxBusyResourceDescription.Builder()
+                        .name(mockedDebugName)
+                        .build()
+                ),
+            ).forEach { (caseTitle, idlingResource, expectedDescription)  ->
+                it(caseTitle) {
+                    val uut = DetoxBusyResource.BusyIdlingResource(idlingResource)
+
+                    assertThat(uut.resource).isEqualTo(idlingResource)
+                    assertThat(uut.getDescription()).isEqualTo(expectedDescription)
+                }
+            }
+        }
+
+        describe("given a looper idling resource") {
+
+            abstract class LooperIdlingResource: IdlingResource {}
+
+            fun aLooperIdlingResourceMock(resourceName: String): LooperIdlingResource =
+                mock() {
+                    on { name }.doReturn(resourceName)
+                }
+
+            listOf(
+                TestCase<LooperIdlingResource>(
+                    caseTitle = "should return a tailored description for the js-thread looper",
+                    idlingResource = aLooperIdlingResourceMock("mqt_js"),
+                    expectedDescription = DetoxBusyResourceDescription.Builder()
+                        .name("looper")
+                        .addDescription("thread", "\"mqt_js\" (JS Thread)")
+                        .addDescription("execution_type", "JavaScript code")
+                        .build(),
+                ),
+                TestCase<LooperIdlingResource>(
+                    caseTitle = "should return a tailored description for native-modules thread",
+                    idlingResource = aLooperIdlingResourceMock("mqt_native"),
+                    expectedDescription = DetoxBusyResourceDescription.Builder()
+                        .name("looper")
+                        .addDescription("thread", "\"mqt_native\" (Native Modules Thread)")
+                        .addDescription("execution_type", "native module calls")
+                        .build()
+                ),
+                TestCase<LooperIdlingResource>(
+                    caseTitle = "should return a default description for unspecified looper-threads",
+                    idlingResource = aLooperIdlingResourceMock("unmapped"),
+                    expectedDescription = DetoxBusyResourceDescription.Builder()
+                        .name("looper")
+                        .addDescription("thread", "\"unmapped\"")
+                        .build(),
+                ),
+            ).forEach { (caseTitle, idlingResource, expectedDescription) ->
+                it(caseTitle) {
+                    val uut = DetoxBusyResource.BusyIdlingResource(idlingResource)
+
+                    assertThat(uut.resource).isEqualTo(idlingResource)
+                    assertThat(uut.getDescription()).isEqualTo(expectedDescription)
+                }
+            }
+        }
+
+        describe("given a generic idling resource") {
+            val mockedResourceName = "mock:resource-name"
+
+            listOf(
+                TestCase<IdlingResource>(
+                    caseTitle = "should return a generic description for a generic idling resource",
+                    idlingResource = mock { on { name}.doReturn(mockedResourceName) },
+                    expectedDescription = DetoxBusyResourceDescription.Builder()
+                        .name("unknown")
+                        .addDescription("identifier", mockedResourceName)
+                        .build()
+                )
+            ).forEach { (caseTitle, idlingResource, expectedDescription) ->
+                it (caseTitle) {
+                    val uut = DetoxBusyResource.BusyIdlingResource(idlingResource)
+
+                    assertThat(uut.resource).isEqualTo(idlingResource)
+                    assertThat(uut.getDescription()).isEqualTo(expectedDescription)
+                }
+            }
+        }
+
+        describe("busy async-task(s) description") {
+            it("should return a general description") {
+                val expectedDescription = DetoxBusyResourceDescription.Builder()
+                    .name("bg")
+                    .addDescription("reason", "native async-tasks")
+                    .build()
+
+                assertThat(DetoxBusyResource.BusyAsyncTasks.getDescription()).isEqualTo(expectedDescription)
+            }
+        }
+    }
+})
diff --git a/detox/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/AsyncStorageIdlingResourceSpec.kt b/detox/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/AsyncStorageIdlingResourceSpec.kt
index fae40aa73..59556ff0c 100644
--- a/detox/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/AsyncStorageIdlingResourceSpec.kt
+++ b/detox/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/AsyncStorageIdlingResourceSpec.kt
@@ -61,6 +61,10 @@ class AsyncStorageIdlingResourceSpec: Spek({
             assertThat(uut.name).isEqualTo("com.wix.detox.reactnative.idlingresources.AsyncStorageIdlingResource")
         }
 
+        it("should have a debug-name") {
+            assertThat(uut.getDebugName()).isEqualTo("io")
+        }
+
         describe("idle-checking") {
             it("should be idle") {
                 givenIdleSExecutor()
@@ -71,11 +75,6 @@ class AsyncStorageIdlingResourceSpec: Spek({
                 givenAnActiveTask()
                 givenNoPendingTasks()
                 assertThat(uut.isIdleNow).isFalse()
-
-                val expectedDescription = IdlingResourceDescription.Builder()
-                    .name("io")
-                    .build()
-                assertThat(uut.getDescription()).isEqualTo(expectedDescription)
             }
 
             it("should be busy if executor has pending tasks") {
diff --git a/detox/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/NetworkIdlingResourcesTest.kt b/detox/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/NetworkIdlingResourcesTest.kt
index 64b07dd5b..6f863e2e4 100644
--- a/detox/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/NetworkIdlingResourcesTest.kt
+++ b/detox/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/NetworkIdlingResourcesTest.kt
@@ -24,20 +24,20 @@ class NetworkIdlingResourcesTest {
     // Note: Ideally, we should test that the list of busy resources is protected,
     // rather than testing thread-safety as a whole.
     @Test
-    fun `should return the description in a thread-safe way`() {
+    fun `should return the descriptive data a thread-safe way`() {
         val localExecutor = Executors.newSingleThreadExecutor()
-        var description: IdlingResourceDescription? = null
+        var busyHint: Map<String, Any>? = null
 
         synchronized(uut) {
             localExecutor.submit {
-                description = uut.getDescription()
+                busyHint = uut.getBusyHint()
             }
 
             yieldToOtherThreads(localExecutor)
-            assertThat(description).isNull()
+            assertThat(busyHint).isNull()
         }
         yieldToOtherThreads(localExecutor)
-        assertThat(description).isNotNull()
+        assertThat(busyHint).isNotNull
     }
 
     // Note: Ideally, we should test that the list of busy resources is protected,
diff --git a/detox/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/timers/TimersIdlingResourceSpec.kt b/detox/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/timers/TimersIdlingResourceSpec.kt
index 2b63203a8..dcc14da03 100644
--- a/detox/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/timers/TimersIdlingResourceSpec.kt
+++ b/detox/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/timers/TimersIdlingResourceSpec.kt
@@ -2,7 +2,6 @@ package com.wix.detox.reactnative.idlingresources.timers
 
 import android.view.Choreographer
 import androidx.test.espresso.IdlingResource
-import com.wix.detox.reactnative.idlingresources.IdlingResourceDescription
 import org.assertj.core.api.Assertions
 import org.mockito.kotlin.*
 import org.spekframework.spek2.Spek
@@ -41,6 +40,10 @@ object TimersIdlingResourceSpec : Spek({
             getChoreographerCallback().doFrame(0L)
         }
 
+        it("should return a debug-name") {
+            Assertions.assertThat(uut().getDebugName()).isEqualTo("timers")
+        }
+
         it("should be idle if strategy says so") {
             givenIdleStrategy()
             Assertions.assertThat(uut().isIdleNow).isTrue()
@@ -49,11 +52,6 @@ object TimersIdlingResourceSpec : Spek({
         it("should be busy if strategy says so") {
             givenBusyStrategy()
             Assertions.assertThat(uut().isIdleNow).isFalse()
-
-            val expectedDescription = IdlingResourceDescription.Builder()
-                .name("timers")
-                .build()
-            Assertions.assertThat(uut().getDescription()).isEqualTo(expectedDescription)
         }
 
         it("should transition to idle if found idle by strategy") {
diff --git a/detox/src/client/actions/formatters/SyncStatusFormatter.test.js b/detox/src/client/actions/formatters/SyncStatusFormatter.test.js
index 22d803179..b2090f4e7 100644
--- a/detox/src/client/actions/formatters/SyncStatusFormatter.test.js
+++ b/detox/src/client/actions/formatters/SyncStatusFormatter.test.js
@@ -7,7 +7,9 @@ describe('Sync Status Formatter', () => {
         busy_resource: []
       };
 
-      await expect(() => { format(invalidStatus); }).toThrowErrorMatchingSnapshot();
+      await expect(() => {
+        format(invalidStatus);
+      }).toThrowErrorMatchingSnapshot();
     });
 
     it('should throw error when `app_status` is invalid', async () => {
@@ -15,7 +17,9 @@ describe('Sync Status Formatter', () => {
         app_status: 'foo'
       };
 
-      await expect(() => { format(invalidStatus); }).toThrowErrorMatchingSnapshot();
+      await expect(() => {
+        format(invalidStatus);
+      }).toThrowErrorMatchingSnapshot();
     });
 
     it('should throw error when `app_status` is `busy` but `busy_resources` is missing', async () => {
@@ -23,7 +27,9 @@ describe('Sync Status Formatter', () => {
         app_status: 'busy'
       };
 
-      await expect(() => { format(invalidStatus); }).toThrowErrorMatchingSnapshot();
+      await expect(() => {
+        format(invalidStatus);
+      }).toThrowErrorMatchingSnapshot();
     });
 
     it('should throw error when `app_status` is `busy` but `busy_resources` is empty', async () => {
@@ -32,7 +38,9 @@ describe('Sync Status Formatter', () => {
         busy_resources: []
       };
 
-      await expect(() => { format(invalidStatus); }).toThrowErrorMatchingSnapshot();
+      await expect(() => {
+        format(invalidStatus);
+      }).toThrowErrorMatchingSnapshot();
     });
 
     it('should throw error when resource `name` is missing', async () => {
@@ -47,7 +55,9 @@ describe('Sync Status Formatter', () => {
         ]
       };
 
-      await expect(() => { format(invalidStatus); }).toThrowErrorMatchingSnapshot();
+      await expect(() => {
+        format(invalidStatus);
+      }).toThrowErrorMatchingSnapshot();
     });
 
     it('should throw error when a busy resource is invalid', async () => {
@@ -60,7 +70,9 @@ describe('Sync Status Formatter', () => {
         ]
       };
 
-      await expect(() => { format(invalidStatus); }).toThrowErrorMatchingSnapshot();
+      await expect(() => {
+        format(invalidStatus);
+      }).toThrowErrorMatchingSnapshot();
     });
   });
 
@@ -376,5 +388,21 @@ describe('Sync Status Formatter', () => {
 
       await expect(format(busyStatus)).toMatchSnapshot();
     });
+
+    it('should format "bg" correctly', async () => {
+      let busyStatus = {
+        app_status: 'busy',
+        busy_resources: [
+          {
+            name: 'bg',
+            description: {
+              reason: 'asynctasks'
+            }
+          }
+        ]
+      };
+
+      await expect(format(busyStatus)).toMatchSnapshot();
+    });
   });
 });
diff --git a/detox/src/client/actions/formatters/__snapshots__/SyncStatusFormatter.test.js.snap b/detox/src/client/actions/formatters/__snapshots__/SyncStatusFormatter.test.js.snap
index 3b1e7492a..241ec7b1e 100644
--- a/detox/src/client/actions/formatters/__snapshots__/SyncStatusFormatter.test.js.snap
+++ b/detox/src/client/actions/formatters/__snapshots__/SyncStatusFormatter.test.js.snap
@@ -57,9 +57,10 @@ With reasons:
 • must have required property 'description' in path \\"#/oneOf/1/properties/busy_resources/items/anyOf/6/required\\" with params: {\\"missingProperty\\":\\"description\\"}
 • must have required property 'description' in path \\"#/oneOf/1/properties/busy_resources/items/anyOf/7/required\\" with params: {\\"missingProperty\\":\\"description\\"}
 • must have required property 'description' in path \\"#/oneOf/1/properties/busy_resources/items/anyOf/8/required\\" with params: {\\"missingProperty\\":\\"description\\"}
-• must be equal to constant in path \\"#/oneOf/1/properties/busy_resources/items/anyOf/9/properties/name/const\\" with params: {\\"allowedValue\\":\\"io\\"}
-• must be equal to constant in path \\"#/oneOf/1/properties/busy_resources/items/anyOf/10/properties/name/const\\" with params: {\\"allowedValue\\":\\"bridge\\"}
-• must have required property 'description' in path \\"#/oneOf/1/properties/busy_resources/items/anyOf/11/required\\" with params: {\\"missingProperty\\":\\"description\\"}
+• must have required property 'description' in path \\"#/oneOf/1/properties/busy_resources/items/anyOf/9/required\\" with params: {\\"missingProperty\\":\\"description\\"}
+• must be equal to constant in path \\"#/oneOf/1/properties/busy_resources/items/anyOf/10/properties/name/const\\" with params: {\\"allowedValue\\":\\"io\\"}
+• must be equal to constant in path \\"#/oneOf/1/properties/busy_resources/items/anyOf/11/properties/name/const\\" with params: {\\"allowedValue\\":\\"bridge\\"}
+• must have required property 'description' in path \\"#/oneOf/1/properties/busy_resources/items/anyOf/12/required\\" with params: {\\"missingProperty\\":\\"description\\"}
 • must match a schema in anyOf in path \\"#/oneOf/1/properties/busy_resources/items/anyOf\\" with params: {}
 • must match exactly one schema in oneOf in path \\"#/oneOf\\" with params: {\\"passingSchemas\\":null}
 
@@ -83,6 +84,7 @@ With reasons:
 • must have required property 'name' in path \\"#/oneOf/1/properties/busy_resources/items/anyOf/9/required\\" with params: {\\"missingProperty\\":\\"name\\"}
 • must have required property 'name' in path \\"#/oneOf/1/properties/busy_resources/items/anyOf/10/required\\" with params: {\\"missingProperty\\":\\"name\\"}
 • must have required property 'name' in path \\"#/oneOf/1/properties/busy_resources/items/anyOf/11/required\\" with params: {\\"missingProperty\\":\\"name\\"}
+• must have required property 'name' in path \\"#/oneOf/1/properties/busy_resources/items/anyOf/12/required\\" with params: {\\"missingProperty\\":\\"name\\"}
 • must match a schema in anyOf in path \\"#/oneOf/1/properties/busy_resources/items/anyOf\\" with params: {}
 • must match exactly one schema in oneOf in path \\"#/oneOf\\" with params: {\\"passingSchemas\\":null}
 
@@ -90,6 +92,11 @@ Please report this issue on our GitHub tracker:
 https://github.com/wix/Detox/issues"
 `;
 
+exports[`Sync Status Formatter busy status should format "bg" correctly 1`] = `
+"The app is busy with the following tasks:
+• Background work taking place in asynctasks."
+`;
+
 exports[`Sync Status Formatter busy status should format "bridge" correctly 1`] = `
 "The app is busy with the following tasks:
 • Activity on the React-Native bridge."
diff --git a/detox/src/logger/utils/DetoxLogFinalizer.test.js b/detox/src/logger/utils/DetoxLogFinalizer.test.js
index 53012497b..019132701 100644
--- a/detox/src/logger/utils/DetoxLogFinalizer.test.js
+++ b/detox/src/logger/utils/DetoxLogFinalizer.test.js
@@ -85,14 +85,6 @@ describe('DetoxLogFinalizer', () => {
       let plainLog = await fs.readFile(path.join(artifactsDir(), 'detox.log'), 'utf8');
       let traceLog = JSON.parse(await fs.readFile(path.join(artifactsDir(), 'detox.trace.json'), 'utf8'));
 
-      plainLog = plainLog
-        .replace(new RegExp(`detox\\[${process.pid}]`, 'g'), 'detox[1234]')
-        .replace(new RegExp(`detox\\[${process.pid + 1}]`, 'g'), 'detox[1235]');
-
-      for (const t of traceLog) {
-        t.pid = 1234 + t.pid - process.pid;
-      }
-
       expect(plainLog).toMatchSnapshot('plain');
       expect(traceLog).toMatchSnapshot('chrome-trace');
     });
@@ -172,21 +164,10 @@ describe('DetoxLogFinalizer', () => {
       expect(fs.existsSync(temporaryFiles[2])).toBe(false);
     });
 
-    it('should not create logs for successful run when configured', async () => {
+    it('should create logs even for successful run when configured to keep failing logs', async () => {
       session.detoxConfig.artifacts.plugins.log.keepOnlyFailedTestsArtifacts = true;
       session.testResults = [{ success: true }];
 
-      await createLogFiles();
-      finalizer.finalizeSync();
-      expect(fs.existsSync(artifactsDir())).toBe(false);
-      expect(fs.existsSync(temporaryFiles[1])).toBe(false);
-      expect(fs.existsSync(temporaryFiles[2])).toBe(false);
-    });
-
-    it('should create logs for failing run when configured', async () => {
-      session.detoxConfig.artifacts.plugins.log.keepOnlyFailedTestsArtifacts = true;
-      session.testResults = [{ success: false }];
-
       await createLogFiles();
       finalizer.finalizeSync();
 
@@ -195,6 +176,10 @@ describe('DetoxLogFinalizer', () => {
         '.jsonl',
         '.jsonl',
       ]);
+
+      // assert that the temporary files have been moved, not copied
+      expect(fs.existsSync(temporaryFiles[1])).toBe(false);
+      expect(fs.existsSync(temporaryFiles[2])).toBe(false);
     });
   });
 
@@ -247,8 +232,8 @@ describe('DetoxLogFinalizer', () => {
       userConfig,
     });
 
-    const log1 = root1.child({ pid: process.pid });
-    const log2 = root2.child({ pid: process.pid + 1 });
+    const log1 = root1.child({ pid: 1234 });
+    const log2 = root2.child({ pid: 1235 });
 
     jest.useFakeTimers();
 
diff --git a/detox/test/e2e/35.overlay.test.js b/detox/test/e2e/35.overlay.test.js
index 3274762fc..25e52f0b6 100644
--- a/detox/test/e2e/35.overlay.test.js
+++ b/detox/test/e2e/35.overlay.test.js
@@ -3,7 +3,8 @@ const custom = require('./utils/custom-it');
 
 describe(':ios: Overlay', () => {
   let showAlertButton;
-  let showOverlayButton;
+  let showOverlayWindowButton;
+  let showOverlayViewButton;
   let verticalScrollView;
 
   beforeEach(async () => {
@@ -12,8 +13,11 @@ describe(':ios: Overlay', () => {
 
     await element(by.text('Overlay')).tap();
 
-    showOverlayButton = await element(by.id('ShowOverlayButton'));
-    await expect(showOverlayButton).toBeVisible();
+    showOverlayWindowButton = await element(by.id('ShowOverlayWindowButton'));
+    await expect(showOverlayWindowButton).toBeVisible();
+
+    showOverlayViewButton = await element(by.id('ShowOverlayViewButton'));
+    await expect(showOverlayViewButton).toBeVisible();
 
     showAlertButton = await element(by.id('ShowDismissibleAlertButton'));
     await expect(showAlertButton).toBeVisible();
@@ -24,7 +28,7 @@ describe(':ios: Overlay', () => {
   describe('default behaviour', () => {
     it('should be able to scroll elements', async () => {
       await verticalScrollView.scrollTo('bottom');
-      await expect(showOverlayButton).not.toBeVisible();
+      await expect(showOverlayWindowButton).not.toBeVisible();
     });
   });
 
@@ -38,7 +42,7 @@ describe(':ios: Overlay', () => {
 
     describe('when shown', () => {
       it('should not be able to tap on elements', async () => {
-        await expectToThrow(() => showOverlayButton.tap());
+        await expectToThrow(() => showOverlayWindowButton.tap());
       });
 
       it('should not be able to scroll elements', async () => {
@@ -52,12 +56,12 @@ describe(':ios: Overlay', () => {
       });
 
       custom.it.withFailureIf.iOSWithRNLessThan67('should be able to tap on elements', async () => {
-        await showOverlayButton.tap();
+        await showOverlayWindowButton.tap();
       });
 
       custom.it.withFailureIf.iOSWithRNLessThan67('should be able to scroll elements', async () => {
         await verticalScrollView.scrollTo('bottom');
-        await expect(showOverlayButton).not.toBeVisible();
+        await expect(showOverlayWindowButton).not.toBeVisible();
       });
     });
   });
@@ -65,11 +69,11 @@ describe(':ios: Overlay', () => {
   describe('overlay window', () => {
     describe('when shown', () => {
       beforeEach(async () => {
-        await showOverlayButton.tap();
+        await showOverlayWindowButton.tap();
       });
 
       it('should not be able to tap on elements', async () => {
-        await expectToThrow(() => showOverlayButton.tap());
+        await expectToThrow(() => showOverlayWindowButton.tap());
       });
 
       it('should not be able to scroll elements', async () => {
@@ -77,4 +81,25 @@ describe(':ios: Overlay', () => {
       });
     });
   });
+
+  describe('overlay view', () => {
+    describe('when shown', () => {
+      beforeEach(async () => {
+        await showOverlayViewButton.tap();
+      });
+
+      it('should be hittable', async () => {
+        const overlayView = await element(by.id('OverlayView'));
+        await overlayView.tap();
+      });
+
+      it('should not be able to tap on elements', async () => {
+        await expectToThrow(() => showOverlayViewButton.tap());
+      });
+
+      it('should not be able to scroll elements', async () => {
+        await expectToThrow(() => showOverlayViewButton.scrollTo('bottom'));
+      });
+    });
+  });
 });
diff --git a/detox/test/ios/example/NativeModule.m b/detox/test/ios/example/NativeModule.m
index 4c9dfdac6..08f07b45f 100644
--- a/detox/test/ios/example/NativeModule.m
+++ b/detox/test/ios/example/NativeModule.m
@@ -42,7 +42,7 @@ RCT_EXPORT_METHOD(switchToNativeRoot)
     [label sizeToFit];
     [[newRoot view] addSubview:label];
     label.center = newRoot.view.center;
-    
+
     id<UIApplicationDelegate> delegate = [[UIApplication sharedApplication] delegate];
     [[delegate window]setRootViewController:newRoot];
     [[delegate window] makeKeyAndVisible];
@@ -54,27 +54,27 @@ RCT_EXPORT_METHOD(switchToMultipleReactRoots)
   dispatch_async(dispatch_get_main_queue(), ^{
     id<UIApplicationDelegate> delegate = [[UIApplication sharedApplication] delegate];
     RCTBridge* bridge = ((RCTRootView*)delegate.window.rootViewController.view).bridge;
-    
+
     UIViewController* newRoot = [UIViewController new];
     newRoot.view = [[RCTRootView alloc]initWithBridge:bridge moduleName:@"example" initialProperties:nil];
     newRoot.tabBarItem.title = @"1";
-    
-    
+
+
     UIViewController* newRoot2 = [UIViewController new];
     newRoot2.view = [[RCTRootView alloc]initWithBridge:bridge moduleName:@"example" initialProperties:nil];
     newRoot2.tabBarItem.title = @"2";
-    
+
     UIViewController* newRoot3 = [UIViewController new];
     newRoot3.view = [[RCTRootView alloc]initWithBridge:bridge moduleName:@"example" initialProperties:nil];
     newRoot3.tabBarItem.title = @"3";
-    
+
     UIViewController* newRoot4 = [UIViewController new];
     newRoot4.view = [[RCTRootView alloc]initWithBridge:bridge moduleName:@"example" initialProperties:nil];
     newRoot4.tabBarItem.title = @"4";
-    
+
     UITabBarController* tbc = [UITabBarController new];
     tbc.viewControllers = @[newRoot, newRoot2, newRoot3, newRoot4];
-    
+
     [[delegate window]setRootViewController:tbc];
     [[delegate window] makeKeyAndVisible];
   });
@@ -93,6 +93,7 @@ RCT_EXPORT_METHOD(presentOverlayWindow) {
     dispatch_async(dispatch_get_main_queue(), ^{
         CGRect screenBounds = UIScreen.mainScreen.bounds;
         overlayWindow = [[UIWindow alloc] initWithFrame:screenBounds];
+        overlayWindow.accessibilityIdentifier = @"OverlayWindow";
 
         [overlayWindow setWindowLevel:UIWindowLevelStatusBar];
         [overlayWindow setHidden:NO];
@@ -101,4 +102,18 @@ RCT_EXPORT_METHOD(presentOverlayWindow) {
     });
 }
 
+RCT_EXPORT_METHOD(presentOverlayView) {
+    static UIView *overlayView;
+
+    dispatch_async(dispatch_get_main_queue(), ^{
+        CGRect screenBounds = UIScreen.mainScreen.bounds;
+        overlayView = [[UIView alloc] initWithFrame:screenBounds];
+        overlayView.userInteractionEnabled = YES;
+        overlayView.accessibilityIdentifier = @"OverlayView";
+
+        UIWindow *keyWindow = UIApplication.sharedApplication.keyWindow;
+        [keyWindow addSubview:overlayView];
+    });
+}
+
 @end
diff --git a/detox/test/src/Screens/OverlayScreen.js b/detox/test/src/Screens/OverlayScreen.js
index 6f0227c27..beb94ed94 100644
--- a/detox/test/src/Screens/OverlayScreen.js
+++ b/detox/test/src/Screens/OverlayScreen.js
@@ -24,8 +24,12 @@ export default class OverlayScreen extends Component {
           </Text>
         </TouchableOpacity>
 
-        <TouchableOpacity onPress={() => NativeModule.presentOverlayWindow()} style={styles.button} testID='ShowOverlayButton'>
-          <Text style={styles.text}>Show Overlay</Text>
+        <TouchableOpacity onPress={() => NativeModule.presentOverlayWindow()} style={styles.button} testID='ShowOverlayWindowButton'>
+          <Text style={styles.text}>Show Overlay Window</Text>
+        </TouchableOpacity>
+
+        <TouchableOpacity onPress={() => NativeModule.presentOverlayView()} style={styles.button} testID='ShowOverlayViewButton'>
+          <Text style={styles.text}>Show Overlay View</Text>
         </TouchableOpacity>
 
         <View style={styles.item}><Text style={styles.itemText}>Text1</Text></View>
diff --git a/docs/troubleshooting/running-tests.md b/docs/troubleshooting/running-tests.md
index d9f402c2c..32494b301 100644
--- a/docs/troubleshooting/running-tests.md
+++ b/docs/troubleshooting/running-tests.md
@@ -32,12 +32,12 @@ This can be a result of various reasons. It is generally up to you to debug and
 
 - You might have forgotten to run `device.launchApp()` in the beginning of your test.
 - The app might have crashed before Detox has had a chance to connect to it. To get the crash details, you can run Detox tests with `--record-logs all` CLI option and then inspect the device logs in the artifacts' folder.
-- **On Android**, there might be a problem with the native test code in the `DetoxTest.java` file. Revisit the [associated section](../introduction/project-setup.mdx#step-4-android-configuration) in the setup guide.
+- **On Android**, there might be a problem with the native test code in the `DetoxTest.java` file. Revisit the [associated section](../introduction/project-setup.mdx#step-4-additional-android-configuration) in the setup guide.
 
 ### If you _do_ see your app running on the device
 
 - **On Android with SDK≥28**, the app’s connection to the Detox test server is blocked due to clear-traffic blockage (as reported in issue [#1450](https://github.com/wix/Detox/issues/1450)).
-  The main step for getting this fixed is to revisit the [associated section](../introduction/project-setup.mdx#step-4-android-configuration) in the setup guide, which discusses network-security. Alternatively, the `android:usesCleartextTraffic="true"` attribute can be configured in the `<application>` tag of the app’s `AndroidManifest.xml`, but **that is highly discouraged**.
+  The main step for getting this fixed is to revisit the [associated section](../introduction/project-setup.mdx#step-4-additional-android-configuration) in the setup guide, which discusses network-security. Alternatively, the `android:usesCleartextTraffic="true"` attribute can be configured in the `<application>` tag of the app’s `AndroidManifest.xml`, but **that is highly discouraged**.
 - If you’ve applied the above suggestion but the app fails to connect to the Detox test server, nonetheless: Refer to the device’s logs, which should contain messages about failed connection attempts (get them using the `--record-logs all` argument)
 - The app could be running without Detox native code injected. In this case, first, make sure you’re not trying to run in manual launch mode (where this behavior is valid). If so, examine the logs from the device (get them using the `--record-logs all` argument). If you see a crash related to Detox’s native code, you are welcome to report it on our GitHub tracker.
 - If you are in fact debugging your native code integration with Detox, our [Debugging tutorial](../introduction/debugging.mdx) may prove helpful.
diff --git a/website/static/img/homepage/test-runner-light.svg b/website/static/img/homepage/test-runner-light.svg
deleted file mode 100644
index ee9113221..000000000
--- a/website/static/img/homepage/test-runner-light.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-<svg width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg">
-<g clip-path="url(#clip0_160_5253)">
-<g clip-path="url(#clip1_160_5253)">
-<path d="M36 44.272L37.9764 46.2483L42.5104 41.7143M8.57143 11.6484L10.1327 13.1429L13.7143 9.71429M8.57143 19.7143L12.8571 24M12.8569 19.7145L8.57119 24.0002M38.8603 32.0654C41.0469 32.0719 43.1913 32.6697 45.068 33.7958C46.9446 34.9219 48.484 36.5348 49.5244 38.4647C50.5647 40.3946 51.0674 42.5701 50.9796 44.7625C50.8918 46.9548 50.2168 49.0829 49.0255 50.9229L54.2857 56.6748L50.6556 60L45.5852 54.4043C44.0053 55.4696 42.1983 56.148 40.3095 56.385C38.4207 56.622 36.5029 56.4109 34.7102 55.7688C32.9175 55.1266 31.3 54.0713 29.9878 52.6876C28.6755 51.304 27.7052 49.6307 27.1547 47.8022C26.6043 45.9738 26.4892 44.0412 26.8185 42.16C27.1479 40.2788 27.9126 38.5014 29.0512 36.9707C30.1898 35.44 31.6704 34.1988 33.3741 33.3468C35.0777 32.4949 36.9569 32.056 38.8603 32.0654ZM18.1066 32.1924C17.7563 32.1747 17.4272 32.0192 17.1903 31.7596C16.9535 31.5 16.8282 31.1573 16.8414 30.8057C16.8329 30.6311 16.859 30.4565 16.9181 30.2921C16.9772 30.1276 17.0683 29.9766 17.1859 29.8476C17.3035 29.7187 17.4455 29.6144 17.6035 29.5408C17.7615 29.4673 17.9325 29.4258 18.1066 29.4189H25.6003C25.9497 29.4391 26.2774 29.5954 26.5137 29.8544C26.75 30.1134 26.8762 30.4547 26.8655 30.8057C26.874 30.9803 26.8479 31.1548 26.7888 31.3193C26.7297 31.4837 26.6387 31.6348 26.521 31.7637C26.4034 31.8926 26.2614 31.9969 26.1034 32.0705C25.9454 32.1441 25.7744 32.1855 25.6003 32.1924H18.1066ZM10.9194 27.9395C11.4651 27.9395 11.9986 28.1018 12.4523 28.406C12.906 28.7103 13.2596 29.1426 13.4685 29.6485C13.6773 30.1544 13.7319 30.7111 13.6255 31.2481C13.519 31.7852 13.2562 32.2785 12.8704 32.6657C12.4845 33.0529 11.9929 33.3165 11.4577 33.4234C10.9225 33.5302 10.3677 33.4754 9.86358 33.2658C9.35943 33.0563 8.92853 32.7014 8.62536 32.2461C8.32219 31.7908 8.16038 31.2556 8.16038 30.708C8.16038 29.9737 8.45106 29.2695 8.96848 28.7503C9.48591 28.2311 10.1877 27.9395 10.9194 27.9395ZM40.5634 8.43262H45.0986C45.9561 8.43646 46.7774 8.77964 47.3842 9.38761C47.991 9.99559 48.3343 10.8193 48.3394 11.6797V26.7676C48.2421 27.7881 45.7555 27.7979 45.5414 26.7676V11.6797C45.5424 11.6191 45.5312 11.559 45.5087 11.5028C45.4861 11.4466 45.4526 11.3955 45.41 11.3525C45.3675 11.3094 45.3167 11.2754 45.2606 11.2528C45.2045 11.2301 45.1444 11.2192 45.084 11.2207H40.544V26.7676C40.3055 27.6904 38.2326 27.832 37.7655 26.7676V3.25195C37.7626 3.13198 37.7158 3.01726 37.6341 2.92969C37.5912 2.887 37.5403 2.85335 37.4843 2.83071C37.4283 2.80807 37.3684 2.7969 37.308 2.79785H3.24566C3.1853 2.7969 3.12536 2.80807 3.06937 2.83071C3.01338 2.85335 2.96247 2.887 2.91963 2.92969C2.83561 3.01974 2.78867 3.13836 2.78825 3.26172V41.8897C2.78867 42.013 2.83561 42.1316 2.91963 42.2217C2.96247 42.2644 3.01338 42.298 3.06937 42.3207C3.12536 42.3433 3.1853 42.3545 3.24566 42.3535H21.7707C23.1722 42.4951 23.2305 44.9268 21.7707 45.1416H10.5399V50.3223C10.5385 50.3829 10.5495 50.4432 10.572 50.4995C10.5945 50.5558 10.6281 50.6069 10.6709 50.6498C10.7136 50.6927 10.7646 50.7264 10.8207 50.749C10.8768 50.7716 10.9369 50.7826 10.9973 50.7812H21.7707C22.7877 50.8984 23.1138 53.2227 21.7707 53.5693H11.0167C10.5897 53.5688 10.1672 53.4821 9.77429 53.3144C9.38137 53.1466 9.02613 52.9012 8.7297 52.5928C8.42432 52.2938 8.18106 51.9371 8.01401 51.5431C7.84696 51.1492 7.75943 50.7259 7.75649 50.2979V45.1416H3.24079C2.38246 45.1377 1.56039 44.7939 0.953449 44.1849C0.346513 43.5758 0.00384045 42.7509 0 41.8897V3.25195C0.0030846 2.82677 0.0907584 2.40648 0.257878 2.01575C0.424998 1.62502 0.668198 1.27172 0.973211 0.976562C1.27081 0.669693 1.62628 0.425312 2.01893 0.257653C2.41158 0.0899939 2.83355 0.00240909 3.26026 0H37.3226C37.7496 0.000765146 38.1721 0.0876035 38.5649 0.25536C38.9578 0.423116 39.3131 0.66837 39.6097 0.976562C39.9146 1.27584 40.1576 1.63267 40.3246 2.02652C40.4917 2.42037 40.5794 2.84347 40.5829 3.27148V8.43262H40.5634ZM18.092 12.9102C17.7422 12.8912 17.4137 12.7353 17.1772 12.4761C16.9406 12.2168 16.8148 11.8748 16.8268 11.5234C16.8183 11.3488 16.8444 11.1743 16.9035 11.0098C16.9627 10.8454 17.0537 10.6943 17.1713 10.5654C17.2889 10.4365 17.4309 10.3322 17.5889 10.2586C17.7469 10.185 17.9179 10.1436 18.092 10.1367H31.0746C31.4249 10.1544 31.7541 10.3099 31.9909 10.5695C32.2277 10.8291 32.353 11.1718 32.3398 11.5234C32.3483 11.698 32.3222 11.8726 32.2631 12.037C32.204 12.2015 32.113 12.3525 31.9953 12.4815C31.8777 12.6104 31.7358 12.7147 31.5777 12.7883C31.4197 12.8618 31.2487 12.9033 31.0746 12.9102H18.092ZM18.092 22.5488C17.7426 22.5311 17.4142 22.3763 17.1775 22.1178C16.9408 21.8593 16.8149 21.5178 16.8268 21.167C16.8183 20.9924 16.8444 20.8178 16.9035 20.6534C16.9627 20.489 17.0537 20.3379 17.1713 20.209C17.2889 20.08 17.4309 19.9758 17.5889 19.9022C17.7469 19.8286 17.9179 19.7872 18.092 19.7803H31.0746C31.4249 19.798 31.7541 19.9535 31.9909 20.2131C32.2277 20.4726 32.353 20.8153 32.3398 21.167C32.3483 21.3414 32.3222 21.5157 32.263 21.6798C32.2038 21.844 32.1127 21.9947 31.995 22.1233C31.8773 22.2518 31.7354 22.3556 31.5774 22.4287C31.4194 22.5017 31.2485 22.5426 31.0746 22.5488H18.092ZM38.87 34.624C40.7816 34.626 42.6497 35.1967 44.2379 36.2641C45.8262 37.3314 47.0633 38.8475 47.7929 40.6205C48.5224 42.3934 48.7115 44.3437 48.3363 46.2245C47.9612 48.1053 47.0385 49.8323 45.6852 51.1869C44.3318 52.5415 42.6084 53.463 40.7331 53.8347C38.8578 54.2064 36.9147 54.0117 35.1497 53.2752C33.3847 52.5387 31.8769 51.2935 30.8172 49.6971C29.7575 48.1007 29.1934 46.2248 29.1963 44.3066C29.1963 43.0324 29.4466 41.7706 29.9329 40.5934C30.4192 39.4162 31.1319 38.3468 32.0303 37.4462C32.9287 36.5456 33.9952 35.8315 35.1688 35.3447C36.3424 34.858 37.6001 34.6081 38.87 34.6094V34.624Z" stroke="black"/>
-<path d="M36 44.272L37.9764 46.2483L42.5104 41.7143M8.57143 11.6484L10.1327 13.1429L13.7143 9.71429M8.57143 19.7143L12.8571 24M12.8569 19.7145L8.57119 24.0002M38.8603 32.0654C41.0469 32.0719 43.1913 32.6697 45.068 33.7958C46.9446 34.9219 48.484 36.5348 49.5244 38.4647C50.5647 40.3946 51.0674 42.5701 50.9796 44.7625C50.8918 46.9548 50.2168 49.0829 49.0255 50.9229L54.2857 56.6748L50.6556 60L45.5852 54.4043C44.0053 55.4696 42.1983 56.148 40.3095 56.385C38.4207 56.622 36.5029 56.4109 34.7102 55.7688C32.9175 55.1266 31.3 54.0713 29.9878 52.6876C28.6755 51.304 27.7052 49.6307 27.1547 47.8022C26.6043 45.9738 26.4892 44.0412 26.8185 42.16C27.1479 40.2788 27.9126 38.5014 29.0512 36.9707C30.1898 35.44 31.6704 34.1988 33.3741 33.3468C35.0777 32.4949 36.9569 32.056 38.8603 32.0654ZM18.1066 32.1924C17.7563 32.1747 17.4272 32.0192 17.1903 31.7596C16.9535 31.5 16.8282 31.1573 16.8414 30.8057C16.8329 30.6311 16.859 30.4565 16.9181 30.2921C16.9772 30.1276 17.0683 29.9766 17.1859 29.8476C17.3035 29.7187 17.4455 29.6144 17.6035 29.5408C17.7615 29.4673 17.9325 29.4258 18.1066 29.4189H25.6003C25.9497 29.4391 26.2774 29.5954 26.5137 29.8544C26.75 30.1134 26.8762 30.4547 26.8655 30.8057C26.874 30.9803 26.8479 31.1548 26.7888 31.3193C26.7297 31.4837 26.6387 31.6348 26.521 31.7637C26.4034 31.8926 26.2614 31.9969 26.1034 32.0705C25.9454 32.1441 25.7744 32.1855 25.6003 32.1924H18.1066ZM10.9194 27.9395C11.4651 27.9395 11.9986 28.1018 12.4523 28.406C12.906 28.7103 13.2596 29.1426 13.4685 29.6485C13.6773 30.1544 13.7319 30.7111 13.6255 31.2481C13.519 31.7852 13.2562 32.2785 12.8704 32.6657C12.4845 33.0529 11.9929 33.3165 11.4577 33.4234C10.9225 33.5302 10.3677 33.4754 9.86358 33.2658C9.35943 33.0563 8.92853 32.7014 8.62536 32.2461C8.32219 31.7908 8.16038 31.2556 8.16038 30.708C8.16038 29.9737 8.45106 29.2695 8.96848 28.7503C9.48591 28.2311 10.1877 27.9395 10.9194 27.9395ZM40.5634 8.43262H45.0986C45.9561 8.43646 46.7774 8.77964 47.3842 9.38761C47.991 9.99559 48.3343 10.8193 48.3394 11.6797V26.7676C48.2421 27.7881 45.7555 27.7979 45.5414 26.7676V11.6797C45.5424 11.6191 45.5312 11.559 45.5087 11.5028C45.4861 11.4466 45.4526 11.3955 45.41 11.3525C45.3675 11.3094 45.3167 11.2754 45.2606 11.2528C45.2045 11.2301 45.1444 11.2192 45.084 11.2207H40.544V26.7676C40.3055 27.6904 38.2326 27.832 37.7655 26.7676V3.25195C37.7626 3.13198 37.7158 3.01726 37.6341 2.92969C37.5912 2.887 37.5403 2.85335 37.4843 2.83071C37.4283 2.80807 37.3684 2.7969 37.308 2.79785H3.24566C3.1853 2.7969 3.12536 2.80807 3.06937 2.83071C3.01338 2.85335 2.96247 2.887 2.91963 2.92969C2.83561 3.01974 2.78867 3.13836 2.78825 3.26172V41.8897C2.78867 42.013 2.83561 42.1316 2.91963 42.2217C2.96247 42.2644 3.01338 42.298 3.06937 42.3207C3.12536 42.3433 3.1853 42.3545 3.24566 42.3535H21.7707C23.1722 42.4951 23.2305 44.9268 21.7707 45.1416H10.5399V50.3223C10.5385 50.3829 10.5495 50.4432 10.572 50.4995C10.5945 50.5558 10.6281 50.6069 10.6709 50.6498C10.7136 50.6927 10.7646 50.7264 10.8207 50.749C10.8768 50.7716 10.9369 50.7826 10.9973 50.7812H21.7707C22.7877 50.8984 23.1138 53.2227 21.7707 53.5693H11.0167C10.5897 53.5688 10.1672 53.4821 9.77429 53.3144C9.38137 53.1466 9.02613 52.9012 8.7297 52.5928C8.42432 52.2938 8.18106 51.9371 8.01401 51.5431C7.84696 51.1492 7.75943 50.7259 7.75649 50.2979V45.1416H3.24079C2.38246 45.1377 1.56039 44.7939 0.953449 44.1849C0.346513 43.5758 0.00384045 42.7509 0 41.8897V3.25195C0.0030846 2.82677 0.0907584 2.40648 0.257878 2.01575C0.424998 1.62502 0.668198 1.27172 0.973211 0.976562C1.27081 0.669693 1.62628 0.425312 2.01893 0.257653C2.41158 0.0899939 2.83355 0.00240909 3.26026 0H37.3226C37.7496 0.000765146 38.1721 0.0876035 38.5649 0.25536C38.9578 0.423116 39.3131 0.66837 39.6097 0.976562C39.9146 1.27584 40.1576 1.63267 40.3246 2.02652C40.4917 2.42037 40.5794 2.84347 40.5829 3.27148V8.43262H40.5634ZM18.092 12.9102C17.7422 12.8912 17.4137 12.7353 17.1772 12.4761C16.9406 12.2168 16.8148 11.8748 16.8268 11.5234C16.8183 11.3488 16.8444 11.1743 16.9035 11.0098C16.9627 10.8454 17.0537 10.6943 17.1713 10.5654C17.2889 10.4365 17.4309 10.3322 17.5889 10.2586C17.7469 10.185 17.9179 10.1436 18.092 10.1367H31.0746C31.4249 10.1544 31.7541 10.3099 31.9909 10.5695C32.2277 10.8291 32.353 11.1718 32.3398 11.5234C32.3483 11.698 32.3222 11.8726 32.2631 12.037C32.204 12.2015 32.113 12.3525 31.9953 12.4815C31.8777 12.6104 31.7358 12.7147 31.5777 12.7883C31.4197 12.8618 31.2487 12.9033 31.0746 12.9102H18.092ZM18.092 22.5488C17.7426 22.5311 17.4142 22.3763 17.1775 22.1178C16.9408 21.8593 16.8149 21.5178 16.8268 21.167C16.8183 20.9924 16.8444 20.8178 16.9035 20.6534C16.9627 20.489 17.0537 20.3379 17.1713 20.209C17.2889 20.08 17.4309 19.9758 17.5889 19.9022C17.7469 19.8286 17.9179 19.7872 18.092 19.7803H31.0746C31.4249 19.798 31.7541 19.9535 31.9909 20.2131C32.2277 20.4726 32.353 20.8153 32.3398 21.167C32.3483 21.3414 32.3222 21.5157 32.263 21.6798C32.2038 21.844 32.1127 21.9947 31.995 22.1233C31.8773 22.2518 31.7354 22.3556 31.5774 22.4287C31.4194 22.5017 31.2485 22.5426 31.0746 22.5488H18.092ZM38.87 34.624C40.7816 34.626 42.6497 35.1967 44.2379 36.2641C45.8262 37.3314 47.0633 38.8475 47.7929 40.6205C48.5224 42.3934 48.7115 44.3437 48.3363 46.2245C47.9612 48.1053 47.0385 49.8323 45.6852 51.1869C44.3318 52.5415 42.6084 53.463 40.7331 53.8347C38.8578 54.2064 36.9147 54.0117 35.1497 53.2752C33.3847 52.5387 31.8769 51.2935 30.8172 49.6971C29.7575 48.1007 29.1934 46.2248 29.1963 44.3066C29.1963 43.0324 29.4466 41.7706 29.9329 40.5934C30.4192 39.4162 31.1319 38.3468 32.0303 37.4462C32.9287 36.5456 33.9952 35.8315 35.1688 35.3447C36.3424 34.858 37.6001 34.6081 38.87 34.6094V34.624Z" stroke="url(#paint0_linear_160_5253)"/>
-</g>
-</g>
-<defs>
-<linearGradient id="paint0_linear_160_5253" x1="14.0238" y1="4.5" x2="42.5813" y2="55.6969" gradientUnits="userSpaceOnUse">
-<stop stop-color="#9934BD"/>
-<stop offset="1" stop-color="#4479E0"/>
-</linearGradient>
-<clipPath id="clip0_160_5253">
-<rect width="60" height="60" fill="white"/>
-</clipPath>
-<clipPath id="clip1_160_5253">
-<rect width="60" height="60" fill="white"/>
-</clipPath>
-</defs>
-</svg>
diff --git a/website/static/img/homepage/test-runner.svg b/website/static/img/homepage/test-runner.svg
new file mode 100644
index 000000000..d9efeecac
--- /dev/null
+++ b/website/static/img/homepage/test-runner.svg
@@ -0,0 +1,16 @@
+<svg width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M2.95964 0.0789038C1.84295 0.300961 0.833318 1.13191 0.30113 2.26703L0.0103144 2.88729L0.000712295 17.6212C-0.0045853 25.7249 0.0202472 34.6646 0.0558956 37.4872L0.120681 42.6193L0.388099 43.1626C0.745025 43.8879 1.3867 44.5094 2.14613 44.8654C2.75292 45.15 2.83426 45.1586 5.21818 45.1911L7.66688 45.2245L7.70143 47.9503C7.73388 50.511 7.75109 50.7089 7.98639 51.219C8.39398 52.1028 8.93257 52.6682 9.75072 53.071L10.4904 53.4352H16.4713H22.452L22.7511 53.1593C23.5649 52.4084 23.557 50.8856 22.7353 50.1241L22.4377 49.8483H16.9355H11.4333V47.5306V45.2129H16.8521C22.8992 45.2129 22.7904 45.2257 23.2676 44.4562C23.6201 43.8879 23.616 42.8891 23.2588 42.3131C22.7704 41.5256 23.3924 41.5708 13.0391 41.5708H3.70759V22.6429V3.71504H20.5385H37.3694V15.3438C37.3694 26.7521 37.3735 26.9779 37.5871 27.2494C37.9181 27.6702 38.4773 27.8853 39.2402 27.8853C39.9701 27.8853 40.4991 27.6868 40.8159 27.294C40.9923 27.0752 41.0067 26.4949 41.0091 19.525L41.0115 11.9925H43.0533H45.0951V19.5636V27.1346L45.4303 27.4478C46.1463 28.1166 47.7571 28.1098 48.4317 27.4351L48.7371 27.1297V19.1789C48.7371 11.455 48.7307 11.2111 48.5128 10.6284C48.197 9.78454 47.5488 9.09353 46.6646 8.65803L45.928 8.29525L43.5333 8.25696L41.1386 8.21866L41.0986 5.49779C41.0616 2.98331 41.0403 2.73708 40.8178 2.25169C40.4612 1.47383 39.6863 0.705565 38.8852 0.335616L38.1971 0.0177606L20.8144 0.00142628C11.2539 -0.00762378 3.21922 0.0273626 2.95964 0.0789038ZM38.2904 1.13268C38.9676 1.36346 39.721 2.11682 39.9518 2.79403C40.0949 3.21398 40.1286 3.82486 40.1286 5.9972C40.1286 8.60792 40.1346 8.68154 40.3493 8.68154C40.5112 8.68154 40.57 8.75515 40.57 8.95745V9.23337H43.0336C45.8385 9.23337 46.2429 9.31184 46.9438 9.99214C47.176 10.2174 47.4634 10.5983 47.5825 10.8384C47.7905 11.2579 47.8001 11.5769 47.827 18.9456C47.843 23.3364 47.8126 26.6815 47.756 26.7692C47.5989 27.0119 46.587 27.0652 46.2557 26.8482L45.978 26.6662V19.1036V11.541L45.707 11.2702L45.4362 10.9992H42.7823H40.1286V18.8218C40.1286 27.5096 40.1896 26.8605 39.3626 26.9714C39.0552 27.0125 38.8344 26.9753 38.6429 26.8497L38.3667 26.6687L38.3371 14.9616L38.3075 3.25437L37.9978 2.98806L37.6881 2.72174H20.5385H3.38886L3.07917 2.98817L2.76948 3.25448L2.76804 17.4186C2.76727 25.2088 2.7921 33.9581 2.82323 36.8615C2.87753 41.9249 2.88856 42.147 3.09407 42.2971C3.27507 42.4294 4.75906 42.4537 12.6535 42.4537C21.9406 42.4537 22.0005 42.4551 22.2895 42.6825C22.6514 42.967 22.6903 43.6177 22.3694 44.0142L22.1585 44.2748L16.2992 44.3052L10.44 44.3356V47.2625V50.1894L10.7109 50.4602L10.9817 50.7312H16.488C21.5936 50.7312 22.0066 50.7452 22.1646 50.9243C22.4431 51.24 22.5057 51.7767 22.3086 52.1579L22.1332 52.4971L16.4245 52.4946C10.0076 52.4919 10.2533 52.5213 9.42447 51.6549C8.69738 50.8949 8.67409 50.7619 8.67409 47.3769V44.3467L5.88733 44.3092C2.824 44.2679 2.68207 44.241 1.89957 43.5541C1.67277 43.355 1.37842 42.9886 1.24543 42.7401L1.00361 42.2882V22.6429C1.00361 3.69506 1.0109 2.98397 1.20912 2.61137C1.60621 1.86486 2.2864 1.28962 3.04473 1.05896C3.19682 1.01271 11.0726 0.970555 20.5464 0.965368C36.0706 0.956759 37.8228 0.973314 38.2904 1.13268ZM12.1175 11.1785L10.5422 12.6807L9.9039 12.1256L9.26565 11.5705L8.97837 11.9305L8.69109 12.2905L9.54036 13.1348C10.0074 13.5992 10.4382 13.978 10.4976 13.9766C10.5569 13.9752 11.4498 13.1598 12.4817 12.1645L14.358 10.3549L14.0254 10.0155L13.6928 9.67616L12.1175 11.1785ZM17.9624 10.0037C17.4955 10.1162 16.8828 10.7043 16.7206 11.1957C16.4461 12.0276 16.8708 13.0409 17.6527 13.4195C18.1145 13.643 18.2718 13.648 24.7949 13.6456C31.0608 13.6433 31.4922 13.6307 31.9172 13.4378C33.1736 12.8671 33.3096 11.0149 32.1514 10.2483L31.7019 9.95075L25.0165 9.93276C21.3395 9.92294 18.1652 9.95484 17.9624 10.0037ZM31.6905 11.1598C32.0703 11.5396 32.0612 12.1188 31.6706 12.4259C31.3838 12.6516 31.2899 12.6547 24.7677 12.6547H18.1556L17.8847 12.3838C17.7139 12.213 17.6138 11.9868 17.6138 11.7718C17.6138 11.5568 17.7139 11.3306 17.8847 11.1598L18.1556 10.8889H24.7876H31.4196L31.6905 11.1598ZM17.6096 19.6354C16.9358 19.9752 16.5803 20.6502 16.666 21.4273C16.7338 22.043 16.963 22.4138 17.5023 22.7809L17.8672 23.0292H24.7613C31.6447 23.0292 31.6562 23.0289 32.0844 22.7881C32.5765 22.5115 32.9547 21.844 32.9547 21.2518C32.9547 20.6147 32.5295 19.9197 31.9656 19.6354L31.4732 19.3871H24.7876H18.102L17.6096 19.6354ZM8.94791 19.8308L8.62851 20.1641L9.50405 21.0448L10.3796 21.9255L9.50405 22.8062L8.62851 23.687L8.95012 24.0226L9.27172 24.3583L10.1618 23.4729L11.0518 22.5874L11.9285 23.4692L12.805 24.3509L13.1694 23.9978L13.5337 23.6447L12.6793 22.7851L11.8247 21.9255L12.6773 21.0679L13.5299 20.2103L13.1736 19.8541L12.8174 19.4978L11.9598 20.3504L11.1022 21.203L10.2444 20.3503C9.77257 19.8812 9.35969 19.4975 9.32691 19.4975C9.29413 19.4975 9.1235 19.6474 8.94791 19.8308ZM31.706 20.6203C32.0781 20.97 32.0591 21.612 31.6675 21.92C31.3754 22.1497 31.3299 22.151 24.7046 22.1212L18.0357 22.0911L17.8247 21.8305C17.531 21.4677 17.5558 20.9801 17.8847 20.6513L18.1556 20.3804H24.8031H31.4505L31.706 20.6203ZM10.0616 27.6666C9.76241 27.7833 9.32371 28.0665 9.08653 28.296C8.44155 28.9199 8.20415 29.4608 8.14565 30.4395C8.10228 31.1665 8.13274 31.3648 8.36628 31.875C8.91855 33.0815 9.93734 33.7318 11.2776 33.7336C11.9309 33.7345 12.1717 33.679 12.7356 33.3972C13.9005 32.8152 14.4594 31.8999 14.4503 30.5893C14.4415 29.3035 13.8575 28.342 12.7487 27.7879C11.9109 27.3692 10.9358 27.3252 10.0616 27.6666ZM11.9053 28.4438C12.4479 28.5944 13.0716 29.149 13.3244 29.7054C14.233 31.7055 11.8001 33.7027 10.0231 32.4155C8.83666 31.556 8.70665 30.0564 9.72975 29.0318C10.3443 28.4164 11.0854 28.2161 11.9053 28.4438ZM17.6368 29.0606C16.3499 29.7022 16.3446 31.6525 17.6279 32.3072C18.0424 32.5186 18.2432 32.5269 22.2442 32.4969C26.2713 32.4667 26.4386 32.457 26.7318 32.238C27.5318 31.6404 27.7521 30.7346 27.3056 29.8784C26.7952 28.8991 26.9962 28.9374 22.2136 28.9066C18.4934 28.8827 17.9576 28.9008 17.6368 29.0606ZM26.1041 29.923C26.6088 30.184 26.7288 30.9106 26.3327 31.3067C26.1202 31.5192 25.9649 31.5274 22.1183 31.5274C18.1698 31.5274 18.1218 31.5247 17.8692 31.2875C17.4053 30.8515 17.6225 30.0784 18.276 29.8395C18.367 29.8062 20.0954 29.775 22.1167 29.7703C25.1389 29.7631 25.8473 29.7902 26.1041 29.923ZM37.3758 31.5409C33.1422 32.0313 29.3538 34.7632 27.5401 38.6336C24.1638 45.8385 28.3527 54.3004 36.1554 56.0372C39.2712 56.7307 42.2888 56.2352 45.4394 54.5122C45.477 54.4916 46.642 55.718 48.028 57.2374L50.5482 60L50.8291 59.7451C54.707 56.2261 54.8164 56.1176 54.6734 55.9342C54.5121 55.7274 50.8278 51.7138 50.0831 50.9336L49.5914 50.4186L50.0925 49.3885C50.7087 48.1214 51.0185 47.1307 51.2257 45.7647C51.6176 43.1801 51.2457 40.7985 50.0785 38.4188C48.182 34.5521 44.5529 32.0259 40.1837 31.5313C39.0567 31.4037 38.5444 31.4055 37.3758 31.5409ZM41.5852 32.726C46.1186 33.9226 49.3186 37.275 50.2324 41.785C50.4875 43.0438 50.4084 45.5552 50.0744 46.8036C49.8588 47.6093 49.012 49.506 48.5602 50.1955L48.3689 50.4876L50.9389 53.2636C52.3524 54.7904 53.4906 56.0541 53.4683 56.0718C53.446 56.0896 52.8193 56.6583 52.0756 57.3356C51.332 58.0131 50.6807 58.5672 50.6283 58.5672C50.5498 58.5672 47.2304 54.9993 46.0304 53.625L45.6966 53.2427L44.7207 53.8023C42.8377 54.8819 41.0039 55.3676 38.8196 55.3652C33.2044 55.3588 28.4381 51.3545 27.4775 45.8364C27.2454 44.5031 27.3179 42.4108 27.6387 41.1845C28.1577 39.2006 29.0329 37.5928 30.3611 36.1831C32.2262 34.2038 34.2872 33.0635 36.8727 32.5805C38.0958 32.352 40.4429 32.4245 41.5852 32.726ZM37.2775 34.0717C33.9103 34.6744 30.9028 37.0518 29.6756 40.0808C29.1125 41.4708 28.9311 42.4315 28.9357 43.9988C28.9435 46.6448 29.8071 48.8176 31.6206 50.7543C34.8201 54.1709 39.9959 54.9065 44.0454 52.52C45.1935 51.8434 46.8834 50.1857 47.5069 49.1246C50.932 43.2946 47.9039 35.9869 41.3513 34.2694C40.3837 34.0157 38.1856 33.9091 37.2775 34.0717ZM41.0115 35.1732C44.1246 35.9125 46.6482 38.2869 47.6352 41.4052C48.0119 42.5952 48.0688 44.752 47.7562 45.9902C46.9068 49.3543 44.4125 51.8659 41.0766 52.716C39.1963 53.1952 36.8605 52.9584 35.0615 52.106C32.6109 50.945 30.8209 48.8086 30.1181 46.2062C29.8471 45.2027 29.8442 42.6786 30.1129 41.6811C30.3866 40.6651 31.1901 39.0972 31.8546 38.2823C33.1614 36.6794 35.1787 35.4569 37.1569 35.0687C38.1007 34.8837 40.0101 34.9353 41.0115 35.1732ZM40.0466 43.1419L38.034 45.1545L37.2278 44.3538L36.4217 43.553L36.0992 43.8895L35.7768 44.226L36.8966 45.3457L38.0165 46.4655L39.2104 45.3504C39.8672 44.7371 40.9457 43.6897 41.6071 43.0229L42.8098 41.8105L42.5453 41.476C42.3998 41.292 42.2308 41.1388 42.17 41.1354C42.1091 41.1321 41.1535 42.035 40.0466 43.1419Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M2.95964 0.0789038C1.84295 0.300961 0.833318 1.13191 0.30113 2.26703L0.0103144 2.88729L0.000712295 17.6212C-0.0045853 25.7249 0.0202472 34.6646 0.0558956 37.4872L0.120681 42.6193L0.388099 43.1626C0.745025 43.8879 1.3867 44.5094 2.14613 44.8654C2.75292 45.15 2.83426 45.1586 5.21818 45.1911L7.66688 45.2245L7.70143 47.9503C7.73388 50.511 7.75109 50.7089 7.98639 51.219C8.39398 52.1028 8.93257 52.6682 9.75072 53.071L10.4904 53.4352H16.4713H22.452L22.7511 53.1593C23.5649 52.4084 23.557 50.8856 22.7353 50.1241L22.4377 49.8483H16.9355H11.4333V47.5306V45.2129H16.8521C22.8992 45.2129 22.7904 45.2257 23.2676 44.4562C23.6201 43.8879 23.616 42.8891 23.2588 42.3131C22.7704 41.5256 23.3924 41.5708 13.0391 41.5708H3.70759V22.6429V3.71504H20.5385H37.3694V15.3438C37.3694 26.7521 37.3735 26.9779 37.5871 27.2494C37.9181 27.6702 38.4773 27.8853 39.2402 27.8853C39.9701 27.8853 40.4991 27.6868 40.8159 27.294C40.9923 27.0752 41.0067 26.4949 41.0091 19.525L41.0115 11.9925H43.0533H45.0951V19.5636V27.1346L45.4303 27.4478C46.1463 28.1166 47.7571 28.1098 48.4317 27.4351L48.7371 27.1297V19.1789C48.7371 11.455 48.7307 11.2111 48.5128 10.6284C48.197 9.78454 47.5488 9.09353 46.6646 8.65803L45.928 8.29525L43.5333 8.25696L41.1386 8.21866L41.0986 5.49779C41.0616 2.98331 41.0403 2.73708 40.8178 2.25169C40.4612 1.47383 39.6863 0.705565 38.8852 0.335616L38.1971 0.0177606L20.8144 0.00142628C11.2539 -0.00762378 3.21922 0.0273626 2.95964 0.0789038ZM38.2904 1.13268C38.9676 1.36346 39.721 2.11682 39.9518 2.79403C40.0949 3.21398 40.1286 3.82486 40.1286 5.9972C40.1286 8.60792 40.1346 8.68154 40.3493 8.68154C40.5112 8.68154 40.57 8.75515 40.57 8.95745V9.23337H43.0336C45.8385 9.23337 46.2429 9.31184 46.9438 9.99214C47.176 10.2174 47.4634 10.5983 47.5825 10.8384C47.7905 11.2579 47.8001 11.5769 47.827 18.9456C47.843 23.3364 47.8126 26.6815 47.756 26.7692C47.5989 27.0119 46.587 27.0652 46.2557 26.8482L45.978 26.6662V19.1036V11.541L45.707 11.2702L45.4362 10.9992H42.7823H40.1286V18.8218C40.1286 27.5096 40.1896 26.8605 39.3626 26.9714C39.0552 27.0125 38.8344 26.9753 38.6429 26.8497L38.3667 26.6687L38.3371 14.9616L38.3075 3.25437L37.9978 2.98806L37.6881 2.72174H20.5385H3.38886L3.07917 2.98817L2.76948 3.25448L2.76804 17.4186C2.76727 25.2088 2.7921 33.9581 2.82323 36.8615C2.87753 41.9249 2.88856 42.147 3.09407 42.2971C3.27507 42.4294 4.75906 42.4537 12.6535 42.4537C21.9406 42.4537 22.0005 42.4551 22.2895 42.6825C22.6514 42.967 22.6903 43.6177 22.3694 44.0142L22.1585 44.2748L16.2992 44.3052L10.44 44.3356V47.2625V50.1894L10.7109 50.4602L10.9817 50.7312H16.488C21.5936 50.7312 22.0066 50.7452 22.1646 50.9243C22.4431 51.24 22.5057 51.7767 22.3086 52.1579L22.1332 52.4971L16.4245 52.4946C10.0076 52.4919 10.2533 52.5213 9.42447 51.6549C8.69738 50.8949 8.67409 50.7619 8.67409 47.3769V44.3467L5.88733 44.3092C2.824 44.2679 2.68207 44.241 1.89957 43.5541C1.67277 43.355 1.37842 42.9886 1.24543 42.7401L1.00361 42.2882V22.6429C1.00361 3.69506 1.0109 2.98397 1.20912 2.61137C1.60621 1.86486 2.2864 1.28962 3.04473 1.05896C3.19682 1.01271 11.0726 0.970555 20.5464 0.965368C36.0706 0.956759 37.8228 0.973314 38.2904 1.13268ZM12.1175 11.1785L10.5422 12.6807L9.9039 12.1256L9.26565 11.5705L8.97837 11.9305L8.69109 12.2905L9.54036 13.1348C10.0074 13.5992 10.4382 13.978 10.4976 13.9766C10.5569 13.9752 11.4498 13.1598 12.4817 12.1645L14.358 10.3549L14.0254 10.0155L13.6928 9.67616L12.1175 11.1785ZM17.9624 10.0037C17.4955 10.1162 16.8828 10.7043 16.7206 11.1957C16.4461 12.0276 16.8708 13.0409 17.6527 13.4195C18.1145 13.643 18.2718 13.648 24.7949 13.6456C31.0608 13.6433 31.4922 13.6307 31.9172 13.4378C33.1736 12.8671 33.3096 11.0149 32.1514 10.2483L31.7019 9.95075L25.0165 9.93276C21.3395 9.92294 18.1652 9.95484 17.9624 10.0037ZM31.6905 11.1598C32.0703 11.5396 32.0612 12.1188 31.6706 12.4259C31.3838 12.6516 31.2899 12.6547 24.7677 12.6547H18.1556L17.8847 12.3838C17.7139 12.213 17.6138 11.9868 17.6138 11.7718C17.6138 11.5568 17.7139 11.3306 17.8847 11.1598L18.1556 10.8889H24.7876H31.4196L31.6905 11.1598ZM17.6096 19.6354C16.9358 19.9752 16.5803 20.6502 16.666 21.4273C16.7338 22.043 16.963 22.4138 17.5023 22.7809L17.8672 23.0292H24.7613C31.6447 23.0292 31.6562 23.0289 32.0844 22.7881C32.5765 22.5115 32.9547 21.844 32.9547 21.2518C32.9547 20.6147 32.5295 19.9197 31.9656 19.6354L31.4732 19.3871H24.7876H18.102L17.6096 19.6354ZM8.94791 19.8308L8.62851 20.1641L9.50405 21.0448L10.3796 21.9255L9.50405 22.8062L8.62851 23.687L8.95012 24.0226L9.27172 24.3583L10.1618 23.4729L11.0518 22.5874L11.9285 23.4692L12.805 24.3509L13.1694 23.9978L13.5337 23.6447L12.6793 22.7851L11.8247 21.9255L12.6773 21.0679L13.5299 20.2103L13.1736 19.8541L12.8174 19.4978L11.9598 20.3504L11.1022 21.203L10.2444 20.3503C9.77257 19.8812 9.35969 19.4975 9.32691 19.4975C9.29413 19.4975 9.1235 19.6474 8.94791 19.8308ZM31.706 20.6203C32.0781 20.97 32.0591 21.612 31.6675 21.92C31.3754 22.1497 31.3299 22.151 24.7046 22.1212L18.0357 22.0911L17.8247 21.8305C17.531 21.4677 17.5558 20.9801 17.8847 20.6513L18.1556 20.3804H24.8031H31.4505L31.706 20.6203ZM10.0616 27.6666C9.76241 27.7833 9.32371 28.0665 9.08653 28.296C8.44155 28.9199 8.20415 29.4608 8.14565 30.4395C8.10228 31.1665 8.13274 31.3648 8.36628 31.875C8.91855 33.0815 9.93734 33.7318 11.2776 33.7336C11.9309 33.7345 12.1717 33.679 12.7356 33.3972C13.9005 32.8152 14.4594 31.8999 14.4503 30.5893C14.4415 29.3035 13.8575 28.342 12.7487 27.7879C11.9109 27.3692 10.9358 27.3252 10.0616 27.6666ZM11.9053 28.4438C12.4479 28.5944 13.0716 29.149 13.3244 29.7054C14.233 31.7055 11.8001 33.7027 10.0231 32.4155C8.83666 31.556 8.70665 30.0564 9.72975 29.0318C10.3443 28.4164 11.0854 28.2161 11.9053 28.4438ZM17.6368 29.0606C16.3499 29.7022 16.3446 31.6525 17.6279 32.3072C18.0424 32.5186 18.2432 32.5269 22.2442 32.4969C26.2713 32.4667 26.4386 32.457 26.7318 32.238C27.5318 31.6404 27.7521 30.7346 27.3056 29.8784C26.7952 28.8991 26.9962 28.9374 22.2136 28.9066C18.4934 28.8827 17.9576 28.9008 17.6368 29.0606ZM26.1041 29.923C26.6088 30.184 26.7288 30.9106 26.3327 31.3067C26.1202 31.5192 25.9649 31.5274 22.1183 31.5274C18.1698 31.5274 18.1218 31.5247 17.8692 31.2875C17.4053 30.8515 17.6225 30.0784 18.276 29.8395C18.367 29.8062 20.0954 29.775 22.1167 29.7703C25.1389 29.7631 25.8473 29.7902 26.1041 29.923ZM37.3758 31.5409C33.1422 32.0313 29.3538 34.7632 27.5401 38.6336C24.1638 45.8385 28.3527 54.3004 36.1554 56.0372C39.2712 56.7307 42.2888 56.2352 45.4394 54.5122C45.477 54.4916 46.642 55.718 48.028 57.2374L50.5482 60L50.8291 59.7451C54.707 56.2261 54.8164 56.1176 54.6734 55.9342C54.5121 55.7274 50.8278 51.7138 50.0831 50.9336L49.5914 50.4186L50.0925 49.3885C50.7087 48.1214 51.0185 47.1307 51.2257 45.7647C51.6176 43.1801 51.2457 40.7985 50.0785 38.4188C48.182 34.5521 44.5529 32.0259 40.1837 31.5313C39.0567 31.4037 38.5444 31.4055 37.3758 31.5409ZM41.5852 32.726C46.1186 33.9226 49.3186 37.275 50.2324 41.785C50.4875 43.0438 50.4084 45.5552 50.0744 46.8036C49.8588 47.6093 49.012 49.506 48.5602 50.1955L48.3689 50.4876L50.9389 53.2636C52.3524 54.7904 53.4906 56.0541 53.4683 56.0718C53.446 56.0896 52.8193 56.6583 52.0756 57.3356C51.332 58.0131 50.6807 58.5672 50.6283 58.5672C50.5498 58.5672 47.2304 54.9993 46.0304 53.625L45.6966 53.2427L44.7207 53.8023C42.8377 54.8819 41.0039 55.3676 38.8196 55.3652C33.2044 55.3588 28.4381 51.3545 27.4775 45.8364C27.2454 44.5031 27.3179 42.4108 27.6387 41.1845C28.1577 39.2006 29.0329 37.5928 30.3611 36.1831C32.2262 34.2038 34.2872 33.0635 36.8727 32.5805C38.0958 32.352 40.4429 32.4245 41.5852 32.726ZM37.2775 34.0717C33.9103 34.6744 30.9028 37.0518 29.6756 40.0808C29.1125 41.4708 28.9311 42.4315 28.9357 43.9988C28.9435 46.6448 29.8071 48.8176 31.6206 50.7543C34.8201 54.1709 39.9959 54.9065 44.0454 52.52C45.1935 51.8434 46.8834 50.1857 47.5069 49.1246C50.932 43.2946 47.9039 35.9869 41.3513 34.2694C40.3837 34.0157 38.1856 33.9091 37.2775 34.0717ZM41.0115 35.1732C44.1246 35.9125 46.6482 38.2869 47.6352 41.4052C48.0119 42.5952 48.0688 44.752 47.7562 45.9902C46.9068 49.3543 44.4125 51.8659 41.0766 52.716C39.1963 53.1952 36.8605 52.9584 35.0615 52.106C32.6109 50.945 30.8209 48.8086 30.1181 46.2062C29.8471 45.2027 29.8442 42.6786 30.1129 41.6811C30.3866 40.6651 31.1901 39.0972 31.8546 38.2823C33.1614 36.6794 35.1787 35.4569 37.1569 35.0687C38.1007 34.8837 40.0101 34.9353 41.0115 35.1732ZM40.0466 43.1419L38.034 45.1545L37.2278 44.3538L36.4217 43.553L36.0992 43.8895L35.7768 44.226L36.8966 45.3457L38.0165 46.4655L39.2104 45.3504C39.8672 44.7371 40.9457 43.6897 41.6071 43.0229L42.8098 41.8105L42.5453 41.476C42.3998 41.292 42.2308 41.1388 42.17 41.1354C42.1091 41.1321 41.1535 42.035 40.0466 43.1419Z" fill="url(#paint0_linear_965_2949)"/>
+<defs>
+<linearGradient id="paint0_linear_965_2949" x1="14.1332" y1="4.5" x2="42.5737" y2="55.8849" gradientUnits="userSpaceOnUse">
+<stop stop-color="#9934BD"/>
+<stop offset="1" stop-color="#4479E0"/>
+</linearGradient>
+<clipPath id="clip0_160_5253">
+<rect width="60" height="60" fill="white"/>
+</clipPath>
+<clipPath id="clip1_160_5253">
+<rect width="60" height="60" fill="white"/>
+</clipPath>
+</defs>
+</svg>