+  
+    
+      
+    
+
+    
+
+    
+
+    
+      
+        {{ copyProjectId }}
+      
+    
+
+    
+  
+
diff --git a/app/assets/javascripts/pages/projects/home_panel/index.js b/app/assets/javascripts/pages/projects/home_panel/index.js
new file mode 100644
index 00000000000..071d3d81b7e
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/home_panel/index.js
@@ -0,0 +1,106 @@
+import { GlToast } from '@gitlab/ui';
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createDefaultClient from '~/lib/graphql';
+
+import { parseBoolean } from '~/lib/utils/common_utils';
+import HomePanel from './components/home_panel.vue';
+
+Vue.use(GlToast);
+Vue.use(VueApollo);
+
+const apolloProvider = new VueApollo({
+  defaultClient: createDefaultClient(),
+});
+
+const initHomePanel = () => {
+  const container = document.getElementById('js-home-panel');
+
+  if (container === null) {
+    return null;
+  }
+
+  const {
+    // HomePanel component
+    canReadProject,
+    isProjectEmpty,
+    projectId,
+
+    // Dropdown component
+    isGroup,
+    leaveConfirmMessage,
+    leavePath,
+    requestAccessPath,
+    withdrawConfirmMessage,
+    withdrawPath,
+
+    // Fork component
+    canCreateFork,
+    canForkProject,
+    canReadCode,
+    forksCount,
+    newForkUrl,
+    projectForksUrl,
+    projectFullPath,
+    userForkUrl,
+
+    // Notification component
+    emailsDisabled,
+    notificationDropdownItems,
+    notificationHelpPagePath,
+    notificationLevel,
+
+    // Star component
+    signInPath,
+    starCount,
+    starred,
+    starrersPath,
+  } = container.dataset;
+
+  return new Vue({
+    apolloProvider,
+    el: container,
+    name: 'HomePanelRoot',
+    provide: {
+      // HomePanel component
+      canReadProject: parseBoolean(canReadProject),
+      isProjectEmpty: parseBoolean(isProjectEmpty),
+      projectId,
+
+      // Dropdown component
+      groupOrProjectId: projectId,
+      isGroup: parseBoolean(isGroup),
+      leaveConfirmMessage,
+      leavePath,
+      requestAccessPath,
+      withdrawConfirmMessage,
+      withdrawPath,
+
+      // Fork component
+      canCreateFork: parseBoolean(canCreateFork),
+      canForkProject: parseBoolean(canForkProject),
+      canReadCode: parseBoolean(canReadCode),
+      forksCount: parseInt(forksCount, 10) || 0,
+      newForkUrl,
+      projectForksUrl,
+      projectFullPath,
+      userForkUrl,
+
+      // Notification component
+      dropdownItems: JSON.parse(notificationDropdownItems || null),
+      emailsDisabled: parseBoolean(emailsDisabled),
+      helpPagePath: notificationHelpPagePath,
+      initialNotificationLevel: notificationLevel,
+      noFlip: true,
+
+      // Star component
+      signInPath,
+      starCount: parseInt(starCount, 10) || 0,
+      starred: parseBoolean(starred),
+      starrersPath,
+    },
+    render: (createElement) => createElement(HomePanel),
+  });
+};
+
+export { initHomePanel };
diff --git a/app/assets/javascripts/pages/projects/show/index.js b/app/assets/javascripts/pages/projects/show/index.js
index f7833c038cb..b840df8708f 100644
--- a/app/assets/javascripts/pages/projects/show/index.js
+++ b/app/assets/javascripts/pages/projects/show/index.js
@@ -3,15 +3,12 @@ import { addShortcutsExtension } from '~/behaviors/shortcuts';
 import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
 import initClustersDeprecationAlert from '~/projects/clusters_deprecation_alert';
 import leaveByUrl from '~/namespaces/leave_by_url';
-import initVueNotificationsDropdown from '~/notifications';
-import initVueStarCount from '~/stars';
 import initTerraformNotification from '~/projects/terraform_notification';
 import { initUploadFileTrigger } from '~/projects/upload_file';
 import initReadMore from '~/read_more';
-import initForksButton from '~/forks/init_forks_button';
 import initAmbiguousRefModal from '~/ref/init_ambiguous_ref_modal';
-import InitMoreActionsDropdown from '~/groups_projects/init_more_actions_dropdown';
 import CodeDropdown from '~/vue_shared/components/code_dropdown/code_dropdown.vue';
+import { initHomePanel } from '../home_panel';
 
 // Project show page loads different overview content based on user preferences
 if (document.getElementById('js-tree-list')) {
@@ -38,17 +35,14 @@ if (document.querySelector('.project-show-activity')) {
     .catch(() => {});
 }
 
-initVueNotificationsDropdown();
-initVueStarCount();
-
 addShortcutsExtension(ShortcutsNavigation);
 
 initUploadFileTrigger();
 initClustersDeprecationAlert();
 initTerraformNotification();
-
 initReadMore();
 initAmbiguousRefModal();
+initHomePanel();
 
 if (document.querySelector('.js-autodevops-banner')) {
   import(/* webpackChunkName: 'userCallOut' */ '~/user_callout')
@@ -62,8 +56,6 @@ if (document.querySelector('.js-autodevops-banner')) {
     .catch(() => {});
 }
 
-initForksButton();
-InitMoreActionsDropdown();
 leaveByUrl('project');
 
 const initCodeDropdown = () => {
diff --git a/app/assets/javascripts/repository/commits_service.js b/app/assets/javascripts/repository/commits_service.js
index 44113788716..b94db1b0f3b 100644
--- a/app/assets/javascripts/repository/commits_service.js
+++ b/app/assets/javascripts/repository/commits_service.js
@@ -31,14 +31,13 @@ const fetchData = (projectPath, path, ref, offset, refType) => {
 
   fetchedBatches.push(offset);
 
-  const encodePathFunc = gon.features.encodingLogsTree ? encodeURI : encodeURIComponent;
   const url = joinPaths(
     gon.relative_url_root || '/',
     projectPath,
     '/-/refs/',
-    encodePathFunc(ref),
+    encodeURI(ref),
     '/logs_tree/',
-    encodePathFunc(removeLeadingSlash(path)),
+    encodeURI(removeLeadingSlash(path)),
   );
 
   return axios
diff --git a/app/assets/javascripts/stars/index.js b/app/assets/javascripts/stars/index.js
deleted file mode 100644
index e19b3a54021..00000000000
--- a/app/assets/javascripts/stars/index.js
+++ /dev/null
@@ -1,40 +0,0 @@
-import { GlToast } from '@gitlab/ui';
-import Vue from 'vue';
-import VueApollo from 'vue-apollo';
-import createDefaultClient from '~/lib/graphql';
-import { parseBoolean } from '../lib/utils/common_utils';
-import StarCount from './components/star_count.vue';
-
-Vue.use(GlToast);
-Vue.use(VueApollo);
-
-const apolloProvider = new VueApollo({
-  defaultClient: createDefaultClient(),
-});
-
-export default () => {
-  const containers = document.querySelectorAll('.js-vue-star-count');
-
-  if (containers.length === 0) {
-    return false;
-  }
-
-  return containers.forEach((el) => {
-    const { projectId, starCount, starred, starrersPath, signInPath } = el.dataset;
-
-    return new Vue({
-      el,
-      provide: {
-        starred: parseBoolean(starred),
-        starCount,
-        projectId,
-        starrersPath,
-        signInPath,
-      },
-      render(h) {
-        return h(StarCount);
-      },
-      apolloProvider,
-    });
-  });
-};
diff --git a/app/assets/javascripts/usage_quotas/storage/components/storage_type_help_link.vue b/app/assets/javascripts/usage_quotas/storage/components/storage_type_help_link.vue
index c25b1848124..3c8fd9b74d2 100644
--- a/app/assets/javascripts/usage_quotas/storage/components/storage_type_help_link.vue
+++ b/app/assets/javascripts/usage_quotas/storage/components/storage_type_help_link.vue
@@ -30,7 +30,7 @@ export default {