Marktplatz für gebrauchte Fahrzeugteile · Meilensteine 1–7 stehen · vollständig in Betrieb · neu gestaltet · Stand 17. September 2026
Zum Ausprobieren ohne Registrierung. Zwei Demo-Konten sind
angelegt, beide mit dem Passwort ironparts-demo:
zweiradteile-nord@demo.ironparts.invalid — Hamburg, 4 Inserateschrauberhof-sued@demo.ironparts.invalid — München, 4 InserateDie Konten und ihre acht Inserate sind erfunden und jederzeit rückstandslos
entfernbar (npm run demo:daten -- --entfernen). Ihre Bilder liegen
in R2 wie jeder echte Upload; als Motiv sind es weiter erkennbare Platzhalter,
weil mir keine Teilefotos vorliegen.
Du kannst dich jetzt auch selbst registrieren. Die
Bestätigungsmail kommt wirklich an — Absender noreply@calestai.com.
Und du kannst eigene Inserate mit eigenen Fotos einstellen.
Fahrzeugtyp → Marke → Modell → Baujahr, auf jeder Seite ganz oben. Die Auswahl bleibt in der Sitzung. Probier Motorrad → Yamaha → MT-07 → 2018–2020.
„Passt zu deinem Fahrzeug“ (belegt), „Passt vermutlich“ (mit Prüfhinweis), „Weitere Treffer“ (Volltext, ohne Fahrzeugbezug). Kein Inserat steht in zwei Blöcken.
Auf der Inseratsseite steht „vom Verkäufer bestätigt“ oder „vermutet“ — nie eine Zusage, die kein Fitment-Eintrag deckt.
Registrierung mit E-Mail-Bestätigung, Anmeldung, Profil, eigene Inserate verwalten, Gespräche, Bewertungen, Meldefunktion.
Unleserliche Stellen bleiben als ? stehen und werden nie
ergänzt — siehe die Bremsscheibe mit 1WS-F581T-00 und den
Scheinwerfer mit B4C-84?00-00.
Airbagmodule, Gurtstraffer, pyrotechnische Batterietrenner und die Airbagweste lassen sich nicht einstellen. 27 der 95 Kategorien sind als sicherheitsrelevant markiert, 5 sind gesperrt.
| Baustein | Stand | Einzelheiten |
|---|---|---|
| Worker | läuft | ironparts auf der Subdomain ironparts.workers.dev, per API angelegt |
| Datenbank | läuft | PostgreSQL 17.6 bei Supabase, Region eu-west-1 — 16 Tabellen, 12 CHECK-Bedingungen, 4 Migrationen |
| Stammdaten | geladen | 28 Fahrzeuge, 95 Kategorien, 8.298 Postleitzahlen mit Koordinaten |
| Hyperdrive | läuft | Verbindungs-Pool vor dem Supabase-Pooler (Session-Modus, Port 5432) |
| Datenbankrolle | angelegt | ironparts_app mit eigenem Passwort — das postgres-Passwort blieb unangetastet |
| Geheimnisse | gesetzt | APP_GEHEIMNIS, S3_ZUGRIFFSSCHLUESSEL, S3_GEHEIMSCHLUESSEL |
| R2 (Bilder) | läuft | Bucket ironparts-bilder (WEUR), öffentlich über pub-…r2.dev, CORS für den Direktupload aus dem Browser gesetzt |
| E-Mail-Versand | läuft | Resend über die verifizierte Domain calestai.com, Absender noreply@calestai.com |
| KI-Vorbefüllung | aus | KI_ANBIETER="aus" — ohne Schlüssel erscheint der Vorschlagsknopf gar nicht erst. |
30 Prüfungen laufen gegen die deployte Instanz grün.
16 lesende (npm run test:live): Startseite, Fahrzeugleiste,
Anmeldung mit Demo-Konto, eigene Inserate, Inseratsseite mit Preis, Passung
und Teilenummer, Profil, alle vier Rechtstexte, keine Schlüssel im
ausgelieferten Browser-JavaScript, keine JavaScript-Laufzeitfehler.
14 schreibende (npm run test:live-schreibend) decken genau
das ab, was von den beiden externen Diensten abhängt: Registrierung mit
echtem Versand, der Bestätigungslink aus der tatsächlich zugestellten
Mail gelesen, Anmeldung, Bildupload direkt aus dem Browser nach R2 und
der öffentliche Abruf des hochgeladenen Bildes. Der Link kommt bewusst aus
der Mail und nicht aus der Datenbank: Dort liegt nur sein SHA-256-Hash, im
Klartext steht er nirgendwo sonst. Registriert wird auf
delivered@resend.dev, Resends Testadresse — echter Versandweg,
kein fremdes Postfach.
Die drei Suchblöcke wurden einzeln gegen die Live-Instanz nachgemessen: Bei gewählter MT-07 2018–2020 stehen Bremsscheibe und Scheinwerfer in Block 1, das Kettenkit in Block 2, und Spiegelpaar, Stahlflex-Leitung und Auspuff landen in Block 3 — ohne Überschneidung.
Die 214 Prüfungen der sieben Meilenstein-Suiten brauchen dagegen eine direkte Postgres-Verbindung, um sich ihre Testdaten selbst einzurichten. Die gibt es in dieser Umgebung nicht; gelaufen sind sie zuletzt in der Entwicklungsumgebung.
Die Oberfläche sieht jetzt aus wie ein Marktplatz: helle Warenfläche, dunkles Kopf- und Fußband, Signalorange für alles, was zum Handeln auffordert. Der Inhalt trägt die Seite — Bild, Titel, Preis, Zustand, immer an derselben Stelle, damit sich Inserate vergleichen lassen.
Zwei Dinge sind dabei aufgefallen und mitrepariert worden. Die Suchleiste
schickte ihr Formular an die aktuelle Adresse, solange die Seite
noch nicht hydriert war — aus einem Klick auf der Anmeldeseite wurde
/anmelden?q= statt einer Suche; jetzt steht
action="/suche" daran, und die Suche funktioniert auch ganz ohne
JavaScript. Und die neuen Kategorielinks hätten still ins Leere gezeigt: Die
Suche kannte Kategorien nur als Id aus der Filterspalte, jetzt versteht sie
auch einen Slug.
Die zwei Dinge, die vorher am Konto hingen, sind erledigt — beide Wege laufen und sind nachgemessen.
http umgestellt, Absender auf die verifizierte Domain.workers.dev-Adresse. Sobald eine Domain da ist, kommt sie
als custom_domain in wrangler.jsonc, und
APP_URL zieht nach.