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.
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.
?loc=Köln&headline=…Was daraus folgt:
lang trägt, setzt die Seite noindex und entfernt canonical.headline.de, headline.en); der Umschalter wechselt ohne Neuladen.
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äre | Alles 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 Links | Mehrere 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 hochladen | Nein. Fotos brauchen eine eigene Internetadresse. | Ja, direkt im Baukasten: in begrenzter Zahl und Größe (siehe Grenzen). Der Baukasten verkleinert sie vorher. |
| Haltbarkeit | Unbegrenzt, 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 bearbeiten | Link 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. |
| Konto | Nie nötig. | Nicht nötig. Optional (nur Google) für mehrere Seiten und Premium. |
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.
GET /api/limits, erklärt in der API-Dokumentation.
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.
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).
Drei Wege zum fertigen Link, alle mit demselben Ergebnis:
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.
| Parameter | Was er setzt | Beispiel im Link |
|---|---|---|
| Sprachunabhängig | ||
langs | Sprachen 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 |
lang | Sprache, die zuerst gezeigt wird. Standard: die erste aus langs. | ?lang=en |
email | Kontakt-E-Mail. - blendet die Kachel aus. | ?email=wohnung%40example.com |
phone | Telefonnummer. - blendet die Kachel aus. | ?phone=%2B49%20151%201234567 |
photo | Groß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… |
logo | Emoji oben links (Standard 🏡). | ?logo=%F0%9F%90%95 |
accent | Akzentfarbe als Hex-Wert. Daraus entsteht die ganze Farbabstufung. | ?accent=%232f7a4d |
sections | Welche Abschnitte in welcher Reihenfolge: hero, about, intro, facts, wishes, location, documents, contact. | ?sections=hero%2Cintro%2Ccontact |
people | Feste Anzahl Kacheln. Wichtig, wenn eine Kachel nur ein Emoji hat. | ?people=2&p1emoji=%F0%9F%90%95&p2emoji=%F0%9F%90%88 |
pcols | Spalten im Kachelraster, 1–6. Standard: automatisch. | ?pcols=4 |
imprint | Ziel des Impressum-Links in der Fußzeile. - blendet ihn aus. | ?imprint=- |
privacy | Ziel 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 | ||
brand | Text oben links. | ?brand=WG-Suche%20K%C3%B6ln |
navcontact | Kontakt-Button oben rechts. | ?navcontact=Schreib%20uns |
title | Titel im Browser-Tab und in Lesezeichen. | ?title=Familie%20Kaya%20sucht%20eine%20Wohnung%20in%20K%C3%B6ln |
desc | Kurzbeschreibung der Seite. | ?desc=Zwei%20Erwachsene%20und%20ein%20Kind%20suchen%20eine%203-Zimmer-Wohnung. |
skip | Sprunglink für die Tastaturbedienung. | ?skip=Direkt%20zum%20Inhalt |
| Kopfbereich | ||
loc | Stadt über der Überschrift. | ?loc=K%C3%B6ln |
names | Namen im Streifen über dem Foto. | ?names=Aylin%2C%20Jonas%20%26%20Mia |
headline | Große Überschrift. | ?headline=Wir%20suchen%20ein%20Zuhause%20in%20K%C3%B6ln |
subline | Text unter der Überschrift. | ?subline=Ruhige%20Familie%2C%20sichere%20Einkommen%2C%20langfristig. |
badges | Kurz-Merkmale als Liste. | ?badges=3%20Zimmer%3B%20bis%201.400%20%E2%82%AC%20warm%3B%20ab%201.%20M%C3%A4rz |
btncontact | Button zum Kontaktabschnitt. | ?btncontact=Jetzt%20anfragen |
btnshare | Button, der den Link kopiert. - blendet ihn aus. | ?btnshare=- |
btnshared | Text nach dem Kopieren. | ?btnshared=Kopiert%2C%20danke%21 |
btns | Weitere Buttons als Paare Beschriftung | Link. | ?btns=Unsere%20Anzeige%20%7C%20https%3A%2F%2Fwww.kleinanzeigen.de%2F |
prevphoto nextphoto | Bedienhilfe-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 |
intro | Freitext. \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 |
facts | Zeilen 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 |
musthead | Titel der linken Liste. | ?musthead=Unbedingt |
must | Liste links. | ?must=3%20Zimmer%3B%20Aufzug%3B%20Haustiere%20erlaubt |
nicehead | Titel der rechten Liste. | ?nicehead=Sch%C3%B6n%20w%C3%A4re |
nice | Liste rechts. | ?nice=Balkon%3B%20Altbau%3B%20Badewanne |
| Wunschlage | ||
lochead | Überschrift. | ?lochead=Wo%20wir%20wohnen%20m%C3%B6chten |
locintro | Einleitung. | ?locintro=Am%20liebsten%20nah%20an%20der%20Kita%3A |
districts | Stadtteile als Liste. | ?districts=Ehrenfeld%3B%20Nippes%3B%20S%C3%BClz |
locnote | Hinweis darunter. | ?locnote=Andere%20Veedel%20gern%20auch. |
| Unterlagen | ||
dochead | Überschrift. | ?dochead=Unterlagen |
docintro | Einleitung. | ?docintro=Liegt%20alles%20bereit%3A |
docs | Liste. | ?docs=SCHUFA-Auskunft%3B%20Gehaltsnachweise%3B%20Mietschuldenfreiheitsbescheinigung |
| Kontakt | ||
contacthead | Überschrift. | ?contacthead=So%20erreichen%20Sie%20uns |
contactintro | Einleitung. | ?contactintro=Wir%20melden%20uns%20innerhalb%20eines%20Tages. |
maillabel | Beschriftung der E-Mail-Kachel. | ?maillabel=Mail |
phonelabel | Beschriftung der Telefon-Kachel. | ?phonelabel=Handy |
| Fußzeile | ||
foot | Hinweis in der Fußzeile. | ?foot=Private%20Wohnungssuche. |
imprintlabel | Beschriftung des Impressum-Links. | ?imprintlabel=Anbieter |
privacylabel | Beschriftung des Datenschutz-Links. | ?privacylabel=Privatsph%C3%A4re |
producedby | Text 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 |
posterabout | Erste 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 |
posterwish | Zweite 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 |
postermore | Zeile über dem QR-Code. Standard: „Mehr Infos“. | ?postermore=Unsere%20Bewerbungsseite |
posterlink | Wohin 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 |
posterstrips | Anzahl der Abreißzettel, 0 bis 10. Standard: 8. | ?posterstrips=6 |
posterphoto | Foto 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.
badges, must, nice, districts, docs): Einträge mit Semikolon trennen, 3 Zimmer; Balkon; Aufzug.facts, btns, p1facts…): Links | Rechts, mehrere mit Semikolon. Getrennt wird am ersten |, ein zweites darf im Wert stehen.p1photo…): mehrere Bild-Links mit | trennen. Nicht mit Semikolon, denn eine data:image/webp;base64,…-Adresse enthält selbst eins.intro): \n oder ein echter Zeilenumbruch bricht die Zeile, eine Zeile mit - am Anfang wird Aufzählungspunkt, *Text* wird kursiv.
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.
Vier Ebenen, die erste nicht-leere gewinnt:
?key.<sprache> → ?key → config.js → eingebauter Standard
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.)
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.
https://drive.google.com/thumbnail?id=DATEI_ID&sz=w1000. Der oft empfohlene uc?export=view-Link sieht im eigenen Tab gut aus und bleibt in einer fremden Seite leer, weil Google ihn mit cross-origin-resource-policy: same-site ausliefert.upload.wikimedia.org/…).i.imgur.com/…), der eigene Webspace oder Netlify Drop.http:// ohne s.data:image/webp;base64,…. Nichts wird hochgeladen, aber jedes Bild macht den Link um tausende Zeichen länger, und der QR-Code passt dann nicht mehr.
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.
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.
poster…-Parameter im Link des Aushangs; die Bewerbungsseite ignoriert sie.aushang/vorlage.docx im Browser aus, inklusive Foto und QR-Code. Die leere Vorlage enthält Platzhalter wie {posterhead}.posterlink eintragen oder den QR-Code mit posterqr=- ausblenden.
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 setzt | Beispiel |
|---|---|---|
mieter | Anzahl 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, m1email | Geburtsdatum, aktuelle Anschrift, Mobilnummer, E-Mail. | #mieter=1&m1birth=01.02.1990&m1address=Musterweg%201%2C%2012345%20Musterstadt |
m1job, m1income, m1landlord | Beruf und Arbeitgeber, Nettoeinkommen pro Monat, derzeitige:r Vermieter:in. | #mieter=1&m1job=Lehrerin%2C%20Stadtschule&m1income=3.200%20%E2%82%AC |
m1q | Antworten auf die vier Fragen (Pfändung, Vermögensauskunft, Insolvenz, Räumung), kommagetrennt. Standard: alle nein. | #mieter=1&m1q=nein%2Cnein%2Cnein%2Cnein |
m1docs | Welche Unterlagen ins Paket kommen: ausweis, gehalt, schufa, vorvermieter, weitere. Standard: die ersten vier. | #mieter=1&m1docs=ausweis%2Cgehalt%2Cschufa |
haushalt | Weitere 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 |
tiere | Haustiere als „Art | Rasse, Alter“, mit ; getrennt; - für keine. | #mieter=1&tiere=Hund%20%7C%20Mischling%2C%206%20Jahre |
ort, datum | Ort und Datum (JJJJ-MM-TT) der Unterschrift. Standard: loc und heute. | #mieter=1&ort=Hamburg&datum=2026-08-01 |
gehalt | Bezeichnung der Gehaltsnachweise. | #mieter=1&gehalt=Gehaltsnachweise%20Mai%20bis%20Juli |
Rund um die Suche, vom Aushang bis zur Wohnungsgeberbestätigung, führt der Ratgeber.
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.
config.jsDie 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: "🐕",
};
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) + ";");
});
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.
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).