diff --git a/ui/src/pages/AppsTab/AppDeploymentPage/AppDeploymentPage.module.css b/ui/src/pages/AppsTab/AppDeploymentPage/AppDeploymentPage.module.css
new file mode 100644
index 00000000..c8d8cef7
--- /dev/null
+++ b/ui/src/pages/AppsTab/AppDeploymentPage/AppDeploymentPage.module.css
@@ -0,0 +1,7 @@
+.container {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ padding: 16px 24px;
+ min-height: 100%;
+}
diff --git a/ui/src/pages/AppsTab/AppDeploymentPage/index.tsx b/ui/src/pages/AppsTab/AppDeploymentPage/index.tsx
new file mode 100644
index 00000000..c0a73228
--- /dev/null
+++ b/ui/src/pages/AppsTab/AppDeploymentPage/index.tsx
@@ -0,0 +1,26 @@
+import { useParams, useLocation } from 'react-router';
+import { useEnvironmentStore } from '../../../api/environment-store';
+import { useEnvironments } from '../../../api/queries/admin/environments';
+import { useApps } from '../../../api/queries/admin/apps';
+import { PageLoader } from '../../../components/PageLoader';
+import styles from './AppDeploymentPage.module.css';
+
+export default function AppDeploymentPage() {
+ const { appId } = useParams<{ appId?: string }>();
+ const location = useLocation();
+ const selectedEnv = useEnvironmentStore((s) => s.environment);
+ const { data: environments = [], isLoading: envLoading } = useEnvironments();
+ const { data: apps = [], isLoading: appsLoading } = useApps(selectedEnv);
+
+ const isNetNew = location.pathname.endsWith('/apps/new');
+ const app = isNetNew ? null : apps.find((a) => a.slug === appId) ?? null;
+
+ if (envLoading || appsLoading) return