From 8ff17c552b506d93c5fac52ce3c75873481b2a39 Mon Sep 17 00:00:00 2001 From: denshooter Date: Thu, 9 Apr 2026 17:22:56 +0200 Subject: [PATCH] chore: update workflows, messages, and footer --- app/components/Footer.tsx | 11 ++++++++--- messages/de.json | 3 ++- messages/en.json | 3 ++- n8n-workflows/book-review.json | 2 +- n8n-workflows/docker-callback-handler.json | 3 ++- n8n-workflows/docker-event.json | 6 ++++-- 6 files changed, 19 insertions(+), 9 deletions(-) diff --git a/app/components/Footer.tsx b/app/components/Footer.tsx index 1b422bd..81b1b3a 100644 --- a/app/components/Footer.tsx +++ b/app/components/Footer.tsx @@ -64,9 +64,14 @@ const Footer = () => { {/* Bottom Bar */}
-

- Built with Next.js, Directus & Passion. -

+
+

+ Built with Next.js, Directus & Passion. +

+

+ {t("aiDisclaimer")} +

+
Systems Online diff --git a/messages/de.json b/messages/de.json index b5f6766..7cbe25c 100644 --- a/messages/de.json +++ b/messages/de.json @@ -157,6 +157,7 @@ "privacyPolicy": "Datenschutz", "privacySettings": "Datenschutz-Einstellungen", "privacySettingsTitle": "Datenschutz-Banner wieder anzeigen", - "builtWith": "Built with" + "builtWith": "Built with", + "aiDisclaimer": "Einige Inhalte dieser Seite können KI-generiert sein." } } diff --git a/messages/en.json b/messages/en.json index 4eb42b7..a199634 100644 --- a/messages/en.json +++ b/messages/en.json @@ -160,7 +160,8 @@ "privacyPolicy": "Privacy policy", "privacySettings": "Privacy settings", "privacySettingsTitle": "Show privacy settings banner again", - "builtWith": "Built with" + "builtWith": "Built with", + "aiDisclaimer": "Some content on this site may be AI-assisted." } } diff --git a/n8n-workflows/book-review.json b/n8n-workflows/book-review.json index 8083c21..63fd7d5 100644 --- a/n8n-workflows/book-review.json +++ b/n8n-workflows/book-review.json @@ -110,7 +110,7 @@ }, { "parameters": { - "jsCode": "const book = $input.first().json;\nif (book.skip) return [{ json: { skip: true } }];\n\nconst parts = [];\nparts.push(\"Du hilfst jemandem eine Buchbewertung zu schreiben.\");\nparts.push(\"Das Buch ist \" + book.title + \" von \" + book.author + \".\");\nparts.push(\"Erstelle 4 kurze spezifische Fragen zum Buch.\");\nparts.push(\"Die Fragen sollen helfen eine Review zu schreiben.\");\nparts.push(\"Frage auf Deutsch.\");\nparts.push(\"Antworte NUR als JSON Array mit 4 Strings.\");\nconst prompt = parts.join(\" \");\n\nconst aiResponse = await this.helpers.httpRequest({\n method: \"POST\",\n url: \"https://openrouter.ai/api/v1/chat/completions\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: \"Bearer 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\",\n },\n body: {\n model: \"openrouter/free\",\n messages: [{ role: \"user\", content: prompt }],\n },\n});\n\nconst aiText = aiResponse.choices?.[0]?.message?.content ?? \"[]\";\nconst match = aiText.match(/\\[[\\s\\S]*\\]/);\n\nconst f1 = \"Wie hat dir das Buch gefallen?\";\nconst f2 = \"Was war der beste Teil?\";\nconst f3 = \"Was hast du mitgenommen?\";\nconst f4 = \"Wem empfiehlst du es?\";\nconst fallback = [f1, f2, f3, f4];\n\nconst questions = match ? JSON.parse(match[0]) : fallback;\n\nreturn [{ json: { ...book, questions } }];\n" + "jsCode": "const book = $input.first().json;\nif (book.skip) return [{ json: { skip: true } }];\n\nconst parts = [];\nparts.push(\"Du hilfst jemandem eine Buchbewertung zu schreiben.\");\nparts.push(\"Das Buch ist \" + book.title + \" von \" + book.author + \".\");\nparts.push(\"Erstelle 4 kurze spezifische Fragen zum Buch.\");\nparts.push(\"Die Fragen sollen helfen eine Review zu schreiben.\");\nparts.push(\"Frage auf Deutsch.\");\nparts.push(\"Antworte NUR als JSON Array mit 4 Strings. Verwende keine Bindestriche, Em-Dashes oder Gedankenstriche (–, —, -).\");\nconst prompt = parts.join(\" \");\n\nconst aiResponse = await this.helpers.httpRequest({\n method: \"POST\",\n url: \"https://openrouter.ai/api/v1/chat/completions\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: \"Bearer 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\",\n },\n body: {\n model: \"openrouter/free\",\n messages: [{ role: \"user\", content: prompt }],\n },\n});\n\nconst aiText = aiResponse.choices?.[0]?.message?.content ?? \"[]\";\nconst match = aiText.match(/\\[[\\s\\S]*\\]/);\n\nconst f1 = \"Wie hat dir das Buch gefallen?\";\nconst f2 = \"Was war der beste Teil?\";\nconst f3 = \"Was hast du mitgenommen?\";\nconst f4 = \"Wem empfiehlst du es?\";\nconst fallback = [f1, f2, f3, f4];\n\nconst questions = match ? JSON.parse(match[0]) : fallback;\n\nreturn [{ json: { ...book, questions } }];\n" }, "type": "n8n-nodes-base.code", "typeVersion": 2, diff --git a/n8n-workflows/docker-callback-handler.json b/n8n-workflows/docker-callback-handler.json index 081a6e5..2537646 100644 --- a/n8n-workflows/docker-callback-handler.json +++ b/n8n-workflows/docker-callback-handler.json @@ -183,7 +183,8 @@ "parameters": { "promptType": "define", "text": "=Du bist ein technischer Autor für das Portfolio von Dennis (dk0.dev).\n\nNeues eigenes Projekt deployed:\nRepo: {{ $('Parse Callback').item.json.slug }}\n\nREADME:\n{{ $('Get README').first().json.content ? Buffer.from($('Get README').first().json.content, 'base64').toString('utf8').substring(0, 1000) : 'Kein README' }}\n\nLetzte Commits:\n{{ $('Get Commits').first().json.map(c => '- ' + c.commit.message).join('\\n') }}\n\nErstelle eine Portfolio-Beschreibung:\n- Was macht das Projekt (Features, Zweck)\n- Tech-Stack und Architektur\n- Highlights aus den Commits\n- Warum ist es cool/interessant\n\nKategorie: webdev (wenn Web-App), automation (wenn Tool/Script), oder selfhosted\n\nAntworte NUR als JSON:\n{\n \"title_en\": \"Aussagekräftiger Titel\",\n \"title_de\": \"Aussagekräftiger Titel\",\n \"description_en\": \"4-6 Sätze\",\n \"description_de\": \"4-6 Sätze\",\n \"content_en\": \"2-3 Absätze Markdown mit technischen Details\",\n \"content_de\": \"2-3 Absätze Markdown mit technischen Details\",\n \"category\": \"webdev|automation|selfhosted\",\n \"technologies\": [\"Next.js\", \"Docker\", \"...\"]\n}", - "batching": {} + "batching": {}, + "prompt": "\n Verwende keine Bindestriche, Em-Dashes oder Gedankenstriche (–, —, -)." }, "type": "@n8n/n8n-nodes-langchain.chainLlm", "typeVersion": 1.9, diff --git a/n8n-workflows/docker-event.json b/n8n-workflows/docker-event.json index 16b5713..263bef2 100644 --- a/n8n-workflows/docker-event.json +++ b/n8n-workflows/docker-event.json @@ -116,7 +116,8 @@ "parameters": { "promptType": "define", "text": "= Du bist ein technischer Autor für das Self-Hosting Portfolio von Dennis auf dk0.dev.\n Ein neuer Service wurde auf dem Server deployed:\n \n Container: {{ $('Kontext aufbereiten').item.json.container }}\n Image: {{ $('Kontext aufbereiten').item.json.image }}\n Service: {{ $('Kontext aufbereiten').item.json.serviceName }}\n \n Aufgabe:\n 1. Erkenne ob es sich um ein EIGENES Projekt (z.B. Image enthält \"denshooter\", \"dk0\", \"portfolio\") oder eine \nSELF-HOSTED App handelt.\n 2. Bewerte die \"Coolness\" (1-10) basierend auf:\n - Eigener Code = +3 Punkte\n - Neue/spannende Technologie = +2 Punkte\n - Großes/bekanntes Projekt (Suricata, CrowdStrike-Level) = +3 Punkte\n - Standard Self-Hosted Tool (Nextcloud, Plausible) = +1 Punkt\n - CI/CD Build-Container, Test-Runner = 0 Punkte (ignorieren)\n 3. Erstelle Beschreibung NUR wenn coolness_score >= 6\n \n Antworte NUR als valides JSON:\n {\n \"coolness_score\": 1-10,\n \"notify\": true/false (true wenn >= 7),\n \"reason\": \"Kurze Begründung warum cool oder nicht\",\n \"type\": \"own\" oder \"selfhosted\" oder \"ignore\",\n \"title_en\": \"...\",\n \"title_de\": \"...\",\n \"description_en\": \"...\",\n \"description_de\": \"...\",\n \"content_en\": \"...\",\n \"content_de\": \"...\",\n \"category\": \"selfhosted\" oder \"webdev\" oder \"automation\",\n \"technologies\": [\"Docker\", \"...\"]\n }", - "batching": {} + "batching": {}, + "prompt": "\n Verwende keine Bindestriche, Em-Dashes oder Gedankenstriche (–, —, -)." }, "type": "@n8n/n8n-nodes-langchain.chainLlm", "typeVersion": 1.9, @@ -488,7 +489,8 @@ "parameters": { "promptType": "define", "text": "=Du bist ein technischer Autor für dk0.dev.\n\nNeuer Self-Hosted Service:\nContainer: {{ $('Parse Context').item.json.container }}\nImage: {{ $('Parse Context').item.json.image }}\n\nErstelle eine Portfolio-Beschreibung:\n- Was macht die App\n- Warum Self-Hosting besser ist als Cloud\n- Wie sie in die Infrastruktur integriert ist\n\nAntworte NUR als JSON:\n{\n \"title_en\": \"Titel\",\n \"title_de\": \"Titel\",\n \"description_en\": \"4-6 Sätze\",\n \"description_de\": \"4-6 Sätze\",\n \"content_en\": \"2-3 Absätze Markdown\",\n \"content_de\": \"2-3 Absätze Markdown\",\n \"category\": \"selfhosted\",\n \"technologies\": [\"Docker\", \"...\"]\n}", - "batching": {} + "batching": {}, + "prompt": "\n Verwende keine Bindestriche, Em-Dashes oder Gedankenstriche (–, —, -)." }, "type": "@n8n/n8n-nodes-langchain.chainLlm", "typeVersion": 1.9,