diff --git a/.ahoy.l3d.yml b/.ahoy.l3d.yml
index de2b7690741c1b2762b16084ac2b9fd5f6ab50e6..6cc76c43c8ed70218469d643d2d9e125341241e7 100644
--- a/.ahoy.l3d.yml
+++ b/.ahoy.l3d.yml
@@ -24,3 +24,7 @@ commands:
     imports:
       - ahoy.cypress.yml
     usage: Cypress
+  unlighthouse:
+    imports:
+      - ahoy.unlighthouse.yml
+    usage: Unlighthouse
diff --git a/ahoy.unlighthouse.yml b/ahoy.unlighthouse.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c7b28d9161a7abd9b008581ee6499d25d4b3f9a0
--- /dev/null
+++ b/ahoy.unlighthouse.yml
@@ -0,0 +1,18 @@
+ahoyapi: v2
+commands:
+  on:
+    cmd: |
+      UNLIGHTHOUSE=1
+      echo "UNLIGHTHOUSE=1" >>.env
+      env -i $(cat .env | xargs) >.env
+      composer lakedrops:docker4drupal --no-interaction
+      ahoy d4d up unlighthouse
+    usage: Turn on Unlighthouse
+  off:
+    cmd: |
+      UNLIGHTHOUSE=0
+      echo "UNLIGHTHOUSE=0" >>.env
+      env -i $(cat .env | xargs) >.env
+      composer lakedrops:docker4drupal --no-interaction
+      ahoy d4d stop unlighthouse
+    usage: Turn off Unlighthouse
diff --git a/src/Handler.php b/src/Handler.php
index 3e7d82f6d15fbc4ce801e72f375c680f7838ee99..128760e447a8c17c97d3984bd2448b75bfe9bd62 100644
--- a/src/Handler.php
+++ b/src/Handler.php
@@ -201,6 +201,9 @@ class Handler extends BaseHandler {
         'enable' => $this->env->receiveGlobal('CYPRESS', 'Cypress', '0'),
         'version' => 'latest',
       ],
+      'unlighthouse' => [
+        'enable' => $this->env->receiveGlobal('UNLIGHTHOUSE', 'Unlighthouse', '0'),
+      ],
     ];
   }
 
@@ -230,6 +233,7 @@ class Handler extends BaseHandler {
     $this->config->setValue('projectroot', $projectRoot, FALSE);
     $this->config->setValue('projectdomain', str_replace('_', '-', $this->config->readValue('projectname')) . '.' . $traefik['domain'], FALSE);
     $this->config->setValue('projectprotocol', 'http' . ($traefik['usessl'] ? 's' : ''), FALSE);
+    $this->config->setValue('socketprotocol', 'ws' . ($traefik['usessl'] ? 's' : ''), FALSE);
     $projectport = '';
     if ($traefik['usessl'] && (int) $traefik['ports'] !== 443) {
       $projectport = ':' . $traefik['ports'];
@@ -344,6 +348,7 @@ class Handler extends BaseHandler {
           'projectdomain' => str_replace('_', '-', $this->config->readValue('domain') ?? ''),
           'projectprotocol' => 'https',
           'projectport' => '',
+          'socketprotocol' => 'wss',
           'extradomains' => $this->config->readValue('aliases') ?? [],
         ];
         foreach ($overwriteConfig as $key => $value) {
@@ -489,6 +494,9 @@ class Handler extends BaseHandler {
     $this->gitIgnore('tests/cypress/screenshots');
     $this->gitIgnore('tests/cypress/videos');
 
+    // Ignore some Unlighthouse directories
+    $this->gitIgnore('tests/unlighthouse');
+
     if (getenv('LAKEDROPS_BUILD_NG') !== 'yes') {
       $this->updateTraefik();
     }
@@ -626,6 +634,11 @@ class Handler extends BaseHandler {
       'dest' => $projectRoot . '/tests/cypress/support',
       'add2git' => TRUE,
     ];
+    $files['unlighthouse.config.ts'] = [
+      'source' => 'tests/',
+      'dest' => $projectRoot . '/tests',
+      'add2git' => FALSE,
+    ];
     if (getenv('LAKEDROPS_BUILD_NG') === 'yes') {
       if ($this->config->readValue(['backup', 'enable'])) {
         $files['config.yaml'] = [
diff --git a/templates/docker-compose.yml.twig b/templates/docker-compose.yml.twig
index 9fdac5c5f00db3a487f7f965c74da1bee7fe435e..d02410e808ee1fe01afc97e7be5e5814785698c3 100644
--- a/templates/docker-compose.yml.twig
+++ b/templates/docker-compose.yml.twig
@@ -570,3 +570,28 @@ services:
     user: '1000:{{ docker_group_id }}'
 {% endif %}
 {% endif %}
+{% if unlighthouse.enable|default(0) %}
+
+  unlighthouse:
+    image: 'registry.lakedrops.com/docker/unlighthouse:latest'
+    restart: unless-stopped
+    networks:
+      - traefik-public
+      - default
+    volumes:
+      - /etc/timezone:/etc/timezone:ro
+      - /etc/localtime:/etc/localtime:ro
+      - {{ projectroot }}/tests/unlighthouse/:/data/.unlighthouse
+      - {{ projectroot }}/tests/unlighthouse.config.ts:/data/unlighthouse.config.ts
+    working_dir: /data
+    user: root
+    labels:
+      traefik.enable: 'true'
+      traefik.docker.network: traefik-public
+      traefik.http.services.{{ projectname }}_unlighthouse.loadbalancer.server.port: 5678
+      traefik.http.routers.unlighthouse-{{ projectname }}.rule: Host(`{{ projectdomain }}`)
+{% if drupal.live|default(0) or traefik.usessl %}
+      traefik.http.routers.unlighthouse-{{ projectname }}.tls: 'true'
+      traefik.http.routers.unlighthouse-{{ projectname }}.tls.certresolver: lakedrops
+{% endif %}
+{% endif %}
diff --git a/templates/tests/unlighthouse.config.ts b/templates/tests/unlighthouse.config.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4b83077255cbd956df8d3f8e42a0e3c613551651
--- /dev/null
+++ b/templates/tests/unlighthouse.config.ts
@@ -0,0 +1,13 @@
+export default {
+    puppeteerOptions: {
+        args: ["--no-sandbox"],
+    },
+    server: {
+        open: false,
+    },
+    site: "{{ projectprotocol }}://{{ projectdomain }}",
+    serverUrl: "{{ projectprotocol }}:/unlighthouse-{{ projectdomain }}/",
+    clientUrl: "{{ projectprotocol }}://unlighthouse-{{ projectdomain }}/",
+    apiUrl: "{{ projectprotocol }}://unlighthouse-{{ projectdomain }}/api",
+    websocketUrl: "{{ socketprotocol }}://unlighthouse-{{ projectdomain }}/api/ws",
+}