diff --git a/package.json b/package.json
index 5820aa6d..573741e0 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "qryptchat-web",
"private": true,
- "version": "0.9.2",
+ "version": "0.9.3",
"type": "module",
"bin": {
"qc": "./bin/qc.js",
diff --git a/src/app/client-layout.jsx b/src/app/client-layout.jsx
index 2c125384..f6d101d9 100644
--- a/src/app/client-layout.jsx
+++ b/src/app/client-layout.jsx
@@ -17,7 +17,7 @@ import ActiveCallInterface from '@/lib/components/voice-call/ActiveCallInterface
// token, since passkey/CoinPay/phone sessions have no cookie.
installApiAuth({ refresh: (token) => useAuthStore.getState().refreshSession(token) });
-export default function ClientLayout({ children }) {
+export default function ClientLayout({ children, footerBottom }) {
const pathname = usePathname();
const currentTheme = useThemeStore((s) => s.currentTheme);
const { t: _t } = useI18n();
@@ -60,7 +60,7 @@ export default function ClientLayout({ children }) {
{children}
- {shouldShowFooter &&
}
+ {shouldShowFooter &&
}
{mounted && (
<>
diff --git a/src/app/layout.jsx b/src/app/layout.jsx
index 90b98a19..5de4fbab 100644
--- a/src/app/layout.jsx
+++ b/src/app/layout.jsx
@@ -1,11 +1,12 @@
import './globals.css';
import ClientLayout from './client-layout.jsx';
import Script from "next/script";
+import { Footer as PfsFooter } from '@profullstack/footer/react';
import PitFooter from '@/lib/components/PitFooter.jsx';
const SITE_URL = (process.env.NEXT_PUBLIC_APP_URL ?? process.env.NEXT_PUBLIC_BASE_URL ?? 'https://qrypt.chat').replace(/\/$/, '');
-// Re-render hourly so the pit.world footer stays fresh.
+// Re-render hourly so @profullstack/footer and the pit.world footer stay fresh.
export const revalidate = 3600;
export const metadata = {
@@ -146,7 +147,26 @@ export default function RootLayout({ children }) {
/>
-
{children}
+
+ }
+ >
+ {children}
+
diff --git a/src/lib/components/Footer.jsx b/src/lib/components/Footer.jsx
index 84922d7e..cdfb6be0 100644
--- a/src/lib/components/Footer.jsx
+++ b/src/lib/components/Footer.jsx
@@ -1,44 +1,25 @@
'use client';
-const links = [
- { label: 'Security', href: '/security' },
- { label: 'About', href: '/about' },
- { label: 'Blog', href: '/blog' },
- { label: 'FAQ', href: '/faq' },
- { label: 'Contact', href: '/contact' },
- { label: 'Warrant Canary', href: '/warrant-canary' },
- { label: 'Privacy', href: '/privacy' },
- { label: 'Terms', href: '/terms' },
- { label: 'GitHub', href: 'https://github.com/profullstack/qryptchat-web' },
-];
-
-export default function Footer() {
+// One footer row: links, copyright and the Profullstack ring come from
+// @profullstack/footer, server-rendered in app/layout.jsx and passed in as
+// `bottom`. The Tor mirror link sits just above it when configured.
+export default function Footer({ bottom }) {
const onionUrl = process.env.NEXT_PUBLIC_ONION_URL;
const isOnionSite = typeof window !== 'undefined' && window.location.hostname.endsWith('.onion');
return (
);