FEWO Search

Full-Stack · Buchungsplattform

Express

SQLite

SQL

SSE

Rolle

Design, Front-End & Backend

Jahr

2026

Ein Ferienwohnungsportal auf Basis eines rohen Airbnb-Exports: 1.476 Unterkünfte, 504.795 Kalendernächte und 103.295 Bewertungen, hinter einer Suche, einem Buchungsablauf und einem Live-Verfügbarkeitsfeed. Express und SQLite auf dem Server, handgeschriebenes JS im Browser. Kein Front-End-Framework, kein Build-Schritt.

1476

Unterkünfte

504k

Kalendernächte

23

API-Endpoints

0

Front-End-Frameworks

FEWO im Browser auf einem Laptop: Suchleiste mit geöffnetem Filterpanel über dem Unterkunftskarussell

01 — Etwas finden

Erst suchen, dann Formular

Der Datensatz umfasst 1.476 Unterkünfte in einer Stadt. Klein genug zum Stöbern, groß genug, dass Stöbern nichts bringt. Also besteht die Startseite aus einer Suchleiste und einem Karussell, und alles, was die Auswahl eingrenzt, liegt ein Popover entfernt: sichtbar, wenn du es willst, und weg, wenn nicht.

Startseite

The More Filter popover: price range slider, minimum rating stars, rooms and type selects, and an apply button showing 1476

Filter

The full listing grid: 1476 Unterkünfte, a sort select, and six cards per row

Alle Unterkünfte

02 — Buchen

Der Kalender ist das Produkt

Eine halbe Million Kalenderzeilen existieren, um eine Frage ehrlich zu beantworten: Kann ich diese Nächte haben, und was kosten sie? Jede Regel unten wird im Browser geprüft, damit die Antwort sofort kommt, und noch einmal auf dem Server, damit sie stimmt.

Listing calendar for August 2026 with a selected range, struck-out unavailable days, a price summary and a minimum-nights warning

Verfügbarkeit

Booking form: listing recap, check-in and check-out, total price, name and address fields, guest count and a requests box

Buchungsformular

Booking confirmation: green check, dates, nights and total price, with buttons to bookings or back to the listing

Bestätigung

03 — Das Interface entscheiden

Was jeder Screen statt etwas anderem ist

Ein Buchungsinterface hat eine naheliegende Version, und der Datensatz hat sie immer wieder kaputtgemacht. Jede Entscheidung unten hat sich gegen eine konventionellere durchgesetzt, und die hat aus einem Grund verloren, der aus den Daten kam, nicht aus Geschmack. Sie stehen als Paare da, was es ist und statt was, denn eine Entscheidung ohne verworfene Alternative war nie wirklich eine.

04 — Darunter

Was der Server wirklich macht

Zehn Abhängigkeiten, acht Router, eine SQLite-Datei. Spannend war nie ein einzelner Endpoint. Spannend war zu entscheiden, welche Probleme eine Bibliothek verdienen und welche zwanzig Zeilen.

05 — Admin & Reste

Die schlichte Hälfte, und was noch nicht stimmt

Die Admin-Seite ist bewusst schlicht: ein Importformular, ein Dashboard, ein Dark-Mode-Schalter. Vier Dinge stimmen noch nicht, und ich schreibe sie lieber auf, als sie aus einem Screenshot herauszuschneiden. Das Login-Token liegt in localStorage, was CSP und Escaping weniger schlimm machen, aber nicht lösen. bookings.json wird nach jeder Änderung neu geschrieben und nie wieder gelesen, ist also ein Spiegel, der vorgibt, ein Speicher zu sein. Die 2-Minuten-Reservierungen liegen im Arbeitsspeicher und verschwinden beim Neustart. Und der Bezahlen-Button belastet niemanden.

Profile page: dark-mode toggle and an admin block with CSV import forms for listings, calendar and reviews

Profil — Adminbereich

Jede Entscheidung dieses Projekts, aufgeschrieben, auch die, die sich als falsch herausgestellt haben. Zwanzig Seiten. Niemand muss sie lesen.