diff --git a/frontend/public/assets/ext-gitlab.svg b/frontend/public/assets/ext-gitlab.svg
new file mode 100644
index 0000000000000000000000000000000000000000..95a22f101748e6eb643b4778eb8dca39b8b462ac
--- /dev/null
+++ b/frontend/public/assets/ext-gitlab.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 380 380"><defs><style>.cls-1{fill:#e24329;}.cls-2{fill:#fc6d26;}.cls-3{fill:#fca326;}</style></defs><g id="LOGO"><path class="cls-1" d="M282.83,170.73l-.27-.69-26.14-68.22a6.81,6.81,0,0,0-2.69-3.24,7,7,0,0,0-8,.43,7,7,0,0,0-2.32,3.52l-17.65,54H154.29l-17.65-54A6.86,6.86,0,0,0,134.32,99a7,7,0,0,0-8-.43,6.87,6.87,0,0,0-2.69,3.24L97.44,170l-.26.69a48.54,48.54,0,0,0,16.1,56.1l.09.07.24.17,39.82,29.82,19.7,14.91,12,9.06a8.07,8.07,0,0,0,9.76,0l12-9.06,19.7-14.91,40.06-30,.1-.08A48.56,48.56,0,0,0,282.83,170.73Z"/><path class="cls-2" d="M282.83,170.73l-.27-.69a88.3,88.3,0,0,0-35.15,15.8L190,229.25c19.55,14.79,36.57,27.64,36.57,27.64l40.06-30,.1-.08A48.56,48.56,0,0,0,282.83,170.73Z"/><path class="cls-3" d="M153.43,256.89l19.7,14.91,12,9.06a8.07,8.07,0,0,0,9.76,0l12-9.06,19.7-14.91S209.55,244,190,229.25C170.45,244,153.43,256.89,153.43,256.89Z"/><path class="cls-2" d="M132.58,185.84A88.19,88.19,0,0,0,97.44,170l-.26.69a48.54,48.54,0,0,0,16.1,56.1l.09.07.24.17,39.82,29.82s17-12.85,36.57-27.64Z"/></g></svg>
\ No newline at end of file
diff --git a/frontend/public/markdown/ext-gitlab.md b/frontend/public/markdown/ext-gitlab.md
new file mode 100644
index 0000000000000000000000000000000000000000..b0c8e6b83b7dc60c61b7d4eb807fdeec71228715
--- /dev/null
+++ b/frontend/public/markdown/ext-gitlab.md
@@ -0,0 +1,12 @@
+---
+title: 'HedgeDoc'
+tileExcerpt: 'DevOps software package which can develop, secure, and operate software'
+---
+
+## Introduction
+
+> **The DevSecOps Platform:** Deliver better software faster with one platform for your entire software delivery lifecycle
+
+## Signing in
+
+## Using GitLab
diff --git a/frontend/src/components/UserModal/UserModal.tsx b/frontend/src/components/UserModal/UserModal.tsx
index b6ceed73710f45f3bda1e4218224c85fbec575fd..a023ef2f18224ea1c042ac6b2d1b8ea2e0562cd4 100644
--- a/frontend/src/components/UserModal/UserModal.tsx
+++ b/frontend/src/components/UserModal/UserModal.tsx
@@ -6,11 +6,22 @@ import { Banner, Modal, ConfirmationModal, InfoModal } from 'src/components';
 import { Input, Select } from 'src/components/Form';
 import { User, UserRole, useUsers } from 'src/services/users';
 import { useAuth } from 'src/services/auth';
+import { useApps } from 'src/services/apps';
+
 import { HIDDEN_APPS } from 'src/modules/dashboard/consts';
-import { appAccessList, initialUserForm } from './consts';
+import { initialUserForm } from './consts';
+
 import { UserModalProps } from './types';
 
 export const UserModal = ({ open, onClose, userId, setUserId }: UserModalProps) => {
+  const { apps, loadApps } = useApps();
+
+  // Tell React to load the apps and system information
+  useEffect(() => {
+    loadApps();
+    return () => {};
+  });
+
   const [deleteModal, setDeleteModal] = useState(false);
   const [passwordLinkModal, setPasswordLinkModal] = useState(false);
   const [isAdminRoleSelected, setAdminRoleSelected] = useState(true);
@@ -275,11 +286,11 @@ export const UserModal = ({ open, onClose, userId, setUserId }: UserModalProps)
                                 <div className="flex-shrink-0 flex-1 flex items-center">
                                   <img
                                     className="h-10 w-10 rounded-md overflow-hidden"
-                                    src={_.find(appAccessList, ['name', item.name!])?.image}
+                                    src={_.find(apps, ['slug', item.name!])?.assetSrc}
                                     alt={item.name ?? 'Image'}
                                   />
                                   <h3 className="ml-4 text-md leading-6 font-medium text-gray-900">
-                                    {_.find(appAccessList, ['name', item.name!])?.label}
+                                    {_.find(apps, ['slug', item.name!])?.name}
                                   </h3>
                                 </div>
                                 <div>
diff --git a/frontend/src/modules/dashboard/Dashboard.tsx b/frontend/src/modules/dashboard/Dashboard.tsx
index 9bf8acbc12dde01260ca89001aaf8f7244c897e5..02af89adf218ac2087f829908486256def87e355 100644
--- a/frontend/src/modules/dashboard/Dashboard.tsx
+++ b/frontend/src/modules/dashboard/Dashboard.tsx
@@ -49,7 +49,7 @@ export const Dashboard: React.FC = () => {
             .filter((app) => HIDDEN_APPS.concat(UTILITY_APPS).indexOf(app.slug) === -1)
             .filter((app) => app.status !== AppStatusEnum.NotInstalled)
             .map((app) => {
-              const version = appVersions[app.slug as keyof typeof appVersions];
+              const version = app.external ? 'CUSTOM' : appVersions[app.slug as keyof typeof appVersions];
               return <DashboardCard app={app} key={app.name} version={version} />;
             })}
         </div>
diff --git a/frontend/src/services/apps/transformations.ts b/frontend/src/services/apps/transformations.ts
index 6b98a878cd2190ff4021a2aa498c6070042c6be6..a95f31174ba31141aa70d5192f560486267b541f 100644
--- a/frontend/src/services/apps/transformations.ts
+++ b/frontend/src/services/apps/transformations.ts
@@ -11,6 +11,7 @@ export const transformApp = (response: any): App => {
     id: response.id ?? '',
     name: response.name ?? '',
     slug: response.slug ?? '',
+    external: response.external ?? '',
     status: transformAppStatus(response.status),
     url: response.url,
     automaticUpdates: response.automatic_updates,
diff --git a/frontend/src/services/apps/types.ts b/frontend/src/services/apps/types.ts
index 9c5e0e22ca1ecaca969c6e111d4d281a20678459..a7e05c34707e46d16daad658ff356a1a026f43e1 100644
--- a/frontend/src/services/apps/types.ts
+++ b/frontend/src/services/apps/types.ts
@@ -2,6 +2,7 @@ export interface App {
   id: number;
   name: string;
   slug: string;
+  external: boolean;
   status?: AppStatusEnum;
   url: string;
   automaticUpdates: boolean;