So funktioniert die Bewerbungsseite für die Wohnungssuche

Eine persönliche Seite für die Wohnungs- oder WG-Suche: Fotos, Vorstellung, Eckdaten, Wünsche und Unterlagen, verschickt als Link oder QR-Code. Hier steht, wie sie aufgebaut ist, welche Einstellungen ein Link tragen kann und wie du eine eigene Kopie betreibst.

Mit einer KI bauen? Gib ihr https://d-solve.de/projects/apartment-search/llms.txt: die vollständige Anleitung, alle Parameter, die Speicher-API und den MCP-Server in einer Datei.

Die eine Idee

Der Link ist die Datenbank.

Im Link-Modus, dem Standard, gibt es keinen Server, keine Datenbank und kein Konto. Die Seite unter d-solve.de/projects/apartment-search/ ist für alle dieselbe Datei. Namen, Texte, Fotos, Farbe und Reihenfolge stehen als Parameter im Link, und die Seite liest sie beim Öffnen aus ihrer eigenen Adresse. Wer lieber einen kurzen Link möchte und Fotos hochladen will, kann die Seite stattdessen optional online speichern; das ist ein zweiter, eigener Modus.

BaukastenDu änderst die Vorschau. Dein Browser macht daraus eine Zeichenkette.
Der LinkTrägt jede Einstellung: ?loc=Köln&headline=…
Deine SeiteLiest den Link und baut die Seite. Im Link-Modus wird nichts geladen oder gespeichert.

Was daraus folgt:

Online speichern: Kurzlink statt langem Link

Der Link-Modus hat zwei Nachteile: Links mit vielen Texten werden lang, und Fotos müssen schon irgendwo im Netz liegen. Deshalb gibt es einen zweiten Modus. Im Baukasten speicherst du die Seite auf Wunsch online und bekommst eine kurze Adresse wie https://d-solve.de/apartment-search/k7m2p9q4r6t8. Inhalt, Aufbau und Parameter sind gleich, auch Aushang (/<id>/aushang/) und Mietunterlagen (/<id>/mietunterlagen/) laufen unter dem Kurzlink. Du entscheidest pro Seite, welchen Modus du nimmst.

Link-Modus (Standard)Online speichern (Kurzlink)
PrivatsphäreAlles steht im Link, nichts liegt auf einem Server. Wer den Link hat, sieht den Inhalt.Die Daten liegen auf einem Server von d-solve.de (Cloudflare). Wer den Link hat, sieht die Seite; Suchmaschinen erfassen sie nicht.
Länge des LinksMehrere tausend Zeichen bei voller Seite; ab etwa 2 950 Zeichen passt er in keinen QR-Code.Immer kurz, etwa 50 Zeichen. Der QR-Code bleibt klein und scannt zuverlässig.
Fotos hochladenNein. Fotos brauchen eine eigene Internetadresse.Ja, direkt im Baukasten: in begrenzter Zahl und Größe (siehe Grenzen). Der Baukasten verkleinert sie vorher.
HaltbarkeitUnbegrenzt, solange die Seite d-solve.de existiert. Es gibt nichts zu löschen.Mit Frist, die du beim Speichern wählst; danach automatisch gelöscht. Die Frist lässt sich jederzeit neu setzen.
Später bearbeitenLink im Baukasten laden, ändern, neuen Link verteilen. Der alte Link bleibt unverändert gültig.Der Kurzlink bleibt gleich, der Inhalt ändert sich. Dafür braucht es den Bearbeitungsschlüssel.
KontoNie nötig.Nicht nötig. Optional (nur Google) für mehrere Seiten und Premium.

So schaltest du um

  1. Im Baukasten steht oben in der Seitenleiste der Umschalter „Nur im Link (privat, nichts gespeichert)“ / „Online speichern (kurzer Link)“. Der Link-Modus ist voreingestellt, deine Wahl merkt sich der Browser.
  2. Im Online-Modus wählst du die Speicherfrist und klickst „Online speichern“. Danach siehst du den Kurzlink zum Kopieren und Öffnen, den QR-Code zum Kurzlink und, einmalig, den Bearbeitungsschlüssel.
  3. Änderungen im Baukasten werden danach alle 30 Sekunden gespeichert; außerdem gibt es „Jetzt speichern“, „Frist ändern“, „Seite löschen“ und „Neuen Schlüssel erzeugen“.
  4. Fotos lädst du im Bild-Editor oder in der Foto-Liste der Karte hoch. Das funktioniert, sobald die Seite einmal gespeichert ist.
  5. Eine vorhandene Seite öffnest du später über „Vorhandene Seite laden“ mit Kurzlink (oder ID) und Schlüssel. Ohne Schlüssel kannst du sie ansehen und lokal als Vorlage für eine neue Seite verwenden.

Ist der Dienst gerade nicht erreichbar (zum Beispiel bei einer Kopie ohne Backend), zeigt der Baukasten „Online-Speicherung ist hier nicht verfügbar“. Der Link-Modus funktioniert dann wie immer.

Was gespeichert wird und wo

Der Bearbeitungsschlüssel

Der Bearbeitungsschlüssel (as_…) wird nur ein einziges Mal angezeigt. Auf dem Server liegt nur sein Hash; er kann nicht wiederhergestellt werden. Kopiere ihn in einen Passwortmanager oder eine Notiz. Der Baukasten kann ihn auf Wunsch in diesem Browser merken („In diesem Browser merken“). Wer den Schlüssel verliert, kann die Seite nicht mehr ändern oder löschen; sie läuft dann nach der Frist ab. Gib den Schlüssel nie weiter und schreibe ihn in keinen Link.

Für Entwickler und KI

Der Baukasten spricht eine offene HTTP-Schnittstelle. Wer Seiten per Skript oder KI-Assistent anlegen will, findet Endpunkte, Grenzen, Fehlercodes und curl-Beispiele in der API-Dokumentation (maschinenlesbar: openapi.json).

Loslegen

Drei Wege zum fertigen Link, alle mit demselben Ergebnis:

  1. Baukasten: in der Vorschau auf einen Text oder ein Bild klicken und direkt ändern. Dazu QR-Code, Sprachen, Farbe und Reihenfolge.
  2. KI-Assistent: Im Baukasten steht ein Prompt zum Kopieren für ChatGPT, Claude oder Gemini. Die KI fragt dich nach Stadt, Personen, Eckdaten und Foto-Links und gibt dir den fertigen Link.
  3. Von Hand: die Parameter unten selbst an die Adresse hängen.

Alle Parameter

Jeder Parameter ist optional. Fehlt er oder ist er leer, steht dort ein eingebauter Beispieltext. Ein einzelner Bindestrich - blendet ein Feld aus. Jedes Beispiel unten ist ein funktionierender Link: öffnen und ansehen.

Texte gelten je Sprache: headline.de nur auf Deutsch, headline.en nur auf Englisch, headline ohne Suffix in allen Sprachen. Wer nur eine Sprache will, setzt langs=de und lässt die Suffixe weg.

ParameterWas er setztBeispiel im Link
Sprachunabhängig
langsSprachen der Seite, kommagetrennt. Ab zwei Sprachen erscheint oben rechts ein Umschalter. Eingebaute Texte gibt es auf Deutsch und Englisch; für jede andere Sprache stehen die englischen da, bis du eigene setzt.?langs=de%2Cen%2Ctr
langSprache, die zuerst gezeigt wird. Standard: die erste aus langs.?lang=en
emailKontakt-E-Mail. - blendet die Kachel aus.?email=wohnung%40example.com
phoneTelefonnummer. - blendet die Kachel aus.?phone=%2B49%20151%201234567
photoGroßes Foto oben, als direkter Bild-Link. Ohne Foto: farbige Fläche mit dem Emoji.?photo=https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Fthumb%2Fc%2Fc4%2FBre…
logoEmoji oben links (Standard 🏡).?logo=%F0%9F%90%95
accentAkzentfarbe als Hex-Wert. Daraus entsteht die ganze Farbabstufung.?accent=%232f7a4d
sectionsWelche Abschnitte in welcher Reihenfolge: hero, about, intro, facts, wishes, location, documents, contact.?sections=hero%2Cintro%2Ccontact
peopleFeste Anzahl Kacheln. Wichtig, wenn eine Kachel nur ein Emoji hat.?people=2&p1emoji=%F0%9F%90%95&p2emoji=%F0%9F%90%88
pcolsSpalten im Kachelraster, 1–6. Standard: automatisch.?pcols=4
imprintZiel des Impressum-Links in der Fußzeile. - blendet ihn aus.?imprint=-
privacyZiel des Datenschutz-Links in der Fußzeile. - blendet ihn aus.?privacy=https%3A%2F%2Fexample.com%2Fdatenschutz
p1emoji p2emoji …Emoji der Kachel, wenn sie kein Foto hat.?p1emoji=%F0%9F%90%95&p1name=Nala
p1photo p2photo …Ein oder mehrere Bild-Links, getrennt mit |. Mehrere ergeben eine Galerie zum Wischen.?p1name=Esel&p1photo=https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Fthumb%…
Kopfzeile
brandText oben links.?brand=WG-Suche%20K%C3%B6ln
navcontactKontakt-Button oben rechts.?navcontact=Schreib%20uns
titleTitel im Browser-Tab und in Lesezeichen.?title=Familie%20Kaya%20sucht%20eine%20Wohnung%20in%20K%C3%B6ln
descKurzbeschreibung der Seite.?desc=Zwei%20Erwachsene%20und%20ein%20Kind%20suchen%20eine%203-Zimmer-Wohnung.
skipSprunglink für die Tastaturbedienung.?skip=Direkt%20zum%20Inhalt
Kopfbereich
locStadt über der Überschrift.?loc=K%C3%B6ln
namesNamen im Streifen über dem Foto.?names=Aylin%2C%20Jonas%20%26%20Mia
headlineGroße Überschrift.?headline=Wir%20suchen%20ein%20Zuhause%20in%20K%C3%B6ln
sublineText unter der Überschrift.?subline=Ruhige%20Familie%2C%20sichere%20Einkommen%2C%20langfristig.
badgesKurz-Merkmale als Liste.?badges=3%20Zimmer%3B%20bis%201.400%20%E2%82%AC%20warm%3B%20ab%201.%20M%C3%A4rz
btncontactButton zum Kontaktabschnitt.?btncontact=Jetzt%20anfragen
btnshareButton, der den Link kopiert. - blendet ihn aus.?btnshare=-
btnsharedText nach dem Kopieren.?btnshared=Kopiert%2C%20danke%21
btnsWeitere Buttons als Paare Beschriftung | Link.?btns=Unsere%20Anzeige%20%7C%20https%3A%2F%2Fwww.kleinanzeigen.de%2F
prevphoto nextphotoBedienhilfe-Texte der Galerie-Pfeile (für Screenreader).?prevphoto=Zur%C3%BCck&nextphoto=Weiter
Kacheln
aboutheadÜberschrift über den Kacheln.?abouthead=Das%20sind%20wir
p1name p2name …Name auf der Kachel. Sobald eine Kachel gesetzt ist, verschwindet die Beispielfamilie.?p1name=Aylin&p2name=Jonas
p1role p2role …Rolle oder Beruf.?p1name=Aylin&p1role=%C3%84rztin
p1facts p2facts …Stichpunkte als Paare Emoji | Text.?p1name=Nala&p1emoji=%F0%9F%90%95&p1facts=%F0%9F%A6%B4%20%7C%20stubenrein%3B%20%F0%9F%…
Vorstellung
introheadÜberschrift (Standard „Hallo,“).?introhead=Liebe%20Vermieterin%2C%20lieber%20Vermieter%2C
introFreitext. \n bricht die Zeile, eine Zeile mit - wird Aufzählung, *Text* wird kursiv.?intro=wir%20sind%20%2AAylin%20und%20Jonas%2A.%0A-%20zuverl%C3%A4ssig%0A-%20ruhig%0AVi…
Daten & Fakten
factsheadÜberschrift.?factshead=Auf%20einen%20Blick
factsZeilen als Paare Bezeichnung | Wert.?facts=Einzug%20%7C%20ab%201.%20M%C3%A4rz%3B%20Zimmer%20%7C%203%3B%20Warmmiete%20%7C%2…
Wohnungswünsche
wishesheadÜberschrift.?wisheshead=Was%20wir%20suchen
mustheadTitel der linken Liste.?musthead=Unbedingt
mustListe links.?must=3%20Zimmer%3B%20Aufzug%3B%20Haustiere%20erlaubt
niceheadTitel der rechten Liste.?nicehead=Sch%C3%B6n%20w%C3%A4re
niceListe rechts.?nice=Balkon%3B%20Altbau%3B%20Badewanne
Wunschlage
locheadÜberschrift.?lochead=Wo%20wir%20wohnen%20m%C3%B6chten
locintroEinleitung.?locintro=Am%20liebsten%20nah%20an%20der%20Kita%3A
districtsStadtteile als Liste.?districts=Ehrenfeld%3B%20Nippes%3B%20S%C3%BClz
locnoteHinweis darunter.?locnote=Andere%20Veedel%20gern%20auch.
Unterlagen
docheadÜberschrift.?dochead=Unterlagen
docintroEinleitung.?docintro=Liegt%20alles%20bereit%3A
docsListe.?docs=SCHUFA-Auskunft%3B%20Gehaltsnachweise%3B%20Mietschuldenfreiheitsbescheinigung
Kontakt
contactheadÜberschrift.?contacthead=So%20erreichen%20Sie%20uns
contactintroEinleitung.?contactintro=Wir%20melden%20uns%20innerhalb%20eines%20Tages.
maillabelBeschriftung der E-Mail-Kachel.?maillabel=Mail
phonelabelBeschriftung der Telefon-Kachel.?phonelabel=Handy
Fußzeile
footHinweis in der Fußzeile.?foot=Private%20Wohnungssuche.
imprintlabelBeschriftung des Impressum-Links.?imprintlabel=Anbieter
privacylabelBeschriftung des Datenschutz-Links.?privacylabel=Privatsph%C3%A4re
producedbyText vor „d-solve.de“.?producedby=Gebaut%20mit
Aushang (nur unter aushang/)
posterheadÜberschrift im farbigen Kasten. Standard: „Wir suchen eine Wohnung“.?posterhead=Wir%20suchen%20ein%20Zuhause
posteraboutheadÜberschrift der ersten Liste. Standard: „Über uns:“.?posterabouthead=Das%20sind%20wir%3A
posteraboutErste Liste, mit ; getrennt. Standard: aus names, den Rollen der Kacheln und passenden facts (Beruf, Einkommen, SCHUFA, Rauchen, Haustiere, Kinder).?posterabout=zwei%20Erwachsene%2C%20ein%20Kind%3B%20beide%20unbefristet%20angestellt%3B%20Nichtraucher
posterwishheadÜberschrift der zweiten Liste. Standard: „Unsere Wunschwohnung:“.?posterwishhead=Wir%20suchen%3A
posterwishZweite Liste, mit ; getrennt. Standard: passende facts (Zimmer, Fläche, Miete, Einzug) und districts.?posterwish=3%20Zimmer%3B%20ab%2070%20m%C2%B2%3B%20bis%201.400%20%E2%82%AC%20warm
postermoreZeile über dem QR-Code. Standard: „Mehr Infos“.?postermore=Unsere%20Bewerbungsseite
posterlinkWohin der QR-Code führt, und als Text darüber. Standard: die Bewerbungsseite aus demselben Link. Ein Kurzlink hält den Code klein.?posterlink=https%3A%2F%2Fwohnung.example.de
posterstripsAnzahl der Abreißzettel, 0 bis 10. Standard: 8.?posterstrips=6
posterphotoFoto des Aushangs; - blendet es aus. Standard: photo, sonst das erste Foto einer Kachel.?posterphoto=-
posterqr- blendet den QR-Code samt „Mehr Infos“ aus, etwa wenn der Link zu lang ist und es keinen Kurzlink gibt.?posterqr=-

Kacheln: Sobald irgendein p-Parameter gesetzt ist, verschwindet die eingebaute Beispielfamilie komplett. Sonst würde ein Hund den Lebenslauf einer fremden Person erben. Eine Kachel braucht nichts außer einem Emoji; deshalb funktionieren Kinder und Haustiere ohne Foto und Namen. Bis zu 24 Kacheln.

Schreibweise der Werte

Kodierung im Link

Werte müssen URL-kodiert sein: Leerzeichen %20 oder +, & %26, = %3D, ? %3F, # %23, + %2B, ; %3B, | %7C, Zeilenumbruch %0A, Umlaute und Emoji als UTF-8 (ö → %C3%B6). Auch ein Bild-Link ist ein Wert und wird komplett kodiert. In JavaScript erledigt das encodeURIComponent(); Baukasten und KI-Prompt übernehmen es für dich.

Woher ein Wert kommt

Vier Ebenen, die erste nicht-leere gewinnt:

?key.<sprache>   →   ?key   →   config.js   →   eingebauter Standard

Ein Beispiel von Hand

https://d-solve.de/projects/apartment-search/?langs=de&loc=K%C3%B6ln
  &headline=Familie%20sucht%20Wohnung
  &badges=3%E2%80%934%20Zimmer%3B%20bis%201.800%20%E2%82%AC%3B%20ein%20Hund
  &people=1&p1emoji=%F0%9F%90%95&p1name=Nala
  &p1facts=%F0%9F%A6%B4%7Cstubenrein%3B%20%F0%9F%8E%BE%7Cliebt%20Spazierg%C3%A4nge
  &email=wohnung%40example.com&phone=%2B49%20151%201234567

(Zeilenumbrüche nur zur Lesbarkeit; im echten Link steht alles in einer Zeile.)

Fotos verlinken

Ein Foto auf dem Handy hat keine Adresse; es muss erst irgendwo öffentlich liegen. Die eine Regel: Der Link zeigt direkt auf die Bilddatei, beginnt mit https:// und funktioniert ohne Anmeldung. Test: im privaten Fenster öffnen. Siehst du nur das nackte Bild, passt es.

QR-Code

Der Baukasten erzeugt den QR-Code im Browser; der Link verlässt deinen Rechner dafür nicht. customize/qr.js ist ein vollständiger Encoder ohne Abhängigkeiten (Byte-Modus, Version 1–40, Fehlerkorrektur L/M/Q/H), herunterladbar als PNG und SVG. Die Obergrenze liegt bei rund 2 950 Zeichen. Eine übliche einsprachige Seite liegt deutlich darunter, eine voll ausgefüllte zweisprachige darüber. Dann meldet der Baukasten das, statt einen unbrauchbaren Code zu zeigen.

Aushang

Derselbe Link ergibt auch einen Aushang zum Ausdrucken: Foto, Überschrift, zwei kurze Listen, QR-Code zur Bewerbungsseite und Abreißzettel mit Telefon und E-Mail. Dafür kommt aushang/ vor die Parameter: https://d-solve.de/projects/apartment-search/aushang/?…. Im Baukasten führt der Knopf „Aushang erstellen“ genau dorthin.

Mietunterlagen und Selbstauskunft

Unter mietunterlagen/ wird derselbe Link zur Mieter-Selbstauskunft: Namen, Rollen, Kontakt und Stadt kommen aus der Seite. Dazu gibt es Ausweis, Gehaltsnachweise, SCHUFA-Auskunft und Vorvermieterbescheinigung als Anhänge, und alles wird zu einem PDF mit Deckblatt und Inhaltsverzeichnis. Word-Vorlagen (Mietunterlagen, Selbstauskunft, Vorvermieterbescheinigung, Übergabeprotokoll) gibt es vorausgefüllt oder leer.

Datenschutz: Geburtsdatum, Einkommen und Co. stehen nicht im Query-String, sondern hinter dem #. Dieser Teil einer Adresse wird nie an einen Server übertragen, auch nicht an d-solve.de. Hochgeladene Dateien liest nur der Browser; das PDF entsteht mit pdf-lib lokal. Die Form ist also: …/mietunterlagen/?<Parameter der Seite>#<Angaben unten>.

Parameter (nach #)Was er setztBeispiel
mieterAnzahl der Mietinteressent:innen. Ohne diesen Parameter wird das Formular aus den Kacheln abgeleitet: Erwachsene werden Mieter:innen, Kinder und Haustiere kommen in den Haushalt.#mieter=1&m1name=Muster%2C%20Alex
m1name, m2name, …Name, Vorname der Person 1, 2, …#mieter=2&m1name=Muster%2C%20Alex&m2name=Beispiel%2C%20Robin
m1birth, m1address, m1phone, m1emailGeburtsdatum, aktuelle Anschrift, Mobilnummer, E-Mail.#mieter=1&m1birth=01.02.1990&m1address=Musterweg%201%2C%2012345%20Musterstadt
m1job, m1income, m1landlordBeruf und Arbeitgeber, Nettoeinkommen pro Monat, derzeitige:r Vermieter:in.#mieter=1&m1job=Lehrerin%2C%20Stadtschule&m1income=3.200%20%E2%82%AC
m1qAntworten auf die vier Fragen (Pfändung, Vermögensauskunft, Insolvenz, Räumung), kommagetrennt. Standard: alle nein.#mieter=1&m1q=nein%2Cnein%2Cnein%2Cnein
m1docsWelche Unterlagen ins Paket kommen: ausweis, gehalt, schufa, vorvermieter, weitere. Standard: die ersten vier.#mieter=1&m1docs=ausweis%2Cgehalt%2Cschufa
haushaltWeitere Personen im Haushalt als „Name | Geburtsdatum | Verhältnis“, mit ; getrennt; - für keine.#mieter=1&haushalt=Mika%20%7C%2001.03.2021%20%7C%20Kind
tiereHaustiere als „Art | Rasse, Alter“, mit ; getrennt; - für keine.#mieter=1&tiere=Hund%20%7C%20Mischling%2C%206%20Jahre
ort, datumOrt und Datum (JJJJ-MM-TT) der Unterschrift. Standard: loc und heute.#mieter=1&ort=Hamburg&datum=2026-08-01
gehaltBezeichnung der Gehaltsnachweise.#mieter=1&gehalt=Gehaltsnachweise%20Mai%20bis%20Juli

Rund um die Suche, vom Aushang bis zur Wohnungsgeberbestätigung, führt der Ratgeber.

Selbst hosten

Das Projekt ist ein Ordner statischer Dateien: kein Build-Schritt, kein Backend, keine externen Abhängigkeiten (JSZip und pdf-lib liegen bei), keine Webfonts, kein Tracking. Die Seiten stellen keine einzige externe Anfrage. Ordner auf einen beliebigen statischen Hoster kopieren (Cloudflare Pages, Netlify Drop, GitHub Pages, nginx, Apache), fertig. Der Baukasten leitet seine Basis-URL aus der eigenen Adresse ab und baut Links für die eigene Kopie.

Der Online-Modus ist die einzige Funktion mit Backend: ein Cloudflare Worker mit Datenbank und Bildspeicher. Er liegt im Repository unter workers/apartment-search-api; Einrichtung, Grenzen (config.json) und Tests stehen in dessen README.md. Ohne Worker bleibt der Online-Modus im Baukasten verborgen; wer ihn auch bei vorhandenem Worker abschalten will, setzt in config.js window.APARTMENT_CLOUD = {}.

apartment-search/
├── index.html          Grundgerüst: Meta-Tags, #root, zwei Skripte
├── app.js              liest den Link, baut die Seite (reines DOM)
├── styles.css          alle Styles
├── config.js           optionale feste Werte für eine Kopie
├── demo.js, demo/      das Beispiel (für alle Werkzeuge) und seine kurze Adresse
├── docs/               diese Seite
├── favicon.svg, og-image.png
├── llms.txt            vollständige Anleitung für KI-Agenten: Parameter, API, MCP
├── customize/          der Baukasten: index.html, editor.js, cloud.js, qr.js
├── api/                API-Dokumentation für den Online-Modus (Seite für Menschen und KI)
├── aushang/            der Aushang: index.html, aushang.js, vorlage.docx, jszip.min.js
├── mietunterlagen/     Selbstauskunft und Unterlagen: forms.js, pdf.js, docx.js, pdf-lib.min.js
└── ratgeber/           Überblick über die ganze Wohnungssuche

Zum lokalen Testen im Ordner python3 -m http.server 8000 starten und http://localhost:8000/customize/ öffnen.

Feste Werte in config.js

Die Schlüssel heißen genau wie die Parameter, samt Sprachsuffix. Für eine einzelne feste Seite ohne lange Adresse:

window.SITE_CONFIG = {
  langs: "de",
  email: "[email protected]",
  phone: "+49 151 1234567",
  accent: "#2f7a4d",
  loc: "Köln",
  headline: "Wir suchen ein Zuhause in Köln",
  people: "2",
  p1name: "Aylin", p1role: "Ärztin",
  p2name: "Nala", p2emoji: "🐕",
};

Viele Seiten mit kurzen Adressen

Alles bleibt statisch; nur config.js wird je Adresse von einem eigenen Backend erzeugt, zum Beispiel mit Express:

app.use("/w/:slug", express.static("apartment-search"));
app.get("/w/:slug/config.js", async (req, res) => {
  const page = await db.pages.findBySlug(req.params.slug);
  if (!page) return res.status(404).end();
  res.type("text/javascript").send("window.SITE_CONFIG = " + JSON.stringify(page.params) + ";");
});

Sicherheit

Jeder Wert aus dem Link wird vor der Ausgabe escaped; *kursiv* und Zeilenumbrüche werden erst danach zu Markup. Links in href und src lassen nur https, http, mailto, tel, data:image und relative Pfade durch. Wer app.js ändert, behält diese Reihenfolge bei.

Rechtliches

Die Fußzeile nennt d-solve.de und verlinkt standardmäßig dessen Impressum und Datenschutzerklärung. Beide Ziele sind über imprint und privacy frei setzbar und mit - abschaltbar. Für eine rein private Wohnungssuche ohne geschäftlichen Zweck besteht keine Impressumspflicht nach § 5 DDG.

Eine eigene Datenschutzerklärung braucht die ausgelieferte Seite im Link-Modus nicht zwingend: Sie lädt nichts nach, setzt keine Cookies und überträgt nichts. Was an personenbezogenen Daten im Link steht, hat der Absender selbst hineingeschrieben und selbst verschickt. Fotos von anderen Seiten lädt der Browser der Empfänger direkt von dort. Bei einer online gespeicherten Seite liegen die Daten dagegen auf einem Server; dafür gilt die Datenschutzerklärung des jeweiligen Betreibers.

Fotos im Beispiel, alle von Wikimedia Commons: Denkmal der Bremer Stadtmusikanten (Gerhard Marcks), fotografiert von Dietmar Rabich (CC BY-SA 4.0); Esel von Lilly M (CC BY-SA 3.0); Hund von Reba Spike (CC BY 2.0); Katzen von George Chernilevsky (gemeinfrei) und Alvesgaspar (CC BY-SA 3.0); Hahn von Frank Schulenburg (CC BY-SA 4.0).