This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# AdSense in SingleChat
|
||||
# AdSense in YpChat
|
||||
|
||||
## Ziel
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SingleChat Production Installation
|
||||
# YpChat Production Installation
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
|
||||
@@ -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?
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
4
client/package-lock.json
generated
4
client/package-lock.json
generated
@@ -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",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "singlechat-client",
|
||||
"name": "ypchat-client",
|
||||
"version": "1.0.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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(() => {
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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 & 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>
|
||||
|
||||
|
||||
@@ -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' }]
|
||||
|
||||
@@ -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 ""
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ""
|
||||
|
||||
|
||||
@@ -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 ""
|
||||
|
||||
|
||||
@@ -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 ""
|
||||
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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
4
package-lock.json
generated
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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 ""
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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 "=========================================="
|
||||
|
||||
|
||||
Reference in New Issue
Block a user