diff --git a/.gitignore b/.gitignore
index 75edccf..1c8e076 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,8 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
-/node_modules
+node_modules/
+**/node_modules/
/.pnp
.pnp.*
.yarn/*
@@ -20,6 +21,16 @@
# production
/build
+# Separate package projects (they are published from their own repositories)
+/chrome-decision-kit/
+/decision-kit/
+/python-decision-kit/
+/vscode-decision-kit/
+
+# Package build artefacts
+**/*.egg-info/
+*.vsix
+
# misc
.DS_Store
*.pem
diff --git a/app/developer/page.tsx b/app/developer/page.tsx
new file mode 100644
index 0000000..6f7424f
--- /dev/null
+++ b/app/developer/page.tsx
@@ -0,0 +1,179 @@
+import type { Metadata } from "next";
+import Link from "next/link";
+import { ArrowUpRight, Box, Check, Code2, Puzzle, Terminal } from "lucide-react";
+import Nav from "@/components/nav";
+import Footer from "@/components/footer";
+
+function GithubIcon({ className }: { className?: string }) {
+ return (
+
+
+
+
+ );
+}
+
+export const metadata: Metadata = {
+ title: "Decision Kit – Developer Suite",
+ description: "Open-Source-Tools von Entscheidomat: Repository, VS Code Extension, Chrome Extension, npm-Paket, Python SDK und GitHub Action.",
+ openGraph: {
+ title: "Decision Kit – Developer Suite | Entscheidomat",
+ description: "Zufalls-Entscheidungstools für VS Code, Chrome, Node.js, Python und GitHub Actions.",
+ url: "https://entscheidomat.com/developer",
+ },
+};
+
+type Asset = {
+ title: string;
+ eyebrow: string;
+ description: string;
+ icon: typeof Puzzle;
+ action?: string;
+ href?: string;
+ snippet?: string;
+ status: string;
+};
+
+const assets: Asset[] = [
+ {
+ title: "GitHub Repository",
+ eyebrow: "Open Source · MIT",
+ description: "Der vollständige Decision-Kit-Quellcode mit Releases, Issues und Contribution Guide – die zentrale Anlaufstelle für Entwickler.",
+ icon: Code2,
+ action: "Repository öffnen",
+ href: "https://github.com/knuthtimo-lab/decision-kit",
+ snippet: "git clone https://github.com/knuthtimo-lab/decision-kit.git",
+ status: "knuthtimo-lab/decision-kit",
+ },
+ {
+ title: "Decision Kit für VS Code",
+ eyebrow: "Extension · v1.0.0",
+ description: "Ziehe einen Gewinner aus markiertem Text, würfle mit Notation wie 2d6+3 und öffne das Glücksrad direkt in deiner IDE.",
+ icon: Puzzle,
+ action: "Im VS Code Store öffnen",
+ href: "https://marketplace.visualstudio.com/items?itemName=TimoKnuth.decisionkit-vscode",
+ status: "Visual Studio Marketplace",
+ },
+ {
+ title: "Decision Kit für Chrome",
+ eyebrow: "Browser-Erweiterung · Manifest V3",
+ description: "Random Picker, Glücksrad, Würfel, Münzwurf und praktische Kontextmenü-Kürzel für schnelle Entscheidungen im Browser.",
+ icon: Puzzle,
+ status: "Chrome Web Store – Veröffentlichung vorbereitet",
+ },
+ {
+ title: "TypeScript Library",
+ eyebrow: "npm · v1.0.0",
+ description: "Zufallsalgorithmen, Würfel-Parser, Glücksrad-Logik und React Hooks als wiederverwendbare Bausteine.",
+ icon: Box,
+ action: "npm-Paket ansehen",
+ href: "https://www.npmjs.com/package/decision-kit",
+ snippet: "npm install decision-kit",
+ status: "Node.js & React",
+ },
+ {
+ title: "Python SDK & CLI",
+ eyebrow: "PyPI · v1.0.0",
+ description: "Decision-Kit für Python-Skripte, Automatisierungen und die Kommandozeile.",
+ icon: Terminal,
+ action: "PyPI-Projekt ansehen",
+ href: "https://pypi.org/project/decision-kit/",
+ snippet: "pip install decision-kit",
+ status: "Python Package Index",
+ },
+ {
+ title: "GitHub Action",
+ eyebrow: "GitHub Marketplace",
+ description: "Nutze Auslosungen, Teamaufteilungen und Zufallsentscheidungen direkt in deinen CI/CD-Workflows.",
+ icon: Code2,
+ action: "Action ansehen",
+ href: "https://github.com/marketplace/actions/decision-kit-action",
+ snippet: "uses: knuthtimo-lab/decision-kit@v1.0.0",
+ status: "Für GitHub Actions",
+ },
+];
+
+export default function DeveloperPage() {
+ const jsonLd = {
+ "@context": "https://schema.org",
+ "@type": "SoftwareApplication",
+ name: "Decision Kit",
+ operatingSystem: "All",
+ applicationCategory: "DeveloperApplication",
+ author: { "@type": "Organization", name: "Entscheidomat" },
+ codeRepository: "https://github.com/knuthtimo-lab/decision-kit",
+ };
+
+ return (
+ <>
+
+
+
+
+
+ Entscheidomat für Entwickler
+ Decision Kit, dort wo du arbeitest.
+ Eine offene Sammlung von Tools für faire Zufallsentscheidungen – im Editor, im Browser, im Terminal und im Workflow.
+
+
+
+
+
+
+
Open Source · MIT-Lizenz
+
Der gesamte Code lebt auf GitHub.
+
Quellcode, Issues, Releases und Contribution Guide findest du im offiziellen Decision-Kit-Repository.
+
+ GitHub-Repository öffnen
+
+
+
+
# Starte lokal
+
git clone https://github.com/knuthtimo-lab/decision-kit.git
+
+
# Oder als Paket
+
npm install decision-kit
+
+
+
+
+
+
+
+
Integrationen
+
Installieren, einbinden, loslegen.
+
+
Jede Integration ist unabhängig nutzbar und verweist direkt auf ihren offiziellen Kanal.
+
+
+
+ {assets.map((asset) => {
+ const Icon = asset.icon;
+ return (
+
+
+ {asset.title}
+ {asset.description}
+ {asset.snippet && {asset.snippet}}
+
+
{asset.status}
+ {asset.href && asset.action ? (
+
{asset.action}
+ ) :
Bald verfügbar }
+
+
+ );
+ })}
+
+
+
+
Zurück zu den Entscheidungstools.
+
+
+
+ >
+ );
+}
diff --git a/app/globals.css b/app/globals.css
index b8af468..89f37f5 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -143,10 +143,6 @@ body {
/* Der Inline-Check im Root-Layout läuft vor der Hydration. Dadurch blitzt der
Preloader bei einem Reload innerhalb derselben Browser-Session nicht auf. */
-html[data-preloader="cached"] [data-preloader-overlay] {
- display: none;
-}
-
/* Der Preloader würde auf einem gedrosselten Mobilgerät das LCP-Element
verdecken. Die Seite bleibt dort sofort lesbar; Desktop behält den Effekt. */
@media (max-width: 767px) {
diff --git a/app/layout.tsx b/app/layout.tsx
index ee0ae51..db278dd 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -90,6 +90,7 @@ export default function RootLayout({
return (
@@ -100,15 +101,6 @@ export default function RootLayout({
crossOrigin="anonymous"
strategy="beforeInteractive"
/>
-
+
+
+
diff --git a/app/sitemap.ts b/app/sitemap.ts
index ff40120..e51877f 100644
--- a/app/sitemap.ts
+++ b/app/sitemap.ts
@@ -17,6 +17,12 @@ export default function sitemap(): MetadataRoute.Sitemap {
changeFrequency: "monthly" as const,
priority: 0.8,
})),
+ {
+ url: `${SITE_URL}/developer`,
+ lastModified: "2026-08-01",
+ changeFrequency: "weekly",
+ priority: 0.9,
+ },
{
url: `${SITE_URL}/impressum`,
lastModified: "2026-07-23",
diff --git a/components/developer-ecosystem.tsx b/components/developer-ecosystem.tsx
new file mode 100644
index 0000000..5304566
--- /dev/null
+++ b/components/developer-ecosystem.tsx
@@ -0,0 +1,164 @@
+import Link from "next/link";
+import { Code2, Terminal, Puzzle, Box, ArrowUpRight, CheckCircle2, Sparkles } from "lucide-react";
+
+function GithubIcon(props: React.SVGProps) {
+ return (
+
+
+
+
+ );
+}
+
+const DEVELOPER_TOOLS = [
+ {
+ id: "github-repo",
+ title: "GitHub Repository",
+ badge: "Open Source",
+ icon: GithubIcon,
+ description: "Der Quellcode des Decision-Kit & Entscheidomat Ökosystems auf GitHub. Sterne, Issues & Contribution Guide.",
+ snippet: "git clone https://github.com/knuthtimo-lab/decision-kit.git",
+ link: "https://github.com/knuthtimo-lab/decision-kit",
+ actionText: "GitHub Repo besuchen",
+ highlight: true
+ },
+ {
+ id: "vscode",
+ title: "VS Code Extension",
+ badge: "Marketplace",
+ icon: Puzzle,
+ description: "Zufallssieger aus Markierungen ziehen, Würfeln via Befehlspalette (2d6+3) & Glücksrad-Tab direkt in der IDE.",
+ link: "https://marketplace.visualstudio.com/items?itemName=TimoKnuth.decisionkit-vscode",
+ actionText: "VS Code Store öffnen"
+ },
+ {
+ id: "chrome",
+ title: "Chrome Web Store Extension",
+ badge: "Soon",
+ icon: Puzzle,
+ description: "Random Picker, Glücksrad, Würfel, Münzwurf und Kontextmenü-Kürzel – die Veröffentlichung im Chrome Web Store ist in Vorbereitung.",
+ link: "/developer",
+ actionText: "Demnächst verfügbar"
+ },
+ {
+ id: "npm",
+ title: "NPM TypeScript Library",
+ badge: "npm v1.0.0",
+ icon: Box,
+ description: "Vose Alias Method für O(1) Zufallswahl, Glücksrad-Physik, RPG-Dice Parser & React 18/19 Hooks.",
+ snippet: "npm install decision-kit",
+ link: "https://www.npmjs.com/package/decision-kit",
+ actionText: "npm Registry öffnen"
+ },
+ {
+ id: "pypi",
+ title: "Python SDK & CLI",
+ badge: "PyPI v1.0.0",
+ icon: Terminal,
+ description: "Entscheidungs-Engine & Terminal-CLI für Python-Entwickler, Data Scientists und Automationen.",
+ snippet: "pip install decision-kit",
+ link: "https://pypi.org/project/decision-kit/",
+ actionText: "PyPI Project öffnen"
+ },
+ {
+ id: "github-action",
+ title: "GitHub Action",
+ badge: "Marketplace",
+ icon: Code2,
+ description: "Automatisierte Zufallsentscheidungen & Team-Aufteilungen direkt in GitHub CI/CD Actions Workflows.",
+ link: "https://github.com/marketplace/actions/decision-kit-action",
+ actionText: "GitHub Action ansehen"
+ }
+];
+
+export default function DeveloperEcosystem() {
+ return (
+
+
+
+
+ Developer & Extension Suite
+
+
+ Entscheidomat überall nutzen: VS Code, Chrome, Terminal & Code
+
+
+ Nutze unsere Entscheidungstools direkt in deinem Browser, in deiner Lieblings-IDE oder als Open-Source Package in Node.js, Python & GitHub Actions.
+
+
+
+
+ {DEVELOPER_TOOLS.map((tool) => {
+ const Icon = tool.icon;
+ return (
+
+
+
+
+
+
+
+
+ {tool.title}
+
+
+
+ {tool.badge}
+
+
+
+
+ {tool.description}
+
+
+ {tool.snippet && (
+
+ $
+ {tool.snippet}
+
+ )}
+
+
+
+
+ );
+ })}
+
+
+
+
+
Alle Extensions, Repositories & Dokumentation ansehen
+
+
+
+
+ );
+}
diff --git a/components/footer.tsx b/components/footer.tsx
index dd7fe8f..d516d99 100644
--- a/components/footer.tsx
+++ b/components/footer.tsx
@@ -16,7 +16,11 @@ export default function Footer() {
Gebaut für alle, die sich (manchmal) nicht entscheiden können.
-
+
+
+ Chrome Extension
+ Soon
+
Impressum
diff --git a/components/hero.tsx b/components/hero.tsx
index 18fef1c..eb48541 100644
--- a/components/hero.tsx
+++ b/components/hero.tsx
@@ -323,4 +323,3 @@ export default function Hero() {
);
}
-
diff --git a/components/nav.tsx b/components/nav.tsx
index 102804f..9b3b672 100644
--- a/components/nav.tsx
+++ b/components/nav.tsx
@@ -106,6 +106,7 @@ export default function Nav() {
)}
+ Extensions & API
Features
{soundButton}
@@ -125,7 +126,8 @@ export default function Nav() {
{TOOLS.map((tool) => {tool.label} {tool.hint} → )}
- Features
+ Extensions & Developer Suite
+ Features
)}
diff --git a/components/scroll-flourishes.tsx b/components/scroll-flourishes.tsx
index b576631..030e230 100644
--- a/components/scroll-flourishes.tsx
+++ b/components/scroll-flourishes.tsx
@@ -387,4 +387,3 @@ export default function ScrollFlourishes() {
);
}
-
diff --git a/package-lock.json b/package-lock.json
index 9a0548a..540d153 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -74,7 +74,6 @@
"integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@babel/code-frame": "^7.29.7",
"@babel/generator": "^7.29.7",
@@ -289,7 +288,6 @@
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz",
"integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@emnapi/wasi-threads": "1.2.2",
"tslib": "^2.4.0"
@@ -300,7 +298,6 @@
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz",
"integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==",
"license": "MIT",
- "peer": true,
"dependencies": {
"tslib": "^2.4.0"
}
@@ -1593,7 +1590,6 @@
"integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"csstype": "^3.2.2"
}
@@ -1653,7 +1649,6 @@
"integrity": "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "8.65.0",
"@typescript-eslint/types": "8.65.0",
@@ -2257,7 +2252,6 @@
"integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==",
"dev": true,
"license": "MIT",
- "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -2601,7 +2595,6 @@
}
],
"license": "MIT",
- "peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.10.44",
"caniuse-lite": "^1.0.30001806",
@@ -3201,7 +3194,6 @@
"integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
@@ -3387,7 +3379,6 @@
"integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@rtsao/scc": "^1.1.0",
"array-includes": "^3.1.9",
@@ -5651,7 +5642,6 @@
"resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
"integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==",
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -5661,7 +5651,6 @@
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz",
"integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==",
"license": "MIT",
- "peer": true,
"dependencies": {
"scheduler": "^0.27.0"
},
@@ -6354,7 +6343,6 @@
"integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=12"
},
@@ -6517,7 +6505,6 @@
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true,
"license": "Apache-2.0",
- "peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -6796,7 +6783,6 @@
"integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}