Repository: wix/Detox
Pull request #4246 (2023-10-26 11:21:31)

docs(website): home page styling
Change the size of the title. Change indents and fonts on mobile and desktop screens.

Desktop was:
![image](https://github.com/wix/Detox/assets/103461364/f9282d3a-8e40-4abf-a356-701138eda546)

Desktop became:
![image](https://github.com/wix/Detox/assets/103461364/0f9a91f3-86f6-493e-8cff-e487eb1fb92f)

Mobile was:
![image](https://github.com/wix/Detox/assets/103461364/1f28c95f-506b-47be-a236-fbf9ccf49ea7)

Mobile became:
![image](https://github.com/wix/Detox/assets/103461364/8b49fd86-3d38-407a-a9ce-b805b7079271)




Patch:
diff --git a/detox/android/detox/build.gradle b/detox/android/detox/build.gradle
index 3a8efdf95..7ebad1f87 100644
--- a/detox/android/detox/build.gradle
+++ b/detox/android/detox/build.gradle
@@ -25,8 +25,8 @@ android {
     if (agpVersion >= 7) {
         namespace "com.wix.detox"
     }
-    compileSdkVersion _compileSdkVersion
-    buildToolsVersion _buildToolsVersion
+    compileSdk _compileSdkVersion
+    buildToolsVersion = _buildToolsVersion
 
     defaultConfig {
         minSdkVersion _minSdkVersion
@@ -37,7 +37,7 @@ android {
         consumerProguardFiles 'proguard-rules.pro'
     }
 
-    flavorDimensions 'detox'
+    flavorDimensions = ['detox']
     productFlavors {
         full {
             dimension 'detox'
@@ -52,7 +52,7 @@ android {
         unitTests.returnDefaultValues = true
         unitTests.all { t ->
             reports {
-                html.enabled true
+                html.required = true
             }
             testLogging {
                 events "passed", "skipped", "failed", "standardOut", "standardError"
diff --git a/detox/detox.d.ts b/detox/detox.d.ts
index 316493416..785321e45 100644
--- a/detox/detox.d.ts
+++ b/detox/detox.d.ts
@@ -235,6 +235,13 @@ declare global {
              * @see {DetoxInternals.DetoxTestFileReport#isPermanentFailure}
              */
             bail?: boolean;
+            /**
+             * When true, tells `detox test` to spawn the test runner in a detached mode.
+             * This is useful in CI environments, where you want to intercept SIGINT and SIGTERM signals to gracefully shut down the test runner and the device.
+             * Instead of passing the kill signal to the child process (the test runner), Detox will send an emergency shutdown request to all the workers, and then it will wait for them to finish.
+             * @default false
+             */
+            detached?: boolean;
             /**
              * Custom handler to process --inspect-brk CLI flag.
              * Use it when you rely on another test runner than Jest to mutate the config.
diff --git a/detox/internals.d.ts b/detox/internals.d.ts
index c0a2fecad..9496b5ec9 100644
--- a/detox/internals.d.ts
+++ b/detox/internals.d.ts
@@ -116,8 +116,9 @@ declare global {
       /**
        * Workaround for Jest exiting abruptly in --bail mode.
        * Makes sure that all workers and their test environments are properly torn down.
+       * @param [permanent] - forbids further retries
        */
-      unsafe_conductEarlyTeardown(): Promise<void>;
+      unsafe_conductEarlyTeardown(permanent?: boolean): Promise<void>;
       /**
        * Reports to Detox CLI about passed and failed test files.
        * The failed test files might be re-run again if
diff --git a/detox/ios/DetoxSync b/detox/ios/DetoxSync
index 526f2507e..5b2633161 160000
--- a/detox/ios/DetoxSync
+++ b/detox/ios/DetoxSync
@@ -1,1 +1,1 @@
-Subproject commit 526f2507e2e41c744e8286a83fe9325e2b4bda8d
+Subproject commit 5b26331610dc358fc48894023b5d172c238e54b8
diff --git a/detox/local-cli/utils/interruptListeners.js b/detox/local-cli/utils/interruptListeners.js
new file mode 100644
index 000000000..d59ad52b4
--- /dev/null
+++ b/detox/local-cli/utils/interruptListeners.js
@@ -0,0 +1,15 @@
+function subscribe(listener) {
+  process.on('SIGINT', listener);
+  process.on('SIGTERM', listener);
+}
+
+function unsubscribe(listener) {
+  process.removeListener('SIGINT', listener);
+  process.removeListener('SIGTERM', listener);
+}
+
+module.exports = {
+  subscribe,
+  unsubscribe,
+};
+
diff --git a/detox/package.json b/detox/package.json
index e3ba698e5..a76c616bc 100644
--- a/detox/package.json
+++ b/detox/package.json
@@ -1,7 +1,7 @@
 {
   "name": "detox",
   "description": "E2E tests and automation for mobile",
-  "version": "20.13.3",
+  "version": "20.13.5",
   "bin": {
     "detox": "local-cli/cli.js"
   },
diff --git a/detox/src/configuration/composeRunnerConfig.js b/detox/src/configuration/composeRunnerConfig.js
index a36746752..2c3394e81 100644
--- a/detox/src/configuration/composeRunnerConfig.js
+++ b/detox/src/configuration/composeRunnerConfig.js
@@ -32,6 +32,7 @@ function composeRunnerConfig(opts) {
       retries: 0,
       inspectBrk: inspectBrkHookDefault,
       forwardEnv: false,
+      detached: false,
       bail: false,
       jest: {
         setupTimeout: 300000,
@@ -56,8 +57,9 @@ function composeRunnerConfig(opts) {
 
   if (typeof merged.inspectBrk === 'function') {
     if (cliConfig.inspectBrk) {
-      merged.retries = 0;
+      merged.detached = false;
       merged.forwardEnv = true;
+      merged.retries = 0;
       merged.inspectBrk(merged);
     }
 
diff --git a/detox/src/ipc/IPCClient.js b/detox/src/ipc/IPCClient.js
index 5033d1804..ca5554361 100644
--- a/detox/src/ipc/IPCClient.js
+++ b/detox/src/ipc/IPCClient.js
@@ -86,8 +86,8 @@ class IPCClient {
     this._sessionState.patch(sessionState);
   }
 
-  async conductEarlyTeardown() {
-    const sessionState = await this._emit('conductEarlyTeardown', {});
+  async conductEarlyTeardown({ permanent }) {
+    const sessionState = await this._emit('conductEarlyTeardown', { permanent });
     this._sessionState.patch(sessionState);
   }
 
diff --git a/detox/src/ipc/IPCServer.js b/detox/src/ipc/IPCServer.js
index 1fba85ac2..51f4e2f10 100644
--- a/detox/src/ipc/IPCServer.js
+++ b/detox/src/ipc/IPCServer.js
@@ -73,6 +73,7 @@ class IPCServer {
     this._ipc.server.emit(socket, 'registerContextDone', {
       testResults: this._sessionState.testResults,
       testSessionIndex: this._sessionState.testSessionIndex,
+      unsafe_earlyTeardown: this._sessionState.unsafe_earlyTeardown,
     });
   }
 
@@ -90,10 +91,11 @@ class IPCServer {
     }
   }
 
-  onConductEarlyTeardown(_data = null, socket = null) {
-    // Note that we don't save `unsafe_earlyTeardown` in the primary session state
-    // because it's transient and needed only to make the workers quit early.
+  onConductEarlyTeardown({ permanent }, socket = null) {
     const newState = { unsafe_earlyTeardown: true };
+    if (permanent) {
+      Object.assign(this._sessionState, newState);
+    }
 
     if (socket) {
       this._ipc.server.emit(socket, 'conductEarlyTeardownDone', newState);
diff --git a/detox/src/realms/DetoxContext.js b/detox/src/realms/DetoxContext.js
index 28d2f6d87..67c6d6ea4 100644
--- a/detox/src/realms/DetoxContext.js
+++ b/detox/src/realms/DetoxContext.js
@@ -102,7 +102,7 @@ class DetoxContext {
   /** @abstract */
   [symbols.reportTestResults](_testResults) {}
   /** @abstract */
-  [symbols.conductEarlyTeardown]() {}
+  [symbols.conductEarlyTeardown](_permanent) {}
   /**
    * @abstract
    * @param {Partial<DetoxInternals.DetoxInitOptions>} _opts
diff --git a/detox/src/realms/DetoxPrimaryContext.js b/detox/src/realms/DetoxPrimaryContext.js
index bec924eda..feb061fdb 100644
--- a/detox/src/realms/DetoxPrimaryContext.js
+++ b/detox/src/realms/DetoxPrimaryContext.js
@@ -51,9 +51,9 @@ class DetoxPrimaryContext extends DetoxContext {
     }
   }
 
-  [symbols.conductEarlyTeardown] = async () => {
+  [symbols.conductEarlyTeardown] = async (permanent = false) => {
     if (this[_ipcServer]) {
-      await this[_ipcServer].onConductEarlyTeardown();
+      await this[_ipcServer].onConductEarlyTeardown({ permanent });
     }
   };
 
diff --git a/detox/src/realms/DetoxSecondaryContext.js b/detox/src/realms/DetoxSecondaryContext.js
index 0a74e9a25..108daf29c 100644
--- a/detox/src/realms/DetoxSecondaryContext.js
+++ b/detox/src/realms/DetoxSecondaryContext.js
@@ -33,9 +33,9 @@ class DetoxSecondaryContext extends DetoxContext {
     }
   }
 
-  [symbols.conductEarlyTeardown] = async () => {
+  [symbols.conductEarlyTeardown] = async (permanent = false) => {
     if (this[_ipcClient]) {
-      await this[_ipcClient].conductEarlyTeardown();
+      await this[_ipcClient].conductEarlyTeardown({ permanent });
     } else {
       throw new DetoxInternalError('Detected an attempt to report early teardown using a non-initialized context.');
     }
diff --git a/docs/introduction/preparing-for-ci.md b/docs/introduction/preparing-for-ci.md
index adcfcaee8..dff392115 100644
--- a/docs/introduction/preparing-for-ci.md
+++ b/docs/introduction/preparing-for-ci.md
@@ -172,9 +172,9 @@ detox_e2e:
     - mkdir -p /root/.android && touch /root/.android/repositories.cfg
     # The Dockerimage provides two paths for sdkmanager and avdmanager, which the defaults are from $ANDROID_HOME/cmdline-tools
     # That is not compatible with the one that Detox is using ($ANDROID_HOME/tools/bin)
-    - echo yes | $ANDROID_HOME/tools/bin/sdkmanager --channel=0 --verbose "system-images;android-27;default;x86_64"
+    - echo yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --channel=0 --verbose "system-images;android-27;default;x86_64" "emulator"
     # Nexus 6P, API 27, XXXHDPI
-    - echo no | $ANDROID_HOME/tools/bin/avdmanager --verbose create avd --force --name "Nexus6P" --package "system-images;android-27;default;x86_64" --sdcard 200M --device 11
+    - echo no | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager --verbose create avd --force --name "Nexus6P" --package "system-images;android-27;default;x86_64" --sdcard 200M --device 11
     - adb start-server
   script:
     - npx detox build -c android.emu.release.ci
diff --git a/examples/demo-native-android/package.json b/examples/demo-native-android/package.json
index f9abdea04..581f293e3 100644
--- a/examples/demo-native-android/package.json
+++ b/examples/demo-native-android/package.json
@@ -1,13 +1,13 @@
 {
   "name": "detox-demo-native-android",
-  "version": "20.13.3",
+  "version": "20.13.5",
   "private": true,
   "scripts": {
     "packager": "react-native start",
     "detox-server": "detox run-server"
   },
   "devDependencies": {
-    "detox": "^20.13.3"
+    "detox": "^20.13.5"
   },
   "detox": {}
 }
diff --git a/examples/demo-native-ios/package.json b/examples/demo-native-ios/package.json
index 501363ad7..c2aa0383d 100644
--- a/examples/demo-native-ios/package.json
+++ b/examples/demo-native-ios/package.json
@@ -1,9 +1,9 @@
 {
   "name": "detox-demo-native-ios",
-  "version": "20.13.3",
+  "version": "20.13.5",
   "private": true,
   "devDependencies": {
-    "detox": "^20.13.3"
+    "detox": "^20.13.5"
   },
   "detox": {
     "specs": "",
diff --git a/examples/demo-plugin/package.json b/examples/demo-plugin/package.json
index a37a773e8..13f004b4e 100644
--- a/examples/demo-plugin/package.json
+++ b/examples/demo-plugin/package.json
@@ -1,12 +1,12 @@
 {
   "name": "demo-plugin",
-  "version": "20.13.3",
+  "version": "20.13.5",
   "private": true,
   "scripts": {
     "test:plugin": "detox test --configuration plugin -l verbose"
   },
   "devDependencies": {
-    "detox": "^20.13.3",
+    "detox": "^20.13.5",
     "jest": "^28.0.0"
   },
   "detox": {
diff --git a/examples/demo-react-native-detox-instruments/package.json b/examples/demo-react-native-detox-instruments/package.json
index 3a230f4a0..a47b77d55 100644
--- a/examples/demo-react-native-detox-instruments/package.json
+++ b/examples/demo-react-native-detox-instruments/package.json
@@ -1,10 +1,10 @@
 {
   "name": "demo-react-native-detox-instruments",
-  "version": "20.13.3",
+  "version": "20.13.5",
   "private": true,
   "scripts": {},
   "devDependencies": {
-    "detox": "^20.13.3"
+    "detox": "^20.13.5"
   },
   "detox": {
     "configurations": {
diff --git a/examples/demo-react-native/package.json b/examples/demo-react-native/package.json
index 0ac3f3f11..409d1f255 100644
--- a/examples/demo-react-native/package.json
+++ b/examples/demo-react-native/package.json
@@ -1,6 +1,6 @@
 {
   "name": "example",
-  "version": "20.13.3",
+  "version": "20.13.5",
   "private": true,
   "scripts": {
     "start": "react-native start",
@@ -32,7 +32,7 @@
     "@types/fs-extra": "^9.0.13",
     "@types/jest": "^29.2.1",
     "@types/react": "^18.0.24",
-    "detox": "^20.13.3",
+    "detox": "^20.13.5",
     "fs-extra": "^9.1.0",
     "jest": "^29.2.1",
     "ts-jest": "^29.0.3",
diff --git a/lerna.json b/lerna.json
index 3d71b4717..e5ebf3fbb 100644
--- a/lerna.json
+++ b/lerna.json
@@ -13,7 +13,7 @@
     "generation",
     "."
   ],
-  "version": "20.13.3",
+  "version": "20.13.5",
   "npmClient": "npm",
   "command": {
     "publish": {
diff --git a/package.json b/package.json
index f56e8d821..0c99489c7 100644
--- a/package.json
+++ b/package.json
@@ -54,5 +54,5 @@
     "shell-utils": "1.x.x",
     "unified": "^10.1.0"
   },
-  "version": "20.13.3"
+  "version": "20.13.5"
 }
diff --git a/website/src/components/Homepage/Features/Features.js b/website/src/components/Homepage/Features/Features.js
index f6f5af8fa..c92c363ab 100644
--- a/website/src/components/Homepage/Features/Features.js
+++ b/website/src/components/Homepage/Features/Features.js
@@ -1,13 +1,14 @@
 import React from 'react';
-import './Features.scss';
+import styles from './Features.module.scss';
+import clsx from 'clsx';
 
 const Features = ({ Svg, title, description }) => {
   return (
-    <div className="col col--4 features-gap">
-      <Svg className="feature-image" alt={title} />
+    <div className={clsx('col col--4', styles.featuresGap)}>
+      <Svg className={styles.featureImage} alt={title} />
       <div>
-        <h3>{title}</h3>
-        <p>{description}</p>
+        <h3 className={styles.featureTitle}>{title}</h3>
+        <p className={styles.featureText}>{description}</p>
       </div>
     </div>
   );
diff --git a/website/src/components/Homepage/Features/Features.module.scss b/website/src/components/Homepage/Features/Features.module.scss
new file mode 100644
index 000000000..481c49c12
--- /dev/null
+++ b/website/src/components/Homepage/Features/Features.module.scss
@@ -0,0 +1,52 @@
+@import '@site/src/css/fonts';
+
+.featuresGap {
+  --ifm-col-width: calc(1 / 3 * 100%);
+  margin-bottom: 91px;
+}
+
+.featureImage {
+  height: 60px;
+  width: 60px;
+  margin-bottom: 18px;
+}
+
+.featureTitle {
+  @include h5;
+  margin-bottom: 14px;
+  letter-spacing: -0.2px;
+}
+
+.featureText {
+  @include t2;
+  max-width: 256px;
+}
+
+@media only screen and (max-width: 996px) {
+  .featuresGap {
+    --ifm-col-width: 50%;
+  }
+}
+
+@media only screen and (max-width: 500px) {
+  .featuresGap {
+    --ifm-col-width: 100%;
+
+    margin-bottom: 29px;
+    padding-left: 25px;
+  }
+
+  .featureImage {
+    height: 45px;
+    width: 45px;
+    margin-bottom: 7px;
+  }
+
+  .featureTitle {
+    margin-bottom: 11px;
+  }
+
+  .featureText {
+    max-width: 290px;
+  }
+}
\ No newline at end of file
diff --git a/website/src/components/Homepage/Features/Features.scss b/website/src/components/Homepage/Features/Features.scss
deleted file mode 100644
index 3700d7fe9..000000000
--- a/website/src/components/Homepage/Features/Features.scss
+++ /dev/null
@@ -1,9 +0,0 @@
-.feature-image {
-  height: 60px;
-  width: 60px;
-  margin-bottom: 10px;
-}
-
-.features-gap {
-  margin-bottom: 100px;
-}
diff --git a/website/src/components/Homepage/Features/HomepageFeatures.js b/website/src/components/Homepage/Features/HomepageFeatures.js
index a4e934c1f..418045391 100644
--- a/website/src/components/Homepage/Features/HomepageFeatures.js
+++ b/website/src/components/Homepage/Features/HomepageFeatures.js
@@ -1,15 +1,16 @@
 import React from 'react';
 import styles from './HomepageFeatures.module.scss';
+import clsx from 'clsx';
 import FeatureList from './FeatureList';
 import Features from './Features';
 
 const HomepageFeatures = () => {
   return (
     <section>
-      <div className="container">
+      <div className={clsx('container', styles.benefitsHeader)}>
         <div className="row">
           <div className="col">
-            <h1 className={styles.benefitsHeader}>Detox benefits</h1>
+            <h1 className={styles.benefitsTitle}>Detox benefits</h1>
           </div>
         </div>
         <div className="row">
diff --git a/website/src/components/Homepage/Features/HomepageFeatures.module.scss b/website/src/components/Homepage/Features/HomepageFeatures.module.scss
index 6a87dd3cd..243818201 100644
--- a/website/src/components/Homepage/Features/HomepageFeatures.module.scss
+++ b/website/src/components/Homepage/Features/HomepageFeatures.module.scss
@@ -1,15 +1,23 @@
+@import '@site/src/css/fonts';
+
 .benefitsHeader {
-  font-family: 'Nunito Sans', sans-serif;
-  font-style: normal;
-  font-weight: 700;
-  font-size: 58px;
-  line-height: 70px;
-  color: #131419;
-  margin-top: 125px;
-  margin-bottom: 125px;
-  margin-left: -5px;
-}
+  margin-bottom: 24px;
 
-[data-theme='dark'] .benefitsHeader {
-  color: #ffffff;
+  @media only screen and (max-width: 1200px) {
+    --ifm-spacing-horizontal: 1.625rem;
+  }
 }
+
+.benefitsTitle {
+  @include h2;
+  color: var(--ifm-heading-color);
+  margin-top: 136px;
+  margin-bottom: 104px;
+  margin-left: -5px;
+
+  @media only screen and (max-width: 500px) {
+    font-size: 40px;
+    margin-top: 47px;
+    margin-bottom: 30px;
+  }
+}
\ No newline at end of file
diff --git a/website/src/components/Homepage/Header/HomepageHeader.module.scss b/website/src/components/Homepage/Header/HomepageHeader.module.scss
index dbcdee8bd..aa4f03527 100644
--- a/website/src/components/Homepage/Header/HomepageHeader.module.scss
+++ b/website/src/components/Homepage/Header/HomepageHeader.module.scss
@@ -4,8 +4,8 @@
   --ifm-heading-color: #fff;
 
   width: 100%;
-  height: calc(366px + 22vw);
-  padding: 54px 10px;
+  height: calc(357px + 23vw);
+  padding-top: 54px;
   min-height: 450px;
   max-height: 725px;
   overflow: hidden;
@@ -24,8 +24,13 @@
     background-size: 1100px;
   }
 
-  @media only screen and (max-width: 870px) {
-    padding: 32px 9px;
+  @media only screen and (max-width: 890px) {
+    padding-top: 32px;
+    padding-bottom: 32px;
+  }
+
+  @media only screen and (max-width: 1200px) {
+    --ifm-spacing-horizontal: 1.625rem;
   }
 
   @media only screen and (min-width: 1600px) {
@@ -42,7 +47,7 @@
   letter-spacing: -6px;
   margin-left: -10px;
 
-  @media only screen and (max-width: 870px) {
+  @media only screen and (max-width: 890px) {
     font-size: 72px;
     line-height: normal;
     letter-spacing: -3.6px;
@@ -52,14 +57,13 @@
 
 .tagline {
   @include t1;
-
   max-width: 450px;
   min-height: 60px;
   margin-top: -30px;
   margin-bottom: 32px;
   letter-spacing: 0.1px;
 
-  @media only screen and (max-width: 870px) {
+  @media only screen and (max-width: 890px) {
     margin-top: -22px;
     margin-bottom: 21px;
   }
@@ -71,8 +75,7 @@
 
 .linkText {
   @include t2;
-
-  font-family: 'Poppins';
+  font-size: 17px;
   color: var(--ifm-color-gray-900);
   background-color: var(--ifm-button-background-color);
   min-width: 250px;
diff --git a/website/src/components/Homepage/SubHeader/HomepageSubHeader.js b/website/src/components/Homepage/SubHeader/HomepageSubHeader.js
index 66c4d2ee9..b8cee7cb8 100644
--- a/website/src/components/Homepage/SubHeader/HomepageSubHeader.js
+++ b/website/src/components/Homepage/SubHeader/HomepageSubHeader.js
@@ -1,32 +1,37 @@
 import React from 'react';
+import clsx from 'clsx';
 import styles from './HomepageSubHeader.module.scss';
 
 const HomepageSubHeader = () => {
-  return (
-    <div className={styles.subHeader}>
-      <div className={styles.callToAction}>
-        <span>
-          Follow us on <strong>social networks:</strong>
-        </span>
+  return (<div className={styles.subHeaderWrapper}>
+      <div className='container'>
+        <div className='row'>
+          <div className={clsx('col', styles.subHeader)}>
+            <div className={styles.callToAction}>
+              <span>
+                Follow&nbsp;us&nbsp;on <strong>social&nbsp;networks:</strong>
+              </span>
+            </div>
+            <div className={styles.socialNetworks}>
+              <a className={styles.discordButton} href='https://discord.gg/CkD5QKheF5' target='_blank'></a>
+              <a className={styles.twitterButton} href='https://x.com/detoxe2e?s=20' target='_blank'>
+                <span className={styles.twitterLogo}></span>
+                <span className={styles.twitterFollowText}>Follow </span>
+                <span className={styles.twitterFollowId}>@detoxe2e</span>
+              </a>
+              <a className={styles.twitterCounter} href='https://x.com/detoxe2e?s=20' target='_blank'>
+                <span>486</span>
+                <span>&nbsp;followers</span>
+              </a>
+              <a className={styles.githubButton} href='https://github.com/wix/detox' target='_blank'></a>
+              <a className={styles.githubCounter} href='https://github.com/wix/detox/stargazers' target='_blank'>
+                <span>10,598</span>
+              </a>
+            </div>
+          </div>
+        </div>
       </div>
-      <div className={styles.socialNetworks}>
-        <a className={styles.discordButton} href="https://discord.gg/CkD5QKheF5" target="_blank"></a>
-        <a className={styles.twitterButton} href="https://x.com/detoxe2e?s=20" target="_blank">
-          <span className={styles.twitterLogo}></span>
-          <span className={styles.twitterFollowText}>Follow </span>
-          <span className={styles.twitterFollowId}>@detoxe2e</span>
-        </a>
-        <a className={styles.twitterCounter} href="https://x.com/detoxe2e?s=20" target="_blank">
-          <span>486</span>
-          <span>&nbsp;followers</span>
-        </a>
-        <a className={styles.githubButton} href="https://github.com/wix/detox" target="_blank"></a>
-        <a className={styles.githubCounter} href="https://github.com/wix/detox/stargazers" target="_blank">
-          <span>10,598</span>
-        </a>
-      </div>
-    </div>
-  );
+    </div>);
 };
 
 export default HomepageSubHeader;
diff --git a/website/src/components/Homepage/SubHeader/HomepageSubHeader.module.scss b/website/src/components/Homepage/SubHeader/HomepageSubHeader.module.scss
index f2de7e07f..80c44f329 100644
--- a/website/src/components/Homepage/SubHeader/HomepageSubHeader.module.scss
+++ b/website/src/components/Homepage/SubHeader/HomepageSubHeader.module.scss
@@ -1,41 +1,52 @@
-.subHeader {
+@import '@site/src/css/fonts';
+
+.subHeaderWrapper {
   background-color: #171b20;
-  color: var(--primary-dark-a-0, #FFF);
-  font-family: 'Nunito Sans', sans-serif;
-  font-style: normal;
-  font-weight: 300;
-  font-size: 24px;
   width: 100%;
+  color: #fff;
+
+  @media only screen and (max-width: 1200px) {
+    --ifm-spacing-horizontal: 1.625rem;
+  }
+}
+
+.subHeader {
   min-height: 85px;
   display: flex;
-  flex-wrap: wrap;
-  justify-content: space-around;
-  padding: 0 var(--ifm-spacing-horizontal);
+  justify-content: space-between;
 }
 
 .callToAction {
-  color: var(--primary-dark-a-0, #FFF);
+  @include h5;
+  font-weight: 300;
+  line-height: 35px;
+  color: #fff;
   display: flex;
   align-items: center;
   margin-right: 10px;
   flex-wrap: nowrap;
 
-  @media only screen and (max-width: 600px) {
+  @media only screen and (max-width: 570px) {
     font-size: 18px;
-    line-height: 24px;
+    line-height: 25px;
   }
 
   @media only screen and (max-width: 480px) {
     max-width: 140px;
-    margin-top: 20px;
+    margin-top: 16px;
     align-items: normal;
   }
+
+  @media only screen and (max-width: 370px) {
+    letter-spacing: -1px;
+  }
 }
 
 .socialNetworks {
   display: flex;
   align-items: center;
   margin: 20px 0;
+  @include t2;
 }
 
 .discordButton {
@@ -58,6 +69,7 @@
   display: inline-block;
   background-color: #1E9EEE;
   height: 45px;
+  line-height: 45px;
   width: 199px;
   border-radius: 10px;
   margin-right: 10px;
@@ -77,8 +89,7 @@
 
 .twitterFollowText,
 .twitterFollowId {
-  color: var(--primary-dark-a-0, #FFF);
-  font-size: 16px;
+  color: #fff;
 }
 
 .twitterFollowText {
@@ -93,10 +104,8 @@
   align-items: center;
   justify-content: center;
   border-radius: 5px;
-  background: var(--primary-dark-a-4, #313439);
-  color: var(--primary-dark-a-0, #FFF);
-  font-size: 16px;
-  line-height: 25px;
+  background: #313439;
+  color: #fff;
 
   @media only screen and (max-width: 1100px) {
     display: none;
@@ -119,10 +128,8 @@
   align-items: center;
   justify-content: center;
   border-radius: 5px;
-  background: var(--primary-dark-a-4, #313439);
-  color: var(--primary-dark-a-0, #FFF);
-  font-size: 16px;
-  line-height: 25px;
+  background: #313439;
+  color: #fff;
 
   @media only screen and (max-width: 950px) {
     display: none;
@@ -155,9 +162,9 @@
   }
 }
 
-@media only screen and (max-width: 870px) {
+@media only screen and (max-width: 890px) {
   .discordButton {
-    margin-right: 5px;
+    margin-right: 10px;
   }
 
   .twitterButton {
@@ -170,9 +177,11 @@
   }
 }
 
-@media only screen and (max-width: 750px) {
+@media only screen and (max-width: 780px) {
   .subHeader {
-    padding: 10px var(--ifm-spacing-horizontal);
+    padding-top: 10px;
+    padding-bottom: 10px;
+
   }
 
   .discordButton,
diff --git a/website/src/css/_fonts.scss b/website/src/css/_fonts.scss
index 907fb177e..d1fd21662 100644
--- a/website/src/css/_fonts.scss
+++ b/website/src/css/_fonts.scss
@@ -1,5 +1,4 @@
 @import url('https://fonts.googleapis.com/css2?family=Nunito+Sans:wght@300;700&display=swap');
-@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;600&display=swap');
 
 @mixin h1 {
   font: 80px/96px 'Nunito Sans', sans-serif;
@@ -35,4 +34,4 @@
 
 @mixin t3 {
   font: 400 13px/20px 'Nunito Sans', sans-serif;
-}
+}
\ No newline at end of file
diff --git a/website/src/css/_root.scss b/website/src/css/_root.scss
index 504c218a5..09a0736cb 100644
--- a/website/src/css/_root.scss
+++ b/website/src/css/_root.scss
@@ -36,7 +36,7 @@
   &[data-theme='light'] {
     @include define-detox-light-colors();
     --docusaurus-highlighted-code-line-bg: #d9e5f6;
-    --ifm-heading-color: #131419;
+    --ifm-heading-color: #12161B;
   }
 
   &[data-theme='dark'] {
diff --git a/website/static/img/homepage/cross-platform.svg b/website/static/img/homepage/cross-platform.svg
index 9d55ded84..46a816b92 100644
--- a/website/static/img/homepage/cross-platform.svg
+++ b/website/static/img/homepage/cross-platform.svg
@@ -1,8 +1,8 @@
-<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)"/>
+<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_6183)"/>
 <defs>
-<linearGradient id="paint0_linear_965_2940" x1="15.5" y1="4.03047" x2="38.0656" y2="53.9527" gradientUnits="userSpaceOnUse">
+<linearGradient id="paint0_linear_160_6183" 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>
diff --git a/website/static/img/homepage/sync.svg b/website/static/img/homepage/sync.svg
index 6f51539f0..07f7b98cf 100644
--- a/website/static/img/homepage/sync.svg
+++ b/website/static/img/homepage/sync.svg
@@ -1,10 +1,15 @@
-<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)"/>
+<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_6185)">
+<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_6185)"/>
+</g>
 <defs>
-<linearGradient id="paint0_linear_965_2945" x1="15.5" y1="8.2033" x2="39.6829" y2="59.5038" gradientUnits="userSpaceOnUse">
+<linearGradient id="paint0_linear_160_6185" 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_6185">
+<rect width="60" height="60" fill="white"/>
+</clipPath>
 </defs>
 </svg>
diff --git a/website/versioned_docs/version-20.x/introduction/preparing-for-ci.md b/website/versioned_docs/version-20.x/introduction/preparing-for-ci.md
index adcfcaee8..dff392115 100644
--- a/website/versioned_docs/version-20.x/introduction/preparing-for-ci.md
+++ b/website/versioned_docs/version-20.x/introduction/preparing-for-ci.md
@@ -172,9 +172,9 @@ detox_e2e:
     - mkdir -p /root/.android && touch /root/.android/repositories.cfg
     # The Dockerimage provides two paths for sdkmanager and avdmanager, which the defaults are from $ANDROID_HOME/cmdline-tools
     # That is not compatible with the one that Detox is using ($ANDROID_HOME/tools/bin)
-    - echo yes | $ANDROID_HOME/tools/bin/sdkmanager --channel=0 --verbose "system-images;android-27;default;x86_64"
+    - echo yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --channel=0 --verbose "system-images;android-27;default;x86_64" "emulator"
     # Nexus 6P, API 27, XXXHDPI
-    - echo no | $ANDROID_HOME/tools/bin/avdmanager --verbose create avd --force --name "Nexus6P" --package "system-images;android-27;default;x86_64" --sdcard 200M --device 11
+    - echo no | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager --verbose create avd --force --name "Nexus6P" --package "system-images;android-27;default;x86_64" --sdcard 200M --device 11
     - adb start-server
   script:
     - npx detox build -c android.emu.release.ci


Test patch:
diff --git a/detox/local-cli/test.test.js b/detox/local-cli/test.test.js
index c29ce5995..4c86cfca1 100644
--- a/detox/local-cli/test.test.js
+++ b/detox/local-cli/test.test.js
@@ -5,6 +5,7 @@ if (process.platform === 'win32') {
 
 jest.mock('../src/logger/DetoxLogger');
 jest.mock('./utils/jestInternals');
+jest.mock('./utils/interruptListeners');
 
 const cp = require('child_process');
 const cpSpawn = cp.spawn;
@@ -18,6 +19,8 @@ const { buildMockCommand, callCli } = require('../__tests__/helpers');
 
 const { DEVICE_LAUNCH_ARGS_DEPRECATION } = require('./testCommand/warnings');
 
+const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
+
 describe('CLI', () => {
   let _env;
   let logger;
@@ -143,6 +146,38 @@ describe('CLI', () => {
     });
   });
 
+  describe('detached runner', () => {
+    beforeEach(() => {
+      detoxConfig.testRunner.detached = true;
+    });
+
+    test('should be able to run as you would normally expect', async () => {
+      await run();
+      expect(_.last(cliCall().argv)).toEqual('e2e/config.json');
+    });
+
+    test('should intercept SIGINT and SIGTERM', async () => {
+      const { subscribe, unsubscribe } = jest.requireMock('./utils/interruptListeners');
+      const simulateSIGINT = () => subscribe.mock.calls[0][0]();
+
+      mockExitCode(1);
+      mockLongRun(2000);
+
+      await Promise.all([
+        run('--retries 2').catch(_.noop),
+        sleep(1000).then(() => {
+          simulateSIGINT();
+          simulateSIGINT();
+          expect(unsubscribe).not.toHaveBeenCalled();
+        }),
+      ]);
+
+      expect(unsubscribe).toHaveBeenCalled();
+      expect(cliCall(0)).not.toBe(null);
+      expect(cliCall(1)).toBe(null);
+    });
+  });
+
   test('should use testRunner.args._ as default specs', async () => {
     detoxConfig.testRunner.args._ = ['e2e/sanity'];
     await run();
@@ -620,4 +655,9 @@ describe('CLI', () => {
     mockExecutable.options.exitCode = code;
     detoxConfig.testRunner.args.$0 = mockExecutable.cmd;
   }
+
+  function mockLongRun(ms) {
+    mockExecutable.options.sleep = ms;
+    detoxConfig.testRunner.args.$0 = mockExecutable.cmd;
+  }
 });
diff --git a/detox/local-cli/testCommand/TestRunnerCommand.js b/detox/local-cli/testCommand/TestRunnerCommand.js
index fcf453473..e24fb64db 100644
--- a/detox/local-cli/testCommand/TestRunnerCommand.js
+++ b/detox/local-cli/testCommand/TestRunnerCommand.js
@@ -12,6 +12,7 @@ const { escapeSpaces, useForwardSlashes } = require('../../src/utils/shellUtils'
 const sleep = require('../../src/utils/sleep');
 const AppStartCommand = require('../startCommand/AppStartCommand');
 const { markErrorAsLogged } = require('../utils/cliErrorHandling');
+const interruptListeners = require('../utils/interruptListeners');
 
 const TestRunnerError = require('./TestRunnerError');
 
@@ -28,10 +29,12 @@ class TestRunnerCommand {
     const appsConfig = opts.config.apps;
 
     this._argv = runnerConfig.args;
+    this._detached = runnerConfig.detached;
     this._retries = runnerConfig.retries;
     this._envHint = this._buildEnvHint(opts.env);
     this._startCommands = this._prepareStartCommands(appsConfig, cliConfig);
     this._envFwd = {};
+    this._terminating = false;
 
     if (runnerConfig.forwardEnv) {
       this._envFwd = this._buildEnvOverride(cliConfig, deviceConfig);
@@ -59,16 +62,20 @@ class TestRunnerCommand {
       } catch (e) {
         launchError = e;
 
+        if (this._terminating) {
+          runsLeft = 0;
+        }
+
         const failedTestFiles = detox.session.testResults.filter(r => !r.success);
 
         const { bail } = detox.config.testRunner;
         if (bail && failedTestFiles.some(r => r.isPermanentFailure)) {
-          throw e;
+          runsLeft = 0;
         }
 
         const testFilesToRetry = failedTestFiles.filter(r => !r.isPermanentFailure).map(r => r.testFilePath);
-        if (_.isEmpty(testFilesToRetry)) {
-          throw e;
+        if (testFilesToRetry.length === 0) {
+          runsLeft = 0;
         }
 
         if (--runsLeft > 0) {
@@ -143,6 +150,15 @@ class TestRunnerCommand {
     }, _.isUndefined);
   }
 
+  _onTerminate = () => {
+    if (this._terminating) {
+      return;
+    }
+
+    this._terminating = true;
+    return detox.unsafe_conductEarlyTeardown(true);
+  };
+
   async _spawnTestRunner() {
     const fullCommand = this._buildSpawnArguments().map(escapeSpaces);
     const fullCommandWithHint = printEnvironmentVariables(this._envHint) + fullCommand.join(' ');
@@ -153,6 +169,7 @@ class TestRunnerCommand {
       cp.spawn(fullCommand[0], fullCommand.slice(1), {
         shell: true,
         stdio: 'inherit',
+        detached: this._detached,
         env: _({})
           .assign(process.env)
           .assign(this._envFwd)
@@ -162,6 +179,8 @@ class TestRunnerCommand {
       })
         .on('error', /* istanbul ignore next */ (err) => reject(err))
         .on('exit', (code, signal) => {
+          interruptListeners.unsubscribe(this._onTerminate);
+
           if (code === 0) {
             log.trace.end({ success: true });
             resolve();
@@ -175,6 +194,10 @@ class TestRunnerCommand {
             reject(markErrorAsLogged(error));
           }
         });
+
+      if (this._detached) {
+        interruptListeners.subscribe(this._onTerminate);
+      }
     });
   }
 
diff --git a/detox/runners/jest/testEnvironment/index.js b/detox/runners/jest/testEnvironment/index.js
index cddafe5e8..9418a65ed 100644
--- a/detox/runners/jest/testEnvironment/index.js
+++ b/detox/runners/jest/testEnvironment/index.js
@@ -73,7 +73,9 @@ class DetoxCircusEnvironment extends NodeEnvironment {
   // @ts-expect-error TS2425
   async handleTestEvent(event, state) {
     if (detox.session.unsafe_earlyTeardown) {
-      throw new Error('Detox halted test execution due to an early teardown request');
+      if (event.name === 'test_fn_start' || event.name === 'hook_start') {
+        throw new Error('Detox halted test execution due to an early teardown request');
+      }
     }
 
     this._timer.schedule(state.testTimeout != null ? state.testTimeout : this.setupTimeout);
@@ -107,6 +109,10 @@ class DetoxCircusEnvironment extends NodeEnvironment {
    * @protected
    */
   async initDetox() {
+    if (detox.session.unsafe_earlyTeardown) {
+      throw new Error('Detox halted test execution due to an early teardown request');
+    }
+
     const opts = {
       global: this.global,
       workerId: `w${process.env.JEST_WORKER_ID}`,
diff --git a/detox/src/configuration/composeRunnerConfig.test.js b/detox/src/configuration/composeRunnerConfig.test.js
index 958fe04aa..84bfc5450 100644
--- a/detox/src/configuration/composeRunnerConfig.test.js
+++ b/detox/src/configuration/composeRunnerConfig.test.js
@@ -46,6 +46,7 @@ describe('composeRunnerConfig', () => {
       },
       retries: 0,
       bail: false,
+      detached: false,
       forwardEnv: false,
     });
   });
@@ -60,6 +61,7 @@ describe('composeRunnerConfig', () => {
       },
       bail: true,
       retries: 1,
+      detached: true,
       forwardEnv: true,
     };
 
@@ -77,6 +79,7 @@ describe('composeRunnerConfig', () => {
       },
       bail: true,
       retries: 1,
+      detached: true,
       forwardEnv: true,
     });
   });
@@ -92,6 +95,7 @@ describe('composeRunnerConfig', () => {
       },
       bail: true,
       retries: 1,
+      detached: true,
       forwardEnv: true,
     };
 
@@ -109,6 +113,7 @@ describe('composeRunnerConfig', () => {
       },
       bail: true,
       retries: 1,
+      detached: true,
       forwardEnv: true,
     });
   });
@@ -222,6 +227,7 @@ describe('composeRunnerConfig', () => {
         reportSpecs: true,
       },
       bail: true,
+      detached: true,
       retries: 1,
     };
 
@@ -236,6 +242,7 @@ describe('composeRunnerConfig', () => {
         reportSpecs: false,
       },
       bail: false,
+      detached: false,
       retries: 3,
     };
 
@@ -256,6 +263,7 @@ describe('composeRunnerConfig', () => {
         reportWorkerAssign: true,
       },
       bail: false,
+      detached: false,
       retries: 3,
       forwardEnv: false,
     });
diff --git a/detox/src/ipc/ipc.test.js b/detox/src/ipc/ipc.test.js
index 4414935ff..29f70758b 100644
--- a/detox/src/ipc/ipc.test.js
+++ b/detox/src/ipc/ipc.test.js
@@ -129,6 +129,36 @@ describe('IPC', () => {
       });
     });
 
+    describe('conductEarlyTeardown', () => {
+      beforeEach(() => ipcServer.init());
+
+      describe('(permanent)', () => {
+        beforeEach(() => ipcServer.onConductEarlyTeardown({ permanent: true }));
+
+        it('should change the session state', async () => {
+          expect(ipcServer.sessionState.unsafe_earlyTeardown).toEqual(true);
+        });
+
+        it('should pass the session state to the client', async () => {
+          await ipcClient1.init();
+          expect(ipcClient1.sessionState.unsafe_earlyTeardown).toEqual(true);
+        });
+      });
+
+      describe('(transient)', () => {
+        beforeEach(() => ipcServer.onConductEarlyTeardown({ permanent: false }));
+
+        it('should not change the session state', async () => {
+          expect(ipcServer.sessionState.unsafe_earlyTeardown).toBe(undefined);
+        });
+
+        it('should not pass the session state to the client', async () => {
+          await ipcClient1.init();
+          expect(ipcClient1.sessionState.unsafe_earlyTeardown).toBe(undefined);
+        });
+      });
+    });
+
     describe('dispose()', () => {
       it('should resolve if there are no connected clients', async () => {
         await ipcServer.init();
@@ -278,7 +308,7 @@ describe('IPC', () => {
           expect(ipcClient1.sessionState).toEqual(expect.objectContaining({ unsafe_earlyTeardown: undefined }));
           expect(ipcClient2.sessionState).toEqual(expect.objectContaining({ unsafe_earlyTeardown: undefined }));
 
-          await ipcClient1.conductEarlyTeardown();
+          await ipcClient1.conductEarlyTeardown({ permanent: false });
           expect(ipcClient1.sessionState).toEqual(expect.objectContaining({ unsafe_earlyTeardown: true }));
           await sleep(10); // broadcasting might happen with a delay
           expect(ipcClient2.sessionState).toEqual(expect.objectContaining({ unsafe_earlyTeardown: true }));
@@ -287,7 +317,7 @@ describe('IPC', () => {
         it('should broadcast early teardown in all connected clients (from server)', async () => {
           expect(ipcClient1.sessionState).toEqual(expect.objectContaining({ unsafe_earlyTeardown: undefined }));
           expect(ipcClient2.sessionState).toEqual(expect.objectContaining({ unsafe_earlyTeardown: undefined }));
-          await ipcServer.onConductEarlyTeardown();
+          await ipcServer.onConductEarlyTeardown({ permanent: false });
           await sleep(10); // broadcasting might happen with a delay
           expect(ipcClient1.sessionState).toEqual(expect.objectContaining({ unsafe_earlyTeardown: true }));
           expect(ipcClient2.sessionState).toEqual(expect.objectContaining({ unsafe_earlyTeardown: true }));
diff --git a/detox/test/e2e/detox.config.js b/detox/test/e2e/detox.config.js
index bd6a5a4c5..84a2a367b 100644
--- a/detox/test/e2e/detox.config.js
+++ b/detox/test/e2e/detox.config.js
@@ -12,8 +12,10 @@ const config = {
     args: {
       $0: 'nyc jest',
       config: 'e2e/jest.config.js',
-      _: ['e2e/']
+      forceExit: process.env.CI ? true : undefined,
+      _: ['e2e/'],
     },
+    detached: !!process.env.CI,
     retries: process.env.CI ? 1 : undefined,
     jest: {
       setupTimeout: +`${process.env.DETOX_JEST_SETUP_TIMEOUT || 300000}`,
diff --git a/detox/test/integration/jest.config.js b/detox/test/integration/jest.config.js
index 680626e0f..019df7af4 100644
--- a/detox/test/integration/jest.config.js
+++ b/detox/test/integration/jest.config.js
@@ -1,3 +1,5 @@
+process.env.CI = ''; // disable CI-specific behavior for integration tests
+
 module.exports = {
   "maxWorkers": 1,
   "testMatch": ["<rootDir>/*.test.js"],
diff --git a/detox/test/package.json b/detox/test/package.json
index b70bedccc..4325ea657 100644
--- a/detox/test/package.json
+++ b/detox/test/package.json
@@ -1,6 +1,6 @@
 {
   "name": "detox-test",
-  "version": "20.13.3",
+  "version": "20.13.5",
   "private": true,
   "engines": {
     "node": ">=14.5.0"
@@ -56,7 +56,7 @@
     "@typescript-eslint/eslint-plugin": "^5.4.0",
     "@typescript-eslint/parser": "^5.4.0",
     "cross-env": "^7.0.3",
-    "detox": "^20.13.3",
+    "detox": "^20.13.5",
     "eslint": "^8.41.0",
     "eslint-plugin-unicorn": "^47.0.0",
     "execa": "^5.1.1",
diff --git a/docs/config/testRunner.mdx b/docs/config/testRunner.mdx
index ca7638d5f..524f5d2c1 100644
--- a/docs/config/testRunner.mdx
+++ b/docs/config/testRunner.mdx
@@ -142,6 +142,16 @@ Default: `false`.
 When true, tells `detox test` to cancel next retrying if it gets at least one report about a [permanent test suite failure](../api/internals.mdx#reporting-test-results).
 Has no effect, if [`testRunner.retries`] is undefined or set to zero.
 
+### `testRunner.detached` \[boolean]
+
+Default: `false`.
+
+When true, tells `detox test` to spawn the test runner in a detached mode.
+
+This is useful in CI environments, where you want to intercept SIGINT and SIGTERM signals to gracefully shut down the test runner and the device.
+
+Instead of passing the kill signal to the child process (the test runner), Detox will send an emergency shutdown request to all the workers, and then it will wait for them to finish.
+
 ### `testRunner.forwardEnv` \[boolean]
 
 Default: `false`.