diff --git a/app/(main)/[locale]/layout.tsx b/app/(main)/[locale]/layout.tsx
index 8d5589501..9164a715f 100644
--- a/app/(main)/[locale]/layout.tsx
+++ b/app/(main)/[locale]/layout.tsx
@@ -26,6 +26,7 @@ import { PluginAppEvents } from "@/components/providers/plugin-app-events";
import { PluginOAuthCallbackListener } from "@/components/providers/plugin-oauth-callback-listener";
import { PWAInstallPrompt } from "@/components/pwa-install-prompt";
import { AppUpdatePrompt } from "@/components/app-update-prompt";
+import { OfflineHost } from "@/components/offline/offline-host";
import { DevicePolicyHost } from "@/components/device/device-policy-host";
import { PushNotificationPrompt } from "@/components/push-notification-prompt";
import { AccountArchiveRestorePrompt } from "@/components/account-archive-prompt";
@@ -100,6 +101,8 @@ export default async function LocaleLayout({
+ {/* Offline mode isn't in Lite (no service worker there). */}
+ {!IS_LITE && }
{/* Lite is a static bundle: no server keeps an archive there. */}
diff --git a/app/(main)/[locale]/login/page.tsx b/app/(main)/[locale]/login/page.tsx
index 5cee22b98..e144984b8 100644
--- a/app/(main)/[locale]/login/page.tsx
+++ b/app/(main)/[locale]/login/page.tsx
@@ -183,6 +183,7 @@ function LoginPageContent() {
const router = useRouter();
const t = useTranslations("login");
const tSessionLimits = useTranslations("session_limits");
+ const tOffline = useTranslations("offline");
const tTheme = useTranslations("settings.appearance.theme");
const params = useParams();
const searchParams = useSearchParams();
@@ -1418,6 +1419,11 @@ function LoginPageContent() {
{(sessionEnd?.draftsUnsaved || expiredDraftsUnsaved) && (
{tSessionLimits("drafts_not_saved")}
)}
+ {sessionEnd?.outboxLost?.length ? (
+
+ {tOffline("signout.lost", { subjects: sessionEnd.outboxLost.map((s) => s || tOffline("outbox.no_subject")).join(", ") })}
+
+ ) : null}