From 2a4695b787ab01527c4d9dcd2f40fffaa2300f69 Mon Sep 17 00:00:00 2001
From: Tobias Leinss <7684178+leinss@users.noreply.github.com>
Date: Tue, 18 Aug 2026 18:20:32 +0200
Subject: [PATCH] content: point consulting links at consulting.leinss.xyz
The consulting site moved to a subdomain; the previous domain stops
resolving. Replaces the host in every cross-link (blog posts in both
languages, homepage, /now, llms.txt) and names the consultancy rather
than its hostname in the work timeline entry.
- 36 files, all outbound links to the consulting site
- work entry company field now reads as a business name
- all 21 distinct target URLs verified 200 on the new host
- build green, 1760 internal links checked, none broken
---
public/llms.txt | 2 +-
src/content/blog/de/faq-assistant-technical/index.md | 6 +++---
src/content/blog/de/invoice-extractor-technical/index.md | 8 ++++----
src/content/blog/de/lead-response-technical/index.md | 6 +++---
src/content/blog/de/listmonk-vs-mailchimp/index.md | 2 +-
src/content/blog/de/meeting-assistant-technical/index.md | 6 +++---
src/content/blog/de/mittelstand-ai/index.md | 2 +-
src/content/blog/de/n8n-automation-stack/index.md | 2 +-
src/content/blog/de/n8n-customer-service/index.md | 4 ++--
src/content/blog/de/own-your-ai-agent/index.md | 2 +-
src/content/blog/de/postiz-vs-buffer/index.md | 2 +-
src/content/blog/de/self-hosted-research-agent/index.md | 2 +-
src/content/blog/de/self-hosted-stack/index.md | 2 +-
.../blog/de/self-hosted-supabase-vs-firebase/index.md | 2 +-
.../blog/de/spreadsheet-cleaning-technical/index.md | 6 +++---
src/content/blog/de/umami-vs-google-analytics/index.md | 2 +-
.../blog/de/where-n8n-stops-and-code-starts/index.md | 2 +-
src/content/blog/en/faq-assistant-technical/index.md | 6 +++---
src/content/blog/en/invoice-extractor-technical/index.md | 8 ++++----
src/content/blog/en/lead-response-technical/index.md | 6 +++---
src/content/blog/en/listmonk-vs-mailchimp/index.md | 2 +-
src/content/blog/en/meeting-assistant-technical/index.md | 6 +++---
src/content/blog/en/mittelstand-ai/index.md | 2 +-
src/content/blog/en/n8n-automation-stack/index.md | 2 +-
src/content/blog/en/n8n-customer-service/index.md | 4 ++--
src/content/blog/en/own-your-ai-agent/index.md | 2 +-
src/content/blog/en/postiz-vs-buffer/index.md | 2 +-
src/content/blog/en/self-hosted-research-agent/index.md | 2 +-
src/content/blog/en/self-hosted-stack/index.md | 2 +-
.../blog/en/self-hosted-supabase-vs-firebase/index.md | 2 +-
.../blog/en/spreadsheet-cleaning-technical/index.md | 6 +++---
src/content/blog/en/umami-vs-google-analytics/index.md | 2 +-
.../blog/en/where-n8n-stops-and-code-starts/index.md | 2 +-
src/content/staticPages/now.md | 2 +-
src/content/work/leinss-consulting.md | 4 ++--
src/pages/index.astro | 4 ++--
36 files changed, 62 insertions(+), 62 deletions(-)
diff --git a/public/llms.txt b/public/llms.txt
index 45099e5d1..5aff09bf8 100644
--- a/public/llms.txt
+++ b/public/llms.txt
@@ -23,7 +23,7 @@ The apps below are all local-first: data stays on your device by default, and an
- [Projects](https://leinss.xyz/projects/): full app list.
## Consulting (secondary)
-- Generative-AI consulting for German Mittelstand and service companies is offered separately at https://leinss-consulting.de, building your own apps is the main focus.
+- Generative-AI consulting for German Mittelstand and service companies is offered separately at https://consulting.leinss.xyz, building your own apps is the main focus.
## Contact
- Email: dev@leinss.xyz
diff --git a/src/content/blog/de/faq-assistant-technical/index.md b/src/content/blog/de/faq-assistant-technical/index.md
index 5d440c595..42f300bd8 100644
--- a/src/content/blog/de/faq-assistant-technical/index.md
+++ b/src/content/blog/de/faq-assistant-technical/index.md
@@ -6,9 +6,9 @@ tags: ["n8n", "rag", "kimi", "ai", "teardown", "own-your-stack"]
lang: "de"
---
-> **Kurz gesagt:** Der FAQ-Assistent ist Retrieval-Augmented Generation in zehn n8n-Nodes: in einer Postgres-Wissensbasis die am besten passenden Passagen zur Frage suchen, diese Kimi K2 als Kontext geben und eine belegte Antwort zurückgeben. Der Retrieval-Schritt hält das Modell davon ab, etwas zu erfinden. Es kann nur aus dem antworten, was die Suche liefert. Das ist der Teardown der [Live-FAQ-Demo](https://leinss-consulting.de/de/blog/faq-assistent-ki-support/).
+> **Kurz gesagt:** Der FAQ-Assistent ist Retrieval-Augmented Generation in zehn n8n-Nodes: in einer Postgres-Wissensbasis die am besten passenden Passagen zur Frage suchen, diese Kimi K2 als Kontext geben und eine belegte Antwort zurückgeben. Der Retrieval-Schritt hält das Modell davon ab, etwas zu erfinden. Es kann nur aus dem antworten, was die Suche liefert. Das ist der Teardown der [Live-FAQ-Demo](https://consulting.leinss.xyz/de/blog/faq-assistent-ki-support/).
-Ein Chatbot, der Antworten erfindet, ist schlimmer als kein Chatbot. Der [FAQ-Assistent auf meiner Beratungsseite](https://leinss-consulting.de/de/blog/faq-assistent-ki-support/) antwortet nur aus einer Wissensbasis, die ich kontrolliere, und verweigert, wenn die Antwort nicht drinsteht. Dieses Verhalten ist Retrieval-Augmented Generation (RAG), und so ist es verdrahtet. Sie können [das Workflow-JSON herunterladen](https://leinss-consulting.de/workflows/faq-assistent.json) und jeden Node prüfen.
+Ein Chatbot, der Antworten erfindet, ist schlimmer als kein Chatbot. Der [FAQ-Assistent auf meiner Beratungsseite](https://consulting.leinss.xyz/de/blog/faq-assistent-ki-support/) antwortet nur aus einer Wissensbasis, die ich kontrolliere, und verweigert, wenn die Antwort nicht drinsteht. Dieses Verhalten ist Retrieval-Augmented Generation (RAG), und so ist es verdrahtet. Sie können [das Workflow-JSON herunterladen](https://consulting.leinss.xyz/workflows/faq-assistent.json) und jeden Node prüfen.
## Die RAG-Pipeline
@@ -48,4 +48,4 @@ Dieser mittlere Node ist der Ort, an dem Retrieval zur *Antwort* wird. „Setze
## Warum Selbst-Hosting hier zählt
-Die Wissensbasis sind Unternehmensdaten, und die Fragen der Nutzer sind oft sensibel. Speicher und Workflow auf Infrastruktur zu betreiben, die ich kontrolliere, heißt, keins von beiden verlässt meinen Server außer für den Modellaufruf selbst. Das ist der Sinn [des selbst gehosteten Stacks, den ich statt SaaS betreibe](/blog/de/self-hosted-stack/). Wenn Sie einen belegten Assistenten über Ihren eigenen Dokumenten wollen, gebaut und übergeben, mache ich das bei [Leinss Consulting](https://leinss-consulting.de/de/).
+Die Wissensbasis sind Unternehmensdaten, und die Fragen der Nutzer sind oft sensibel. Speicher und Workflow auf Infrastruktur zu betreiben, die ich kontrolliere, heißt, keins von beiden verlässt meinen Server außer für den Modellaufruf selbst. Das ist der Sinn [des selbst gehosteten Stacks, den ich statt SaaS betreibe](/blog/de/self-hosted-stack/). Wenn Sie einen belegten Assistenten über Ihren eigenen Dokumenten wollen, gebaut und übergeben, mache ich das bei [Leinss Consulting](https://consulting.leinss.xyz/de/).
diff --git a/src/content/blog/de/invoice-extractor-technical/index.md b/src/content/blog/de/invoice-extractor-technical/index.md
index 36a25dddf..689c0fe00 100644
--- a/src/content/blog/de/invoice-extractor-technical/index.md
+++ b/src/content/blog/de/invoice-extractor-technical/index.md
@@ -6,9 +6,9 @@ tags: ["n8n", "claude", "ai", "automation", "teardown", "own-your-stack"]
lang: "de"
---
-> **Kurz gesagt:** Der Rechnungsleser sind drei n8n-Nodes: ein Formular für den Upload, ein HTTP-Aufruf an ein Vision-Modell mit dem Rechnungsbild und ein Code-Node, der die Antwort des Modells in sauberes JSON parst. Vision übernimmt das Lesen; der Code-Node den Teil, den ein No-Code-Tool nicht kann, die Markdown-Zäune des Modells entfernen und das Ergebnis sicher parsen. Das ist der Teardown des Workflows hinter der [Rechnungs-Demo](https://leinss-consulting.de/de/blog/rechnungsverarbeitung-automatisieren/).
+> **Kurz gesagt:** Der Rechnungsleser sind drei n8n-Nodes: ein Formular für den Upload, ein HTTP-Aufruf an ein Vision-Modell mit dem Rechnungsbild und ein Code-Node, der die Antwort des Modells in sauberes JSON parst. Vision übernimmt das Lesen; der Code-Node den Teil, den ein No-Code-Tool nicht kann, die Markdown-Zäune des Modells entfernen und das Ergebnis sicher parsen. Das ist der Teardown des Workflows hinter der [Rechnungs-Demo](https://consulting.leinss.xyz/de/blog/rechnungsverarbeitung-automatisieren/).
-Die [Rechnungs-Demo auf meiner Beratungsseite](https://leinss-consulting.de/de/blog/rechnungsverarbeitung-automatisieren/) liest eine echte Rechnung und gibt strukturierte Felder zurück. Man vermutet einen Berg OCR-Regeln dahinter. Den gibt es nicht. Hier ist das Ganze, und Sie können [das Workflow-JSON herunterladen](https://leinss-consulting.de/workflows/n8n-invoice-cloud.json) und selbst laufen lassen.
+Die [Rechnungs-Demo auf meiner Beratungsseite](https://consulting.leinss.xyz/de/blog/rechnungsverarbeitung-automatisieren/) liest eine echte Rechnung und gibt strukturierte Felder zurück. Man vermutet einen Berg OCR-Regeln dahinter. Den gibt es nicht. Hier ist das Ganze, und Sie können [das Workflow-JSON herunterladen](https://consulting.leinss.xyz/workflows/n8n-invoice-cloud.json) und selbst laufen lassen.
## Die ganze Pipeline sind drei Nodes
@@ -24,7 +24,7 @@ Das ist alles. Keine OCR-Engine, kein Template pro Lieferant, kein Regex-Zoo. Ei
Der eine echte Schritt ist ein HTTP-Request an ein Vision-Modell, die Rechnung inline als Base64-Bild übergeben. Der Prompt fragt die Felder ab, die mich interessieren (Nummer, Datum, Positionen, Summen, Steuer) als JSON. Weil das Modell Pixel liest, ist es ihm egal, ob das Layout ein sauberer PDF-Export oder ein Handyfoto einer zerknitterten Papierrechnung ist.
-Welches Modell, ist eine Kostenentscheidung, keine Architekturentscheidung, und die beiden Kopien dieses Workflows unterscheiden sich genau darin. Das JSON zum Herunterladen ruft die Messages-API von Claude Sonnet 4 auf. Das Widget auf meiner Beratungsseite ruft den Vision-Endpunkt von Kimi auf meiner eigenen n8n-Instanz auf, weil es öffentlich ist und jede Einreichung Geld kostet. Es gibt außerdem eine [lokale Variante](https://leinss-consulting.de/workflows/n8n-invoice-local.json), die denselben Schritt auf Ollama zeigen lässt, sodass nichts die Maschine verlässt. In allen dreien dieselbe Form aus drei Schritten; tauschen Sie URL und Auth-Header.
+Welches Modell, ist eine Kostenentscheidung, keine Architekturentscheidung, und die beiden Kopien dieses Workflows unterscheiden sich genau darin. Das JSON zum Herunterladen ruft die Messages-API von Claude Sonnet 4 auf. Das Widget auf meiner Beratungsseite ruft den Vision-Endpunkt von Kimi auf meiner eigenen n8n-Instanz auf, weil es öffentlich ist und jede Einreichung Geld kostet. Es gibt außerdem eine [lokale Variante](https://consulting.leinss.xyz/workflows/n8n-invoice-local.json), die denselben Schritt auf Ollama zeigen lässt, sodass nichts die Maschine verlässt. In allen dreien dieselbe Form aus drei Schritten; tauschen Sie URL und Auth-Header.
Die gehostete Kopie hat zusätzlich drei Nodes, die der Starter nicht hat: einen Validierungsschritt, ein IF und eine Fehlerantwort. Eine Anfrage ohne Datei bekommt so eine klare Ablehnung statt eines leeren Modellaufrufs. Das lohnt sich für alles Öffentliche, und es ist derselbe Punkt „Code besitzt den Fehlerfall", den auch der Parse-Node macht.
@@ -42,4 +42,4 @@ Nichts davon ist schwer, aber alles zusammen ist der Unterschied zwischen einer
Drei Nodes heißt fast nichts zu warten. Taucht ein neues Rechnungslayout auf, gibt es kein Template hinzuzufügen. Das Vision-Modell kann es bereits. Der einzige Code ist der Parse-Schritt, und er ist stabil, weil die Ausgabeform des Modells stabil ist. Einfach ist hier auch belastbar.
-Das läuft auf meinem eigenen n8n, Teil [des selbst gehosteten Stacks, den ich statt SaaS betreibe](/blog/de/self-hosted-stack/). Wenn Sie einen solchen Leser für Ihre Dokumenttypen gebaut und an Ihr Team übergeben haben wollen, mache ich das bei [Leinss Consulting](https://leinss-consulting.de/de/).
+Das läuft auf meinem eigenen n8n, Teil [des selbst gehosteten Stacks, den ich statt SaaS betreibe](/blog/de/self-hosted-stack/). Wenn Sie einen solchen Leser für Ihre Dokumenttypen gebaut und an Ihr Team übergeben haben wollen, mache ich das bei [Leinss Consulting](https://consulting.leinss.xyz/de/).
diff --git a/src/content/blog/de/lead-response-technical/index.md b/src/content/blog/de/lead-response-technical/index.md
index f07659653..7d08d81c0 100644
--- a/src/content/blog/de/lead-response-technical/index.md
+++ b/src/content/blog/de/lead-response-technical/index.md
@@ -6,9 +6,9 @@ tags: ["n8n", "kimi", "ai", "automation", "teardown", "own-your-stack"]
lang: "de"
---
-> **Kurz gesagt:** Der Lead-Response-Bot fährt zwei LLM-Durchläufe über eine Kontaktformular-Einsendung: Zuerst klassifiziert Kimi K2 den Lead (Absicht, Passung, Sprache) als JSON, dann nutzt ein zweiter Kimi-Aufruf diese Klassifikation, um eine personalisierte Antwort in der Sprache des Absenders zu entwerfen. n8n übernimmt Formular, Verzweigung und Versand; Code-Nodes validieren die Eingabe und parsen die Klassifikation zwischen den Durchläufen. Klassifizieren-dann-schreiben zu trennen lässt die Antwort gezielt wirken. Das ist der Teardown der [Live-Lead-Response-Demo](https://leinss-consulting.de/de/blog/kommunikation-automatisieren-menschlich-bleiben/).
+> **Kurz gesagt:** Der Lead-Response-Bot fährt zwei LLM-Durchläufe über eine Kontaktformular-Einsendung: Zuerst klassifiziert Kimi K2 den Lead (Absicht, Passung, Sprache) als JSON, dann nutzt ein zweiter Kimi-Aufruf diese Klassifikation, um eine personalisierte Antwort in der Sprache des Absenders zu entwerfen. n8n übernimmt Formular, Verzweigung und Versand; Code-Nodes validieren die Eingabe und parsen die Klassifikation zwischen den Durchläufen. Klassifizieren-dann-schreiben zu trennen lässt die Antwort gezielt wirken. Das ist der Teardown der [Live-Lead-Response-Demo](https://consulting.leinss.xyz/de/blog/kommunikation-automatisieren-menschlich-bleiben/).
-Eine generische Auto-Antwort ist schlimmer als eine langsame menschliche. Die [Lead-Response-Demo auf meiner Beratungsseite](https://leinss-consulting.de/de/blog/kommunikation-automatisieren-menschlich-bleiben/) liest eine eingehende Nachricht und entwirft eine Antwort, die tatsächlich darauf eingeht. Der Kniff ist, es in zwei Durchläufen zu tun, nicht in einem. Das [Workflow-JSON ist herunterladbar](https://leinss-consulting.de/workflows/blitz-antwort.json).
+Eine generische Auto-Antwort ist schlimmer als eine langsame menschliche. Die [Lead-Response-Demo auf meiner Beratungsseite](https://consulting.leinss.xyz/de/blog/kommunikation-automatisieren-menschlich-bleiben/) liest eine eingehende Nachricht und entwirft eine Antwort, die tatsächlich darauf eingeht. Der Kniff ist, es in zwei Durchläufen zu tun, nicht in einem. Das [Workflow-JSON ist herunterladbar](https://consulting.leinss.xyz/workflows/blitz-antwort.json).
## Zwei Durchläufe, nicht einer
@@ -42,4 +42,4 @@ Dieser Parse-zwischen-Durchläufen-Node ist reines „wo Code anfängt": Zwei Mo
## Warum es auf meinem eigenen Stack läuft
-Eingehende Leads sind Geschäftsdaten, und die Antwort geht unter meinem Namen raus. Die Pipeline auf Infrastruktur zu betreiben, die ich kontrolliere, heißt, Nachricht und Klassifikation bleiben bei mir, abgesehen von den Modellaufrufen, die ich zu machen wähle. Das ist die Logik [des selbst gehosteten Stacks, den ich statt SaaS betreibe](/blog/de/self-hosted-stack/). Schnelle, personalisierte Lead-Bearbeitung, für Ihre Pipeline gebaut und übergeben? Das mache ich bei [Leinss Consulting](https://leinss-consulting.de/de/).
+Eingehende Leads sind Geschäftsdaten, und die Antwort geht unter meinem Namen raus. Die Pipeline auf Infrastruktur zu betreiben, die ich kontrolliere, heißt, Nachricht und Klassifikation bleiben bei mir, abgesehen von den Modellaufrufen, die ich zu machen wähle. Das ist die Logik [des selbst gehosteten Stacks, den ich statt SaaS betreibe](/blog/de/self-hosted-stack/). Schnelle, personalisierte Lead-Bearbeitung, für Ihre Pipeline gebaut und übergeben? Das mache ich bei [Leinss Consulting](https://consulting.leinss.xyz/de/).
diff --git a/src/content/blog/de/listmonk-vs-mailchimp/index.md b/src/content/blog/de/listmonk-vs-mailchimp/index.md
index 1f0de3db8..c7cc4e54c 100644
--- a/src/content/blog/de/listmonk-vs-mailchimp/index.md
+++ b/src/content/blog/de/listmonk-vs-mailchimp/index.md
@@ -44,4 +44,4 @@ Beide versenden Kampagnen und transaktionale E-Mails, verwalten Abonnenten und S
Der ehrliche Haken: den Versand zu besitzen ist der Teil, der Engineering braucht. Listmonk selbst ist ein einzelnes Binary; es zuverlässig senden zu lassen ist DNS, ein Versandanbieter und Monitoring. Diese Lücke ist das Thema von [dem selbst gehosteten Stack, den ich statt SaaS betreibe](/blog/de/self-hosted-stack/).
-Wenn Sie einen eigenen Newsletter sauber eingerichtet haben wollen, samt Zustellbarkeit, und an Ihr Team übergeben, ist das genau die Art Arbeit, die ich bei [Leinss Consulting](https://leinss-consulting.de/de/) mache.
+Wenn Sie einen eigenen Newsletter sauber eingerichtet haben wollen, samt Zustellbarkeit, und an Ihr Team übergeben, ist das genau die Art Arbeit, die ich bei [Leinss Consulting](https://consulting.leinss.xyz/de/) mache.
diff --git a/src/content/blog/de/meeting-assistant-technical/index.md b/src/content/blog/de/meeting-assistant-technical/index.md
index db2f94734..4cd7937ef 100644
--- a/src/content/blog/de/meeting-assistant-technical/index.md
+++ b/src/content/blog/de/meeting-assistant-technical/index.md
@@ -6,9 +6,9 @@ tags: ["n8n", "claude", "whisper", "ai", "teardown", "own-your-stack"]
lang: "de"
---
-> **Kurz gesagt:** Der Meeting-Bot nimmt eine Audiodatei, transkribiert sie mit Whisper und lässt dann ein Modell strukturierte Protokolle extrahieren (Entscheidungen, Aufgaben, Zuständige) gegen ein festes Schema statt als Fließtext. Ein Code-Node formatiert das zu Markdown, und n8n verschickt es. Das erzwungene Schema macht die Zusammenfassung verlässlich statt zu einer Textwand. Das ist der Teardown des [Meeting-Protokoll-Workflows](https://leinss-consulting.de/de/blog/meeting-protokoll-automatisieren/).
+> **Kurz gesagt:** Der Meeting-Bot nimmt eine Audiodatei, transkribiert sie mit Whisper und lässt dann ein Modell strukturierte Protokolle extrahieren (Entscheidungen, Aufgaben, Zuständige) gegen ein festes Schema statt als Fließtext. Ein Code-Node formatiert das zu Markdown, und n8n verschickt es. Das erzwungene Schema macht die Zusammenfassung verlässlich statt zu einer Textwand. Das ist der Teardown des [Meeting-Protokoll-Workflows](https://consulting.leinss.xyz/de/blog/meeting-protokoll-automatisieren/).
-„Fasse dieses Meeting zusammen" liefert einen Absatz, den niemand liest. Was Leute wirklich wollen, ist eine Liste von Entscheidungen und wer welche Aufgabe verantwortet. Der [Meeting-Protokoll-Workflow auf meiner Beratungsseite](https://leinss-consulting.de/de/blog/meeting-protokoll-automatisieren/) erzeugt genau das, und hier ist wie. Das [Workflow-JSON ist herunterladbar](https://leinss-consulting.de/workflows/meeting-protokoll.json).
+„Fasse dieses Meeting zusammen" liefert einen Absatz, den niemand liest. Was Leute wirklich wollen, ist eine Liste von Entscheidungen und wer welche Aufgabe verantwortet. Der [Meeting-Protokoll-Workflow auf meiner Beratungsseite](https://consulting.leinss.xyz/de/blog/meeting-protokoll-automatisieren/) erzeugt genau das, und hier ist wie. Das [Workflow-JSON ist herunterladbar](https://consulting.leinss.xyz/workflows/meeting-protokoll.json).
**Eines vorweg, weil Sie es nachprüfen können:** Das Widget auf der Demo-Seite transkribiert derzeit nicht. Es braucht einen Whisper-Dienst, dieser Dienst läuft nicht auf der Maschine, auf der die Demos liegen, und statt eines Fehlers gibt das Widget eine Beispiel-Zusammenfassung zurück. Einen solchen Dienst aufzusetzen ist Infrastruktur, die ich für eine Demo nicht ausgegeben habe. Lesen Sie das hier also als Teardown des Workflows, der echt und herunterladbar ist, nicht als Beleg dafür, dass der Knopf durchgängig funktioniert.
@@ -45,4 +45,4 @@ Dieser letzte Node ist der „wo Code anfängt"-Moment: ein strukturiertes API-E
## Warum ich es selbst betreibe
-Meeting-Audio ist ungefähr so sensibel, wie Unternehmensdaten werden. Transkription und Zusammenfassung durch einen Workflow auf Infrastruktur zu führen, die ich kontrolliere, hält die Aufnahme aus fremder SaaS heraus, außer für die Modellaufrufe, die ich wähle. Das ist der Fall hinter [dem selbst gehosteten Stack, den ich statt SaaS betreibe](/blog/de/self-hosted-stack/). So etwas für die Meetings Ihres Teams, gebaut und übergeben? Das mache ich bei [Leinss Consulting](https://leinss-consulting.de/de/).
+Meeting-Audio ist ungefähr so sensibel, wie Unternehmensdaten werden. Transkription und Zusammenfassung durch einen Workflow auf Infrastruktur zu führen, die ich kontrolliere, hält die Aufnahme aus fremder SaaS heraus, außer für die Modellaufrufe, die ich wähle. Das ist der Fall hinter [dem selbst gehosteten Stack, den ich statt SaaS betreibe](/blog/de/self-hosted-stack/). So etwas für die Meetings Ihres Teams, gebaut und übergeben? Das mache ich bei [Leinss Consulting](https://consulting.leinss.xyz/de/).
diff --git a/src/content/blog/de/mittelstand-ai/index.md b/src/content/blog/de/mittelstand-ai/index.md
index 0e3042704..6fc72124c 100644
--- a/src/content/blog/de/mittelstand-ai/index.md
+++ b/src/content/blog/de/mittelstand-ai/index.md
@@ -50,4 +50,4 @@ Das wäre Dogma, und Dogma ist teuer. Gemietete Cloud-Tools sind der richtige Ei
## Wenn Sie beim Ziehen dieser Linie Hilfe wollen
-Zu entscheiden, was gehören und was gemietet sein soll, und dann die besessene Hälfte so zu bauen, dass sie dokumentiert und ans Team übergeben ist statt im Kopf einer Person eingeschlossen. Das ist die Arbeit, die ich bei [Leinss Consulting](https://leinss-consulting.de/de/) mache. Wenn Sie an diesem Punkt stehen, steht die Tür offen.
+Zu entscheiden, was gehören und was gemietet sein soll, und dann die besessene Hälfte so zu bauen, dass sie dokumentiert und ans Team übergeben ist statt im Kopf einer Person eingeschlossen. Das ist die Arbeit, die ich bei [Leinss Consulting](https://consulting.leinss.xyz/de/) mache. Wenn Sie an diesem Punkt stehen, steht die Tür offen.
diff --git a/src/content/blog/de/n8n-automation-stack/index.md b/src/content/blog/de/n8n-automation-stack/index.md
index ab99b4397..7ab9090cf 100644
--- a/src/content/blog/de/n8n-automation-stack/index.md
+++ b/src/content/blog/de/n8n-automation-stack/index.md
@@ -58,4 +58,4 @@ Käme das Volumen, das es rechtfertigt: Queue-Modus mit Postgres und Redis, dami
## Wollen Sie das, aber besessen?
-So einen Stack aufzusetzen (selbst gehostet, dokumentiert und so übergeben, dass er nicht im Kopf einer einzelnen Person eingeschlossen ist) ist die Arbeit, die ich bei [Leinss Consulting](https://leinss-consulting.de/de/) mache. Wenn Sie ein ähnliches Setup betreiben, vergleiche ich gern Notizen.
+So einen Stack aufzusetzen (selbst gehostet, dokumentiert und so übergeben, dass er nicht im Kopf einer einzelnen Person eingeschlossen ist) ist die Arbeit, die ich bei [Leinss Consulting](https://consulting.leinss.xyz/de/) mache. Wenn Sie ein ähnliches Setup betreiben, vergleiche ich gern Notizen.
diff --git a/src/content/blog/de/n8n-customer-service/index.md b/src/content/blog/de/n8n-customer-service/index.md
index bcedf4bbd..82eb12667 100644
--- a/src/content/blog/de/n8n-customer-service/index.md
+++ b/src/content/blog/de/n8n-customer-service/index.md
@@ -66,7 +66,7 @@ Diese vier Zahlen lohnen die Beobachtung, sobald es läuft, und Sie bekommen sie
- **Zeit bis zur ersten Antwort**, vorher und nachher, nach Kategorie getrennt. Der Durchschnitt versteckt genau den Fall, auf den es ankommt.
- **Rate der falschen, selbstsicheren Antworten.** Die wichtigste. Ein Bot, der zu oft „weiß ich nicht" sagt, nervt; ein Bot, der selbstsicher falsch liegt, kostet Sie einen Kunden.
-> **Referenz-Build:** Die vollständige Architektur mit jedem erklärten Node und dem n8n-Workflow zum Herunterladen finden Sie im **[Referenz-Build KI-Support-Triage](https://leinss-consulting.de/de/blog/fallstudie-support-triage/)**. Das ist ein Aufbau zum Nachprüfen, kein Kundenbericht, und er enthält keine Kundenzahlen.
+> **Referenz-Build:** Die vollständige Architektur mit jedem erklärten Node und dem n8n-Workflow zum Herunterladen finden Sie im **[Referenz-Build KI-Support-Triage](https://consulting.leinss.xyz/de/blog/fallstudie-support-triage/)**. Das ist ein Aufbau zum Nachprüfen, kein Kundenbericht, und er enthält keine Kundenzahlen.
## Erste Schritte
@@ -79,4 +79,4 @@ Klein anfangen:
---
-Wollen Sie das Echte statt einer Beschreibung? Der [Referenz-Build Support-Triage](https://leinss-consulting.de/de/blog/fallstudie-support-triage/) liefert den n8n-Workflow als herunterladbare JSON, importieren Sie ihn und lesen Sie jeden Node. Wenn Sie ihn lieber gebaut und übergeben bekommen, ist das die Arbeit, die ich bei [Leinss Consulting](https://leinss-consulting.de/de/) mache.
+Wollen Sie das Echte statt einer Beschreibung? Der [Referenz-Build Support-Triage](https://consulting.leinss.xyz/de/blog/fallstudie-support-triage/) liefert den n8n-Workflow als herunterladbare JSON, importieren Sie ihn und lesen Sie jeden Node. Wenn Sie ihn lieber gebaut und übergeben bekommen, ist das die Arbeit, die ich bei [Leinss Consulting](https://consulting.leinss.xyz/de/) mache.
diff --git a/src/content/blog/de/own-your-ai-agent/index.md b/src/content/blog/de/own-your-ai-agent/index.md
index 0173d97b9..8c2362713 100644
--- a/src/content/blog/de/own-your-ai-agent/index.md
+++ b/src/content/blog/de/own-your-ai-agent/index.md
@@ -38,4 +38,4 @@ Aber ein Agent, der echte Arbeit tut (Ihre Dateien liest, Ihre Systeme anfasst,
- [Pi vs OpenClaw](/blog/de/pi-vs-openclaw/): der minimale Agenten-Kern und das Assistenz-Gateway drumherum, und wann man zu welchem greift.
- [Wie ich einen selbst gehosteten Recherche-Agenten im Alltag nutze](/blog/de/self-hosted-research-agent/), der praktische Aufbau.
-Eigene Automatisierung und eigene Agenten sind dieselbe Idee eine Schicht weiter. Wenn Sie eines von beidem für Ihr Unternehmen gebaut und übergeben haben wollen, mache ich das bei [Leinss Consulting](https://leinss-consulting.de/de/).
+Eigene Automatisierung und eigene Agenten sind dieselbe Idee eine Schicht weiter. Wenn Sie eines von beidem für Ihr Unternehmen gebaut und übergeben haben wollen, mache ich das bei [Leinss Consulting](https://consulting.leinss.xyz/de/).
diff --git a/src/content/blog/de/postiz-vs-buffer/index.md b/src/content/blog/de/postiz-vs-buffer/index.md
index 98b1c1f29..db4647d6f 100644
--- a/src/content/blog/de/postiz-vs-buffer/index.md
+++ b/src/content/blog/de/postiz-vs-buffer/index.md
@@ -43,4 +43,4 @@ Alle drei erledigen die Kernaufgabe: Social-Konten verbinden, Beiträge schreibe
Der wiederkehrende Haken bei allem, was ich selbst hoste: das Tool ist der leichte Teil; es *gut* zu betreiben ist Docker, Backups und Wartung. Diese Lücke ist das Thema von [dem selbst gehosteten Stack, den ich statt SaaS betreibe](/blog/de/self-hosted-stack/).
-Wenn Sie eigene Automatisierung wie diese, Social-Planung und den Rest, gebaut und an Ihr Team übergeben haben wollen, ist das genau die Art Arbeit, die ich bei [Leinss Consulting](https://leinss-consulting.de/de/) mache.
+Wenn Sie eigene Automatisierung wie diese, Social-Planung und den Rest, gebaut und an Ihr Team übergeben haben wollen, ist das genau die Art Arbeit, die ich bei [Leinss Consulting](https://consulting.leinss.xyz/de/) mache.
diff --git a/src/content/blog/de/self-hosted-research-agent/index.md b/src/content/blog/de/self-hosted-research-agent/index.md
index 315adb294..3445711e6 100644
--- a/src/content/blog/de/self-hosted-research-agent/index.md
+++ b/src/content/blog/de/self-hosted-research-agent/index.md
@@ -41,4 +41,4 @@ Zwei Gründe, beide praktisch:
Das ist eine Gewohnheit, kein Zauberknopf. Es lohnt sich einzurichten, wenn Sie genug recherchieren oder entwerfen, dass ein immer-da, eigener Agent den Aufwand seines Betriebs zurückzahlt. Wenn Sie zweimal im Monat einen Chatbot etwas fragen, lassen Sie es, ein gemieteter Tab reicht.
-Wollen Sie das ganze Bild, deckt [Pi vs OpenClaw](/blog/de/pi-vs-openclaw/) den Terminal-Agenten gegenüber dem Chat-Kanal-Assistenten ab. Und wenn Sie einen eigenen Agenten oder eigene Automatisierung für Ihr Unternehmen gebaut und übergeben haben wollen, mache ich das bei [Leinss Consulting](https://leinss-consulting.de/de/).
+Wollen Sie das ganze Bild, deckt [Pi vs OpenClaw](/blog/de/pi-vs-openclaw/) den Terminal-Agenten gegenüber dem Chat-Kanal-Assistenten ab. Und wenn Sie einen eigenen Agenten oder eigene Automatisierung für Ihr Unternehmen gebaut und übergeben haben wollen, mache ich das bei [Leinss Consulting](https://consulting.leinss.xyz/de/).
diff --git a/src/content/blog/de/self-hosted-stack/index.md b/src/content/blog/de/self-hosted-stack/index.md
index 38091ad36..3dcfa2597 100644
--- a/src/content/blog/de/self-hosted-stack/index.md
+++ b/src/content/blog/de/self-hosted-stack/index.md
@@ -51,4 +51,4 @@ Für die tragenden Tools habe ich das direkte Duell gegen die SaaS aufgeschriebe
## So einen Aufbau für Ihr Unternehmen?
-Automatisierung, die Ihnen gehört (auf Ihrer Infrastruktur gebaut, dokumentiert, an Ihr Team übergeben) mache ich für Unternehmen bei [Leinss Consulting](https://leinss-consulting.de/de/). Schnell mit bewährten Tools starten; die Teile besitzen, die zählen. Kein Lock-in, keine gemieteten Blackboxes.
+Automatisierung, die Ihnen gehört (auf Ihrer Infrastruktur gebaut, dokumentiert, an Ihr Team übergeben) mache ich für Unternehmen bei [Leinss Consulting](https://consulting.leinss.xyz/de/). Schnell mit bewährten Tools starten; die Teile besitzen, die zählen. Kein Lock-in, keine gemieteten Blackboxes.
diff --git a/src/content/blog/de/self-hosted-supabase-vs-firebase/index.md b/src/content/blog/de/self-hosted-supabase-vs-firebase/index.md
index 267feecd4..109ea0aab 100644
--- a/src/content/blog/de/self-hosted-supabase-vs-firebase/index.md
+++ b/src/content/blog/de/self-hosted-supabase-vs-firebase/index.md
@@ -46,4 +46,4 @@ Beide geben einer App dieselben Kern-Dienste ab Werk: eine Datenbank, Authentifi
Ein Mittelweg, den ich tatsächlich empfehle: auf Supabases gehostetem Tarif starten (derselbe offene Stack, kein Ops) und auf selbst gehostet umziehen, wenn sich der Besitz lohnt. So oder so sind Sie auf Postgres, der Umzug ist also eine Datenbank-Migration, kein Neuschrieb. Diese Reihenfolge („die tragenden Teile besitzen, sobald sie wichtig werden") ist die ganze Idee hinter [dem selbst gehosteten Stack, den ich statt SaaS betreibe](/blog/de/self-hosted-stack/).
-Wenn Sie ein eigenes Backend gebaut, betrieben und an Ihr Team übergeben haben wollen, ist das genau die Art Arbeit, die ich bei [Leinss Consulting](https://leinss-consulting.de/de/) mache.
+Wenn Sie ein eigenes Backend gebaut, betrieben und an Ihr Team übergeben haben wollen, ist das genau die Art Arbeit, die ich bei [Leinss Consulting](https://consulting.leinss.xyz/de/) mache.
diff --git a/src/content/blog/de/spreadsheet-cleaning-technical/index.md b/src/content/blog/de/spreadsheet-cleaning-technical/index.md
index db27214c2..d46121aa5 100644
--- a/src/content/blog/de/spreadsheet-cleaning-technical/index.md
+++ b/src/content/blog/de/spreadsheet-cleaning-technical/index.md
@@ -6,9 +6,9 @@ tags: ["n8n", "ai", "data-cleaning", "automation", "teardown", "own-your-stack"]
lang: "de"
---
-> **Kurz gesagt:** Der Tabellen-Bereiniger nimmt rohes CSV plus Anweisungen in Alltagssprache („dedupliziere, korrigiere Groß-/Kleinschreibung, trenne Namen"), baut einen System-Prompt, der ein LLM anweist, die Daten zu normalisieren und immer valides JSON zurückzugeben, und formatiert das Ergebnis wieder heraus. n8n übernimmt Eingang und Antwort; Code-Nodes validieren das CSV, bauen den Prompt und parsen die Antwort. Es funktioniert, weil Regeln für unordentliche Daten leichter in einem Satz zu beschreiben als zu programmieren sind. Das ist der Teardown der [Tabellen-Rettungs-Demo](https://leinss-consulting.de/de/blog/von-tabellen-zu-systemen/).
+> **Kurz gesagt:** Der Tabellen-Bereiniger nimmt rohes CSV plus Anweisungen in Alltagssprache („dedupliziere, korrigiere Groß-/Kleinschreibung, trenne Namen"), baut einen System-Prompt, der ein LLM anweist, die Daten zu normalisieren und immer valides JSON zurückzugeben, und formatiert das Ergebnis wieder heraus. n8n übernimmt Eingang und Antwort; Code-Nodes validieren das CSV, bauen den Prompt und parsen die Antwort. Es funktioniert, weil Regeln für unordentliche Daten leichter in einem Satz zu beschreiben als zu programmieren sind. Das ist der Teardown der [Tabellen-Rettungs-Demo](https://consulting.leinss.xyz/de/blog/von-tabellen-zu-systemen/).
-Eine Kontaktliste zu bereinigen (deduplizieren, „SMITH, john" zu „John Smith" richten, eine Vollnamen-Spalte aufteilen) ist die Art Aufgabe, die einen Haufen spröder Regeln zum Programmieren und einen Satz zum Beschreiben braucht. Also lasse ich ein LLM das Beschreiben-zum-Tun übernehmen. Der [Tabellen-Workflow auf meiner Beratungsseite](https://leinss-consulting.de/de/blog/von-tabellen-zu-systemen/) ist das Ergebnis, und das [JSON ist herunterladbar](https://leinss-consulting.de/workflows/excel-retter.json).
+Eine Kontaktliste zu bereinigen (deduplizieren, „SMITH, john" zu „John Smith" richten, eine Vollnamen-Spalte aufteilen) ist die Art Aufgabe, die einen Haufen spröder Regeln zum Programmieren und einen Satz zum Beschreiben braucht. Also lasse ich ein LLM das Beschreiben-zum-Tun übernehmen. Der [Tabellen-Workflow auf meiner Beratungsseite](https://consulting.leinss.xyz/de/blog/von-tabellen-zu-systemen/) ist das Ergebnis, und das [JSON ist herunterladbar](https://consulting.leinss.xyz/workflows/excel-retter.json).
## Die Pipeline
@@ -38,4 +38,4 @@ Der Prompt-bauende Node ist genau „wo Code anfängt": die Verlässlichkeit des
## Warum ich die Daten auf meinem eigenen Server halte
-Der ganze Sinn, eine Tabelle zu bereinigen, ist, dass es *Ihre* Daten sind: Kunden, Kontakte, Aufträge. Den Workflow auf Infrastruktur zu betreiben, die ich kontrolliere, heißt, die Datei bleibt bei mir, abgesehen vom einen Modellaufruf, statt in die Bereinigungs-SaaS eines anderen hochgeladen zu werden. Das ist das Argument in [dem selbst gehosteten Stack, den ich statt SaaS betreibe](/blog/de/self-hosted-stack/). Eine Datenbereinigungs-Pipeline, für Ihre Formate gebaut und übergeben? Das mache ich bei [Leinss Consulting](https://leinss-consulting.de/de/).
+Der ganze Sinn, eine Tabelle zu bereinigen, ist, dass es *Ihre* Daten sind: Kunden, Kontakte, Aufträge. Den Workflow auf Infrastruktur zu betreiben, die ich kontrolliere, heißt, die Datei bleibt bei mir, abgesehen vom einen Modellaufruf, statt in die Bereinigungs-SaaS eines anderen hochgeladen zu werden. Das ist das Argument in [dem selbst gehosteten Stack, den ich statt SaaS betreibe](/blog/de/self-hosted-stack/). Eine Datenbereinigungs-Pipeline, für Ihre Formate gebaut und übergeben? Das mache ich bei [Leinss Consulting](https://consulting.leinss.xyz/de/).
diff --git a/src/content/blog/de/umami-vs-google-analytics/index.md b/src/content/blog/de/umami-vs-google-analytics/index.md
index 9ebb1f452..0f8a92835 100644
--- a/src/content/blog/de/umami-vs-google-analytics/index.md
+++ b/src/content/blog/de/umami-vs-google-analytics/index.md
@@ -44,4 +44,4 @@ Beide beantworten die Alltagsfragen: Wie viele Leute kamen, woher, auf welche Se
Der Haken, den man benennen sollte: Umami *gut* selbst zu hosten heißt Docker, eine Datenbank, ein Reverse Proxy, Backups und Updates. Richtig gemacht ist es privat und läuft einfach. Diese Lücke ist Engineering, und das ist das Thema von [dem selbst gehosteten Stack, den ich statt SaaS betreibe](/blog/de/self-hosted-stack/).
-Wenn Sie eigene, private Analyse lieber eingerichtet und an Ihr Team übergeben bekommen, statt sie selbst zu betreiben, ist das genau die Art Arbeit, die ich bei [Leinss Consulting](https://leinss-consulting.de/de/) mache.
+Wenn Sie eigene, private Analyse lieber eingerichtet und an Ihr Team übergeben bekommen, statt sie selbst zu betreiben, ist das genau die Art Arbeit, die ich bei [Leinss Consulting](https://consulting.leinss.xyz/de/) mache.
diff --git a/src/content/blog/de/where-n8n-stops-and-code-starts/index.md b/src/content/blog/de/where-n8n-stops-and-code-starts/index.md
index 3b4019a7b..2adbffb1a 100644
--- a/src/content/blog/de/where-n8n-stops-and-code-starts/index.md
+++ b/src/content/blog/de/where-n8n-stops-and-code-starts/index.md
@@ -47,4 +47,4 @@ Die Grenze ist also nicht „n8n gegen Code". Sie ist diese:
Klar gesagt, wo meine eigenen Demos stehen: keine davon braucht heute eine Queue oder einen Checkpoint. Sie nehmen eine Anfrage nach der anderen, und ihre Code-Nodes sind bewusst klein. Die Naht wird wichtig, wenn dieselbe Form in Menge laufen muss, und zu wissen, wo sie liegt, bevor das passiert, ist der Unterschied zwischen einer Automatisierung, die gut vorführt, und einer, die Sie einem Unternehmen übergeben und der Sie trauen können.
-Deshalb betreibe ich das alles auch auf meinem eigenen Stack: diese Linie zu überschreiten heißt, echten Code zu schreiben und zu besitzen, keinen Feature-Wunsch einzureichen. Das ist das ganze Argument in [dem selbst gehosteten Stack, den ich statt SaaS betreibe](/blog/de/self-hosted-stack/). Wenn Sie einen Workflow haben, der auf eine dieser drei Arten wehzutun begonnen hat, ist das genau die Art Sache, die ich bei [Leinss Consulting](https://leinss-consulting.de/de/) behebe.
+Deshalb betreibe ich das alles auch auf meinem eigenen Stack: diese Linie zu überschreiten heißt, echten Code zu schreiben und zu besitzen, keinen Feature-Wunsch einzureichen. Das ist das ganze Argument in [dem selbst gehosteten Stack, den ich statt SaaS betreibe](/blog/de/self-hosted-stack/). Wenn Sie einen Workflow haben, der auf eine dieser drei Arten wehzutun begonnen hat, ist das genau die Art Sache, die ich bei [Leinss Consulting](https://consulting.leinss.xyz/de/) behebe.
diff --git a/src/content/blog/en/faq-assistant-technical/index.md b/src/content/blog/en/faq-assistant-technical/index.md
index 48f31dfca..47eaf8416 100644
--- a/src/content/blog/en/faq-assistant-technical/index.md
+++ b/src/content/blog/en/faq-assistant-technical/index.md
@@ -6,9 +6,9 @@ tags: ["n8n", "rag", "kimi", "ai", "teardown", "own-your-stack"]
lang: "en"
---
-> **Short answer:** The FAQ assistant is retrieval-augmented generation in ten n8n nodes: search a Postgres knowledge base for the passages closest to the question, hand those to Kimi K2 as context, and return a grounded answer. The retrieval step is what stops the model inventing things. It can only answer from what the search returns. This is the teardown of the [live FAQ demo](https://leinss-consulting.de/en/blog/faq-automation-ai-support/).
+> **Short answer:** The FAQ assistant is retrieval-augmented generation in ten n8n nodes: search a Postgres knowledge base for the passages closest to the question, hand those to Kimi K2 as context, and return a grounded answer. The retrieval step is what stops the model inventing things. It can only answer from what the search returns. This is the teardown of the [live FAQ demo](https://consulting.leinss.xyz/en/blog/faq-automation-ai-support/).
-A chatbot that makes up answers is worse than no chatbot. The [FAQ assistant on my consulting site](https://leinss-consulting.de/en/blog/faq-automation-ai-support/) only answers from a knowledge base I control, and refuses when the answer isn't in there. That behaviour is retrieval-augmented generation (RAG), and here's how it's wired. You can [download the workflow JSON](https://leinss-consulting.de/workflows/faq-assistent.json) and inspect every node.
+A chatbot that makes up answers is worse than no chatbot. The [FAQ assistant on my consulting site](https://consulting.leinss.xyz/en/blog/faq-automation-ai-support/) only answers from a knowledge base I control, and refuses when the answer isn't in there. That behaviour is retrieval-augmented generation (RAG), and here's how it's wired. You can [download the workflow JSON](https://consulting.leinss.xyz/workflows/faq-assistent.json) and inspect every node.
## The RAG pipeline
@@ -48,4 +48,4 @@ That middle node is where retrieval becomes an *answer*. You can't express "asse
## Why self-hosted matters here
-The knowledge base is company data, and the questions users ask are often sensitive. Running the store and the workflow on infrastructure I control means neither leaves my box except for the model call itself. That's the point of [the self-hosted stack I run instead of paying for SaaS](/blog/en/self-hosted-stack/). If you want a grounded assistant over your own docs, built and handed over, that's what I do at [Leinss Consulting](https://leinss-consulting.de/en/).
+The knowledge base is company data, and the questions users ask are often sensitive. Running the store and the workflow on infrastructure I control means neither leaves my box except for the model call itself. That's the point of [the self-hosted stack I run instead of paying for SaaS](/blog/en/self-hosted-stack/). If you want a grounded assistant over your own docs, built and handed over, that's what I do at [Leinss Consulting](https://consulting.leinss.xyz/en/).
diff --git a/src/content/blog/en/invoice-extractor-technical/index.md b/src/content/blog/en/invoice-extractor-technical/index.md
index 5e71b0a6c..6308915d5 100644
--- a/src/content/blog/en/invoice-extractor-technical/index.md
+++ b/src/content/blog/en/invoice-extractor-technical/index.md
@@ -6,9 +6,9 @@ tags: ["n8n", "claude", "ai", "automation", "teardown", "own-your-stack"]
lang: "en"
---
-> **Short answer:** The invoice reader is three n8n nodes: a form that takes the upload, one HTTP call to a vision model with the invoice image, and a code node that parses the model's reply into clean JSON. Vision does the reading; the code node does the part a no-code tool can't, stripping the model's markdown fences and safely parsing the result. This is the teardown of the workflow behind the [invoice demo](https://leinss-consulting.de/en/blog/automating-invoice-processing/).
+> **Short answer:** The invoice reader is three n8n nodes: a form that takes the upload, one HTTP call to a vision model with the invoice image, and a code node that parses the model's reply into clean JSON. Vision does the reading; the code node does the part a no-code tool can't, stripping the model's markdown fences and safely parsing the result. This is the teardown of the workflow behind the [invoice demo](https://consulting.leinss.xyz/en/blog/automating-invoice-processing/).
-The [invoice-processing demo on my consulting site](https://leinss-consulting.de/en/blog/automating-invoice-processing/) reads a real invoice and returns structured fields. People assume there's a mountain of OCR rules behind it. There isn't. Here's the whole thing, and you can [download the workflow JSON](https://leinss-consulting.de/workflows/n8n-invoice-cloud.json) and run it yourself.
+The [invoice-processing demo on my consulting site](https://consulting.leinss.xyz/en/blog/automating-invoice-processing/) reads a real invoice and returns structured fields. People assume there's a mountain of OCR rules behind it. There isn't. Here's the whole thing, and you can [download the workflow JSON](https://consulting.leinss.xyz/workflows/n8n-invoice-cloud.json) and run it yourself.
## The whole pipeline is three nodes
@@ -24,7 +24,7 @@ That's it. No OCR engine, no template per vendor, no regex zoo. A vision model r
The one real step is an HTTP request to a vision model with the invoice passed inline as a base64 image. The prompt asks for the fields I care about (number, date, line items, totals, tax) as JSON. Because the model reads pixels, it doesn't care whether the layout is a clean PDF export or a phone photo of a crumpled paper invoice.
-Which model is a cost decision, not an architectural one, and the two copies of this workflow differ on it. The JSON you can download calls Claude Sonnet 4's messages API. The widget on my consulting site calls Kimi's vision endpoint on my own n8n instance, because it is public and every submission spends money. There is also a [local variant](https://leinss-consulting.de/workflows/n8n-invoice-local.json) that points the same step at Ollama, so nothing leaves the machine. Same three-step shape in all three; swap the URL and the auth header.
+Which model is a cost decision, not an architectural one, and the two copies of this workflow differ on it. The JSON you can download calls Claude Sonnet 4's messages API. The widget on my consulting site calls Kimi's vision endpoint on my own n8n instance, because it is public and every submission spends money. There is also a [local variant](https://consulting.leinss.xyz/workflows/n8n-invoice-local.json) that points the same step at Ollama, so nothing leaves the machine. Same three-step shape in all three; swap the URL and the auth header.
The hosted copy also has three nodes the starter does not: a validation step, an IF, and an error response, so a request with no file gets a clear rejection instead of an empty model call. That is worth adding to anything public, and it is the same "code owns the failure case" point the parse node makes.
@@ -42,4 +42,4 @@ None of that is hard, but all of it is the difference between a demo and somethi
Three nodes means almost nothing to maintain. When a new invoice layout shows up, there's no template to add, the vision model already handles it. The only code is the parse step, and it's stable because the model's output shape is stable. Simple, in this case, is also hard to break.
-This runs on my own n8n, part of [the self-hosted stack I run instead of paying for SaaS](/blog/en/self-hosted-stack/). If you want a reader like this built for your document types and handed to your team, that's what I do at [Leinss Consulting](https://leinss-consulting.de/en/).
+This runs on my own n8n, part of [the self-hosted stack I run instead of paying for SaaS](/blog/en/self-hosted-stack/). If you want a reader like this built for your document types and handed to your team, that's what I do at [Leinss Consulting](https://consulting.leinss.xyz/en/).
diff --git a/src/content/blog/en/lead-response-technical/index.md b/src/content/blog/en/lead-response-technical/index.md
index 328b116db..0adfa9aaa 100644
--- a/src/content/blog/en/lead-response-technical/index.md
+++ b/src/content/blog/en/lead-response-technical/index.md
@@ -6,9 +6,9 @@ tags: ["n8n", "kimi", "ai", "automation", "teardown", "own-your-stack"]
lang: "en"
---
-> **Short answer:** The lead-response bot runs two LLM passes over a contact-form submission: first Kimi K2 classifies the lead (intent, fit, language) into JSON, then a second Kimi call uses that classification to draft a personalized reply in the sender's language. n8n handles the form, the branching, and the send; code nodes validate the input and parse the classification between the two passes. Splitting classify-then-write is what makes the reply feel targeted. This is the teardown of the [live lead-response demo](https://leinss-consulting.de/en/blog/automating-communication/).
+> **Short answer:** The lead-response bot runs two LLM passes over a contact-form submission: first Kimi K2 classifies the lead (intent, fit, language) into JSON, then a second Kimi call uses that classification to draft a personalized reply in the sender's language. n8n handles the form, the branching, and the send; code nodes validate the input and parse the classification between the two passes. Splitting classify-then-write is what makes the reply feel targeted. This is the teardown of the [live lead-response demo](https://consulting.leinss.xyz/en/blog/automating-communication/).
-A generic auto-reply is worse than a slow human one. The [lead-response demo on my consulting site](https://leinss-consulting.de/en/blog/automating-communication/) reads an inbound message and drafts a reply that actually responds to it. The trick is doing it in two passes, not one. The [workflow JSON is downloadable](https://leinss-consulting.de/workflows/blitz-antwort.json).
+A generic auto-reply is worse than a slow human one. The [lead-response demo on my consulting site](https://consulting.leinss.xyz/en/blog/automating-communication/) reads an inbound message and drafts a reply that actually responds to it. The trick is doing it in two passes, not one. The [workflow JSON is downloadable](https://consulting.leinss.xyz/workflows/blitz-antwort.json).
## Two passes, not one
@@ -42,4 +42,4 @@ That parse-between-passes node is pure "where code starts": you can't reliably c
## Why it runs on my own stack
-Inbound leads are business data, and the reply goes out under my name. Running the pipeline on infrastructure I control means the message and the classification stay with me, apart from the model calls I choose to make. That's the logic of [the self-hosted stack I run instead of paying for SaaS](/blog/en/self-hosted-stack/). Want fast, personalized lead handling built for your pipeline and handed over? That's what I do at [Leinss Consulting](https://leinss-consulting.de/en/).
+Inbound leads are business data, and the reply goes out under my name. Running the pipeline on infrastructure I control means the message and the classification stay with me, apart from the model calls I choose to make. That's the logic of [the self-hosted stack I run instead of paying for SaaS](/blog/en/self-hosted-stack/). Want fast, personalized lead handling built for your pipeline and handed over? That's what I do at [Leinss Consulting](https://consulting.leinss.xyz/en/).
diff --git a/src/content/blog/en/listmonk-vs-mailchimp/index.md b/src/content/blog/en/listmonk-vs-mailchimp/index.md
index 3788c395d..e82055769 100644
--- a/src/content/blog/en/listmonk-vs-mailchimp/index.md
+++ b/src/content/blog/en/listmonk-vs-mailchimp/index.md
@@ -44,4 +44,4 @@ Both send campaigns and transactional email, manage subscribers and segments, tr
The honest catch: owning delivery is the part that takes engineering. Listmonk itself is a single binary; making it send reliably is DNS, a sending provider, and monitoring. That gap is the theme of [the self-hosted stack I run instead of paying for SaaS](/blog/en/self-hosted-stack/).
-If you want an owned newsletter set up properly, deliverability and all, and handed to your team, that's the kind of thing I do at [Leinss Consulting](https://leinss-consulting.de/en/).
+If you want an owned newsletter set up properly, deliverability and all, and handed to your team, that's the kind of thing I do at [Leinss Consulting](https://consulting.leinss.xyz/en/).
diff --git a/src/content/blog/en/meeting-assistant-technical/index.md b/src/content/blog/en/meeting-assistant-technical/index.md
index 9c92a50e2..a9e6c6378 100644
--- a/src/content/blog/en/meeting-assistant-technical/index.md
+++ b/src/content/blog/en/meeting-assistant-technical/index.md
@@ -6,9 +6,9 @@ tags: ["n8n", "claude", "whisper", "ai", "teardown", "own-your-stack"]
lang: "en"
---
-> **Short answer:** The meeting bot takes an audio file, transcribes it with Whisper, then has a model extract structured minutes (decisions, action items, owners) against a fixed schema rather than as free text. A code node formats that into markdown and n8n emails it. Forcing the schema is what makes the summary reliable instead of a wall of prose. This is the teardown of the [meeting-minutes workflow](https://leinss-consulting.de/en/blog/meeting-minutes-automation/).
+> **Short answer:** The meeting bot takes an audio file, transcribes it with Whisper, then has a model extract structured minutes (decisions, action items, owners) against a fixed schema rather than as free text. A code node formats that into markdown and n8n emails it. Forcing the schema is what makes the summary reliable instead of a wall of prose. This is the teardown of the [meeting-minutes workflow](https://consulting.leinss.xyz/en/blog/meeting-minutes-automation/).
-"Summarise this meeting" gives you a paragraph nobody reads. What people actually want is a list of decisions and who owns which action. The [meeting-minutes workflow on my consulting site](https://leinss-consulting.de/en/blog/meeting-minutes-automation/) produces exactly that, and here's how. The [workflow JSON is downloadable](https://leinss-consulting.de/workflows/meeting-protokoll.json).
+"Summarise this meeting" gives you a paragraph nobody reads. What people actually want is a list of decisions and who owns which action. The [meeting-minutes workflow on my consulting site](https://consulting.leinss.xyz/en/blog/meeting-minutes-automation/) produces exactly that, and here's how. The [workflow JSON is downloadable](https://consulting.leinss.xyz/workflows/meeting-protokoll.json).
**One thing to say up front, because you can check it:** the widget on the demo page is not currently transcribing. It needs a Whisper service, that service is not deployed on the box the demos run on, and rather than error the widget returns a sample summary. Standing one up is infrastructure I have not spent on a demo. So read this as a teardown of the workflow, which is real and downloadable, not as proof that the button works end to end.
@@ -45,4 +45,4 @@ That last node is the "where code starts" moment: turning a structured API resul
## Why I run it myself
-Meeting audio is about as sensitive as company data gets. Running transcription and summarisation through a workflow on infrastructure I control keeps the recording off third-party SaaS except for the model calls I choose. That's the case behind [the self-hosted stack I run instead of paying for SaaS](/blog/en/self-hosted-stack/). Want this for your team's meetings, built and handed over? That's what I do at [Leinss Consulting](https://leinss-consulting.de/en/).
+Meeting audio is about as sensitive as company data gets. Running transcription and summarisation through a workflow on infrastructure I control keeps the recording off third-party SaaS except for the model calls I choose. That's the case behind [the self-hosted stack I run instead of paying for SaaS](/blog/en/self-hosted-stack/). Want this for your team's meetings, built and handed over? That's what I do at [Leinss Consulting](https://consulting.leinss.xyz/en/).
diff --git a/src/content/blog/en/mittelstand-ai/index.md b/src/content/blog/en/mittelstand-ai/index.md
index 83e6e6bf8..25892c6b0 100644
--- a/src/content/blog/en/mittelstand-ai/index.md
+++ b/src/content/blog/en/mittelstand-ai/index.md
@@ -50,4 +50,4 @@ That would be dogma, and dogma is expensive. Rented cloud tools are the right on
## If you want help drawing that line
-Deciding what to own and what to rent, then building the owned half so it's documented and handed to your team rather than locked in one person's head, is the work I do at [Leinss Consulting](https://leinss-consulting.de/en/). If that's the stage you're at, the door is open.
+Deciding what to own and what to rent, then building the owned half so it's documented and handed to your team rather than locked in one person's head, is the work I do at [Leinss Consulting](https://consulting.leinss.xyz/en/). If that's the stage you're at, the door is open.
diff --git a/src/content/blog/en/n8n-automation-stack/index.md b/src/content/blog/en/n8n-automation-stack/index.md
index 79bc27523..4eebe67db 100644
--- a/src/content/blog/en/n8n-automation-stack/index.md
+++ b/src/content/blog/en/n8n-automation-stack/index.md
@@ -58,4 +58,4 @@ If the volume arrived to justify it: queue mode with Postgres and Redis, so exec
## Want this, but owned?
-Standing up a stack like this (self-hosted, documented, and handed over so it isn't locked in one person's head) is the work I do at [Leinss Consulting](https://leinss-consulting.de/en/). If you run a similar setup, I'm always happy to compare notes.
+Standing up a stack like this (self-hosted, documented, and handed over so it isn't locked in one person's head) is the work I do at [Leinss Consulting](https://consulting.leinss.xyz/en/). If you run a similar setup, I'm always happy to compare notes.
diff --git a/src/content/blog/en/n8n-customer-service/index.md b/src/content/blog/en/n8n-customer-service/index.md
index 8016e5110..4f3aef50c 100644
--- a/src/content/blog/en/n8n-customer-service/index.md
+++ b/src/content/blog/en/n8n-customer-service/index.md
@@ -66,7 +66,7 @@ These are the four numbers worth watching once it runs, and you can only get the
- **Time to first response**, before and after, split by category. The average hides the case that matters.
- **Rate of wrong confident answers.** The one to watch. A bot that says "I don't know" too often is annoying; a bot that is confidently wrong costs you a customer.
-> **Reference build:** For the full architecture with every node explained and the n8n workflow to download, see the **[AI Support Triage reference build](https://leinss-consulting.de/en/blog/case-study-support-triage/)**. It is a build you can inspect, not a client report, and it carries no client figures.
+> **Reference build:** For the full architecture with every node explained and the n8n workflow to download, see the **[AI Support Triage reference build](https://consulting.leinss.xyz/en/blog/case-study-support-triage/)**. It is a build you can inspect, not a client report, and it carries no client figures.
## Getting started
@@ -79,4 +79,4 @@ Start small:
---
-Want the real thing rather than a description? The [support-triage reference build](https://leinss-consulting.de/en/blog/case-study-support-triage/) ships the n8n workflow as a downloadable JSON, import it and read every node. If you'd rather have it built and handed over, that's what I do at [Leinss Consulting](https://leinss-consulting.de/en/).
+Want the real thing rather than a description? The [support-triage reference build](https://consulting.leinss.xyz/en/blog/case-study-support-triage/) ships the n8n workflow as a downloadable JSON, import it and read every node. If you'd rather have it built and handed over, that's what I do at [Leinss Consulting](https://consulting.leinss.xyz/en/).
diff --git a/src/content/blog/en/own-your-ai-agent/index.md b/src/content/blog/en/own-your-ai-agent/index.md
index 4c70b03fc..7994bfb37 100644
--- a/src/content/blog/en/own-your-ai-agent/index.md
+++ b/src/content/blog/en/own-your-ai-agent/index.md
@@ -38,4 +38,4 @@ But an agent that does real work (reads your files, touches your systems, acts o
- [Pi vs OpenClaw](/blog/en/pi-vs-openclaw/): the minimal agent core and the assistant gateway around it, and when to reach for each.
- [How I run a self-hosted research agent in my daily work](/blog/en/self-hosted-research-agent/), the practical setup.
-Owned automation and owned agents are the same idea one layer apart. If you want either built for your business and handed over, that's what I do at [Leinss Consulting](https://leinss-consulting.de/en/).
+Owned automation and owned agents are the same idea one layer apart. If you want either built for your business and handed over, that's what I do at [Leinss Consulting](https://consulting.leinss.xyz/en/).
diff --git a/src/content/blog/en/postiz-vs-buffer/index.md b/src/content/blog/en/postiz-vs-buffer/index.md
index 47c1e6637..3ec9f6507 100644
--- a/src/content/blog/en/postiz-vs-buffer/index.md
+++ b/src/content/blog/en/postiz-vs-buffer/index.md
@@ -43,4 +43,4 @@ All three do the core job: connect your social accounts, write posts, schedule t
The recurring catch across everything I self-host: the tool is the easy part; running it *well* is Docker, backups, and maintenance. That gap is the theme of [the self-hosted stack I run instead of paying for SaaS](/blog/en/self-hosted-stack/).
-If you want owned automation like this, social scheduling and the rest, built and handed to your team, that's the kind of thing I do at [Leinss Consulting](https://leinss-consulting.de/en/).
+If you want owned automation like this, social scheduling and the rest, built and handed to your team, that's the kind of thing I do at [Leinss Consulting](https://consulting.leinss.xyz/en/).
diff --git a/src/content/blog/en/self-hosted-research-agent/index.md b/src/content/blog/en/self-hosted-research-agent/index.md
index 15fd49b23..bb8d9e7ab 100644
--- a/src/content/blog/en/self-hosted-research-agent/index.md
+++ b/src/content/blog/en/self-hosted-research-agent/index.md
@@ -41,4 +41,4 @@ Two reasons, both practical:
This is a habit, not a magic button. It's worth setting up if you do enough research or drafting that an always-there, owned agent pays back the effort of running it. If you ask a chatbot something twice a month, don't bother, a rented tab is fine.
-If you want the fuller picture, [Pi vs OpenClaw](/blog/en/pi-vs-openclaw/) covers the terminal agent versus the chat-channel assistant. And if you'd like an owned agent or automation built for your business and handed over, that's what I do at [Leinss Consulting](https://leinss-consulting.de/en/).
+If you want the fuller picture, [Pi vs OpenClaw](/blog/en/pi-vs-openclaw/) covers the terminal agent versus the chat-channel assistant. And if you'd like an owned agent or automation built for your business and handed over, that's what I do at [Leinss Consulting](https://consulting.leinss.xyz/en/).
diff --git a/src/content/blog/en/self-hosted-stack/index.md b/src/content/blog/en/self-hosted-stack/index.md
index 898c0ada8..8fdca4224 100644
--- a/src/content/blog/en/self-hosted-stack/index.md
+++ b/src/content/blog/en/self-hosted-stack/index.md
@@ -51,4 +51,4 @@ For the load-bearing tools I've written up the head-to-head against the SaaS the
## Want a setup like this for your business?
-Owned automation (built on your infrastructure, documented, handed to your team) is what I do for companies at [Leinss Consulting](https://leinss-consulting.de/en/). Start fast on proven tools; own the parts that matter. No lock-in, no rented black boxes.
+Owned automation (built on your infrastructure, documented, handed to your team) is what I do for companies at [Leinss Consulting](https://consulting.leinss.xyz/en/). Start fast on proven tools; own the parts that matter. No lock-in, no rented black boxes.
diff --git a/src/content/blog/en/self-hosted-supabase-vs-firebase/index.md b/src/content/blog/en/self-hosted-supabase-vs-firebase/index.md
index 827839f42..b068d6a2e 100644
--- a/src/content/blog/en/self-hosted-supabase-vs-firebase/index.md
+++ b/src/content/blog/en/self-hosted-supabase-vs-firebase/index.md
@@ -46,4 +46,4 @@ Both give an app the same core services out of the box: a database, authenticati
A middle path I'd actually recommend: start on Supabase's hosted tier (same open stack, no ops) and move to self-hosted when owning it pays off. Either way you're on Postgres, so the move is a database migration, not a rewrite. That "own the load-bearing pieces as they matter" sequence is the whole idea behind [the self-hosted stack I run instead of paying for SaaS](/blog/en/self-hosted-stack/).
-If you want an owned backend built, run, and handed to your team, that's the kind of thing I do at [Leinss Consulting](https://leinss-consulting.de/en/).
+If you want an owned backend built, run, and handed to your team, that's the kind of thing I do at [Leinss Consulting](https://consulting.leinss.xyz/en/).
diff --git a/src/content/blog/en/spreadsheet-cleaning-technical/index.md b/src/content/blog/en/spreadsheet-cleaning-technical/index.md
index dba1538bf..f4b544364 100644
--- a/src/content/blog/en/spreadsheet-cleaning-technical/index.md
+++ b/src/content/blog/en/spreadsheet-cleaning-technical/index.md
@@ -6,9 +6,9 @@ tags: ["n8n", "ai", "data-cleaning", "automation", "teardown", "own-your-stack"]
lang: "en"
---
-> **Short answer:** The spreadsheet cleaner takes raw CSV plus plain-language instructions ("dedupe, fix capitalisation, split names"), builds a system prompt that tells an LLM to normalise the data and always return valid JSON, and formats the result back out. n8n handles intake and response; code nodes validate the CSV, assemble the prompt, and parse the reply. It works because messy-data rules are easier to describe in a sentence than to code. This is the teardown of the [spreadsheet-rescue demo](https://leinss-consulting.de/en/blog/from-spreadsheets-to-systems/).
+> **Short answer:** The spreadsheet cleaner takes raw CSV plus plain-language instructions ("dedupe, fix capitalisation, split names"), builds a system prompt that tells an LLM to normalise the data and always return valid JSON, and formats the result back out. n8n handles intake and response; code nodes validate the CSV, assemble the prompt, and parse the reply. It works because messy-data rules are easier to describe in a sentence than to code. This is the teardown of the [spreadsheet-rescue demo](https://consulting.leinss.xyz/en/blog/from-spreadsheets-to-systems/).
-Cleaning a contact list (deduping, fixing "SMITH, john" into "John Smith", splitting a full-name column) is the kind of task that takes a pile of brittle rules to code and one sentence to describe. So I let an LLM do the describing-to-doing. The [spreadsheet workflow on my consulting site](https://leinss-consulting.de/en/blog/from-spreadsheets-to-systems/) is the result, and the [JSON is downloadable](https://leinss-consulting.de/workflows/excel-retter.json).
+Cleaning a contact list (deduping, fixing "SMITH, john" into "John Smith", splitting a full-name column) is the kind of task that takes a pile of brittle rules to code and one sentence to describe. So I let an LLM do the describing-to-doing. The [spreadsheet workflow on my consulting site](https://consulting.leinss.xyz/en/blog/from-spreadsheets-to-systems/) is the result, and the [JSON is downloadable](https://consulting.leinss.xyz/workflows/excel-retter.json).
## The pipeline
@@ -38,4 +38,4 @@ The prompt-building node is exactly "where code starts", the reliability of the
## Why I keep the data on my own box
-The whole point of cleaning a spreadsheet is that it's *your* data: customers, contacts, orders. Running the workflow on infrastructure I control means the file stays with me apart from the single model call, instead of being uploaded to someone else's cleaning SaaS. That's the argument in [the self-hosted stack I run instead of paying for SaaS](/blog/en/self-hosted-stack/). Want a data-cleaning pipeline built for your formats and handed over? That's what I do at [Leinss Consulting](https://leinss-consulting.de/en/).
+The whole point of cleaning a spreadsheet is that it's *your* data: customers, contacts, orders. Running the workflow on infrastructure I control means the file stays with me apart from the single model call, instead of being uploaded to someone else's cleaning SaaS. That's the argument in [the self-hosted stack I run instead of paying for SaaS](/blog/en/self-hosted-stack/). Want a data-cleaning pipeline built for your formats and handed over? That's what I do at [Leinss Consulting](https://consulting.leinss.xyz/en/).
diff --git a/src/content/blog/en/umami-vs-google-analytics/index.md b/src/content/blog/en/umami-vs-google-analytics/index.md
index 1a546e423..69477a259 100644
--- a/src/content/blog/en/umami-vs-google-analytics/index.md
+++ b/src/content/blog/en/umami-vs-google-analytics/index.md
@@ -44,4 +44,4 @@ Both answer the everyday questions: how many people came, from where, to which p
The catch worth naming: self-hosting Umami *well* is Docker, a database, a reverse proxy, backups, and updates. Done right it's private and it just runs. That gap is engineering, and it's the theme of [the self-hosted stack I run instead of paying for SaaS](/blog/en/self-hosted-stack/).
-If you'd rather have owned, private analytics set up and handed to your team rather than run it yourself, that's the kind of thing I do at [Leinss Consulting](https://leinss-consulting.de/en/).
+If you'd rather have owned, private analytics set up and handed to your team rather than run it yourself, that's the kind of thing I do at [Leinss Consulting](https://consulting.leinss.xyz/en/).
diff --git a/src/content/blog/en/where-n8n-stops-and-code-starts/index.md b/src/content/blog/en/where-n8n-stops-and-code-starts/index.md
index d287978e7..b1db8bcd3 100644
--- a/src/content/blog/en/where-n8n-stops-and-code-starts/index.md
+++ b/src/content/blog/en/where-n8n-stops-and-code-starts/index.md
@@ -47,4 +47,4 @@ So the line is not "n8n versus code". It is this:
Worth being clear about where my own demos sit: none of them needs a queue or a checkpoint today. They take one request at a time, and their code nodes are small on purpose. The seam matters when the same shape has to run at volume, and knowing where it is before that happens is the difference between an automation that demos well and one you can hand to a business and trust.
-That is also why I run all of it on my own stack: crossing that line means writing and owning real code, not filing a feature request. It is the whole argument in [the self-hosted stack I run instead of paying for SaaS](/blog/en/self-hosted-stack/). If you have a workflow that has started to hurt in one of these three ways, that is exactly the kind of thing I fix at [Leinss Consulting](https://leinss-consulting.de/en/).
+That is also why I run all of it on my own stack: crossing that line means writing and owning real code, not filing a feature request. It is the whole argument in [the self-hosted stack I run instead of paying for SaaS](/blog/en/self-hosted-stack/). If you have a workflow that has started to hurt in one of these three ways, that is exactly the kind of thing I fix at [Leinss Consulting](https://consulting.leinss.xyz/en/).
diff --git a/src/content/staticPages/now.md b/src/content/staticPages/now.md
index 84a8584b4..da0eef426 100644
--- a/src/content/staticPages/now.md
+++ b/src/content/staticPages/now.md
@@ -11,6 +11,6 @@ Most of my time right now goes into [TobiBoard](/projects/TobiBoard), an on-devi
The thread through all of it: see how far useful, AI-flavoured software can go while keeping user data on the user's own hardware. In practice that's two patterns: run models locally where it's feasible (on-device speech and text-to-speech, local LLMs via Ollama on the desktop), and bring-your-own-key for the rest, so anything cloud-bound uses *your* API key and endpoint, never mine.
-I also do some consulting through [Leinss Consulting](https://leinss-consulting.de), helping service companies put generative AI to work, but building my own apps is the main focus these days.
+I also do some consulting through [Leinss Consulting](https://consulting.leinss.xyz), helping service companies put generative AI to work, but building my own apps is the main focus these days.
Based in Germany. This is a [now page](https://nownownow.com/about); last updated June 2026.
diff --git a/src/content/work/leinss-consulting.md b/src/content/work/leinss-consulting.md
index 07d0b34e7..c22d54c6a 100644
--- a/src/content/work/leinss-consulting.md
+++ b/src/content/work/leinss-consulting.md
@@ -1,5 +1,5 @@
---
-company: "leinss-consulting.de"
+company: "Leinss Consulting"
role: "Founder & Independent Consultant"
dateStart: "02/01/2025"
dateEnd: "Present"
@@ -8,7 +8,7 @@ dateEnd: "Present"
Consultancy delivering web products and process automation, run end to end from
the productized offering through to delivery.
-[leinss-consulting.de](https://leinss-consulting.de)
+[consulting.leinss.xyz](https://consulting.leinss.xyz)
**product delivery**
diff --git a/src/pages/index.astro b/src/pages/index.astro
index 107472019..2e8389c2a 100644
--- a/src/pages/index.astro
+++ b/src/pages/index.astro
@@ -141,12 +141,12 @@ const education = await Promise.all(
plus the self-hosted infrastructure behind it, I take that on through{
" "
}Leinss Consulting: LLM assistants and chatbots, process automation, and the backends
and devops to run them privately. If that's a fit, let's talk.