diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 7bb661ebb604059274ba9e29965d435f252ca90f..cb2e2a6e84308004c509c43f9f4f4eb552cf9457 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -36,11 +36,12 @@ build project:
     - composer config --global repositories.template path $CI_PROJECT_DIR/project_template
     # Create the project.
     - composer create-project drupal/drupal-cms-project $BUILD_DIR --stability=dev
-    # Until they are available on Packagist, the recipes and installer need to NOT
+    # Until they are available on Packagist, the various components need to NOT
     # be managed by Composer at all.
     - .ddev/commands/web/unpack $BUILD_DIR
     - cd $BUILD_DIR/$_WEB_ROOT
     - mkdir -p ./profiles/contrib && mv $CI_PROJECT_DIR/drupal_cms_installer ./profiles/contrib
+    - mkdir -p ./themes/contrib && mv $CI_PROJECT_DIR/drupal_cms_olivero ./themes/contrib
     - mkdir recipes && mv $CI_PROJECT_DIR/drupal_cms* recipes
     # Turn the built project into an archive that can be downloaded by the public
     # to spin up projects with Drupal CMS.
diff --git a/CODEOWNERS b/CODEOWNERS
index 832d81cab8580b7056a7276be35b197a8da4f0fc..f7c7aa7f58e848c3cf7ae40946b67ee95c70cff9 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -39,9 +39,11 @@
 [contact form track] @artinruins
 /drupal_cms_forms/
 
+[front-end theme] @mherchel
+/drupal_cms_olivero/
+
 # No track leads identified yet...
 # /drupal_cms_anti_spam/
-# /drupal_cms_workflows/
 
 [SEO track] @thejimbirch @doylejd
 /drupal_cms_seo_basic/
diff --git a/drupal_cms/composer.json b/drupal_cms/composer.json
index ef6e981a2681c7fdaa15f54fbff94a435102345d..a80d214cf78c801215861b89683b564243d62835 100644
--- a/drupal_cms/composer.json
+++ b/drupal_cms/composer.json
@@ -14,6 +14,7 @@
         "drupal/drupal_cms_full_html_editor": "*",
         "drupal/drupal_cms_image_media_type": "*",
         "drupal/drupal_cms_media_tools": "*",
+        "drupal/drupal_cms_olivero": "*",
         "drupal/drupal_cms_seo_basic": "*",
         "drupal/drupal_cms_dashboard": "*",
         "drupal/eca": "2.1.x-dev",
diff --git a/drupal_cms/recipe.yml b/drupal_cms/recipe.yml
index 50874039dd2e618c8cfdf1cae10b6b2a002f68a4..e5a8246bac9fedac519055a9ac8f8aec1e490174 100644
--- a/drupal_cms/recipe.yml
+++ b/drupal_cms/recipe.yml
@@ -29,6 +29,7 @@ install:
   - automatic_updates
   - automatic_updates_extensions
   - bpmn_io
+  - drupal_cms_olivero
   - eca_base
   - eca_misc
   - eca_user
diff --git a/drupal_cms_olivero/composer.json b/drupal_cms_olivero/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..7152d88e5f57bca3ae6c20fca751a28b03d3bad7
--- /dev/null
+++ b/drupal_cms_olivero/composer.json
@@ -0,0 +1,8 @@
+{
+    "name": "drupal/drupal_cms_olivero",
+    "version": "dev-main",
+    "type": "drupal-theme",
+    "require": {
+        "drupal/core": "^10"
+    }
+}
diff --git a/drupal_cms_olivero/drupal_cms_olivero.info.yml b/drupal_cms_olivero/drupal_cms_olivero.info.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f36886321d7a47e652cc386d680b8666ff5fb05e
--- /dev/null
+++ b/drupal_cms_olivero/drupal_cms_olivero.info.yml
@@ -0,0 +1,4 @@
+name: 'Olivero for Drupal CMS'
+type: theme
+base theme: olivero
+core_version_requirement: ^10