}
diff --git a/surfsense_web/app/layout.tsx b/surfsense_web/app/layout.tsx
index af25193ef..047baa27b 100644
--- a/surfsense_web/app/layout.tsx
+++ b/surfsense_web/app/layout.tsx
@@ -1,4 +1,4 @@
-import type { Metadata } from "next";
+import type { Metadata, Viewport } from "next";
import "./globals.css";
import { RootProvider } from "fumadocs-ui/provider/next";
import { Roboto } from "next/font/google";
@@ -19,6 +19,20 @@ const roboto = Roboto({
variable: "--font-roboto",
});
+/**
+ * Viewport configuration for mobile keyboard handling.
+ * - interactiveWidget: 'resizes-content' tells mobile browsers (especially Chrome Android)
+ * to resize the CSS layout viewport when the virtual keyboard opens, so sticky elements
+ * (like the chat input bar) stay visible above the keyboard.
+ * - viewportFit: 'cover' enables env(safe-area-inset-*) for notched/home-indicator devices.
+ */
+export const viewport: Viewport = {
+ width: "device-width",
+ initialScale: 1,
+ viewportFit: "cover",
+ interactiveWidget: "resizes-content",
+};
+
export const metadata: Metadata = {
title: "SurfSense – Customizable AI Research & Knowledge Management Assistant",
description:
diff --git a/surfsense_web/components/assistant-ui/thread.tsx b/surfsense_web/components/assistant-ui/thread.tsx
index 4c2165c0a..dc30cfe40 100644
--- a/surfsense_web/components/assistant-ui/thread.tsx
+++ b/surfsense_web/components/assistant-ui/thread.tsx
@@ -120,7 +120,10 @@ const ThreadContent: FC<{ header?: React.ReactNode }> = ({ header }) => {
}}
/>
-
+
!thread.isEmpty}>