Fixeds and enhancements
Some checks failed
Deploy SingleChat / deploy (push) Has been cancelled

This commit is contained in:
Torsten Schulz (local)
2026-06-17 15:44:11 +02:00
parent 10e6e7a80a
commit 5d4129b5b3
44 changed files with 151 additions and 109 deletions

View File

@@ -1,4 +1,4 @@
# AdSense in SingleChat
# AdSense in YpChat
## Ziel

View File

@@ -1,8 +1,8 @@
# Android-App-Konzept fuer SingleChat
# Android-App-Konzept fuer YpChat
## Zielbild
SingleChat soll als echte Android-App verfuegbar werden, nicht nur als WebView-Wrapper. Die Android-App nutzt die bestehenden Backend-Endpunkte und spricht mit dem vorhandenen Socket.IO-Server dasselbe Ereignisprotokoll wie das Vue-Web-Frontend.
YpChat soll als echte Android-App verfuegbar werden, nicht nur als WebView-Wrapper. Die Android-App nutzt die bestehenden Backend-Endpunkte und spricht mit dem vorhandenen Socket.IO-Server dasselbe Ereignisprotokoll wie das Vue-Web-Frontend.
Das Ziel fuer den ersten Release ist Funktionsgleichheit mit dem Kern-Chat:

View File

@@ -1,8 +1,8 @@
e# Design-Konzept: Modernisierung SingleChat
e# Design-Konzept: Modernisierung YpChat
## Zielbild
SingleChat soll moderner, ruhiger und effizienter wirken, ohne seinen funktionalen Charakter zu verlieren. Die Oberfläche bleibt kompakt und schnell erfassbar, bekommt aber:
YpChat soll moderner, ruhiger und effizienter wirken, ohne seinen funktionalen Charakter zu verlieren. Die Oberfläche bleibt kompakt und schnell erfassbar, bekommt aber:
- eine konsistentere Farbwelt
- dezentere Rundungen
@@ -350,4 +350,4 @@ Sinnvolle Reihenfolge:
## Ergebnisbild in einem Satz
SingleChat soll nach der Überarbeitung wie ein kompaktes, modernes Chat-Tool wirken: ruhig, klar strukturiert, responsiv, markentreu grün und deutlich hochwertiger, ohne unnötig anders auszusehen.
YpChat soll nach der Überarbeitung wie ein kompaktes, modernes Chat-Tool wirken: ruhig, klar strukturiert, responsiv, markentreu grün und deutlich hochwertiger, ohne unnötig anders auszusehen.

View File

@@ -1,4 +1,4 @@
# SingleChat Production Installation
# YpChat Production Installation
## Voraussetzungen

View File

@@ -17,7 +17,7 @@ Empfehlung:
Alternative:
- `SingleChat by YPChat`
- `YpChat`
- `YPChat`
## Kurzbeschreibung
@@ -107,7 +107,7 @@ Für den ersten Store-Eintrag empfehle ich mindestens diese Smartphone-Screens:
Diese Punkte sind noch nicht in den Texten aufgelöst und müssen von dir final bestätigt werden:
1. Soll der öffentliche Markenname im Store `YPChat` oder `SingleChat` sein?
1. Soll der öffentliche Markenname im Store `YpChat` sein?
2. Welche URL wird als Datenschutzerklärung verwendet?
3. Soll die App als `Social`, `Dating` oder `Communication` eingeordnet werden?

View File

@@ -34,8 +34,8 @@ android {
applicationId = "de.ypchat.android"
minSdk = 26
targetSdk = 36
versionCode = 2
versionName = "1.1.0"
versionCode = 3
versionName = "1.2.0"
}
lint {

View File

@@ -1,6 +1,6 @@
<resources>
<string name="app_name">YPChat</string>
<string name="landing_eyebrow">SingleChat</string>
<string name="landing_eyebrow">YpChat</string>
<string name="landing_title">Direkt in den Chat</string>
<string name="landing_copy">Kompakt, schnell und ohne Umwege. Erstelle dein Profil und starte sofort eine Unterhaltung.</string>
<string name="feature_worldwide_chat">Weltweiter Chat</string>
@@ -105,7 +105,7 @@
<string name="faq_body">Wähle einen Nicknamen, gib deine Profildaten an und starte den Chat. Teile keine sensiblen Daten wie Telefonnummern, Adressen, Passwörter oder Zahlungsinformationen. Du kannst Bilder senden, Benutzer blockieren und Feedback für ernste Vorfälle nutzen.</string>
<string name="rules_body">Keine Beleidigungen, Hassrede, illegalen Inhalte, Spam oder unerwünschte Belästigung. Sende nur Bilder, die du teilen darfst, und respektiere die Privatsphäre anderer.</string>
<string name="safety_body">Nutze einen Nicknamen, der dich nicht identifiziert. Teile keine privaten Kontakt- oder Zahlungsdaten. Sei vorsichtig mit Links von Unbekannten und beende Gespräche, die sich falsch anfühlen. Nutze Blockieren und Feedback bei schweren Vorfällen.</string>
<string name="privacy_body">SingleChat verarbeitet den von dir gewählten Nickname, Profildaten wie Alter, Geschlecht und Land, Chat-Nachrichten, von dir aktiv gesendete Bilder, Feedback-Nachrichten sowie technisch notwendige Sitzungsdaten. Die Android-App fragt den Kamerazugriff nur an, wenn du in der App aktiv ein Foto aufnehmen möchtest. Die vollständige Datenschutzerklärung für Website und App ist auf www.ypchat.net veröffentlicht.</string>
<string name="privacy_body">YpChat verarbeitet den von dir gewählten Nickname, Profildaten wie Alter, Geschlecht und Land, Chat-Nachrichten, von dir aktiv gesendete Bilder, Feedback-Nachrichten sowie technisch notwendige Sitzungsdaten. Die Android-App fragt den Kamerazugriff nur an, wenn du in der App aktiv ein Foto aufnehmen möchtest. Die vollständige Datenschutzerklärung für Website und App ist auf www.ypchat.net veröffentlicht.</string>
<string name="privacy_open_policy">Datenschutzerklärung öffnen</string>
<string name="imprint_body">Torsten Schulz, Friedrich-Stampfer-Str. 21, 60437 Frankfurt. Kontakt: tsschulz@tsschulz.de. Für externe Links sind deren Betreiber verantwortlich.</string>
</resources>

View File

@@ -1,6 +1,6 @@
<resources>
<string name="app_name">YPChat</string>
<string name="landing_eyebrow">SingleChat</string>
<string name="app_name">YpChat</string>
<string name="landing_eyebrow">YpChat</string>
<string name="landing_title">Directly into chat</string>
<string name="landing_copy">Compact, fast and without detours. Create your profile and start a conversation right away.</string>
<string name="feature_worldwide_chat">Worldwide chat</string>
@@ -136,7 +136,7 @@
<string name="faq_body">Choose a nickname, enter your profile details and start chatting. Do not share sensitive data like phone numbers, addresses, passwords or payment information. You can send images, block users and use feedback for serious issues.</string>
<string name="rules_body">No insults, hate speech, illegal content, spam or unwanted harassment. Only send images you are allowed to share and respect the privacy of others.</string>
<string name="safety_body">Use a nickname that does not identify you. Do not share private contact or payment data. Be careful with links from strangers and end conversations that feel wrong. Use block and feedback for serious incidents.</string>
<string name="privacy_body">SingleChat processes the nickname you choose, profile details such as age, gender and country, chat messages, images you actively send, feedback messages and technically necessary session data. The Android app requests camera access only if you actively want to take a photo in the app. The full privacy policy for website and app is published on www.ypchat.net.</string>
<string name="privacy_body">YpChat processes the nickname you choose, profile details such as age, gender and country, chat messages, images you actively send, feedback messages and technically necessary session data. The Android app requests camera access only if you actively want to take a photo in the app. The full privacy policy for website and app is published on www.ypchat.net.</string>
<string name="privacy_open_policy">Open privacy policy</string>
<string name="imprint_body">Torsten Schulz, Friedrich-Stampfer-Str. 21, 60437 Frankfurt. Contact: tsschulz@tsschulz.de. External links are the responsibility of their operators.</string>
</resources>

View File

@@ -32,7 +32,7 @@
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="shortcut icon" href="/favicon.ico">
<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","alternateName":"YPChat","url":"https://www.ypchat.net/","description":"Kostenloser Single Chat ohne lange Registrierung: Profil starten, Singles kennenlernen, privat chatten und Bilder sicher austauschen.","inLanguage":"de-DE"}</script>
<script type="application/ld+json" id="seo-json-ld">{"@context":"https://schema.org","@type":"WebSite","name":"SingleChat","alternateName":"ypchat.net","url":"https://www.ypchat.net/","description":"Kostenloser Single Chat ohne lange Registrierung: Profil starten, Singles kennenlernen, privat chatten und Bilder sicher austauschen.","inLanguage":"de-DE"}</script>
</head>
<body>
<div id="app"></div>

View File

@@ -1,11 +1,11 @@
{
"name": "singlechat-client",
"name": "ypchat-client",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "singlechat-client",
"name": "ypchat-client",
"version": "1.0.0",
"dependencies": {
"@unhead/vue": "^2.0.19",

View File

@@ -1,5 +1,5 @@
{
"name": "singlechat-client",
"name": "ypchat-client",
"version": "1.0.0",
"type": "module",
"scripts": {

View File

@@ -32,7 +32,7 @@
title="Foto aufnehmen"
:disabled="!hasConversation || isCameraStarting"
>
<span aria-hidden="true">📷</span>
<span class="camera-button-icon" aria-hidden="true">📷</span>
</button>
<div v-if="showSmileys" class="smiley-bar">
@@ -380,15 +380,22 @@ onBeforeUnmount(() => {
<style scoped>
.camera-button {
width: 35px;
height: 35px;
width: 40px;
height: 40px;
padding: 0;
border: 1px solid #cdd8d0;
border-radius: 8px;
background: #ffffff;
display: inline-grid;
place-items: center;
background: linear-gradient(180deg, #fdfefd 0%, #edf4ef 100%);
display: inline-flex;
align-items: center;
justify-content: center;
cursor: pointer;
font-size: 18px;
}
.camera-button-icon {
display: block;
font-size: 20px;
line-height: 1;
}
.camera-button:disabled {

View File

@@ -1,7 +1,7 @@
<template>
<div class="landing-login">
<section class="landing-login-intro">
<p class="landing-login-eyebrow">SingleChat</p>
<p class="landing-login-eyebrow">YpChat</p>
<h2>Direkt in den Chat</h2>
<p class="landing-login-copy">
Kompakt, schnell und ohne Umwege. Erstelle dein Profil und starte sofort eine Unterhaltung.
@@ -11,7 +11,7 @@
<span>Bildaustausch</span>
<span>Kompakte Bedienung</span>
</div>
<nav class="landing-login-topic-links" aria-label="SingleChat Themen">
<nav class="landing-login-topic-links" aria-label="YpChat 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>

View File

@@ -107,9 +107,9 @@ function statusLabel(status) {
<style scoped>
.video-dock {
width: min(20vw, 320px);
min-width: 220px;
max-width: 320px;
width: min(16vw, 240px);
min-width: 180px;
max-width: 240px;
padding: 12px;
border-left: 1px solid #dfe6e1;
background: linear-gradient(180deg, #f5f8f6 0%, #edf3ef 100%);
@@ -191,8 +191,8 @@ function statusLabel(status) {
@media (max-width: 1100px) {
.video-dock {
width: 240px;
min-width: 240px;
width: 200px;
min-width: 200px;
}
}

View File

@@ -69,7 +69,7 @@ const homeSchema = {
'@context': 'https://schema.org',
'@type': 'WebSite',
name: 'SingleChat',
alternateName: 'YPChat',
alternateName: 'ypchat.net',
url: `${SITE_URL}/`,
description: 'Kostenloser Single Chat ohne lange Registrierung. Lerne Singles kennen, chatte privat und tausche Bilder sicher aus.',
inLanguage: 'de-DE'
@@ -347,7 +347,7 @@ const routes = [
meta: {
title: 'Datenschutzerklärung für Website und App - SingleChat',
description: 'Datenschutzerklärung für SingleChat und die Android-App mit Informationen zu Profilangaben, Nachrichten, Bildern und Sitzungsdaten.',
keywords: 'datenschutz singlechat, privacy policy chat app, chat datenschutz, android app datenschutz',
keywords: 'datenschutz ypchat, privacy policy chat app, chat datenschutz, android app datenschutz',
ogTitle: 'Datenschutzerklärung für Website und App - SingleChat',
ogDescription: 'Informationen zur Datenverarbeitung bei SingleChat und in der Android-App.',
ogType: 'website',

View File

@@ -8,6 +8,15 @@ const MAX_VIDEO_CONNECTIONS_DEFAULT = 3;
const VIDEO_TERMINAL_STATUSES = new Set(['rejected', 'cancelled', 'ended', 'failed']);
const VIDEO_LIVE_STATUSES = new Set(['ringing', 'connecting', 'active']);
const WEBRTC_CONNECTION_STATES = new Set(['new', 'connecting', 'connected', 'disconnected', 'failed', 'closed']);
const VIDEO_STATUS_ORDER = {
ringing: 1,
connecting: 2,
active: 3,
rejected: 4,
cancelled: 4,
ended: 4,
failed: 4
};
function createEmptySearchData() {
return {
@@ -139,6 +148,34 @@ export const useChatStore = defineStore('chat', () => {
};
}
function getVideoStatusRank(status) {
return VIDEO_STATUS_ORDER[status] || 0;
}
function parseVideoTimestamp(value) {
const time = Date.parse(value || '');
return Number.isFinite(time) ? time : 0;
}
function shouldIgnoreVideoSessionUpdate(currentSession, nextSession) {
if (!currentSession) return false;
const currentUpdatedAt = parseVideoTimestamp(currentSession.updatedAt || currentSession.createdAt);
const nextUpdatedAt = parseVideoTimestamp(nextSession.updatedAt || nextSession.createdAt);
if (nextUpdatedAt && currentUpdatedAt && nextUpdatedAt < currentUpdatedAt) {
return true;
}
if (
nextUpdatedAt === currentUpdatedAt &&
getVideoStatusRank(nextSession.status) < getVideoStatusRank(currentSession.status)
) {
return true;
}
return false;
}
function getRemoteStream(callId) {
return remoteStreams.value[callId] || null;
}
@@ -209,8 +246,13 @@ export const useChatStore = defineStore('chat', () => {
const index = videoSessions.value.findIndex((entry) => entry.callId === next.callId);
if (index >= 0) {
const current = videoSessions.value[index];
if (shouldIgnoreVideoSessionUpdate(current, next)) {
return;
}
videoSessions.value[index] = {
...videoSessions.value[index],
...current,
...next
};
videoSessions.value = [...videoSessions.value];

View File

@@ -633,7 +633,7 @@ a {
background: linear-gradient(180deg, rgba(238, 245, 240, 0.92) 0%, rgba(247, 250, 248, 0.88) 100%);
flex-shrink: 0;
display: grid;
grid-template-columns: minmax(0, 1fr) auto auto auto;
grid-template-columns: minmax(0, 1fr) auto auto auto auto;
gap: 8px;
align-items: center;
position: relative;
@@ -868,7 +868,7 @@ a {
}
.chat-input-container {
grid-template-columns: minmax(0, 1fr) auto auto;
grid-template-columns: minmax(0, 1fr) auto auto auto auto;
}
.chat-input-container button:not(.no-style) {

View File

@@ -5,8 +5,8 @@
<aside class="app-sidebar">
<div class="sidebar-brand">
<div class="sidebar-brand-head">
<span class="app-brand-mark sidebar-brand-mark" aria-hidden="true">S</span>
<strong>SingleChat</strong>
<span class="app-brand-mark sidebar-brand-mark" aria-hidden="true">Y</span>
<strong>YpChat</strong>
</div>
<span>Online Chat</span>
</div>
@@ -51,7 +51,7 @@
<span class="profile-avatar">{{ userInitials }}</span>
<span>
<strong>{{ chatStore.userName }}</strong>
<small>{{ chatStore.country || 'SingleChat Member' }}</small>
<small>{{ chatStore.country || 'YpChat Member' }}</small>
</span>
</div>
</aside>
@@ -156,9 +156,9 @@
<template v-else>
<header class="header">
<div class="app-brand">
<span class="app-brand-mark">S</span>
<span class="app-brand-mark">Y</span>
<div class="app-brand-copy">
<span class="app-brand-eyebrow">SingleChat</span>
<span class="app-brand-eyebrow">YpChat</span>
<h1>Chat</h1>
</div>
</div>
@@ -195,12 +195,12 @@ import FloatingVideoWindow from '../components/FloatingVideoWindow.vue';
const chatStore = useChatStore();
const userInitials = computed(() => {
return (chatStore.userName || 'SC')
return (chatStore.userName || 'YP')
.split(/\s+/)
.filter(Boolean)
.slice(0, 2)
.map(part => part.charAt(0).toUpperCase())
.join('') || 'SC';
.join('') || 'YP';
});
const pageTitle = computed(() => {

View File

@@ -4,7 +4,7 @@
<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>
<span class="app-brand-eyebrow">YpChat</span>
<h1>FAQ</h1>
</div>
</router-link>
@@ -90,4 +90,3 @@ import ImprintContainer from '../components/ImprintContainer.vue';
text-decoration: none;
}
</style>

View File

@@ -4,7 +4,7 @@
<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>
<span class="app-brand-eyebrow">YpChat</span>
<h1>Feedback</h1>
</div>
</router-link>

View File

@@ -4,7 +4,7 @@
<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>
<span class="app-brand-eyebrow">YpChat</span>
<h1>Ratgeber</h1>
</div>
</router-link>
@@ -77,7 +77,7 @@
</p>
<p class="content-meta">
Redaktion: SingleChat Team · Zuletzt aktualisiert: 07.05.2026
Redaktion: YpChat Team · Zuletzt aktualisiert: 07.05.2026
</p>
</main>

View File

@@ -4,7 +4,7 @@
<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>
<span class="app-brand-eyebrow">YpChat</span>
<h1>Ratgeber</h1>
</div>
</router-link>
@@ -15,7 +15,7 @@
<h2>Ratgeber: Sicher und entspannt chatten</h2>
<p>
In unserem Ratgeber findest du praxisnahe Tipps rund um privaten Chat, Profilgestaltung und digitale Sicherheit.
Alle Inhalte sind speziell fuer SingleChat-Nutzer geschrieben und werden laufend erweitert.
Alle Inhalte sind speziell fuer YpChat-Nutzer geschrieben und werden laufend erweitert.
</p>
<p>
Wenn du neu im Chat bist, starte am besten mit dem Leitfaden zur ersten Unterhaltung und arbeite dich dann zu
@@ -77,7 +77,7 @@
</section>
<p class="content-meta">
Redaktion: SingleChat Team · Zuletzt aktualisiert: 07.05.2026
Redaktion: YpChat Team · Zuletzt aktualisiert: 07.05.2026
</p>
</main>

View File

@@ -4,7 +4,7 @@
<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>
<span class="app-brand-eyebrow">YpChat</span>
<h1>Ratgeber</h1>
</div>
</router-link>
@@ -76,7 +76,7 @@
</p>
<p class="content-meta">
Redaktion: SingleChat Team · Zuletzt aktualisiert: 07.05.2026
Redaktion: YpChat Team · Zuletzt aktualisiert: 07.05.2026
</p>
</main>

View File

@@ -4,7 +4,7 @@
<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>
<span class="app-brand-eyebrow">YpChat</span>
<h1>Ratgeber</h1>
</div>
</router-link>
@@ -63,7 +63,7 @@
</p>
<p class="content-meta">
Redaktion: SingleChat Team · Zuletzt aktualisiert: 07.05.2026
Redaktion: YpChat Team · Zuletzt aktualisiert: 07.05.2026
</p>
</main>

View File

@@ -4,7 +4,7 @@
<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>
<span class="app-brand-eyebrow">YpChat</span>
<h1>Ratgeber</h1>
</div>
</router-link>
@@ -63,7 +63,7 @@
</p>
<p class="content-meta">
Redaktion: SingleChat Team · Zuletzt aktualisiert: 07.05.2026
Redaktion: YpChat Team · Zuletzt aktualisiert: 07.05.2026
</p>
</main>

View File

@@ -2,7 +2,7 @@
<div class="mockup-page">
<header class="mockup-page-header">
<div>
<p class="mockup-page-eyebrow">SingleChat Redesign</p>
<p class="mockup-page-eyebrow">YpChat Redesign</p>
<h1>Mockup-Vergleich</h1>
</div>
<p class="mockup-page-copy">
@@ -28,7 +28,7 @@
<div class="mockup-brand-mark">S</div>
<div>
<p class="mockup-eyebrow">Design Preview</p>
<h3>SingleChat</h3>
<h3>YpChat</h3>
</div>
</div>
@@ -148,7 +148,7 @@
<div class="mockup-mobile-device mockup-mobile-device-polished">
<div class="mockup-mobile-top">
<span>SingleChat</span>
<span>YpChat</span>
<span class="mockup-mobile-pill">3</span>
</div>
<div class="mockup-mobile-chat-header">

View File

@@ -4,7 +4,7 @@
<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>
<span class="app-brand-eyebrow">YpChat</span>
<h1>Partner</h1>
</div>
</router-link>

View File

@@ -4,7 +4,7 @@
<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>
<span class="app-brand-eyebrow">YpChat</span>
<h1>Datenschutz</h1>
</div>
</router-link>
@@ -14,7 +14,7 @@
<main class="content-page">
<h2>Datenschutzerklärung für Website und App</h2>
<p>
Diese Datenschutzerklärung gilt für die Website und die Android-App von SingleChat unter
Diese Datenschutzerklärung gilt für die Website und die Android-App von YpChat unter
der Domain <strong>www.ypchat.net</strong>.
</p>
<p>

View File

@@ -4,7 +4,7 @@
<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>
<span class="app-brand-eyebrow">YpChat</span>
<h1>Regeln</h1>
</div>
</router-link>
@@ -85,4 +85,3 @@ import ImprintContainer from '../components/ImprintContainer.vue';
text-decoration: none;
}
</style>

View File

@@ -4,7 +4,7 @@
<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>
<span class="app-brand-eyebrow">YpChat</span>
<h1>Sicherheit</h1>
</div>
</router-link>
@@ -14,7 +14,7 @@
<main class="content-page">
<h2>Sicherheit &amp; Privatsphäre</h2>
<p>
SingleChat ist auf schnellen Einstieg ausgelegt trotzdem ist uns Sicherheit wichtig. Diese Hinweise helfen dir,
YpChat ist auf schnellen Einstieg ausgelegt trotzdem ist uns Sicherheit wichtig. Diese Hinweise helfen dir,
im privaten und anonymen Chat deine Privatsphäre zu schützen und gute Entscheidungen zu treffen.
</p>

View File

@@ -4,7 +4,7 @@
<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>
<span class="app-brand-eyebrow">YpChat</span>
<h1>{{ landing.heading }}</h1>
</div>
</router-link>
@@ -27,7 +27,7 @@
</div>
</section>
<section class="topic-grid" aria-label="SingleChat Vorteile">
<section class="topic-grid" aria-label="YpChat Vorteile">
<article
v-for="section in landing.sections"
:key="section.title"
@@ -42,7 +42,7 @@
<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,
fuer neue Kontakte. YpChat buendelt diese Einstiege auf einer Plattform: schnell starten, privat schreiben,
respektvoll bleiben.
</p>
<ul>
@@ -65,7 +65,7 @@ import ImprintContainer from '../components/ImprintContainer.vue';
const route = useRoute();
const landing = computed(() => route.meta.landing || {
heading: 'SingleChat',
heading: 'YpChat',
intro: 'Kostenloser Single Chat fuer private Gespraeche und neue Kontakte.',
sections: [],
links: [{ to: '/', label: 'Chat starten' }]

View File

@@ -1,6 +1,6 @@
#!/bin/bash
# SingleChat Deployment nach /opt/ypchat
# YpChat Deployment nach /opt/ypchat
# Dieses Skript kopiert die Anwendung nach /opt/ypchat und installiert sie dort
set -e
@@ -11,7 +11,7 @@ USER="www-data"
GROUP="www-data"
echo "=========================================="
echo "SingleChat Deployment nach /opt/ypchat"
echo "YpChat Deployment nach /opt/ypchat"
echo "=========================================="
# Prüfe ob als root ausgeführt
@@ -145,4 +145,3 @@ echo "3. Starte den neuen Service:"
echo " sudo systemctl start ypchat"
echo " sudo systemctl status ypchat"
echo ""

View File

@@ -2,7 +2,7 @@
## Ziel
SingleChat soll Videochat innerhalb einer bestehenden 1:1-Konversation unterstützen.
YpChat soll Videochat innerhalb einer bestehenden 1:1-Konversation unterstützen.
Rahmenbedingungen:
@@ -47,7 +47,7 @@ Praktisch heißt das:
### 3. Bevorzugte Zielarchitektur
Für SingleChat ist eine SFU-basierte 1:1-Lösung sinnvoller als vollständiges Server-Transcoding:
Für YpChat ist eine SFU-basierte 1:1-Lösung sinnvoller als vollständiges Server-Transcoding:
- bessere Latenz als kompletter zentraler Decode/Encode-Relay
- trotzdem keine direkte Verbindung zwischen Nutzern

View File

@@ -1,7 +1,7 @@
#!/bin/bash
# SingleChat Systemd Service Installation für ypchat.net
# Erstellt einen systemd Service für SingleChat
# YpChat Systemd Service Installation für ypchat.net
# Erstellt einen systemd Service für YpChat
set -e
@@ -12,7 +12,7 @@ USER="www-data"
GROUP="www-data"
echo "=========================================="
echo "SingleChat Systemd Service Installation"
echo "YpChat Systemd Service Installation"
echo "=========================================="
# Prüfe ob als root ausgeführt
@@ -46,7 +46,7 @@ fi
echo "Erstelle Service-Datei..."
cat > "$SERVICE_FILE" << EOF
[Unit]
Description=SingleChat Node.js Application
Description=YpChat Node.js Application
After=network.target
[Service]
@@ -103,4 +103,3 @@ echo ""
echo "WICHTIG: Starte den Service mit:"
echo " sudo systemctl start $SERVICE_NAME"
echo ""

View File

@@ -1,7 +1,7 @@
#!/bin/bash
# SingleChat Systemd Service Installation
# Erstellt einen systemd Service für SingleChat
# YpChat Systemd Service Installation
# Erstellt einen systemd Service für YpChat
set -e
@@ -11,7 +11,7 @@ APP_DIR=$(pwd)
USER=$(whoami)
echo "=========================================="
echo "SingleChat Systemd Service Installation"
echo "YpChat Systemd Service Installation"
echo "=========================================="
# Prüfe ob als root ausgeführt
@@ -25,7 +25,7 @@ fi
echo "Erstelle Service-Datei..."
cat > "$SERVICE_FILE" << EOF
[Unit]
Description=SingleChat Node.js Application
Description=YpChat Node.js Application
After=network.target
[Service]
@@ -71,4 +71,3 @@ echo " Stop: sudo systemctl stop $SERVICE_NAME"
echo " Status: sudo systemctl status $SERVICE_NAME"
echo " Logs: sudo journalctl -u $SERVICE_NAME -f"
echo ""

View File

@@ -1,12 +1,12 @@
#!/bin/bash
# SingleChat Installation Script
# Dieses Skript installiert die SingleChat-Anwendung für Production
# YpChat Installation Script
# Dieses Skript installiert die YpChat-Anwendung für Production
# set -e wird später aktiviert, nachdem Retry-Logik definiert ist
echo "=========================================="
echo "SingleChat Installation"
echo "YpChat Installation"
echo "=========================================="
# Prüfe ob Node.js installiert ist
@@ -125,4 +125,3 @@ echo "Apache-Konfiguration sollte enthalten:"
echo " ProxyPass / http://localhost:4000/"
echo " ProxyPassReverse / http://localhost:4000/"
echo ""

View File

@@ -1,5 +1,5 @@
"app_name" = "YPChat";
"landing_eyebrow" = "SingleChat";
"landing_eyebrow" = "YpChat";
"landing_title" = "Direkt in den Chat";
"landing_copy" = "Kompakt, schnell und ohne Umwege. Erstelle dein Profil und starte sofort eine Unterhaltung.";
"feature_worldwide_chat" = "Weltweiter Chat";

View File

@@ -1,5 +1,5 @@
"app_name" = "YPChat";
"landing_eyebrow" = "SingleChat";
"landing_eyebrow" = "YpChat";
"landing_title" = "Directly into chat";
"landing_copy" = "Compact, fast and without detours. Create your profile and start a conversation right away.";
"feature_worldwide_chat" = "Worldwide chat";

4
package-lock.json generated
View File

@@ -1,11 +1,11 @@
{
"name": "singlechat",
"name": "ypchat",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "singlechat",
"name": "ypchat",
"version": "1.0.0",
"dependencies": {
"axios": "^1.6.0",

View File

@@ -1,8 +1,8 @@
{
"name": "singlechat",
"name": "ypchat",
"version": "1.0.0",
"type": "module",
"description": "SingleChat Node.js/Vue Application",
"description": "YpChat Node.js/Vue Application",
"scripts": {
"dev:server": "node server/index.js",
"dev:client": "cd client && npm run dev",

View File

@@ -1,6 +1,6 @@
#!/bin/bash
# Schnelles Update-Script für SingleChat
# Schnelles Update-Script für YpChat
# Kopiert nur geänderte Server-Dateien und baut den Client neu
set -e
@@ -11,7 +11,7 @@ USER="www-data"
GROUP="www-data"
echo "=========================================="
echo "SingleChat Quick Update"
echo "YpChat Quick Update"
echo "=========================================="
# Prüfe ob als root ausgeführt
@@ -76,4 +76,3 @@ echo "Starte Service neu mit:"
echo " sudo systemctl restart ypchat"
echo " sudo systemctl status ypchat"
echo ""

View File

@@ -53,7 +53,7 @@ if ! flock -n 9; then
exit 1
fi
log "Starte SingleChat Rollout"
log "Starte YpChat Rollout"
log "APP_DIR=$APP_DIR"
log "REPO_URL=$REPO_URL"
log "BRANCH=$BRANCH"
@@ -171,4 +171,4 @@ else
log "systemctl nicht gefunden, Service-Neustart uebersprungen"
fi
log "SingleChat Rollout abgeschlossen"
log "YpChat Rollout abgeschlossen"

View File

@@ -124,7 +124,7 @@ const seoData = {
'@context': 'https://schema.org',
'@type': 'WebSite',
name: 'SingleChat',
alternateName: 'YPChat',
alternateName: 'ypchat.net',
url: `${SITE_URL}/`,
description: 'Kostenloser Single Chat ohne lange Registrierung. Lerne Singles kennen, chatte privat und tausche Bilder sicher aus.',
inLanguage: 'de-DE'
@@ -253,7 +253,7 @@ const seoData = {
'/datenschutz': {
title: 'Datenschutzerklärung für Website und App - SingleChat',
description: 'Datenschutzerklärung für SingleChat und die Android-App mit Informationen zu Profilangaben, Nachrichten, Bildern und Sitzungsdaten.',
keywords: 'datenschutz singlechat, privacy policy chat app, chat datenschutz, android app datenschutz',
keywords: 'datenschutz ypchat, privacy policy chat app, chat datenschutz, android app datenschutz',
ogTitle: 'Datenschutzerklärung für Website und App - SingleChat',
ogDescription: 'Informationen zur Datenverarbeitung bei SingleChat und in der Android-App.',
ogType: 'website',
@@ -363,7 +363,7 @@ for (const page of landingPages) {
isPartOf: {
'@type': 'WebSite',
name: 'SingleChat',
alternateName: 'YPChat',
alternateName: 'ypchat.net',
url: `${SITE_URL}/`
},
inLanguage: 'de-DE'

View File

@@ -7,14 +7,14 @@
set -euo pipefail
MODE="${1:-update}"
REPO_DIR="/home/torsten/singlechat"
REPO_DIR="/home/torsten/YpChat"
TARGET_DIR="/opt/ypchat"
SERVICE_NAME="ypchat"
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
APP_USER="www-data"
echo "=========================================="
echo "SingleChat Update"
echo "YpChat Update"
echo "Mode: ${MODE}"
echo "=========================================="