Vom JSON-Microservice zur Lauschliste
Nach dem etwas holprigen Release von Laravel Ingest brauchte ich etwas Neues zum Basteln. Es fing alles harmlos an: Ich stolperte über JSONata – ein JavaScript-Tool, das JSON-Daten transformieren kann. Da wir im Laravel-Backend ständig mit JSON jonglieren, dachte ich mir: "Könnte man daraus nicht einen Microservice bauen?"
Als Laravel-Entwickler musste ich also kurz umsatteln – willkommen in der Welt von Node.js. Daher habe ich kurz recherchiert, was aktuell so hip ist: Express.js, Fastify, NestJS – die üblichen Verdächtigen. Kurz damit rumprobiert, in ein Dockerfile geworfen und überraschenderweise lief alles recht schnell. Plötzlich hatte ich einen Microservice, der JSON-Daten umschreiben konnte, ohne dass ich unser Hauptbackend anfassen musste.
Der Kern war schnell gebaut – ein paar Routes mit Fastify, JSONata zum Transformieren der Daten und ein einfaches Template-System:
fastify.post('/transform', async (request, reply) => {
const { data, expression, bindings } = request.body
const expr = jsonata(expression)
const result = await expr.evaluate(data, bindings)
return { result }
})Der JSON-Service hatte mich angefixt – plötzlich wollte ich mehr mit Node.js basteln. Da ich mir als Jahresvorsatz vorgenommen hatte, jeden Monat ein kleines Projekt umzusetzen, beschloss ich, ein PDF-SaaS mit Node.js zu bauen. Nicht besonders originell, aber ich hatte selbst Verwendung dafür und falls sich ein zahlender Kunde finden würde, wäre fast mein kompletter Server bezahlt. Pragmatisch wie immer!
Dann kam ein Krankenhausaufenthalt dazwischen: Ohne Computer, mit viel Zeit zum Nachdenken und noch mehr Zeit für KI-Brainstorming. Gemini und ich haben uns tolle neue Ideen ausgedacht. Als ich wieder daheim war, lag der PDF-Service erstmal auf Eis. Im Krankenhaus hatte ich schon eine Domain gekauft – aber eben für eine neue, andere Idee. Sehr gefährlich für das ADHS-Hirn: Man findet den nächsten Dopamin-Kick zu schnell und die KI bestätigt einen ständig in der Suche danach. 😅
Kaum hatte ich damit angefangen, gab es den nächsten Zwischenfall: Nachdem ich für Felix etwas 3D-gedruckt hatte, schenkte er mir als Dankeschön eine Tonie-Figur. Er hatte mitbekommen, dass ich eine Toniebox habe. Nette Geste! ♥️
Neben der Toniebox hatten wir auch einen Schlummerwal dazu gekauft – und anscheinend ist das eine top Empfehlung, denn Felix besorgte mir genau denselben Tonie.
Das war natürlich schade, aber aus jedem "Problem" entsteht ja bestenfalls eine neue Idee. Warum nicht eine Wunschliste für Tonies? Oder gleich eine Bestandsliste? Damit sowas nie wieder passiert.
Das Projekt Lauschliste war geboren und über die letzten zwei Monate das Einzige, an dem ich in meiner Freizeit gearbeitet habe. Das allein sagt schon alles: Ich war komplett überzeugt von der Idee und sie hat Unmengen an Dopamin ausgeschüttet.
Kleiner Elevator Pitch gefällig?
Lauschliste ist eine stressfreie Tonie-Wunschliste für Familien. Die Eltern wollen Zeit sparen, Chaos vermeiden und den Überblick behalten. Die Gäste sind wenig technikaffin, hassen Registrierungen und vergessen ihre Passwörter. Sie erhalten einen Link, können Tonies ansehen und mit einem Klick reservieren – komplett ohne Account-Zwang.
Der Clou: Doppelkauf-Schutz. Wenn zwei Verwandte gleichzeitig auf denselben Tonie klicken, wird das serverseitig sauber abgefangen. Plus QR-Code-Generator für analoge Einladungskarten und WhatsApp-Integration zum Teilen der Listen.
Monetarisierung läuft über Affiliate-Marketing: Wenn jemand über "Bei Amazon kaufen" klickt und den Tonie kauft, gibt's eine Provision.
Natürlich wollte ich neben E-Mail und Passwort auch Social-Login-Buttons für die Eltern: Google, Apple, Facebook – das volle Programm.
- Google lief problemlos 👌🏼
- Apple verlangt einen Developer Account, der Geld kostet – ist also vorerst rausgeflogen 🫰🏼
- Facebook wurde spaßig: Ich musste rechtliche Links angeben, die tatsächlich existieren und aufrufbar sein müssen. Also habe ich v0.0.1-pre-alpha am 24. März deployed, nur damit ich mich um den Facebook-Button kümmern konnte - damit hat es letzendlich auch geklappt 👍🏼
Die Tonies kamen erst 4 Tage später, am 28. März, dazu. Für SEO habe ich Detailseiten für jeden Tonie gebaut und eine sitemap.xml hinzugefügt.
Dank meiner Crowdsec-Konfiguration ist der Google-Indexer sogar blockiert worden und hat irgendwann abgebrochen. Das habe ich erst Tage später gemerkt und am 7. April gefixt – mit der SEO-Bots-Whitelist.
Zusätzlich fiel mir auf: Ich indexierte nicht nur Tonie-Figuren, sondern auch Download-Inhalte und fremdsprachige Tonies, die ich eigentlich gar nicht haben wollte. Statt 6000+ Einträge sind jetzt noch ~700 übrig – Ich hoffe, dass Google die 404 Pages demnächst wieder aus dem Index nimmt.
Als ich mir eine kleine Admin-UI gebaut und diese live deployed habe, sah ich etwas Überraschendes: Ich hatte bereits eine erste Userin! Shout-out an Maria! ✌️
Sie kam tatsächlich über eine organische Google-Suche und hat ihren Account bereits am 5. April erstellt. Ganz schön verrückt, wenn man bedenkt, dass meine Domain zu dem Zeitpunkt 49 Tage alt war und meine Tonies erst 8 Tage indexiert waren.
Und bereits am 6. April gab es die erste Einnahme über Amazon – stolze 1,11 €. Kaum zu glauben 👀
Als ich meiner Frau Lauschliste zum Testen gab, meinte sie: Der Aufbau und der User-Flow seien nicht optimal und etwas verwirrend. Für einen finalen Release muss ich das noch anpassen – aber das ist eben dieses "Building in Public", von dem alle reden.
Ein bisschen Druck ist jetzt natürlich da: Ich muss die Daten migrieren und ich weiß nicht, ob Maria schon irgendwo einen QR-Code ausgehängt oder den Link in die Familien-WhatsApp-Gruppe geschickt hat.
Bei Laravel Ingest gab es übrigens durch einen Newsletter-Versand mehr Reichweite und ich habe meinen GitHub-Starstruck-Badge bekommen 🎉
Nachdem das Projekt über einen Monat rumlag, ohne dass ich reingeschaut habe, entdeckte ich: Zwei offene Issues. Das ist wohl das Leben eines Open-Source-Entwicklers 😅
Bei einem Issue gab es einen Pull Request, den ich einfach reinklicken konnte. Bei dem anderen habe ich – wie es für einen ADHSler gehört – direkt Lauschliste unterbrochen und mich darum gekümmert. Als ich auf Feedback wartete, habe ich wieder mit Lauschliste weitergemacht. Seitdem liegt das Issue ungelöst rum.
Schaltet auch beim nächsten Mal wieder ein, wenn es heißt: Wie ich versuche, Lauschliste benutzerfreundlich zu machen – ohne Maria zu vergrätzen. Oder vielleicht doch ein neuer Laravel Ingest Release. Oder mein PDF-SaaS ging durch die Decke 😂