seo-improvements

This commit is contained in:
Torsten Schulz (local)
2026-06-15 16:07:42 +02:00
parent 1ca1b45b55
commit 5bb9db2aad
7 changed files with 439 additions and 38 deletions

View File

@@ -3,36 +3,36 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SingleChat - Chat, Single-Chat und Bildaustausch</title> <title>SingleChat - Kostenloser Single Chat ohne Anmeldung</title>
<meta name="description" content="Willkommen auf SingleChat - deine erste Adresse für Chat, Single-Chat und Bildaustausch. Chatte mit Menschen aus aller Welt, finde neue Kontakte und teile Erinnerungen sicher und komfortabel."> <meta name="description" content="Kostenloser Single Chat ohne lange Registrierung: Profil starten, Singles kennenlernen, privat chatten und Bilder sicher austauschen. Direkt online loslegen.">
<meta name="keywords" content="Chat, Single-Chat, Bildaustausch, Online-Chat, Singles, Kontakte, Community"> <meta name="keywords" content="single chat, kostenloser single chat, single chat ohne anmeldung, single treff chat, chatten für singles, online chat">
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"> <meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
<meta name="author" content="SingleChat"> <meta name="author" content="SingleChat">
<meta name="theme-color" content="#2f6f46"> <meta name="theme-color" content="#2f6f46">
<!-- Open Graph Tags --> <!-- Open Graph Tags -->
<meta property="og:title" content="SingleChat - Chat, Single-Chat und Bildaustausch"> <meta property="og:title" content="SingleChat - Kostenloser Single Chat ohne Anmeldung">
<meta property="og:description" content="Willkommen auf SingleChat - deine erste Adresse für Chat, Single-Chat und Bildaustausch."> <meta property="og:description" content="Kostenlos chatten, Singles kennenlernen und Bilder sicher austauschen.">
<meta property="og:type" content="website"> <meta property="og:type" content="website">
<meta property="og:url" content="https://www.ypchat.net/"> <meta property="og:url" content="https://www.single-chat.net/">
<meta property="og:image" content="https://www.ypchat.net/static/favicon.png"> <meta property="og:image" content="https://www.single-chat.net/static/favicon.png">
<meta property="og:site_name" content="SingleChat"> <meta property="og:site_name" content="SingleChat">
<meta property="og:locale" content="de_DE"> <meta property="og:locale" content="de_DE">
<!-- Twitter Card --> <!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image"> <meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="SingleChat - Chat, Single-Chat und Bildaustausch"> <meta name="twitter:title" content="SingleChat - Kostenloser Single Chat ohne Anmeldung">
<meta name="twitter:description" content="Willkommen auf SingleChat - deine erste Adresse für Chat, Single-Chat und Bildaustausch."> <meta name="twitter:description" content="Kostenlos chatten, Singles kennenlernen und Bilder sicher austauschen.">
<meta name="twitter:image" content="https://www.ypchat.net/static/favicon.png"> <meta name="twitter:image" content="https://www.single-chat.net/static/favicon.png">
<!-- Canonical URL --> <!-- Canonical URL -->
<link rel="canonical" href="https://www.ypchat.net/"> <link rel="canonical" href="https://www.single-chat.net/">
<!-- App Icon / Favicon --> <!-- App Icon / Favicon -->
<link rel="icon" type="image/x-icon" href="/favicon.ico"> <link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="shortcut icon" href="/favicon.ico"> <link rel="shortcut icon" href="/favicon.ico">
<link rel="icon" type="image/png" href="/appicon.png"> <link rel="icon" type="image/png" href="/appicon.png">
<script type="application/ld+json" id="seo-json-ld">{"@context":"https://schema.org","@type":"WebSite","name":"SingleChat","url":"https://www.ypchat.net/","description":"Willkommen auf SingleChat - deine erste Adresse für Chat, Single-Chat und Bildaustausch.","inLanguage":"de-DE"}</script> <script type="application/ld+json" id="seo-json-ld">{"@context":"https://schema.org","@type":"WebSite","name":"SingleChat","alternateName":"Single-Chat.net","url":"https://www.single-chat.net/","description":"Kostenloser Single Chat ohne lange Registrierung: Profil starten, Singles kennenlernen, privat chatten und Bilder sicher austauschen.","inLanguage":"de-DE"}</script>
</head> </head>
<body> <body>
<div id="app"></div> <div id="app"></div>

View File

@@ -11,6 +11,11 @@
<span>Bildaustausch</span> <span>Bildaustausch</span>
<span>Kompakte Bedienung</span> <span>Kompakte Bedienung</span>
</div> </div>
<nav class="landing-login-topic-links" aria-label="SingleChat Themen">
<router-link to="/kostenloser-single-chat">Kostenloser Single Chat</router-link>
<router-link to="/single-chat-ohne-anmeldung">Ohne lange Anmeldung</router-link>
<router-link to="/single-treff-chat">Single Treff Chat</router-link>
</nav>
<div class="welcome-message" v-html="$t('welcome')"></div> <div class="welcome-message" v-html="$t('welcome')"></div>
</section> </section>
@@ -242,6 +247,24 @@ function handleSubmit() {
font-weight: 600; font-weight: 600;
} }
.landing-login-topic-links {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin: 0 0 18px;
}
.landing-login-topic-links a {
color: #245c3a;
font-size: 13px;
font-weight: 700;
text-decoration: none;
}
.landing-login-topic-links a:hover {
text-decoration: underline;
}
.landing-login-card { .landing-login-card {
padding: 24px; padding: 24px;
border-radius: 20px; border-radius: 20px;

View File

@@ -12,15 +12,16 @@ import GuideFirstMessageView from '../views/GuideFirstMessageView.vue';
import GuideProfileView from '../views/GuideProfileView.vue'; import GuideProfileView from '../views/GuideProfileView.vue';
import GuideSafetyView from '../views/GuideSafetyView.vue'; import GuideSafetyView from '../views/GuideSafetyView.vue';
import GuideRedFlagsView from '../views/GuideRedFlagsView.vue'; import GuideRedFlagsView from '../views/GuideRedFlagsView.vue';
import SeoLandingView from '../views/SeoLandingView.vue';
const SITE_URL = 'https://www.ypchat.net'; const SITE_URL = 'https://www.single-chat.net';
const DEFAULT_IMAGE = `${SITE_URL}/static/favicon.png`; const DEFAULT_IMAGE = `${SITE_URL}/static/favicon.png`;
const SUPPORTED_LOCALES = ['de', 'en', 'fr', 'es', 'it', 'ja', 'zh', 'th', 'tl']; const SUPPORTED_LOCALES = ['de', 'en', 'fr', 'es', 'it', 'ja', 'zh', 'th', 'tl'];
const LOCALIZED_HOME_META = { const LOCALIZED_HOME_META = {
de: { de: {
title: 'SingleChat: Kostenloser Single Chat, privat & anonym', title: 'SingleChat - Kostenloser Single Chat ohne Anmeldung',
description: 'Kostenloser Single Chat für private und anonyme Gespräche. Lerne neue Kontakte kennen und teile Bilder sicher online.', description: 'Kostenloser Single Chat ohne lange Registrierung: Profil starten, Singles kennenlernen, privat chatten und Bilder sicher austauschen.',
keywords: 'single chat, kostenloser chat, privat chatten, anonym chat, free chat, private chat, anonymous chat, online chat' keywords: 'single chat, kostenloser single chat, single chat ohne anmeldung, single treff chat, chatten für singles, online chat'
}, },
en: { en: {
title: 'SingleChat: Free Private & Anonymous Single Chat', title: 'SingleChat: Free Private & Anonymous Single Chat',
@@ -68,11 +69,87 @@ const homeSchema = {
'@context': 'https://schema.org', '@context': 'https://schema.org',
'@type': 'WebSite', '@type': 'WebSite',
name: 'SingleChat', name: 'SingleChat',
alternateName: 'Single-Chat.net',
url: `${SITE_URL}/`, url: `${SITE_URL}/`,
description: 'Kostenloser Single Chat für private und anonyme Gespräche. Lerne neue Kontakte kennen und tausche Bilder sicher aus.', description: 'Kostenloser Single Chat ohne lange Registrierung. Lerne Singles kennen, chatte privat und tausche Bilder sicher aus.',
inLanguage: 'de-DE' inLanguage: 'de-DE'
}; };
const landingPages = [
{
path: '/kostenloser-single-chat',
name: 'kostenloser-single-chat',
title: 'Kostenloser Single Chat - direkt online chatten',
description: 'Starte kostenlos im Single Chat: Profil anlegen, Singles finden, privat schreiben und Bilder sicher austauschen.',
keywords: 'kostenloser single chat, single chat kostenlos, gratis chat singles, kostenlos chatten',
heading: 'Kostenloser Single Chat',
intro: 'SingleChat ist fuer alle gedacht, die unkompliziert neue Kontakte finden und direkt online chatten moechten. Du startest mit einem kurzen Profil und kannst danach passende Singles suchen oder in der Lobby ins Gespraech kommen.',
sections: [
{
title: 'Warum kostenlos starten?',
text: 'Ein Single Chat funktioniert am besten, wenn der Einstieg niedrig bleibt. Deshalb steht der schnelle Start im Mittelpunkt: Nickname waehlen, Alter und Land angeben, Chat oeffnen.'
},
{
title: 'Privat schreiben und Bilder teilen',
text: 'Neben offenen Kontakten sind private Unterhaltungen moeglich. Bilder lassen sich im Chat austauschen, waehrend Regeln und Blockierfunktionen fuer einen respektvollen Rahmen sorgen.'
}
],
links: [
{ to: '/', label: 'Jetzt Single Chat starten' },
{ to: '/sicherheit', label: 'Sicher chatten' },
{ to: '/faq', label: 'FAQ lesen' }
]
},
{
path: '/single-chat-ohne-anmeldung',
name: 'single-chat-ohne-anmeldung',
title: 'Single Chat ohne Anmeldung - schnell und privat',
description: 'Single Chat ohne lange Anmeldung: Nickname eingeben, Profil starten und direkt mit Singles online chatten.',
keywords: 'single chat ohne anmeldung, chat ohne anmeldung, single chat sofort, anonym chatten',
heading: 'Single Chat ohne Anmeldung',
intro: 'Wenn du nicht erst ein langes Konto erstellen moechtest, passt SingleChat zu diesem Suchwunsch: wenige Angaben reichen fuer den Einstieg, danach kannst du sofort loslegen.',
sections: [
{
title: 'Schneller Einstieg mit Nickname',
text: 'Du brauchst keinen langen Registrierungsprozess. Ein Nickname und die noetigen Basisangaben genuegen, damit andere Nutzer dich im Chat einordnen koennen.'
},
{
title: 'Anonym bleiben, respektvoll chatten',
text: 'Nutze einen Nickname, der keine privaten Daten verraet. Teile Telefonnummer, Adresse oder Zahlungsdaten nicht im Chat und blockiere Kontakte, wenn Grenzen ueberschritten werden.'
}
],
links: [
{ to: '/', label: 'Ohne lange Anmeldung starten' },
{ to: '/ratgeber/sicher-chatten', label: 'Datenschutz-Tipps' },
{ to: '/regeln', label: 'Chat-Regeln' }
]
},
{
path: '/single-treff-chat',
name: 'single-treff-chat',
title: 'Single Treff Chat - neue Kontakte kennenlernen',
description: 'Single Treff Chat fuer neue Kontakte: finde Singles, starte private Gespraeche und lerne Menschen online kennen.',
keywords: 'single treff chat, single treff, singles kennenlernen chat, chatten fuer singles',
heading: 'Single Treff Chat',
intro: 'Der Single Treff Chat richtet sich an Nutzer, die online neue Menschen kennenlernen und aus ersten Nachrichten echte Gespraeche machen wollen.',
sections: [
{
title: 'Kontakte finden statt endlos suchen',
text: 'Mit Profilangaben wie Land, Alter und Geschlecht kannst du leichter passende Kontakte einschaetzen und Gespraeche beginnen, die mehr als nur Smalltalk sind.'
},
{
title: 'Gute erste Nachrichten',
text: 'Persoenliche, kurze Einstiege funktionieren besser als kopierte Standardsaetze. Im Ratgeber findest du Beispiele fuer natuerliche erste Nachrichten.'
}
],
links: [
{ to: '/', label: 'Single Treff Chat oeffnen' },
{ to: '/ratgeber/erste-nachricht', label: 'Erste Nachricht verbessern' },
{ to: '/ratgeber/profil-tipps', label: 'Profil verbessern' }
]
}
];
const partnersSchema = { const partnersSchema = {
'@context': 'https://schema.org', '@context': 'https://schema.org',
'@type': 'CollectionPage', '@type': 'CollectionPage',
@@ -172,11 +249,11 @@ const routes = [
name: 'chat', name: 'chat',
component: ChatView, component: ChatView,
meta: { meta: {
title: 'SingleChat: Kostenloser Single Chat, privat & anonym', title: 'SingleChat - Kostenloser Single Chat ohne Anmeldung',
description: 'Kostenloser Single Chat für private und anonyme Gespräche. Lerne neue Kontakte kennen und teile Bilder sicher online.', description: 'Kostenloser Single Chat ohne lange Registrierung: Profil starten, Singles kennenlernen, privat chatten und Bilder sicher austauschen.',
keywords: 'single chat, kostenloser chat, privat chatten, anonym chat, free chat, private chat, anonymous chat, online chat', keywords: 'single chat, kostenloser single chat, single chat ohne anmeldung, single treff chat, chatten für singles, online chat',
ogTitle: 'SingleChat: Kostenloser Single Chat, privat & anonym', ogTitle: 'SingleChat - Kostenloser Single Chat ohne Anmeldung',
ogDescription: 'Kostenlos chatten, privat bleiben und neue Kontakte kennenlernen - mit sicherem Bildaustausch.', ogDescription: 'Kostenlos chatten, Singles kennenlernen und Bilder sicher austauschen.',
ogType: 'website', ogType: 'website',
image: DEFAULT_IMAGE, image: DEFAULT_IMAGE,
robots: 'index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1', robots: 'index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1',
@@ -377,6 +454,34 @@ const routes = [
} }
]; ];
for (const page of landingPages) {
routes.push({
path: page.path,
name: page.name,
component: SeoLandingView,
meta: {
title: `${page.title} - SingleChat`,
description: page.description,
keywords: page.keywords,
ogTitle: `${page.title} - SingleChat`,
ogDescription: page.description,
ogType: 'website',
image: DEFAULT_IMAGE,
robots: 'index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1',
landing: page,
schema: {
'@context': 'https://schema.org',
'@type': 'WebPage',
name: `${page.title} - SingleChat`,
url: `${SITE_URL}${page.path}`,
description: page.description,
isPartOf: homeSchema,
inLanguage: 'de-DE'
}
}
});
}
for (const locale of SUPPORTED_LOCALES) { for (const locale of SUPPORTED_LOCALES) {
const localized = LOCALIZED_HOME_META[locale] || LOCALIZED_HOME_META.de; const localized = LOCALIZED_HOME_META[locale] || LOCALIZED_HOME_META.de;
routes.push({ routes.push({

View File

@@ -14,8 +14,8 @@
<main class="content-page"> <main class="content-page">
<h2>Datenschutzerklärung für Website und App</h2> <h2>Datenschutzerklärung für Website und App</h2>
<p> <p>
Diese Datenschutzerklärung gilt für die Website und die Android-App von SingleChat beziehungsweise YPChat unter Diese Datenschutzerklärung gilt für die Website und die Android-App von SingleChat unter
der Domain <strong>www.ypchat.net</strong>. der Domain <strong>www.single-chat.net</strong>.
</p> </p>
<h3>1. Verantwortlicher</h3> <h3>1. Verantwortlicher</h3>

View File

@@ -0,0 +1,177 @@
<template>
<div class="chat-container">
<header class="header">
<router-link to="/" class="app-brand app-brand-link">
<span class="app-brand-mark">S</span>
<div class="app-brand-copy">
<span class="app-brand-eyebrow">SingleChat</span>
<h1>{{ landing.heading }}</h1>
</div>
</router-link>
<HeaderAdBanner />
</header>
<main class="content-page">
<section class="landing-hero">
<p class="eyebrow">Single-Chat.net</p>
<h2>{{ landing.heading }}</h2>
<p>{{ landing.intro }}</p>
<div class="action-row">
<router-link
v-for="link in landing.links"
:key="link.to"
:to="link.to"
>
{{ link.label }}
</router-link>
</div>
</section>
<section class="topic-grid" aria-label="SingleChat Vorteile">
<article
v-for="section in landing.sections"
:key="section.title"
class="topic-card"
>
<h3>{{ section.title }}</h3>
<p>{{ section.text }}</p>
</article>
</section>
<section class="support-section">
<h3>Passende Themen im Single Chat</h3>
<p>
Viele Nutzer suchen nach einem kostenlosen Single Chat, einem Chat ohne lange Anmeldung oder einem Single Treff
fuer neue Kontakte. SingleChat buendelt diese Einstiege auf einer Plattform: schnell starten, privat schreiben,
respektvoll bleiben.
</p>
<ul>
<li><router-link to="/kostenloser-single-chat">Kostenloser Single Chat</router-link></li>
<li><router-link to="/single-chat-ohne-anmeldung">Single Chat ohne Anmeldung</router-link></li>
<li><router-link to="/single-treff-chat">Single Treff Chat</router-link></li>
</ul>
</section>
</main>
<ImprintContainer />
</div>
</template>
<script setup>
import { computed } from 'vue';
import { useRoute } from 'vue-router';
import HeaderAdBanner from '../components/HeaderAdBanner.vue';
import ImprintContainer from '../components/ImprintContainer.vue';
const route = useRoute();
const landing = computed(() => route.meta.landing || {
heading: 'SingleChat',
intro: 'Kostenloser Single Chat fuer private Gespraeche und neue Kontakte.',
sections: [],
links: [{ to: '/', label: 'Chat starten' }]
});
</script>
<style scoped>
.content-page {
max-width: 1020px;
margin: 0 auto;
padding: 20px 14px 36px;
line-height: 1.6;
color: #344038;
}
.landing-hero,
.support-section {
border: 1px solid #d7dfd9;
border-radius: 12px;
background: #ffffff;
padding: 18px;
}
.eyebrow {
margin: 0 0 6px;
color: #637067;
font-size: 12px;
font-weight: 700;
text-transform: uppercase;
}
.landing-hero h2 {
margin: 0 0 10px;
color: #18201b;
}
.landing-hero p {
max-width: 760px;
}
.action-row {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 14px;
}
.action-row a {
display: inline-flex;
align-items: center;
min-height: 38px;
padding: 0 14px;
border-radius: 8px;
background: #245c3a;
color: #ffffff;
font-weight: 700;
text-decoration: none;
}
.action-row a:not(:first-child) {
background: #edf4ef;
color: #245c3a;
border: 1px solid #bfd5c4;
}
.topic-grid {
margin: 16px 0;
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 14px;
}
.topic-card {
border: 1px solid #d7dfd9;
border-radius: 12px;
background: #ffffff;
padding: 14px;
}
.topic-card h3,
.support-section h3 {
margin: 0 0 8px;
color: #18201b;
}
.topic-card p,
.support-section p {
margin: 0;
}
.support-section ul {
margin: 12px 0 0;
padding-left: 20px;
}
.support-section a {
color: #245c3a;
}
.app-brand-link {
text-decoration: none;
}
@media (max-width: 760px) {
.topic-grid {
grid-template-columns: 1fr;
}
}
</style>

View File

@@ -20,12 +20,12 @@ const server = createServer(app);
const NODE_ENV = process.env.NODE_ENV || 'development'; const NODE_ENV = process.env.NODE_ENV || 'development';
const PORT = process.env.PORT || (NODE_ENV === 'production' ? 4000 : 3300); const PORT = process.env.PORT || (NODE_ENV === 'production' ? 4000 : 3300);
const IS_PRODUCTION = NODE_ENV === 'production'; const IS_PRODUCTION = NODE_ENV === 'production';
const PRIMARY_HOST = 'www.ypchat.net'; const PRIMARY_HOST = 'www.single-chat.net';
const LEGACY_HOSTS = new Set(['ypchat.net']); const LEGACY_HOSTS = new Set(['single-chat.net', 'ypchat.net', 'www.ypchat.net']);
// CORS-Origins konfigurieren // CORS-Origins konfigurieren
const allowedOrigins = IS_PRODUCTION const allowedOrigins = IS_PRODUCTION
? ['https://ypchat.net', 'https://www.ypchat.net'] ? ['https://single-chat.net', 'https://www.single-chat.net', 'https://ypchat.net', 'https://www.ypchat.net']
: ['http://localhost:5175', 'http://127.0.0.1:5175']; : ['http://localhost:5175', 'http://127.0.0.1:5175'];
// Socket.IO auf dem gleichen HTTP-Server wie Express // Socket.IO auf dem gleichen HTTP-Server wie Express

View File

@@ -2,7 +2,7 @@ import { readFileSync, existsSync } from 'fs';
import { join, resolve } from 'path'; import { join, resolve } from 'path';
import { loadFeedback } from './feedback-store.js'; import { loadFeedback } from './feedback-store.js';
const SITE_URL = 'https://www.ypchat.net'; const SITE_URL = 'https://www.single-chat.net';
const DEFAULT_IMAGE = `${SITE_URL}/static/favicon.png`; const DEFAULT_IMAGE = `${SITE_URL}/static/favicon.png`;
const SEO_LOCALES = [ const SEO_LOCALES = [
{ code: 'de', label: 'Deutsch' }, { code: 'de', label: 'Deutsch' },
@@ -18,9 +18,9 @@ const SEO_LOCALES = [
]; ];
const LOCALE_SEO_META = { const LOCALE_SEO_META = {
de: { de: {
title: 'SingleChat: Kostenloser Single Chat, privat & anonym', title: 'SingleChat - Kostenloser Single Chat ohne Anmeldung',
description: 'Kostenloser Single Chat für private und anonyme Gespräche. Lerne neue Kontakte kennen und teile Bilder sicher online.', description: 'Kostenloser Single Chat ohne lange Registrierung: Profil starten, Singles kennenlernen, privat chatten und Bilder sicher austauschen.',
keywords: 'single chat, kostenloser chat, privat chatten, anonym chat, free chat, private chat, anonymous chat, online chat' keywords: 'single chat, kostenloser single chat, single chat ohne anmeldung, single treff chat, chatten fuer singles, online chat'
}, },
en: { en: {
title: 'SingleChat: Free Private & Anonymous Single Chat', title: 'SingleChat: Free Private & Anonymous Single Chat',
@@ -70,13 +70,52 @@ const LOCALE_SEO_META = {
} }
}; };
const landingPages = [
{
route: '/kostenloser-single-chat',
title: 'Kostenloser Single Chat - direkt online chatten - SingleChat',
description: 'Starte kostenlos im Single Chat: Profil anlegen, Singles finden, privat schreiben und Bilder sicher austauschen.',
keywords: 'kostenloser single chat, single chat kostenlos, gratis chat singles, kostenlos chatten',
heading: 'Kostenloser Single Chat',
intro: 'SingleChat ist fuer alle gedacht, die unkompliziert neue Kontakte finden und direkt online chatten moechten. Du startest mit einem kurzen Profil und kannst danach passende Singles suchen oder in der Lobby ins Gespraech kommen.',
sections: [
['Warum kostenlos starten?', 'Ein Single Chat funktioniert am besten, wenn der Einstieg niedrig bleibt. Deshalb steht der schnelle Start im Mittelpunkt: Nickname waehlen, Alter und Land angeben, Chat oeffnen.'],
['Privat schreiben und Bilder teilen', 'Neben offenen Kontakten sind private Unterhaltungen moeglich. Bilder lassen sich im Chat austauschen, waehrend Regeln und Blockierfunktionen fuer einen respektvollen Rahmen sorgen.']
]
},
{
route: '/single-chat-ohne-anmeldung',
title: 'Single Chat ohne Anmeldung - schnell und privat - SingleChat',
description: 'Single Chat ohne lange Anmeldung: Nickname eingeben, Profil starten und direkt mit Singles online chatten.',
keywords: 'single chat ohne anmeldung, chat ohne anmeldung, single chat sofort, anonym chatten',
heading: 'Single Chat ohne Anmeldung',
intro: 'Wenn du nicht erst ein langes Konto erstellen moechtest, passt SingleChat zu diesem Suchwunsch: wenige Angaben reichen fuer den Einstieg, danach kannst du sofort loslegen.',
sections: [
['Schneller Einstieg mit Nickname', 'Du brauchst keinen langen Registrierungsprozess. Ein Nickname und die noetigen Basisangaben genuegen, damit andere Nutzer dich im Chat einordnen koennen.'],
['Anonym bleiben, respektvoll chatten', 'Nutze einen Nickname, der keine privaten Daten verraet. Teile Telefonnummer, Adresse oder Zahlungsdaten nicht im Chat und blockiere Kontakte, wenn Grenzen ueberschritten werden.']
]
},
{
route: '/single-treff-chat',
title: 'Single Treff Chat - neue Kontakte kennenlernen - SingleChat',
description: 'Single Treff Chat fuer neue Kontakte: finde Singles, starte private Gespraeche und lerne Menschen online kennen.',
keywords: 'single treff chat, single treff, singles kennenlernen chat, chatten fuer singles',
heading: 'Single Treff Chat',
intro: 'Der Single Treff Chat richtet sich an Nutzer, die online neue Menschen kennenlernen und aus ersten Nachrichten echte Gespraeche machen wollen.',
sections: [
['Kontakte finden statt endlos suchen', 'Mit Profilangaben wie Land, Alter und Geschlecht kannst du leichter passende Kontakte einschaetzen und Gespraeche beginnen, die mehr als nur Smalltalk sind.'],
['Gute erste Nachrichten', 'Persoenliche, kurze Einstiege funktionieren besser als kopierte Standardsaetze. Im Ratgeber findest du Beispiele fuer natuerliche erste Nachrichten.']
]
}
];
const seoData = { const seoData = {
'/': { '/': {
title: 'SingleChat: Kostenloser Single Chat, privat & anonym', title: 'SingleChat - Kostenloser Single Chat ohne Anmeldung',
description: 'Kostenloser Single Chat für private und anonyme Gespräche. Lerne neue Kontakte kennen und teile Bilder sicher online.', description: 'Kostenloser Single Chat ohne lange Registrierung: Profil starten, Singles kennenlernen, privat chatten und Bilder sicher austauschen.',
keywords: 'single chat, kostenloser chat, privat chatten, anonym chat, free chat, private chat, anonymous chat, online chat', keywords: 'single chat, kostenloser single chat, single chat ohne anmeldung, single treff chat, chatten fuer singles, online chat',
ogTitle: 'SingleChat: Kostenloser Single Chat, privat & anonym', ogTitle: 'SingleChat - Kostenloser Single Chat ohne Anmeldung',
ogDescription: 'Kostenlos chatten, privat bleiben und neue Kontakte kennenlernen - mit sicherem Bildaustausch.', ogDescription: 'Kostenlos chatten, Singles kennenlernen und Bilder sicher austauschen.',
ogType: 'website', ogType: 'website',
ogUrl: `${SITE_URL}/`, ogUrl: `${SITE_URL}/`,
ogImage: DEFAULT_IMAGE, ogImage: DEFAULT_IMAGE,
@@ -85,8 +124,9 @@ const seoData = {
'@context': 'https://schema.org', '@context': 'https://schema.org',
'@type': 'WebSite', '@type': 'WebSite',
name: 'SingleChat', name: 'SingleChat',
alternateName: 'Single-Chat.net',
url: `${SITE_URL}/`, url: `${SITE_URL}/`,
description: 'Kostenloser Single Chat für private und anonyme Gespräche. Lerne neue Kontakte kennen und tausche Bilder sicher aus.', description: 'Kostenloser Single Chat ohne lange Registrierung. Lerne Singles kennen, chatte privat und tausche Bilder sicher aus.',
inLanguage: 'de-DE' inLanguage: 'de-DE'
} }
}, },
@@ -303,6 +343,34 @@ const seoData = {
} }
}; };
for (const page of landingPages) {
seoData[page.route] = {
title: page.title,
description: page.description,
keywords: page.keywords,
ogTitle: page.title,
ogDescription: page.description,
ogType: 'website',
ogUrl: `${SITE_URL}${page.route}`,
ogImage: DEFAULT_IMAGE,
robots: 'index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1',
schema: {
'@context': 'https://schema.org',
'@type': 'WebPage',
name: page.title,
url: `${SITE_URL}${page.route}`,
description: page.description,
isPartOf: {
'@type': 'WebSite',
name: 'SingleChat',
alternateName: 'Single-Chat.net',
url: `${SITE_URL}/`
},
inLanguage: 'de-DE'
}
};
}
for (const locale of SEO_LOCALES) { for (const locale of SEO_LOCALES) {
const meta = LOCALE_SEO_META[locale.code] || LOCALE_SEO_META.de; const meta = LOCALE_SEO_META[locale.code] || LOCALE_SEO_META.de;
seoData[`/${locale.code}`] = { seoData[`/${locale.code}`] = {
@@ -435,6 +503,26 @@ function buildLocalizedLandingContent(route, __dirname) {
</section>`; </section>`;
} }
function buildSeoLandingContent(route) {
const page = landingPages.find((entry) => entry.route === route);
if (!page) return '';
const sectionMarkup = page.sections
.map(([title, text]) => `<article style="border:1px solid #d7dfd9;border-radius:12px;padding:14px;background:#fff;">
<h3 style="font:600 20px/1.25 sans-serif;color:#18201b;margin:0 0 8px;">${escapeHtml(title)}</h3>
<p style="font:400 15px/1.55 sans-serif;color:#344038;margin:0;">${escapeHtml(text)}</p>
</article>`)
.join('\n');
return `<section lang="de" style="max-width:960px;margin:24px auto;padding:0 16px;">
<p style="font:700 12px/1.2 sans-serif;color:#637067;text-transform:uppercase;margin:0 0 6px;">Single-Chat.net</p>
<h1 style="font:700 34px/1.15 sans-serif;color:#18201b;margin:0 0 12px;">${escapeHtml(page.heading)}</h1>
<p style="font:400 16px/1.6 sans-serif;color:#344038;margin:0 0 18px;max-width:760px;">${escapeHtml(page.intro)}</p>
<div style="display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;">${sectionMarkup}</div>
<p style="font:400 15px/1.6 sans-serif;color:#344038;margin:18px 0 0;">Weitere Einstiege: <a href="/kostenloser-single-chat">kostenloser Single Chat</a>, <a href="/single-chat-ohne-anmeldung">Single Chat ohne Anmeldung</a>, <a href="/single-treff-chat">Single Treff Chat</a>.</p>
</section>`;
}
function generateHTML(route, meta, __dirname) { function generateHTML(route, meta, __dirname) {
const distIndexPath = join(__dirname, '../docroot/dist/index.html'); const distIndexPath = join(__dirname, '../docroot/dist/index.html');
@@ -482,6 +570,11 @@ function generateHTML(route, meta, __dirname) {
} }
} }
const seoLanding = buildSeoLandingContent(route);
if (seoLanding) {
html = html.replace('<div id="app"></div>', `<div id="app">${seoLanding}</div>`);
}
if (route === '/feedback') { if (route === '/feedback') {
const feedbackItems = loadFeedback(__dirname) const feedbackItems = loadFeedback(__dirname)
.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt)) .sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt))
@@ -547,12 +640,15 @@ Allow: /feedback
Allow: /faq Allow: /faq
Allow: /regeln Allow: /regeln
Allow: /sicherheit Allow: /sicherheit
<<Allow: /datenschutz Allow: /datenschutz
Allow: /ratgeber Allow: /ratgeber
Allow: /ratgeber/erste-nachricht Allow: /ratgeber/erste-nachricht
Allow: /ratgeber/profil-tipps Allow: /ratgeber/profil-tipps
Allow: /ratgeber/sicher-chatten Allow: /ratgeber/sicher-chatten
Allow: /ratgeber/red-flags Allow: /ratgeber/red-flags
Allow: /kostenloser-single-chat
Allow: /single-chat-ohne-anmeldung
Allow: /single-treff-chat
Disallow: /api/ Disallow: /api/
Disallow: /static/logs/ Disallow: /static/logs/
Disallow: /mockup-redesign Disallow: /mockup-redesign