diff --git a/web/app-list/app-list-header.css b/web/app-list/app-list-header.css
new file mode 100644
--- /dev/null
+++ b/web/app-list/app-list-header.css
@@ -0,0 +1,15 @@
+.container {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ background-color: var(--card-headerBackground-primary-default);
+ padding: 16px;
+ box-shadow: 0px 1px 3px 0px var(--card-headerShawdow-primary-default);
+ z-index: 0;
+ border-radius: 8px 8px 0 0;
+}
+
+.headerLabel {
+ color: var(--text-background-primary-default);
+ font-weight: var(--semi-bold);
+}
diff --git a/web/app-list/app-list-header.react.js b/web/app-list/app-list-header.react.js
new file mode 100644
--- /dev/null
+++ b/web/app-list/app-list-header.react.js
@@ -0,0 +1,27 @@
+// @flow
+
+import * as React from 'react';
+
+import { useModalContext } from 'lib/components/modal-provider.react.js';
+
+import css from './app-list-header.css';
+import AddButton from '../components/add-button.react.js';
+import AppsDirectory from '../modals/apps/apps-directory-modal.react.js';
+
+function AppListHeader(): React.Node {
+ const { pushModal } = useModalContext();
+
+ const onClickApps = React.useCallback(
+ () => pushModal(