HEX
Server: LiteSpeed
System: Linux houston.panomity.com 6.8.0-100-generic #100-Ubuntu SMP PREEMPT_DYNAMIC Tue Jan 13 16:40:06 UTC 2026 x86_64
User: nudepix (1011)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: //tmp/dateweb_patch_local_scale.cjs
const fs = require('fs');

function read(file) { return fs.readFileSync(file, 'utf8'); }
function write(file, s) { fs.writeFileSync(file, s, 'utf8'); }

const newCities = [
  { slug: 'duesseldorf', name: 'Düsseldorf', region: 'Nordrhein-Westfalen', image: '/media/generated/dateweb-trust-premium-optimized.webp', teaser: 'Dating in Düsseldorf für Singles ab 30: stilvoll, klar und ohne endlose Chat-Schleifen kennenlernen.', intent: 'Düsseldorf verbindet Business-Alltag, Rhein-Nähe und Ausgehkultur. Für Singles ab 30 funktioniert Dating hier besonders gut, wenn Profil, Absicht und Treffpunkt früh konkret werden.', ideas: ['Kaffee in Pempelfort mit klarer Dauer', 'Rheinspaziergang an einem belebten Abschnitt', 'Kunstsammlung oder kleine Ausstellung mit anschließendem Getränk'], signals: ['Viele berufstätige Singles', 'Gute öffentliche Treffpunkte am Rhein', 'Hoher Nutzen klarer Profil- und Absichtssignale'] },
  { slug: 'stuttgart', name: 'Stuttgart', region: 'Baden-Württemberg', image: '/media/generated/dateweb-journey-premium-optimized.webp', teaser: 'Dating in Stuttgart für Singles ab 30: zwischen vollem Alltag, Qualität und echten Treffen entspannter starten.', intent: 'Stuttgart ist oft beruflich dicht getaktet und zugleich regional verwurzelt. Gute Dating-Seiten helfen, aus knapper Zeit klare, sichere und sympathische Treffen zu machen.', ideas: ['Kaffee rund um den Schlossplatz mit guter Anbindung', 'Spaziergang im Park bei Tageslicht', 'kurzes After-Work-Treffen statt langem Pflicht-Dinner'], signals: ['Zeitbewusste Singles', 'Viele gut erreichbare öffentliche Orte', 'Qualitätsorientierte Profile statt beliebiger Reize'] },
  { slug: 'leipzig', name: 'Leipzig', region: 'Sachsen', image: '/media/generated/dateweb-hero-editorial-optimized.webp', teaser: 'Dating in Leipzig für Singles ab 30: kreativ, entspannt und mit klarer Richtung statt unverbindlichem Nebenbei-Chat.', intent: 'Leipzig bietet Kultur, Parks und Cafés als natürliche Gesprächsräume. Für Singles ab 30 zählt, dass Lockerheit nicht in Unverbindlichkeit kippt.', ideas: ['Café-Date in einem gut erreichbaren Viertel', 'Spaziergang am Kanal oder im Park', 'kleiner Kulturtermin als Gesprächsanlass'], signals: ['Kreative und offene Stadtatmosphäre', 'Viele niedrigschwellige Date-Orte', 'Gute Chance auf entspannte erste Treffen'] },
  { slug: 'dortmund', name: 'Dortmund', region: 'Nordrhein-Westfalen', image: '/media/generated/dateweb-profile-editorial-optimized.webp', teaser: 'Dating in Dortmund für Singles ab 30: direkt, bodenständig und mit besseren Gesprächseinstiegen kennenlernen.', intent: 'Dortmund passt zu Dating, das nicht überinszeniert wirkt. Wer klar kommuniziert und öffentliche Treffpunkte wählt, schafft schneller Vertrauen.', ideas: ['Kaffee mit kurzem Zeitfenster', 'Spaziergang in einem belebten Park', 'kleiner Kultur- oder Kneipenabend mit klarer Erwartung'], signals: ['Bodenständige Gesprächskultur', 'Viele unkomplizierte Treffpunkte', 'Hoher Wert konkreter Einladungen'] },
  { slug: 'essen', name: 'Essen', region: 'Nordrhein-Westfalen', image: '/media/generated/dateweb-journey-premium-optimized.webp', teaser: 'Dating in Essen für Singles ab 30: ruhiger filtern, konkrete Treffen planen und aus Profilen echte Gespräche machen.', intent: 'Essen verbindet Ruhrgebietsdirektheit, Kultur und Alltagstempo. Eine starke Dating-Seite hilft, Sympathie ohne Druck in ein sicheres erstes Treffen zu übersetzen.', ideas: ['Kaffee in einem zentral erreichbaren Viertel', 'Spaziergang am Baldeneysee an belebten Stellen', 'Museum oder Kulturtermin mit anschließendem kurzem Gespräch'], signals: ['Öffentliche Treffpunkte mit guter Anbindung', 'Direkte Kommunikation als Vorteil', 'Profilklarheit statt austauschbarer Matches'] },
  { slug: 'bremen', name: 'Bremen', region: 'Bremen', image: '/media/generated/dateweb-trust-premium-optimized.webp', teaser: 'Dating in Bremen für Singles ab 30: überschaubarer, persönlicher und mit klaren nächsten Schritten.', intent: 'Bremen wirkt kleiner und persönlicher als viele Metropolen. Gerade deshalb sind respektvolle Kommunikation, Diskretion und klare Treffpunkte wichtig.', ideas: ['Kaffee im Viertel mit klarer Dauer', 'Spaziergang an der Weser', 'kleiner Kulturtermin statt langem Dinner'], signals: ['Überschaubare Stadtwege', 'Persönliche Atmosphäre', 'Gute Orte für kurze sichere Treffen'] },
  { slug: 'dresden', name: 'Dresden', region: 'Sachsen', image: '/media/generated/dateweb-hero-editorial-optimized.webp', teaser: 'Dating in Dresden für Singles ab 30: Kultur, Spaziergänge und klare Absichten für entspannte erste Treffen nutzen.', intent: 'Dresden bietet viele ruhige, öffentliche Date-Orte. Singles ab 30 profitieren von Profilen, die echte Absicht und gute Gesprächsanlässe sichtbar machen.', ideas: ['Spaziergang an der Elbe mit öffentlichem Treffpunkt', 'Museums- oder Kulturdate', 'Kaffee in der Altstadt mit kurzem Zeitfenster'], signals: ['Starke Kulturkulisse', 'Viele öffentliche Treffpunkte', 'Gute Mischung aus Ruhe und Gesprächsanlass'] },
  { slug: 'hannover', name: 'Hannover', region: 'Niedersachsen', image: '/media/generated/dateweb-profile-editorial-optimized.webp', teaser: 'Dating in Hannover für Singles ab 30: unaufgeregt, ehrlich und mit konkreten Date-Ideen kennenlernen.', intent: 'Hannover eignet sich für Dating ohne Show. Gute Profile, klare Fragen und sichere öffentliche Treffen bringen hier mehr als übertriebene Selbstdarstellung.', ideas: ['Kaffee mit guter Stadtbahn-Anbindung', 'Spaziergang in belebter Umgebung', 'kleiner Kulturtermin mit Option auf Verlängerung'], signals: ['Unaufgeregte Stadtatmosphäre', 'Gute Erreichbarkeit', 'Hoher Nutzen ehrlicher Profiltexte'] },
  { slug: 'nuernberg', name: 'Nürnberg', region: 'Bayern', image: '/media/generated/dateweb-journey-premium-optimized.webp', teaser: 'Dating in Nürnberg für Singles ab 30: kurze sichere Treffen, ehrliche Profile und klare Gesprächsanlässe.', intent: 'Nürnberg bietet viele öffentliche Orte für erste Dates. Entscheidend ist, aus einem guten Match schnell einen einfachen, respektvollen Vorschlag zu machen.', ideas: ['Kaffee in der Altstadt mit klarer Dauer', 'Spaziergang an belebten Orten', 'kleiner Kulturtermin als Gesprächsrahmen'], signals: ['Gut erreichbare Innenstadt', 'Öffentliche Treffpunkte', 'Klarheit vor langen Chat-Schleifen'] },
  { slug: 'karlsruhe', name: 'Karlsruhe', region: 'Baden-Württemberg', image: '/media/generated/dateweb-trust-premium-optimized.webp', teaser: 'Dating in Karlsruhe für Singles ab 30: zwischen Studium, Beruf und Alltag klarer kennenlernen.', intent: 'Karlsruhe verbindet Technik-, Hochschul- und Berufsalltag. Dating funktioniert besser, wenn Profile persönlicher werden und Treffen unkompliziert planbar sind.', ideas: ['Kaffee nahe Innenstadt oder Schloss', 'Spaziergang mit klarer Uhrzeit', 'After-Work-Treffen mit öffentlichem Ort'], signals: ['Mischung aus Hochschule und Beruf', 'Gute Stadtstruktur für kurze Treffen', 'Bedarf an persönlichen Profilsignalen'] },
];

function cityObject(c) {
  return `,
  {
    slug: '${c.slug}',
    name: '${c.name}',
    region: '${c.region}',
    image: '${c.image}',
    teaser: '${c.teaser}',
    intent: '${c.intent}',
    dateIdeas: ${JSON.stringify(c.ideas)},
    localSignals: ${JSON.stringify(c.signals)},
    deepDives: [
      ['Dating in ${c.name} ab 30: lokaler starten, klarer entscheiden', '${c.intent} Für Singles ab 30 entsteht Vertrauen nicht durch mehr Optionen, sondern durch ein Profil, das Alltag, Absicht und Gesprächsanlässe konkret macht.'],
      ['Warum kurze erste Treffen in ${c.name} besser funktionieren', 'Ein gutes erstes Date in ${c.name} ist öffentlich, gut erreichbar und zeitlich überschaubar. So bleibt das Treffen sicher, freundlich und ohne Druck verlängerbar.'],
      ['Vom Match zum Vorschlag', 'Viele Kontakte versanden, weil der nächste Schritt fehlt. Ein konkreter Ort, zwei Zeitfenster und eine leichte Begründung machen Antworten einfacher und reduzieren Ghosting-Frust.'],
    ],
    invitations: [
      'Dein Profil klingt sympathisch. Hast du Lust auf einen kurzen Kaffee in ${c.name}, eher Dienstag oder Donnerstag?',
      'Ich würde für den Einstieg gern etwas Öffentliches und Unkompliziertes wählen. Passt dir ein Spaziergang mit klarem Zeitfenster?',
      'Wenn du auch lieber ohne Druck startest: Lass uns 45 Minuten treffen und danach ehrlich schauen, ob es passt.',
    ],
    contextualLinks: [
      ['/dating-kompass', 'Dating-Kompass', 'hilft, die eigene Richtung vor dem nächsten Kontakt zu klären.'],
      ['/gespraechsstarter', 'Gesprächsstarter', 'macht aus Sympathie eine konkrete Einladung.'],
      ['/profil-check', 'Profil-Check', 'zeigt, ob dein Profil Vertrauen und Absicht vermittelt.'],
      ['/date-ideen-finder', 'Date-Ideen-Finder', 'macht aus lokalem Interesse einen konkreten Vorschlag.'],
    ],
    extraFaq: [
      ['Welche Treffpunkte eignen sich für ein erstes Date in ${c.name}?', 'Geeignet sind öffentliche, gut erreichbare Orte mit natürlicher Zeitbegrenzung: Kaffee, Spaziergang oder ein kleiner Kulturtermin.'],
      ['Wie vermeide ich endlose Chats in ${c.name}?', 'Formuliere früh einen freundlichen, konkreten Vorschlag mit Ort und zwei Zeitfenstern. Das macht Verbindlichkeit leichter.'],
    ],
  }`;
}

const cityRoutes = newCities.map((c) => `/dating/${c.slug}/`);
const citySitemapUrls = newCities.map((c) => `https://dateweb.de/dating/${c.slug}`);

// Add cities to generator.
{
  const file = 'scripts/generate-static-local-pages.mjs';
  let s = read(file);
  if (!s.includes("slug: 'duesseldorf'")) {
    const anchor = '\n];\n\nfunction esc(value) {';
    if (!s.includes(anchor)) throw new Error('city array end anchor missing');
    s = s.replace(anchor, `${newCities.map(cityObject).join('')}\n];\n\nfunction esc(value) {`);
  }
  write(file, s);
}

// Add public sitemap entries.
{
  const file = 'public/sitemap.xml';
  let s = read(file);
  for (const c of newCities) {
    const url = `https://dateweb.de/dating/${c.slug}`;
    if (!s.includes(url)) {
      const entry = `  <url>\n    <loc>${url}</loc>\n    <lastmod>2026-06-02</lastmod>\n    <changefreq>weekly</changefreq>\n    <priority>0.74</priority>\n  </url>\n`;
      s = s.replace('  <url>\n    <loc>https://dateweb.de/sitemap</loc>', `${entry}  <url>\n    <loc>https://dateweb.de/sitemap</loc>`);
    }
  }
  write(file, s);
}

// Add robots allow lines.
{
  const file = 'public/robots.txt';
  let s = read(file);
  const anchor = 'Allow: /dating/frankfurt\n';
  if (!s.includes(anchor)) throw new Error('robots anchor missing');
  const additions = newCities.map((c) => `Allow: /dating/${c.slug}`).filter((line) => !s.includes(line)).join('\n');
  if (additions) s = s.replace(anchor, `${anchor}${additions}\n`);
  write(file, s);
}

// Add growth route tracking.
{
  const file = 'scripts/growth-insights.mjs';
  let s = read(file);
  const anchor = "  '/dating/frankfurt/',\n";
  if (!s.includes(anchor)) throw new Error('growth insights city anchor missing');
  const additions = cityRoutes.map((r) => `  '${r}',`).filter((line) => !s.includes(line)).join('\n');
  if (additions) s = s.replace(anchor, `${anchor}${additions}\n`);
  write(file, s);
}

// Add backlog route tracking.
{
  const file = 'scripts/growth-backlog.mjs';
  let s = read(file);
  const anchor = "  ['/dating/frankfurt/', 'Dating Frankfurt', 'lokale Suchintention'],\n";
  if (!s.includes(anchor)) throw new Error('growth backlog city anchor missing');
  const additions = newCities.map((c) => `  ['/dating/${c.slug}/', 'Dating ${c.name}', 'lokale Suchintention'],`).filter((line) => !s.includes(line)).join('\n');
  if (additions) s = s.replace(anchor, `${anchor}${additions}\n`);
  write(file, s);
}

// Expand visitor audit live/social/CTA/structured checks to new local pages.
{
  const file = 'scripts/visitor-audit.sh';
  let s = read(file);
  for (const c of newCities) {
    if (!s.includes(`/dating/${c.slug} `) && !s.includes(`/dating/${c.slug} /`) && !s.includes(`/dating/${c.slug};`)) {
      s = s.replace('/dating/frankfurt /dating-kompass', `/dating/frankfurt /dating/${c.slug} /dating-kompass`);
    }
    const page = `"$PUBLIC_HTML/dating/${c.slug}/index.html"`;
    if (!s.includes(page)) {
      s = s.replace('"$PUBLIC_HTML/dating/frankfurt/index.html" "$PUBLIC_HTML/sitemap/index.html"', `"$PUBLIC_HTML/dating/frankfurt/index.html" ${page} "$PUBLIC_HTML/sitemap/index.html"`);
      s = s.replace('"$PUBLIC_HTML/dating/frankfurt/index.html"; do', `"$PUBLIC_HTML/dating/frankfurt/index.html" ${page}; do`);
    }
  }
  write(file, s);
}