Kreuzstich-Vorlagen werden üblicherweise mit proprietärer Windows-Software erstellt — die Tools sind teuer, die UX ist ein Relikt aus den frühen 2000ern, und ein vernünftiger Browser-Workflow existiert schlicht nicht. Wer ein Foto in ein zählbares Raster mit Garnfarben verwandeln will, hat kaum Alternativen.
Man lädt ein Bild hoch, gibt Rasterbreite und Farbanzahl vor — der Rest passiert serverseitig. Sharp skaliert das Bild per Nearest-Neighbor auf die Zielgröße, anschließend wird jeder Pixel per RGB-Distanz der nächsten Garnfarbe aus einer Palette zugeordnet. Das Ergebnis lässt sich als PNG, PDF oder JSON exportieren.
Die Konvertierung läuft asynchron über eine BullMQ-Queue — sinnvoll bei großen Rastern, bei denen die Verarbeitung mehrere Sekunden dauern kann. Der Browser pollt den Status und zeigt eine Vorschau sobald das Muster fertig ist.
Fastify statt Express: Deutlich bessere Performance out of the box, Schema-Validierung mit Zod, und der Plugin-Mechanismus macht die Codebasis ordentlicher.
Redis + BullMQ: Für eine einfache Deploymentvariante kann der Queue-Modus deaktiviert werden — dann läuft die Konvertierung synchron. Spart Redis als Dependency wenn man nur lokal testet.
Argon2 statt bcrypt: Der aktuelle Standard für Passwort-Hashing, ohne nennenswerten Mehraufwand bei der Integration.
Die Farbpaletten-Logik hat mich am längsten beschäftigt. Nearest-Neighbor im RGB-Raum ist schnell, aber perceptuell ungenau — zwei Farben die numerisch nah beieinander liegen können optisch sehr unterschiedlich wirken. Ein Delta-E-basierter Ansatz im Lab-Farbraum wäre besser, war mir für die erste Version aber zu aufwändig.
Läuft produktiv und wird tatsächlich benutzt. Das ist mehr als bei den meisten Nebenprojekten der Fall. Der Code ist sauber genug dass ich in einem halben Jahr noch weiß was er tut.