From d10d1dd52a4769541aaf19b84076df0003b7b446 Mon Sep 17 00:00:00 2001 From: Anthony Ettinger Date: Wed, 1 Jul 2026 09:10:41 +0000 Subject: [PATCH 1/4] Add site-wide JSON-LD + OpenGraph/Twitter/canonical metadata Add Organization + WebSite JSON-LD to the root layout and SoftwareApplication JSON-LD to the homepage. Add metadataBase, OpenGraph, Twitter Card, keywords and title template. Split the homepage into a server wrapper (page.jsx, exports metadata) and a client component (home-content.jsx) so it can carry a canonical URL, and add a "How it works" list + audience statement. Co-Authored-By: Claude Opus 4.8 --- src/app/home-content.jsx | 135 ++++++++++++++++++++++++++++++++++++ src/app/layout.jsx | 82 +++++++++++++++++++++- src/app/page.jsx | 144 ++++++++++++--------------------------- 3 files changed, 259 insertions(+), 102 deletions(-) create mode 100644 src/app/home-content.jsx diff --git a/src/app/home-content.jsx b/src/app/home-content.jsx new file mode 100644 index 0000000..eb2e898 --- /dev/null +++ b/src/app/home-content.jsx @@ -0,0 +1,135 @@ +'use client'; + +import Link from 'next/link'; +import { useI18n } from '@/lib/hooks/useI18n.js'; + +export default function HomeContent() { + const { t } = useI18n(); + + return ( + <> +
+
+
+
+

{t('app.name')}

+

{t('app.tagline')}

+

{t('app.description')}

+
+ {t('nav.register')} + {t('nav.login')} +
+
+
+ Illustration of a locked, end-to-end encrypted QryptChat conversation protected by post-quantum cryptography +
+
+
+
+ +
+
+
+

Why Choose QryptChat?

+

Built for the future of secure communication

+
+
+ {[ + { num: '01', title: 'Post-Quantum Cryptography', desc: 'Uses ML-KEM-1024 (CRYSTALS-Kyber) and CRYSTALS-Dilithium algorithms approved by NIST for quantum resistance.' }, + { num: '02', title: 'Phone Number Authentication', desc: 'Simple and secure registration using your phone number with SMS verification.' }, + { num: '03', title: '🔐 Encrypted Voice & Video Calls', desc: 'Crystal-clear 1:1 and group calls protected with ML-KEM-1024 post-quantum encryption.' }, + { num: '04', title: 'Real-time Messaging', desc: 'Instant message delivery with typing indicators and read receipts.' }, + { num: '05', title: 'Multi-language Support', desc: 'Available in multiple languages with full internationalization support.' }, + ].map(({ num, title, desc }) => ( +
+
{num}
+

{title}

+

{desc}

+
+ ))} +
+
+
+ +
+
+
+

How QryptChat Works

+

Private by design — no email, no passwords, no message access.

+
+
    +
  1. Register with a phone number. A one-time SMS code verifies you — no email address and no password to leak.
  2. +
  3. Keys are generated on your device. Your ML-KEM-1024 key pair never leaves your device, so QryptChat cannot read your messages.
  4. +
  5. Every message is encrypted end-to-end. Text, files, and voice & video calls are protected with NIST-approved post-quantum algorithms.
  6. +
  7. Stay private, everywhere. Use QryptChat on the web or over Tor, and self-host it from the open-source (MIT) repository.
  8. +
+

+ Built for privacy-conscious individuals, journalists, activists, and security-minded teams who need + communication that stays private even against future quantum computers. +

+
+
+ + + + + + ); +} diff --git a/src/app/layout.jsx b/src/app/layout.jsx index b2f8b3d..4f88c86 100644 --- a/src/app/layout.jsx +++ b/src/app/layout.jsx @@ -3,9 +3,79 @@ import ClientLayout from './client-layout.jsx'; import FeedbackWidget from './feedback-widget.jsx'; import Script from "next/script"; +const SITE_URL = (process.env.NEXT_PUBLIC_APP_URL ?? process.env.NEXT_PUBLIC_BASE_URL ?? 'https://qrypt.chat').replace(/\/$/, ''); + export const metadata = { - title: 'QryptChat - Quantum-Resistant Encrypted Messaging', - description: 'End-to-end encrypted messaging with post-quantum cryptography.', + metadataBase: new URL(SITE_URL), + title: { + default: 'QryptChat - Quantum-Resistant Encrypted Messaging', + template: '%s — QryptChat', + }, + description: 'End-to-end encrypted messaging with post-quantum cryptography (ML-KEM-1024 / CRYSTALS-Kyber and CRYSTALS-Dilithium). Open source, self-hostable, and accessible over Tor.', + applicationName: 'QryptChat', + keywords: [ + 'quantum-resistant messaging', + 'post-quantum cryptography', + 'end-to-end encryption', + 'ML-KEM-1024', + 'CRYSTALS-Kyber', + 'CRYSTALS-Dilithium', + 'encrypted messenger', + 'private messaging', + 'open source messenger', + 'Signal alternative', + ], + authors: [{ name: 'Profullstack, Inc.', url: 'https://profullstack.com' }], + creator: 'Profullstack, Inc.', + publisher: 'Profullstack, Inc.', + openGraph: { + type: 'website', + siteName: 'QryptChat', + title: 'QryptChat - Quantum-Resistant Encrypted Messaging', + description: 'End-to-end encrypted messaging with post-quantum cryptography. Open source, self-hostable, and accessible over Tor.', + url: SITE_URL, + locale: 'en_US', + images: [{ url: '/banner.png', width: 1200, height: 630, alt: 'QryptChat — Quantum-Resistant Encrypted Messaging' }], + }, + twitter: { + card: 'summary_large_image', + site: '@profullstackinc', + creator: '@profullstackinc', + title: 'QryptChat - Quantum-Resistant Encrypted Messaging', + description: 'End-to-end encrypted messaging with post-quantum cryptography. Open source, self-hostable, and accessible over Tor.', + images: ['/banner.png'], + }, +}; + +const organizationJsonLd = { + '@context': 'https://schema.org', + '@type': 'Organization', + name: 'Profullstack, Inc.', + url: SITE_URL, + logo: `${SITE_URL}/logo.svg`, + foundingDate: '2024', + founder: { '@type': 'Person', name: 'Anthony Ettinger' }, + brand: { '@type': 'Brand', name: 'QryptChat' }, + contactPoint: [ + { '@type': 'ContactPoint', contactType: 'customer support', email: 'support@qrypt.chat' }, + { '@type': 'ContactPoint', contactType: 'security', email: 'security@qrypt.chat' }, + { '@type': 'ContactPoint', contactType: 'sales', email: 'business@qrypt.chat' }, + ], + sameAs: [ + 'https://github.com/profullstack', + 'https://x.com/profullstackinc', + 'https://bsky.app/profile/chovyfu.bsky.social', + 'https://discord.gg/w5nHdzpQ29', + ], +}; + +const websiteJsonLd = { + '@context': 'https://schema.org', + '@type': 'WebSite', + name: 'QryptChat', + url: SITE_URL, + publisher: { '@type': 'Organization', name: 'Profullstack, Inc.' }, + inLanguage: 'en', }; export default function RootLayout({ children }) { @@ -17,6 +87,14 @@ export default function RootLayout({ children }) { +