diff --git a/.env.dist b/.env.dist
index 6610908ad8..93b6c07234 100644
--- a/.env.dist
+++ b/.env.dist
@@ -26,6 +26,8 @@ APP_ENCRYPT_METHOD='{{APP_ENCRYPT_METHOD}}'
 
 APP_LOCALE='en_US'
 
+APP_CUSTOM_VUE_TEMPLATE='0'
+
 APP_MULTIPLE_ACCESS_URL=''
 
 GOOGLE_MAPS_API_KEY=''
diff --git a/assets/vue/App.vue b/assets/vue/App.vue
index d7185423f1..f56895a5ae 100644
--- a/assets/vue/App.vue
+++ b/assets/vue/App.vue
@@ -52,6 +52,8 @@ import Toast from "primevue/toast"
 import { useNotification } from "./composables/notification"
 import { useLocale } from "./composables/locale"
 import { useI18n } from "vue-i18n"
+import { customVueTemplateEnabled } from "./config/env"
+import CustomDashboardLayout from "../../var/vue_templates/components/layout/DashboardLayout.vue"
 
 const apolloClient = new ApolloClient({
   link: createHttpLink({
@@ -73,6 +75,10 @@ const layout = computed(() => {
     return "EmptyLayout"
   }
 
+  if (customVueTemplateEnabled) {
+    return CustomDashboardLayout
+  }
+
   return `${router.currentRoute.value.meta.layout ?? "Dashboard"}Layout`
 })
 
diff --git a/assets/vue/config/env.js b/assets/vue/config/env.js
new file mode 100644
index 0000000000..d25db99644
--- /dev/null
+++ b/assets/vue/config/env.js
@@ -0,0 +1 @@
+export const customVueTemplateEnabled = '1' === ENV_CUSTOM_VUE_TEMPLATE
diff --git a/assets/vue/pages/Index.vue b/assets/vue/pages/AppIndex.vue
similarity index 100%
rename from assets/vue/pages/Index.vue
rename to assets/vue/pages/AppIndex.vue
diff --git a/assets/vue/router/index.js b/assets/vue/router/index.js
index 368dcbbd80..449845fb64 100644
--- a/assets/vue/router/index.js
+++ b/assets/vue/router/index.js
@@ -27,7 +27,8 @@ import MyCoursesLayout from "../layouts/MyCourses.vue"
 
 import CourseHome from "../views/course/CourseHome.vue"
 
-import Index from "../pages/Index.vue"
+import AppIndex from "../pages/AppIndex.vue"
+import CustomAppIndex from "../../../var/vue_templates/pages/AppIndex.vue"
 import Home from "../pages/Home.vue"
 import Login from "../pages/Login.vue"
 import Faq from "../pages/Faq.vue"
@@ -38,6 +39,7 @@ import courseService from "../services/courseService"
 
 import catalogueCourses from "./cataloguecourses"
 import catalogueSessions from "./cataloguesessions"
+import { customVueTemplateEnabled } from "../config/env"
 
 const router = createRouter({
   history: createWebHistory(),
@@ -45,7 +47,7 @@ const router = createRouter({
     {
       path: "/",
       name: "Index",
-      component: Index,
+      component: customVueTemplateEnabled ? CustomAppIndex : AppIndex,
       meta: {
         requiresAuth: false,
         showBreadcrumb: false,
diff --git a/var/vue_templates/.gitkeep b/var/vue_templates/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/var/vue_templates/components/SidebarLogin.vue b/var/vue_templates/components/SidebarLogin.vue
new file mode 100644
index 0000000000..639b7c71d2
--- /dev/null
+++ b/var/vue_templates/components/SidebarLogin.vue
@@ -0,0 +1,116 @@
+
+
+
+  
+
+
+
diff --git a/var/vue_templates/components/layout/DashboardLayout.vue b/var/vue_templates/components/layout/DashboardLayout.vue
new file mode 100644
index 0000000000..53a20421de
--- /dev/null
+++ b/var/vue_templates/components/layout/DashboardLayout.vue
@@ -0,0 +1,24 @@
+
+
+
+  
+  
+  
+  
+    
+    
+  
+
diff --git a/var/vue_templates/components/layout/SidebarNotLoggedIn.vue b/var/vue_templates/components/layout/SidebarNotLoggedIn.vue
new file mode 100644
index 0000000000..536c6962a3
--- /dev/null
+++ b/var/vue_templates/components/layout/SidebarNotLoggedIn.vue
@@ -0,0 +1,144 @@
+
+
+
+  
+
diff --git a/var/vue_templates/components/layout/Topbar.vue b/var/vue_templates/components/layout/Topbar.vue
new file mode 100644
index 0000000000..1a1d21e709
--- /dev/null
+++ b/var/vue_templates/components/layout/Topbar.vue
@@ -0,0 +1,15 @@
+
+
+
+  
+  
+
diff --git a/var/vue_templates/components/layout/TopbarNotLoggedIn.vue b/var/vue_templates/components/layout/TopbarNotLoggedIn.vue
new file mode 100644
index 0000000000..dce861bdd8
--- /dev/null
+++ b/var/vue_templates/components/layout/TopbarNotLoggedIn.vue
@@ -0,0 +1,29 @@
+
+
+
+  
+    
+      
+        
+      
+    
+  
 
+
+
+
diff --git a/var/vue_templates/pages/AppIndex.vue b/var/vue_templates/pages/AppIndex.vue
new file mode 100644
index 0000000000..541c7abc40
--- /dev/null
+++ b/var/vue_templates/pages/AppIndex.vue
@@ -0,0 +1,39 @@
+
+
+
+  
+
diff --git a/webpack.config.js b/webpack.config.js
index b27eaf0712..8c90fd6e78 100755
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -1,4 +1,8 @@
 const Encore = require("@symfony/webpack-encore")
+const dotenv = require('dotenv');
+const webpack = require('webpack');
+
+const env = dotenv.config()
 
 if (!Encore.isRuntimeEnvironmentConfigured()) {
   Encore.configureRuntimeEnvironment(process.env.NODE_ENV || "dev")
@@ -99,6 +103,11 @@ Encore.setOutputPath("public/build/")
         to: 'libs/mathjax/MathJax.js'
     },*/
   ])
+  .addPlugin(
+    new webpack.DefinePlugin({
+      'ENV_CUSTOM_VUE_TEMPLATE': JSON.stringify(env.parsed?.APP_CUSTOM_VUE_TEMPLATE),
+    })
+  )
 
 Encore.copyFiles({
   from: "./node_modules/mediaelement/build",