Initialisieren

This commit is contained in:
2026-07-23 21:59:15 +02:00
commit 2d961adad4
76 changed files with 14318 additions and 0 deletions

163
app/datenschutz/page.tsx Normal file
View File

@@ -0,0 +1,163 @@
import type { Metadata } from "next";
import Link from "next/link";
import LegalLayout from "@/components/legal-layout";
export const metadata: Metadata = {
title: "Datenschutzerklärung",
description: "Datenschutzerklärung von Entscheidomat gemäß DSGVO.",
alternates: { canonical: "/datenschutz" },
};
export default function DatenschutzPage() {
return (
<LegalLayout title="Datenschutzerklärung" updated="23. Juli 2026">
<section>
<h2>1. Verantwortlicher</h2>
<p className="mt-3">
Verantwortlich für die Datenverarbeitung auf dieser Website im
Sinne der Datenschutz-Grundverordnung (DSGVO) ist:
</p>
<p className="mt-3">
Timo Knuth
<br />
E-Mail: <a href="mailto:info@entscheidomat.com">info@entscheidomat.com</a>
</p>
<p className="mt-3 font-medium text-clay">
Die vollständige ladungsfähige Geschäftsanschrift wird vor dem
öffentlichen Launch ergänzt.
</p>
<p className="mt-3">
Weitere Angaben finden Sie im{" "}
<Link href="/impressum">Impressum</Link>.
</p>
</section>
<section>
<h2>2. Grundsatz der Datenverarbeitung</h2>
<p className="mt-3">
Entscheidomat ist bewusst datensparsam aufgebaut: Die
Zufalls-Tools (Münze, Glücksrad, Würfel, Zufallszahl, Magic
8-Ball, Listen-Auswahl, Ja/Nein-Generator) laufen vollständig im
Browser. Eingaben wie eigene Beschriftungen, Listen oder
Fragen werden nicht an unseren Server übertragen.
</p>
</section>
<section>
<h2>3. Hosting und Server-Logfiles</h2>
<p className="mt-3">
Beim Aufruf dieser Website verarbeitet der Hostinganbieter
automatisch technische Zugriffsdaten (z.&nbsp;B. IP-Adresse,
Datum und Uhrzeit des Zugriffs, aufgerufene Seite, verwendeter
Browser) in Server-Logfiles. Dies ist technisch notwendig, um die
Website sicher und stabil auszuliefern (Rechtsgrundlage: Art. 6
Abs. 1 lit. f DSGVO, berechtigtes Interesse an einem
funktionsfähigen Betrieb).
</p>
<p className="mt-3 font-medium text-clay">
Der Webserver befindet sich in Texas, USA. Die Bezeichnung des
Hostinganbieters und die Speicherdauer der Logfiles werden vor dem
öffentlichen Launch ergänzt.
</p>
<h2 className="mt-6">3.1 Datenübermittlung in die USA (Drittlandtransfer)</h2>
<p className="mt-3">
Diese Website wird auf einem Server in Texas, USA gehostet. Dabei werden
personenbezogene Daten (insbesondere die technischen
Zugriffsdaten aus Ziffer 3) in ein Land außerhalb der
Europäischen Union und des Europäischen Wirtschaftsraums
(sogenanntes Drittland) übertragen.
</p>
<p className="mt-3 font-medium text-clay">
Vor dem öffentlichen Launch wird geprüft und dokumentiert, auf
welcher konkreten Grundlage die Datenübermittlung erfolgt und ob
der gewählte Hostinganbieter die erforderlichen Garantien für den
Drittlandtransfer bietet.
</p>
</section>
<section>
<h2>4. Lokale Speicherung (localStorage)</h2>
<p className="mt-3">
Eigene Einstellungen z.&nbsp;B. Münz-Beschriftungen, eigene
Würfel-Texte, Listen-Einträge, Magic-8-Ball-Antworten oder die
Sound-Einstellung werden ausschließlich im{" "}
<code>localStorage</code> Ihres Browsers auf Ihrem Gerät
gespeichert, damit sie bei erneutem Besuch erhalten bleiben.
Diese Daten verlassen Ihr Gerät nicht und werden nicht an uns
übertragen. Sie können diese Daten jederzeit über die
Browsereinstellungen (Website-Daten löschen) entfernen.
</p>
</section>
<section>
<h2>5. Cookies und Werbung</h2>
<p className="mt-3">
Entscheidomat setzt aktuell keine Cookies und keine Werbedienste
ein. Sollte künftig Werbung (z.&nbsp;B. Google AdSense)
hinzukommen, wird diese Datenschutzerklärung vorher aktualisiert
und eine Einwilligungslösung (Consent-Banner) für Nutzerinnen und
Nutzer aus der EU, dem UK und der Schweiz eingebaut, bevor der
Dienst aktiv geschaltet wird.
</p>
</section>
<section>
<h2>6. Webanalyse mit Umami</h2>
<p className="mt-3">
Wir nutzen Umami Cloud (Umami Software, Inc.) mit Datenregion EU,
um anonyme, aggregierte Nutzungsstatistiken zu erheben (z.&nbsp;B.
Seitenaufrufe, Referrer, ungefähre geografische Region, verwendetes
Gerät). Rechtsgrundlage ist unser berechtigtes Interesse an der
Analyse und Verbesserung des Angebots (Art. 6 Abs. 1 lit. f DSGVO).
</p>
<p className="mt-3">
Umami setzt <strong>keine Cookies</strong> und verwendet keine
persistente, geräteübergreifende Kennung zur Wiedererkennung
einzelner Personen. IP-Adressen werden nicht gespeichert; es
erfolgt lediglich eine tagesaktuelle, nicht rückverfolgbare
Kennzeichnung zur Unterscheidung wiederkehrender Besuche
(Hashing). Eine Zusammenführung mit anderen Diensten oder eine
Profilbildung findet nicht statt. Die Daten werden auf Servern in
der EU verarbeitet.
</p>
<p className="mt-3">
Da keine Cookies gesetzt und keine personenbezogenen Kennungen
gespeichert werden, ist nach unserer Einschätzung keine
Einwilligung nach § 25 TDDDG erforderlich.
Weitere Informationen:{" "}
<a
href="https://umami.is/privacy"
target="_blank"
rel="noopener noreferrer"
>
umami.is/privacy
</a>
.
</p>
</section>
<section>
<h2>7. Ihre Rechte</h2>
<p className="mt-3">Sie haben im Rahmen der geltenden Datenschutzgesetze jederzeit das Recht auf:</p>
<ul className="mt-3">
<li>Auskunft über Ihre bei uns gespeicherten personenbezogenen Daten (Art. 15 DSGVO)</li>
<li>Berichtigung unrichtiger Daten (Art. 16 DSGVO)</li>
<li>Löschung Ihrer bei uns gespeicherten Daten (Art. 17 DSGVO)</li>
<li>Einschränkung der Datenverarbeitung (Art. 18 DSGVO)</li>
<li>Widerspruch gegen die Verarbeitung (Art. 21 DSGVO)</li>
<li>Datenübertragbarkeit (Art. 20 DSGVO)</li>
<li>Beschwerde bei einer Datenschutz-Aufsichtsbehörde</li>
</ul>
</section>
<section>
<h2>8. Kontakt für Datenschutzanfragen</h2>
<p className="mt-3">
Bei Fragen zum Datenschutz wenden Sie sich bitte an:{" "}
info@entscheidomat.com.
</p>
</section>
</LegalLayout>
);
}

374
app/globals.css Normal file
View File

@@ -0,0 +1,374 @@
@import "tailwindcss";
@theme {
/* Typografie */
--font-sans: var(--font-inter), ui-sans-serif, system-ui, -apple-system, sans-serif;
--font-display: var(--font-cormorant), Georgia, serif;
/* Farben Warmes Porzellan-Papier mit sattem Gelb-Grün / Smaragd */
--color-paper: #faf8f3;
--color-surface: #ffffff;
--color-ink: #111412;
--color-ink-soft: #45504a;
--color-line: #e0eae4;
--color-primary: #111412;
--color-primary-strong: #000000;
--color-primary-soft: #e6f7f0;
/* Glücksspiel & Zufall Gelb-Grün / Smaragdgrün */
--color-emerald-accent: #0d7a57;
--color-emerald-strong: #095c41;
--color-emerald-soft: #e6f7f0;
--color-emerald-line: #b2e5d1;
--color-clay: #b4633f;
--color-clay-soft: #f6eae2;
/* Schatten */
--shadow-soft: 0 2px 4px rgb(17 20 18 / 0.03), 0 12px 36px rgb(17 20 18 / 0.06);
--shadow-lift: 0 4px 12px rgb(17 20 18 / 0.06), 0 24px 52px rgb(17 20 18 / 0.10);
--shadow-cta: 0 12px 28px rgb(17 20 18 / 0.22);
/* Animationen */
--animate-float: float 7s ease-in-out infinite;
--animate-coin-spin: coin-spin 10s linear infinite;
--animate-bob: bob 2.4s ease-in-out infinite;
@keyframes float {
0%,
100% {
transform: translateY(0);
}
50% {
transform: translateY(-16px);
}
}
@keyframes coin-spin {
from {
transform: rotateY(0deg);
}
to {
transform: rotateY(360deg);
}
}
@keyframes bob {
0%,
100% {
transform: translateY(0);
opacity: 0.7;
}
50% {
transform: translateY(6px);
opacity: 1;
}
}
@keyframes stream {
from {
stroke-dashoffset: 1000;
}
to {
stroke-dashoffset: 0;
}
}
@keyframes shootTL {
0% {
transform: translate(0, 0);
opacity: 0;
}
20% {
opacity: 0.7;
}
80% {
opacity: 0.7;
}
100% {
transform: translate(520px, 180px);
opacity: 0;
}
}
@keyframes shootTR {
0% {
transform: translate(0, 0);
opacity: 0;
}
20% {
opacity: 0.7;
}
80% {
opacity: 0.7;
}
100% {
transform: translate(-520px, 190px);
opacity: 0;
}
}
@keyframes shootBL {
0% {
transform: translate(0, 0);
opacity: 0;
}
20% {
opacity: 0.65;
}
80% {
opacity: 0.65;
}
100% {
transform: translate(480px, -170px);
opacity: 0;
}
}
}
/* ---------- Basis ---------- */
html {
scroll-behavior: smooth;
}
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
}
body {
background: var(--color-paper);
color: var(--color-ink);
font-family: var(--font-sans);
-webkit-font-smoothing: antialiased;
overflow-x: hidden;
}
/* 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) {
[data-preloader-overlay] {
display: none;
}
}
/* Die Hero-Inhalte sind bereits vor dem Öffnen des Vorhangs im Startzustand.
So kann GSAP sie nicht erst sichtbar machen und anschließend zurücksetzen. */
@media (prefers-reduced-motion: no-preference) {
html[data-preloader="active"] .hero-el {
opacity: 0;
transform: translateY(34px);
}
.reveal {
opacity: 0;
transform: translateY(var(--reveal-y, 30px));
transition:
opacity 0.7s ease var(--reveal-delay, 0s),
transform 0.7s cubic-bezier(0.22, 1, 0.36, 1) var(--reveal-delay, 0s);
}
.reveal--visible {
opacity: 1;
transform: translateY(0);
}
}
::selection {
background: rgb(22 21 19 / 0.12);
}
:focus-visible {
outline: 2px solid var(--color-primary);
outline-offset: 2px;
border-radius: 6px;
}
/* Dezente Scrollbar */
::-webkit-scrollbar {
width: 10px;
}
::-webkit-scrollbar-track {
background: var(--color-paper);
}
::-webkit-scrollbar-thumb {
background: #d5d0c2;
border-radius: 8px;
border: 2px solid var(--color-paper);
}
::-webkit-scrollbar-thumb:hover {
background: #c1bbab;
}
/* ---------- Hintergrund-Deko ---------- */
.bg-grid {
background-image:
linear-gradient(to right, rgb(32 30 25 / 0.045) 1px, transparent 1px),
linear-gradient(to bottom, rgb(32 30 25 / 0.045) 1px, transparent 1px);
background-size: 46px 46px;
mask-image: radial-gradient(ellipse 90% 65% at 50% 0%, black 25%, transparent 78%);
-webkit-mask-image: radial-gradient(ellipse 90% 65% at 50% 0%, black 25%, transparent 78%);
}
.bg-noise {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
opacity: 0.03;
}
/* ---------- 3D-Münze (gebürstetes Messing, flach) ---------- */
.coin-scene {
perspective: 1100px;
}
.coin {
position: relative;
width: 100%;
height: 100%;
transform-style: preserve-3d;
will-change: transform;
}
.coin-face {
position: absolute;
inset: 0;
border-radius: 9999px;
display: flex;
align-items: center;
justify-content: center;
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
}
.coin-face--front {
transform: translateZ(4px);
background: #dec998;
box-shadow:
inset 0 1px 2px rgb(255 250 235 / 0.5),
inset 0 -2px 4px rgb(120 90 40 / 0.12);
}
.coin-face--back {
background: #d6be87;
box-shadow:
inset 0 1px 2px rgb(255 248 228 / 0.5),
inset 0 -2px 4px rgb(110 82 36 / 0.12);
}
.coin-edge {
position: absolute;
inset: 0;
border-radius: 9999px;
background: #8a6f44;
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
}
.coin-engraving {
position: absolute;
inset: 8%;
border-radius: 9999px;
border: 2px solid rgb(122 94 51 / 0.38);
pointer-events: none;
}
.coin-engraving--inner {
inset: 16%;
border-width: 1px;
border-color: rgb(122 94 51 / 0.26);
}
.coin-label {
font-family: var(--font-display);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.16em;
color: #6e5533;
text-shadow: 0 1px 0 rgb(255 246 224 / 0.8);
max-width: 78%;
text-align: center;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* ---------- 3D-Würfel ---------- */
.dice-scene {
perspective: 900px;
}
.dice {
position: relative;
width: 100%;
height: 100%;
transform-style: preserve-3d;
will-change: transform;
}
.dice-face {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
background: #fdfcf9;
border: 1px solid var(--color-line);
border-radius: 18%;
box-shadow: inset 0 0 14px rgb(32 30 25 / 0.06);
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
overflow: hidden;
padding: 8%;
}
.dice-face-label {
font-family: var(--font-display);
font-weight: 600;
font-size: clamp(9px, 1.6vw, 13px);
line-height: 1.2;
text-align: center;
color: var(--color-ink);
overflow-wrap: anywhere;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
/* ---------- Magic 8-Ball (warmes Anthrazit, flach) ---------- */
.ball-body {
background: #1d1b17;
box-shadow:
inset 0 -18px 42px rgb(0 0 0 / 0.6),
inset 0 10px 26px rgb(255 255 255 / 0.07),
0 30px 60px rgb(32 30 25 / 0.28);
}
.ball-window {
background: #12130f;
box-shadow:
inset 0 4px 18px rgb(0 0 0 / 0.75),
0 0 0 6px rgb(255 255 255 / 0.05);
}
/* ---------- Diverse ---------- */
.tabular {
font-variant-numeric: tabular-nums;
}
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
input[type="number"] {
-moz-appearance: textfield;
appearance: textfield;
}

163
app/gluecksrad/page.tsx Normal file
View File

@@ -0,0 +1,163 @@
import type { Metadata } from "next";
import WheelOfFortune from "@/components/tools/wheel-of-fortune";
import SubpageLayout from "@/components/subpage-layout";
const SITE_URL = "https://entscheidomat.com";
const PAGE_URL = `${SITE_URL}/gluecksrad`;
const PAGE_TITLE = "Glücksrad online drehen kostenloses Entscheidungsrad";
const PAGE_DESCRIPTION =
"Glücksrad online mit bis zu 12 Optionen: eintragen, drehen und zufällig entscheiden lassen. Kostenlos, ohne Anmeldung und direkt im Browser.";
const UPDATED = "23. Juli 2026";
export const metadata: Metadata = {
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
alternates: { canonical: "/gluecksrad" },
openGraph: { type: "website", locale: "de_DE", siteName: "Entscheidomat", title: PAGE_TITLE, description: PAGE_DESCRIPTION, url: PAGE_URL, images: ["/opengraph-image"] },
twitter: { card: "summary_large_image", title: PAGE_TITLE, description: PAGE_DESCRIPTION, images: ["/twitter-image"] },
};
const FAQS = [
{
q: "Wie viele Optionen kann ich im Glücksrad eintragen?",
a: "Zwischen 2 und 12 Optionen. Du kannst sie jederzeit ändern, hinzufügen oder entfernen deine Liste bleibt automatisch im Browser gespeichert.",
},
{
q: "Wie wird die Option ausgewählt?",
a: "Beim Drehen erzeugt das Tool im Browser einen neuen Zufallswert und ordnet das Ergebnis einer sichtbaren Option zu. Das Glücksrad ist für spielerische Alltagsentscheidungen gedacht, nicht für verbindliche oder sicherheitskritische Zwecke.",
},
{
q: "Werden meine Optionen gespeichert oder übertragen?",
a: "Deine Optionen werden ausschließlich lokal im localStorage deines Browsers gespeichert und nicht an einen Server übertragen.",
},
{
q: "Kann ich das Rad auf die Standardoptionen zurücksetzen?",
a: "Ja, über den Button „Zurücksetzen“ im Optionen-Editor werden die Standardoptionen 16 wiederhergestellt.",
},
{
q: "Eignet sich das Glücksrad für Gruppen und Präsentationen?",
a: "Ja, es ist groß und deutlich lesbar. Für wichtige Entscheidungen sollte es aber nicht der einzige Entscheidungsweg sein.",
},
{
q: "Wie nutze ich das Glücksrad für eine faire Auswahl?",
a: "Trage jede Option genau einmal ein. Das Rad teilt alle Einträge in gleich große Segmente; doppelte Einträge erhöhen deshalb die Chance dieser Option. Prüfe die Liste vor dem Drehen, wenn alle dieselbe Gewinnchance haben sollen.",
},
{
q: "Was ist der Unterschied zwischen Glücksrad und Namen auslosen?",
a: "Das Glücksrad zeigt die Optionen visuell und eignet sich besonders für kleine Gruppen oder Präsentationen mit bis zu 12 Einträgen. Bei langen Listen oder mehreren Ziehungen ohne Wiederholung ist die Namen-Auslosung übersichtlicher.",
},
];
const jsonLd = {
"@context": "https://schema.org",
"@graph": [
{
"@type": "BreadcrumbList",
itemListElement: [
{ "@type": "ListItem", position: 1, name: "Entscheidomat", item: SITE_URL },
{ "@type": "ListItem", position: 2, name: "Glücksrad", item: PAGE_URL },
],
},
{
"@type": "WebApplication",
name: "Glücksrad",
url: PAGE_URL,
description: PAGE_DESCRIPTION,
applicationCategory: "UtilitiesApplication",
operatingSystem: "Any (Web-Browser)",
isPartOf: { "@id": `${SITE_URL}/#website` },
offers: { "@type": "Offer", price: "0", priceCurrency: "EUR" },
},
{
"@type": "FAQPage",
mainEntity: FAQS.map((f) => ({
"@type": "Question",
name: f.q,
acceptedAnswer: { "@type": "Answer", text: f.a },
})),
},
],
};
const STEPS = [
"Trage 2 bis 12 Optionen im Editor ein z. B. Namen, Aktivitäten oder Restaurants.",
"Passe die Beschriftungen jederzeit an.",
"Tippe auf „Drehen!“ das Rad dreht sich und bremst zufällig ab.",
"Der Zeiger markiert die gewonnene Option, inklusive Konfetti.",
];
const EXAMPLES = [
"„Welches Restaurant heute Abend?“",
"„Wer räumt diese Woche auf?“",
"„Welcher Film wird geschaut?“",
];
const VORTEILE = (
<p>
Das Glücksrad eignet sich besonders für Gruppenentscheidungen mit mehreren
gleichwertigen Optionen, die visuell gut dargestellt werden können. Pro Option
sind bis zu 24 Zeichen und maximal 12 Optionen möglich für sehr viele
Alternativen eignet sich eher die Listen-Auswahl.
</p>
);
const ADDITIONAL_CONTENT = (
<article className="space-y-4 text-base leading-relaxed text-ink-soft">
<h2 className="font-display text-2xl sm:text-3xl font-semibold text-ink">
Glücksrad online: Entscheidungen sichtbar und fair auslosen
</h2>
<p>
Ein Online-Glücksrad ist eine Entscheidungshilfe für mehrere gleichwertige
Optionen. Du trägst zwischen zwei und zwölf Begriffe ein, das Tool verteilt sie
auf gleich große Segmente und der Zeiger bestimmt beim Drehen ein Ergebnis.
Dadurch hat jede einmal eingetragene Option dieselbe Chance. Typische Beispiele
sind Restaurants, Filme, Spiele, Aufgaben, Themen für einen Vortrag oder die
Reihenfolge in einer Gruppe.
</p>
<p>
Damit die Auswahl fair bleibt, sollte jede Möglichkeit genau einmal in der Liste
stehen. Ein doppelter Eintrag nimmt zwei Segmente ein und wird entsprechend
wahrscheinlicher ausgewählt. Das ist nützlich, wenn du bewusst gewichten willst,
aber ungeeignet für eine faire Verlosung. Prüfe deshalb die Beschriftungen vor
dem Start und erkläre der Gruppe kurz, dass alle Segmente gleich groß sind. Die
gespeicherten Optionen bleiben nur lokal in deinem Browser und werden nicht an
einen Server übertragen.
</p>
<p>
Für kleine Gruppen ist das drehende Rad oft besser als eine Liste, weil alle
Optionen gleichzeitig sichtbar sind und das Ergebnis einen gemeinsamen Moment
schafft. Bei vielen Namen oder wenn nach jeder Ziehung ein Eintrag verschwinden
soll, ist die Namen-Auslosung die bessere Wahl. Und wenn es nur um zwei
Möglichkeiten geht, sind Ja-Nein-Generator oder Münzwurf schneller. Für wichtige
Entscheidungen bleibt Zufall ein Impuls Verantwortung und Folgen sollten alle
Beteiligten vorher besprechen.
</p>
</article>
);
export default function GluecksradPage() {
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(jsonLd).replace(/</g, "\\u003c"),
}}
/>
<SubpageLayout
toolSlug="gluecksrad"
toolName="Glücksrad"
h1Title="Glücksrad online drehen dein kostenloses Entscheidungsrad"
introText="Das Online-Glücksrad ist ein digitales Entscheidungsrad mit bis zu 12 frei einstellbaren Optionen. Trage deine Optionen ein, drehe das Rad und lass den Zeiger die Entscheidung treffen kostenlos, ohne Anmeldung und direkt im Browser."
steps={STEPS}
examples={EXAMPLES}
vorteileText={VORTEILE}
additionalContent={ADDITIONAL_CONTENT}
faqs={FAQS}
updatedDate={UPDATED}
>
<WheelOfFortune />
</SubpageLayout>
</>
);
}

9
app/icon.svg Normal file
View File

@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<rect width="512" height="512" rx="112" fill="#0d7a57"/>
<path d="M143 168h226c18 0 33 15 33 33v110c0 18-15 33-33 33H143c-18 0-33-15-33-33V201c0-18 15-33 33-33Z" fill="#faf8f3"/>
<rect x="142" y="200" width="94" height="112" rx="20" fill="#dcefe6"/>
<rect x="276" y="200" width="94" height="112" rx="20" fill="#0d7a57"/>
<path d="m300 255 17 17 31-37" fill="none" stroke="#faf8f3" stroke-linecap="round" stroke-linejoin="round" stroke-width="14"/>
<path d="M256 344v36" fill="none" stroke="#faf8f3" stroke-linecap="round" stroke-width="16"/>
<circle cx="256" cy="408" r="25" fill="#8bb79d"/>
</svg>

After

Width:  |  Height:  |  Size: 676 B

88
app/impressum/page.tsx Normal file
View File

@@ -0,0 +1,88 @@
import type { Metadata } from "next";
import LegalLayout from "@/components/legal-layout";
export const metadata: Metadata = {
title: "Impressum",
description: "Impressum und Anbieterkennzeichnung von Entscheidomat.",
alternates: { canonical: "/impressum" },
};
export default function ImpressumPage() {
return (
<LegalLayout title="Impressum" updated="23. Juli 2026">
<section>
<h2>Angaben gemäß § 5 Digitale-Dienste-Gesetz (DDG)</h2>
<p className="mt-3">
Timo Knuth
<br />
Einzelunternehmer
</p>
</section>
<section>
<h2>Kontakt</h2>
<p className="mt-3">
E-Mail: <a href="mailto:info@entscheidomat.com">info@entscheidomat.com</a>
</p>
</section>
<section>
<h2>Verantwortlich für den Inhalt nach § 18 Abs. 2 MStV</h2>
<p className="mt-3">Timo Knuth</p>
</section>
<section>
<h2>Nutzungshinweis und Haftungsrahmen</h2>
<p className="mt-3">
Entscheidomat ist eine spielerische Entscheidungshilfe für
alltägliche, folgenarme Situationen. Die Tools ersetzen keine
persönliche, medizinische, rechtliche, finanzielle oder sonstige
fachliche Beratung und sind nicht für verbindliche Auslosungen,
Gewinnspiele oder sicherheitskritische Zwecke bestimmt.
</p>
<p className="mt-3">
Die Ergebnisse werden mit browserbasierten Zufallswerten erzeugt.
Es wird keine Zusage für kryptografische Zufälligkeit, rechtliche
Verbindlichkeit oder eine bestimmte Eignung für einen konkreten
Zweck gemacht. Gesetzliche Haftung, insbesondere bei Vorsatz,
grober Fahrlässigkeit sowie bei Schäden an Leben, Körper oder
Gesundheit, bleibt unberührt.
</p>
</section>
<section>
<h2>Haftung für Inhalte</h2>
<p className="mt-3">
Als Diensteanbieter sind wir gemäß § 7 Abs. 1 DDG für eigene
Inhalte auf diesen Seiten nach den allgemeinen Gesetzen
verantwortlich. Nach §§ 8 bis 10 DDG sind wir als Diensteanbieter
jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde
Informationen zu überwachen oder nach Umständen zu forschen, die
auf eine rechtswidrige Tätigkeit hinweisen.
</p>
</section>
<section>
<h2>Haftung für Links</h2>
<p className="mt-3">
Entscheidomat enthält aktuell keine Links zu externen Webseiten
Dritter, auf deren Inhalte wir Einfluss haben. Sollten künftig
externe Links ergänzt werden, gilt: Für die Inhalte der
verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber
der Seiten verantwortlich.
</p>
</section>
<section>
<h2>Urheberrecht</h2>
<p className="mt-3">
Die durch die Seitenbetreiber erstellten Inhalte und Werke auf
diesen Seiten unterliegen dem deutschen Urheberrecht.
Vervielfältigung, Bearbeitung, Verbreitung und jede Art der
Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der
schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers.
</p>
</section>
</LegalLayout>
);
}

View File

@@ -0,0 +1,175 @@
import type { Metadata } from "next";
import JaNeinGenerator from "@/components/tools/ja-nein-generator";
import SubpageLayout from "@/components/subpage-layout";
const SITE_URL = "https://entscheidomat.com";
const PAGE_URL = `${SITE_URL}/ja-nein-generator`;
const PAGE_TITLE = "Ja-Nein-Generator: Ja oder Nein online entscheiden";
const PAGE_DESCRIPTION =
"Mit dem Ja-Nein-Generator erhältst du sofort eine zufällige Antwort auf deine Frage: Ja oder Nein. Kostenlos, ohne Anmeldung, direkt im Browser.";
const UPDATED = "23. Juli 2026";
export const metadata: Metadata = {
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
alternates: { canonical: "/ja-nein-generator" },
openGraph: {
type: "website",
locale: "de_DE",
siteName: "Entscheidomat",
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
url: PAGE_URL,
images: ["/opengraph-image"],
},
twitter: {
card: "summary_large_image",
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
images: ["/twitter-image"],
},
};
const FAQS = [
{
q: "Wie funktioniert ein Ja-Nein-Generator?",
a: "Du gibst optional eine Frage ein und startest den Generator per Klick oder Tipp. Das Tool erzeugt im Browser einen neuen Zufallswert und zeigt danach „Ja“ oder „Nein“ an.",
},
{
q: "Wie entsteht das Ergebnis?",
a: "Bei jeder Anfrage erzeugt das Tool im Browser einen neuen Zufallswert. Der Ja-Nein-Generator ist für spielerische Alltagsentscheidungen gedacht, nicht für sicherheitskritische oder rechtlich verbindliche Zwecke.",
},
{
q: "Kann ich den Generator mehrfach verwenden?",
a: "Ja, beliebig oft. Der Verlauf zeigt dir die letzten zehn Ergebnisse, damit du siehst, wie oft Ja bzw. Nein gefallen ist.",
},
{
q: "Eignet sich der Generator für Gruppenentscheidungen?",
a: "Für lockere Gruppenentscheidungen (z. B. „Bestellen wir Pizza?“) eignet er sich gut. Für Entscheidungen, die alle Beteiligten mittragen müssen, ersetzt er kein gemeinsames Gespräch.",
},
{
q: "Ersetzt ein Zufallsergebnis eine wichtige persönliche Entscheidung?",
a: "Nein. Der Generator ist als spielerischer Denkanstoß für Alltagsfragen gedacht bei wichtigen persönlichen, finanziellen, rechtlichen oder gesundheitlichen Entscheidungen solltest du dich nicht auf einen Zufallsgenerator verlassen.",
},
{
q: "Wann ist ein Ja-Nein-Generator besser als ein Münzwurf?",
a: "Beide Methoden helfen bei einer Entscheidung zwischen zwei Optionen. Der Ja-Nein-Generator passt besser, wenn du eine konkrete Frage formulierst und direkt „Ja“ oder „Nein“ sehen möchtest; ein Münzwurf eignet sich eher für Kopf oder Zahl oder frei beschriftete Seiten.",
},
{
q: "Ist der Ja-Nein-Generator für wichtige Entscheidungen geeignet?",
a: "Nein. Er ist als spielerischer Denkanstoß für Alltagsfragen gedacht. Für gesundheitliche, rechtliche, finanzielle oder andere folgenreiche Entscheidungen solltest du Informationen sammeln und gegebenenfalls fachlichen Rat einholen.",
},
];
const jsonLd = {
"@context": "https://schema.org",
"@graph": [
{
"@type": "BreadcrumbList",
itemListElement: [
{ "@type": "ListItem", position: 1, name: "Entscheidomat", item: SITE_URL },
{ "@type": "ListItem", position: 2, name: "Ja-Nein-Generator", item: PAGE_URL },
],
},
{
"@type": "WebApplication",
name: "Ja-Nein-Generator",
url: PAGE_URL,
description: PAGE_DESCRIPTION,
applicationCategory: "UtilitiesApplication",
operatingSystem: "Any (Web-Browser)",
isPartOf: { "@id": `${SITE_URL}/#website` },
offers: { "@type": "Offer", price: "0", priceCurrency: "EUR" },
},
{
"@type": "FAQPage",
mainEntity: FAQS.map((f) => ({
"@type": "Question",
name: f.q,
acceptedAnswer: { "@type": "Answer", text: f.a },
})),
},
],
};
const STEPS = [
"Trage optional deine Frage in das Eingabefeld ein.",
"Tippe auf die Karte oder den Button „Ja oder Nein?“.",
"Der Generator wählt zufällig zwischen Ja und Nein und zeigt dir sofort das Ergebnis.",
"Frag so oft du willst der Verlauf zeigt dir die letzten zehn Ergebnisse.",
];
const EXAMPLES = [
"„Sollen wir heute Abend bestellen statt kochen?“",
"„Soll ich den Film jetzt zu Ende schauen?“",
"„Starte ich heute noch mit dem Sport?“",
];
const VORTEILE = (
<p>
Der Generator ist ideal für schnelle Alltagsfragen ohne großes Abwägen er ist
kostenlos, sofort einsatzbereit und komplett anonym, da nichts an einen Server
übertragen wird. Für wichtige persönliche, finanzielle, rechtliche oder gesundheitliche
Entscheidungen ist ein reiner Zufallsmechanismus dagegen nicht geeignet.
</p>
);
const ADDITIONAL_CONTENT = (
<article className="space-y-4 text-base leading-relaxed text-ink-soft">
<h2 className="font-display text-2xl sm:text-3xl font-semibold text-ink">
Ja-Nein-Generator oder Münzwurf: Was passt wann?
</h2>
<p>
Ein Ja-Nein-Generator ist eine digitale Entscheidungshilfe für Fragen mit
genau zwei möglichen Antworten. Er eignet sich, wenn die Optionen bereits klar
sind und ihr eine kleine Pattsituation ohne langes Diskutieren auflösen möchtet:
Bestellen wir heute?, Gehen wir noch spazieren? oder Starte ich jetzt mit
der Aufgabe? Die Frage ist dabei nur ein hilfreicher Rahmen; sie verändert die
Wahrscheinlichkeit nicht.
</p>
<p>
Im Vergleich zum Münzwurf ist das Ergebnis sprachlich direkter. Statt Kopf oder
Zahl erscheint sofort Ja oder Nein praktisch auf dem Smartphone, in einer
Gruppe oder wenn ihr das Ergebnis später noch einmal im Verlauf sehen wollt.
Für zwei frei benannte Optionen wie Kino oder Couch kannst du entweder die
Frage entsprechend formulieren oder den Münzwurf mit eigenen Seiten nutzen.
Bei drei oder mehr gleichwertigen Möglichkeiten ist ein Glücksrad meist die
passendere Entscheidungshilfe.
</p>
<p>
Zufall ersetzt keine Abwägung, kann aber sichtbar machen, was du selbst willst:
Achte auf deine erste Reaktion auf das Ergebnis. Fühlt sich ein Nein unerwartet
enttäuschend an, steckt in dieser Reaktion oft schon eine Präferenz. Für
finanzielle, rechtliche, gesundheitliche oder andere folgenreiche Entscheidungen
solltest du Informationen sammeln, Alternativen vergleichen und gegebenenfalls
fachlichen Rat einholen nicht würfeln.
</p>
</article>
);
export default function JaNeinGeneratorPage() {
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(jsonLd).replace(/</g, "\\u003c"),
}}
/>
<SubpageLayout
toolSlug="ja-nein-generator"
toolName="Ja-Nein-Generator"
h1Title="Ja-Nein-Generator Ja oder Nein online entscheiden"
introText="Der Ja-Nein-Generator beantwortet eine Frage zufällig mit Ja oder Nein. Formuliere deine Frage, starte den Generator und erhalte sofort eine zufällige Entscheidung kostenlos, ohne Anmeldung und direkt im Browser."
steps={STEPS}
examples={EXAMPLES}
vorteileText={VORTEILE}
additionalContent={ADDITIONAL_CONTENT}
faqs={FAQS}
updatedDate={UPDATED}
>
<JaNeinGenerator />
</SubpageLayout>
</>
);
}

121
app/layout.tsx Normal file
View File

@@ -0,0 +1,121 @@
import type { Metadata } from "next";
import { Inter, Cormorant_Garamond } from "next/font/google";
import Script from "next/script";
import "./globals.css";
import { SoundProvider } from "@/components/providers/sound-provider";
import Preloader from "@/components/preloader";
const inter = Inter({
variable: "--font-inter",
subsets: ["latin"],
display: "optional",
});
const cormorant = Cormorant_Garamond({
variable: "--font-cormorant",
subsets: ["latin"],
weight: ["300", "400", "500", "600", "700"],
style: ["normal", "italic"],
display: "optional",
});
const SITE_URL = "https://entscheidomat.com";
const SITE_NAME = "Entscheidomat";
const SITE_TITLE = "Entscheidomat Lass den Zufall entscheiden";
const SITE_DESCRIPTION =
"Münze werfen, Glücksrad drehen, würfeln, eine Zufallszahl erzeugen, den Magic 8-Ball fragen, eine Liste auslosen oder den Ja-Nein-Generator befragen wunderschön animiert, komplett anpassbar und kostenlos.";
export const metadata: Metadata = {
metadataBase: new URL(SITE_URL),
title: {
default: SITE_TITLE,
template: "%s Entscheidomat",
},
description: SITE_DESCRIPTION,
keywords: [
"Münzwurf",
"Glücksrad",
"Würfel",
"Zufallsgenerator",
"Entscheidung",
"Kopf oder Zahl",
"Ja Nein Generator",
],
alternates: {
canonical: "/",
},
verification: {
google: "8AohGR6zT7xA_1au64S-bh1i0GDPx7d-cbMdS518NkE",
},
openGraph: {
type: "website",
locale: "de_DE",
url: SITE_URL,
siteName: SITE_NAME,
title: SITE_TITLE,
description: SITE_DESCRIPTION,
},
twitter: {
card: "summary_large_image",
title: SITE_TITLE,
description: SITE_DESCRIPTION,
},
};
const jsonLd = {
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebSite",
"@id": `${SITE_URL}/#website`,
url: SITE_URL,
name: SITE_NAME,
description: SITE_DESCRIPTION,
inLanguage: "de-DE",
},
{
"@type": "Organization",
"@id": `${SITE_URL}/#organization`,
name: SITE_NAME,
url: SITE_URL,
},
],
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html
lang="de"
className={`${inter.variable} ${cormorant.variable} h-full antialiased`}
>
<body className="flex min-h-full flex-col">
<Script id="preloader-session" strategy="beforeInteractive">
{`try {
const hasSeenPreloader = sessionStorage.getItem("entscheidomat:preloader-seen") === "1";
const isMobile = window.matchMedia("(max-width: 767px)").matches;
document.documentElement.dataset.preloader = hasSeenPreloader || isMobile ? "cached" : "active";
} catch {
document.documentElement.dataset.preloader = window.matchMedia("(max-width: 767px)").matches ? "cached" : "active";
}`}
</Script>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(jsonLd).replace(/</g, "\\u003c"),
}}
/>
<Script
src="https://cloud.umami.is/script.js"
data-website-id="15bab46b-b1a9-4d2f-9c69-deaef60a0cfc"
strategy="afterInteractive"
/>
<Preloader />
<SoundProvider>{children}</SoundProvider>
</body>
</html>
);
}

146
app/magic-8-ball/page.tsx Normal file
View File

@@ -0,0 +1,146 @@
import type { Metadata } from "next";
import Link from "next/link";
import Magic8Ball from "@/components/tools/magic-8-ball";
import SubpageLayout from "@/components/subpage-layout";
const SITE_URL = "https://entscheidomat.com";
const PAGE_URL = `${SITE_URL}/magic-8-ball`;
const PAGE_TITLE = "Magic 8-Ball online fragen zufällige Antworten";
const PAGE_DESCRIPTION =
"Der Magic 8-Ball beantwortet deine Frage mit einer zufälligen, anpassbaren Antwort. Fragen stellen, schütteln, Antwort erhalten kostenlos, ohne Anmeldung.";
const UPDATED = "23. Juli 2026";
export const metadata: Metadata = {
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
alternates: { canonical: "/magic-8-ball" },
openGraph: { type: "website", locale: "de_DE", siteName: "Entscheidomat", title: PAGE_TITLE, description: PAGE_DESCRIPTION, url: PAGE_URL, images: ["/opengraph-image"] },
twitter: { card: "summary_large_image", title: PAGE_TITLE, description: PAGE_DESCRIPTION, images: ["/twitter-image"] },
};
const FAQS = [
{
q: "Wie funktioniert der Magic 8-Ball?",
a: "Stelle optional deine Frage, tippe auf den Ball oder den Button der Ball schüttelt sich kurz und zeigt eine zufällig ausgewählte Antwort aus deiner Antwortliste.",
},
{
q: "Kann ich die Antworten selbst anpassen?",
a: "Ja, du kannst 2 bis 20 eigene Antworten im Editor eintragen. Sie werden automatisch lokal gespeichert.",
},
{
q: "Sind die Antworten immer eindeutig Ja oder Nein?",
a: "Nein, die klassischen 8-Ball-Antworten sind oft bewusst vage formuliert (z. B. „Frag später nochmal“). Für eine eindeutige Ja/Nein-Antwort eignet sich der Ja-Nein-Generator besser.",
},
{
q: "Werden meine Antworten gespeichert oder an einen Server übertragen?",
a: "Deine Antwortliste wird nur lokal im localStorage deines Browsers gespeichert, nicht an uns übertragen.",
},
{
q: "Kann ich den Ball mehrfach fragen?",
a: "Ja, beliebig oft hintereinander.",
},
];
const jsonLd = {
"@context": "https://schema.org",
"@graph": [
{
"@type": "BreadcrumbList",
itemListElement: [
{ "@type": "ListItem", position: 1, name: "Entscheidomat", item: SITE_URL },
{ "@type": "ListItem", position: 2, name: "Magic 8-Ball", item: PAGE_URL },
],
},
{
"@type": "WebApplication",
name: "Magic 8-Ball",
url: PAGE_URL,
description: PAGE_DESCRIPTION,
applicationCategory: "UtilitiesApplication",
operatingSystem: "Any (Web-Browser)",
isPartOf: { "@id": `${SITE_URL}/#website` },
offers: { "@type": "Offer", price: "0", priceCurrency: "EUR" },
},
{
"@type": "FAQPage",
mainEntity: FAQS.map((f) => ({
"@type": "Question",
name: f.q,
acceptedAnswer: { "@type": "Answer", text: f.a },
})),
},
],
};
const STEPS = [
"Trage optional deine Frage ein.",
"Tippe auf den Ball oder den Button „8-Ball schütteln“.",
"Der Ball schüttelt sich kurz und zeigt eine zufällige Antwort im Fenster.",
"Passe die möglichen Antworten im Editor an (220 Antworten).",
];
const EXAMPLES = [
"„Wird das Projekt heute fertig?“",
"„Soll ich noch mal anrufen?“",
"Spielerische Fragen in der Gruppe stellen",
];
const VORTEILE = (
<p>
Eigene Antwortliste möglich (220 Antworten, automatisch gespeichert). Die klassischen
Antworten sind oft bewusst mehrdeutig formuliert für eine eindeutige Ja- oder
Nein-Entscheidung eignet sich der{" "}
<Link href="/ja-nein-generator" className="text-[#c97d60] font-medium hover:underline underline-offset-2">
Ja-Nein-Generator
</Link>{" "}
besser.
</p>
);
const ADDITIONAL_CONTENT = (
<article className="space-y-4 text-base leading-relaxed text-ink-soft">
<h2 className="font-display text-2xl sm:text-3xl font-semibold text-ink">
Magic 8-Ball online: spielerische Antworten auf deine Frage
</h2>
<p>
Der Magic 8-Ball ist eine spielerische Entscheidungshilfe mit anpassbaren Antworten.
Frage den Ball, schüttle ihn und erhalte eine zufällig ausgewählte Antwort. Mit einer
eigenen Antwortliste kannst du ihn für Spiele, Gruppenfragen oder kleine Impulse
personalisieren.
</p>
<h2 className="font-display text-2xl sm:text-3xl font-semibold text-ink">
Magic 8-Ball, Ja-Nein-Generator oder Münzwurf?
</h2>
<p>
Der Magic 8-Ball passt zu offenen und spielerischen Fragen, weil seine Antworten auch
mehrdeutig sein können. Für eine eindeutige Antwort nutze den <Link href="/ja-nein-generator" className="text-[#c97d60] font-medium hover:underline underline-offset-2">Ja-Nein-Generator</Link>; für Kopf oder Zahl oder zwei frei benannte Optionen eignet sich die <Link href="/muenze-werfen" className="text-[#c97d60] font-medium hover:underline underline-offset-2">Online-Münze</Link>.
</p>
</article>
);
export default function Magic8BallPage() {
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(jsonLd).replace(/</g, "\\u003c"),
}}
/>
<SubpageLayout
toolSlug="magic-8-ball"
toolName="Magic 8-Ball"
h1Title="Magic 8-Ball online fragen zufällige Antworten erhalten"
introText="Der Magic 8-Ball beantwortet deine Frage mit einer zufälligen Antwort aus einer anpassbaren Liste. Stelle deine Frage, schüttle den Ball per Klick und erhalte sofort eine Antwort kostenlos, ohne Anmeldung, direkt im Browser."
steps={STEPS}
examples={EXAMPLES}
vorteileText={VORTEILE}
additionalContent={ADDITIONAL_CONTENT}
faqs={FAQS}
updatedDate={UPDATED}
>
<Magic8Ball />
</SubpageLayout>
</>
);
}

150
app/muenze-werfen/page.tsx Normal file
View File

@@ -0,0 +1,150 @@
import type { Metadata } from "next";
import Link from "next/link";
import CoinFlip from "@/components/tools/coin-flip";
import SubpageLayout from "@/components/subpage-layout";
const SITE_URL = "https://entscheidomat.com";
const PAGE_URL = `${SITE_URL}/muenze-werfen`;
const PAGE_TITLE = "Münze werfen online Kopf oder Zahl entscheiden";
const PAGE_DESCRIPTION =
"Münze online werfen: Die Online-Münze simuliert Kopf oder Zahl mit 3D-Animation und frei beschriftbaren Seiten. Kostenlos und ohne Anmeldung.";
const UPDATED = "23. Juli 2026";
export const metadata: Metadata = {
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
alternates: { canonical: "/muenze-werfen" },
openGraph: { type: "website", locale: "de_DE", siteName: "Entscheidomat", title: PAGE_TITLE, description: PAGE_DESCRIPTION, url: PAGE_URL, images: ["/opengraph-image"] },
twitter: { card: "summary_large_image", title: PAGE_TITLE, description: PAGE_DESCRIPTION, images: ["/twitter-image"] },
};
const FAQS = [
{
q: "Wie entsteht das Ergebnis beim Online-Münzwurf?",
a: "Bei jedem Wurf erzeugt das Tool im Browser einen neuen Zufallswert und zeigt eine der beiden Seiten an. Der Münzwurf ist für spielerische Alltagsentscheidungen gedacht, nicht für verbindliche oder sicherheitskritische Zwecke.",
},
{
q: "Kann ich die Seiten der Münze umbenennen?",
a: "Ja, du kannst beliebige Texte statt „Kopf“ und „Zahl“ verwenden, z. B. „Ja“/„Nein“ oder „Ich“/„Du“ (bis 14 Zeichen pro Seite).",
},
{
q: "Wird mein Wurfverlauf gespeichert?",
a: "Der Verlauf der letzten 10 Würfe wird nur während der aktuellen Sitzung angezeigt. Deine Beschriftungen selbst bleiben dauerhaft lokal im Browser gespeichert.",
},
{
q: "Funktioniert der Münzwurf auch ohne Ton?",
a: "Ja, Sound ist optional und über den Lautsprecher-Button in der Navigation jederzeit abschaltbar.",
},
{
q: "Ersetzt der Münzwurf eine wichtige Entscheidung?",
a: "Nein. Er ist für spielerische Alltagsentscheidungen gedacht nicht für wichtige persönliche, finanzielle oder rechtliche Entscheidungen.",
},
];
const jsonLd = {
"@context": "https://schema.org",
"@graph": [
{
"@type": "BreadcrumbList",
itemListElement: [
{ "@type": "ListItem", position: 1, name: "Entscheidomat", item: SITE_URL },
{ "@type": "ListItem", position: 2, name: "Münze werfen", item: PAGE_URL },
],
},
{
"@type": "WebApplication",
name: "Münze werfen",
url: PAGE_URL,
description: PAGE_DESCRIPTION,
applicationCategory: "UtilitiesApplication",
operatingSystem: "Any (Web-Browser)",
isPartOf: { "@id": `${SITE_URL}/#website` },
offers: { "@type": "Offer", price: "0", priceCurrency: "EUR" },
},
{
"@type": "FAQPage",
mainEntity: FAQS.map((f) => ({
"@type": "Question",
name: f.q,
acceptedAnswer: { "@type": "Answer", text: f.a },
})),
},
],
};
const STEPS = [
"Passe optional die Beschriftung von Vorder- und Rückseite an (bis 14 Zeichen).",
"Tippe auf die Münze oder den Button „Münze werfen“.",
"Die Münze dreht sich in 3D und landet zufällig auf einer Seite.",
"Das Ergebnis erscheint direkt darunter, der Verlauf zeigt die letzten 10 Würfe.",
];
const EXAMPLES = [
"„Wer beginnt das Spiel?“",
"„Kino oder Couch?“",
"Klassisches Kopf-oder-Zahl bei Alltagsentscheidungen",
];
const VORTEILE = (
<p>
Schnell und unkompliziert für binäre Entscheidungen, die freie Beschriftung macht
die Münze vielseitig einsetzbar. Für Entscheidungen mit mehr als zwei Optionen eignet sich eher das{" "}
<Link href="/gluecksrad" className="text-[#c97d60] font-medium hover:underline underline-offset-2">
Glücksrad
</Link>{" "}
oder der{" "}
<Link href="/wuerfel-online" className="text-[#c97d60] font-medium hover:underline underline-offset-2">
Würfel
</Link>
.
</p>
);
const ADDITIONAL_CONTENT = (
<article className="space-y-4 text-base leading-relaxed text-ink-soft">
<h2 className="font-display text-2xl sm:text-3xl font-semibold text-ink">
Münze online werfen oder Ja-Nein-Generator?
</h2>
<p>
Beide Tools helfen bei einer Entscheidung zwischen zwei gleichwertigen Optionen. Wenn
du klassisch Kopf oder Zahl wählen oder die beiden Seiten selbst beschriften möchtest,
passt die Online-Münze. Für eine formulierte Frage mit einer direkten Antwort eignet
sich der <Link href="/ja-nein-generator" className="text-[#c97d60] font-medium hover:underline underline-offset-2">Ja-Nein-Generator</Link> besser.
</p>
<h2 className="font-display text-2xl sm:text-3xl font-semibold text-ink">
Für welche Entscheidungen eignet sich ein Münzwurf?
</h2>
<p>
Einen Münzwurf kannst du nutzen, um eine kleine Pattsituation aufzulösen: Wer beginnt,
Kino oder Couch, bestellen oder kochen. Bei mehr als zwei Optionen ist ein
<Link href="/gluecksrad" className="text-[#c97d60] font-medium hover:underline underline-offset-2"> Glücksrad</Link> übersichtlicher. Für wichtige persönliche, finanzielle, rechtliche oder gesundheitliche Entscheidungen sollte Zufall keine Grundlage sein.
</p>
</article>
);
export default function MuenzeWerfenPage() {
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(jsonLd).replace(/</g, "\\u003c"),
}}
/>
<SubpageLayout
toolSlug="muenze-werfen"
toolName="Münze werfen"
h1Title="Münze werfen online Kopf oder Zahl entscheiden"
introText="Wirf eine Münze online und entscheide zwischen Kopf oder Zahl. Beschrifte beide Seiten frei, starte den Münzwurf per Klick und erhalte sofort ein zufälliges Ergebnis kostenlos und ohne Anmeldung."
steps={STEPS}
examples={EXAMPLES}
vorteileText={VORTEILE}
additionalContent={ADDITIONAL_CONTENT}
faqs={FAQS}
updatedDate={UPDATED}
>
<CoinFlip />
</SubpageLayout>
</>
);
}

143
app/namen-auslosen/page.tsx Normal file
View File

@@ -0,0 +1,143 @@
import type { Metadata } from "next";
import Link from "next/link";
import ListPicker from "@/components/tools/list-picker";
import SubpageLayout from "@/components/subpage-layout";
const SITE_URL = "https://entscheidomat.com";
const PAGE_URL = `${SITE_URL}/namen-auslosen`;
const PAGE_TITLE = "Zufallsgenerator Namen Namen online auslosen";
const PAGE_DESCRIPTION =
"Mit dem Zufallsgenerator für Namen ziehst du Namen oder Optionen zufällig aus deiner Liste für Gewinner, Teams und Aufgaben. Kostenlos und ohne Anmeldung.";
const UPDATED = "23. Juli 2026";
export const metadata: Metadata = {
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
alternates: { canonical: "/namen-auslosen" },
openGraph: { type: "website", locale: "de_DE", siteName: "Entscheidomat", title: PAGE_TITLE, description: PAGE_DESCRIPTION, url: PAGE_URL, images: ["/opengraph-image"] },
twitter: { card: "summary_large_image", title: PAGE_TITLE, description: PAGE_DESCRIPTION, images: ["/twitter-image"] },
};
const FAQS = [
{
q: "Wie viele Namen kann ich eintragen?",
a: "Beliebig viele mindestens 2 sind nötig. Ein Name bzw. Eintrag pro Zeile in das Textfeld eintragen.",
},
{
q: "Was bedeutet „Gezogene Einträge entfernen“?",
a: "Ist die Option aktiviert, wird ein gezogener Eintrag automatisch aus der Liste entfernt (Ziehung ohne Zurücklegen) praktisch für Teameinteilungen oder mehrere Gewinner nacheinander.",
},
{
q: "Werden meine Namen gespeichert oder an einen Server übertragen?",
a: "Deine Liste wird ausschließlich lokal im localStorage deines Browsers gespeichert, nicht an uns übertragen.",
},
{
q: "Kann ich Duplikate in der Liste verwenden?",
a: "Technisch ja ein doppelt eingetragener Name kann dadurch häufiger berücksichtigt werden. Wenn alle Namen gleich behandelt werden sollen, trage jeden Namen nur einmal ein.",
},
{
q: "Eignet sich das Tool für offizielle Gewinnspiele?",
a: "Für lockere, private Ziehungen ist es gut geeignet. Bei rechtlich bindenden Gewinnspielen solltest du eigene Teilnahmebedingungen und mögliche Dokumentationspflichten separat prüfen.",
},
];
const jsonLd = {
"@context": "https://schema.org",
"@graph": [
{
"@type": "BreadcrumbList",
itemListElement: [
{ "@type": "ListItem", position: 1, name: "Entscheidomat", item: SITE_URL },
{ "@type": "ListItem", position: 2, name: "Namen-Auslosung", item: PAGE_URL },
],
},
{
"@type": "WebApplication",
name: "Namen-Auslosung",
url: PAGE_URL,
description: PAGE_DESCRIPTION,
applicationCategory: "UtilitiesApplication",
operatingSystem: "Any (Web-Browser)",
isPartOf: { "@id": `${SITE_URL}/#website` },
offers: { "@type": "Offer", price: "0", priceCurrency: "EUR" },
},
{
"@type": "FAQPage",
mainEntity: FAQS.map((f) => ({
"@type": "Question",
name: f.q,
acceptedAnswer: { "@type": "Answer", text: f.a },
})),
},
],
};
const STEPS = [
"Trage mindestens 2 Namen oder Einträge ein, einen pro Zeile.",
"Aktiviere optional „Gezogene Einträge entfernen“, um ohne Zurücklegen zu ziehen (z. B. für Teameinteilung).",
"Tippe auf „Zufällig ziehen“.",
"Der gezogene Name erscheint groß im Ergebnisfeld, inklusive Konfetti.",
];
const EXAMPLES = [
"Gewinner unter Teilnehmenden auslosen",
"Reihenfolge für eine Präsentation festlegen",
"Teams zufällig zusammenstellen (mehrfach ziehen „ohne Zurücklegen“)",
];
const VORTEILE = (
<p>
Beliebig viele Einträge möglich, flexibel für Namen oder andere Texte. Die Option
ohne Zurücklegen macht wiederholtes Ziehen für Gruppenaufteilungen praktisch. Die
Ziehung nutzt einen browserbasierten Zufallswert eine Gewichtung einzelner Einträge ist nicht möglich.
</p>
);
const ADDITIONAL_CONTENT = (
<article className="space-y-4 text-base leading-relaxed text-ink-soft">
<h2 className="font-display text-2xl sm:text-3xl font-semibold text-ink">
Namen zufällig ziehen für Gewinner, Teams und Reihenfolgen
</h2>
<p>
Der Zufallsgenerator für Namen zieht einen Eintrag aus deiner eigenen Liste. Damit
kannst du einen Gewinner bestimmen, eine Reihenfolge für Präsentationen festlegen oder
Personen fair nacheinander auswählen. Für mehrere Ziehungen aktiviere Gezogene
Einträge entfernen: Dann wird jeder Name nur einmal gezogen.
</p>
<h2 className="font-display text-2xl sm:text-3xl font-semibold text-ink">
So bleibt eine Namen-Auslosung fair
</h2>
<p>
Trage jeden Namen genau einmal ein, wenn alle die gleiche Chance erhalten sollen.
Doppelte Einträge erhöhen die Chance dieses Namens. Für eine Entscheidung zwischen
festen Optionen ist das <Link href="/gluecksrad" className="text-[#c97d60] font-medium hover:underline underline-offset-2">Glücksrad</Link> eine gute Alternative; für eine zufällige Zahl nutze den <Link href="/zufallszahl-generator" className="text-[#c97d60] font-medium hover:underline underline-offset-2">Zufallszahl-Generator</Link>.
</p>
</article>
);
export default function NamenAuslosenPage() {
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(jsonLd).replace(/</g, "\\u003c"),
}}
/>
<SubpageLayout
toolSlug="namen-auslosen"
toolName="Namen-Auslosung"
h1Title="Zufallsgenerator für Namen Namen zufällig auslosen"
introText="Der Zufallsgenerator für Namen zieht einen Eintrag aus deiner eigenen Liste. Trage Namen oder Optionen ein, starte die Ziehung und erhalte sofort ein zufälliges Ergebnis ideal für Gewinner, Teameinteilungen oder Aufgabenverteilung."
steps={STEPS}
examples={EXAMPLES}
vorteileText={VORTEILE}
additionalContent={ADDITIONAL_CONTENT}
faqs={FAQS}
updatedDate={UPDATED}
>
<ListPicker />
</SubpageLayout>
</>
);
}

17
app/opengraph-image.tsx Normal file
View File

@@ -0,0 +1,17 @@
import { ImageResponse } from "next/og";
import { readFile } from "node:fs/promises";
import { join } from "node:path";
import { OgImageContent, ogImageSize } from "@/lib/og-image";
export const alt = "Entscheidomat Lass den Zufall entscheiden";
export const size = ogImageSize;
export const contentType = "image/png";
export const runtime = "nodejs";
export default async function Image() {
const image = await readFile(join(process.cwd(), "public/images/og-decision-tools.jpg"));
const visualSrc = `data:image/jpeg;base64,${image.toString("base64")}`;
return new ImageResponse(<OgImageContent visualSrc={visualSrc} />, size);
}

68
app/page.tsx Normal file
View File

@@ -0,0 +1,68 @@
import type { Metadata } from "next";
import Nav from "@/components/nav";
import Hero from "@/components/hero";
import DirectAnswer from "@/components/direct-answer";
import Playground from "@/components/playground";
import Features from "@/components/features";
import HomepageFaq, { HOMEPAGE_FAQS } from "@/components/homepage-faq";
import Footer from "@/components/footer";
import DeferredScrollFlourishes from "@/components/deferred-scroll-flourishes";
const SITE_URL = "https://entscheidomat.com";
export const metadata: Metadata = {
title: {
absolute: "Entscheidomat Kostenloser Zufallsgenerator & Entscheidungshilfe",
},
description:
"Kostenloser Zufallsgenerator und Entscheidungshilfe für schnelle Alltagsentscheidungen: Ja-Nein-Generator, Glücksrad, Würfel, Münzwurf und mehr direkt im Browser.",
alternates: { canonical: "/" },
};
const jsonLd = {
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebApplication",
name: "Entscheidomat",
url: SITE_URL,
description:
"Kostenloser Zufallsgenerator und digitale Entscheidungshilfe mit sieben Tools: Ja-Nein-Generator, Münze, Glücksrad, Würfel, Zufallszahl, Magic 8-Ball und Listen-Auslosung.",
applicationCategory: "UtilitiesApplication",
operatingSystem: "Any (Web-Browser)",
isPartOf: { "@id": `${SITE_URL}/#website` },
offers: { "@type": "Offer", price: "0", priceCurrency: "EUR" },
},
{
"@type": "FAQPage",
mainEntity: HOMEPAGE_FAQS.map((f) => ({
"@type": "Question",
name: f.q,
acceptedAnswer: { "@type": "Answer", text: f.a },
})),
},
],
};
export default function Home() {
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(jsonLd).replace(/</g, "\\u003c"),
}}
/>
<Nav />
<main className="flex-1">
<Hero />
<DirectAnswer />
<Playground />
<Features />
<HomepageFaq />
</main>
<Footer />
<DeferredScrollFlourishes />
</>
);
}

13
app/robots.ts Normal file
View File

@@ -0,0 +1,13 @@
import type { MetadataRoute } from "next";
const SITE_URL = "https://entscheidomat.com";
export default function robots(): MetadataRoute.Robots {
return {
rules: {
userAgent: "*",
allow: "/",
},
sitemap: `${SITE_URL}/sitemap.xml`,
};
}

33
app/sitemap.ts Normal file
View File

@@ -0,0 +1,33 @@
import type { MetadataRoute } from "next";
import { TOOL_PAGES } from "@/lib/tool-pages";
const SITE_URL = "https://entscheidomat.com";
export default function sitemap(): MetadataRoute.Sitemap {
return [
{
url: SITE_URL,
lastModified: "2026-07-23",
changeFrequency: "weekly",
priority: 1,
},
...TOOL_PAGES.map((t) => ({
url: `${SITE_URL}/${t.slug}`,
lastModified: t.lastModified,
changeFrequency: "monthly" as const,
priority: 0.8,
})),
{
url: `${SITE_URL}/impressum`,
lastModified: "2026-07-23",
changeFrequency: "yearly",
priority: 0.2,
},
{
url: `${SITE_URL}/datenschutz`,
lastModified: "2026-07-23",
changeFrequency: "yearly",
priority: 0.2,
},
];
}

17
app/twitter-image.tsx Normal file
View File

@@ -0,0 +1,17 @@
import { ImageResponse } from "next/og";
import { readFile } from "node:fs/promises";
import { join } from "node:path";
import { OgImageContent, ogImageSize } from "@/lib/og-image";
export const alt = "Entscheidomat Lass den Zufall entscheiden";
export const size = ogImageSize;
export const contentType = "image/png";
export const runtime = "nodejs";
export default async function Image() {
const image = await readFile(join(process.cwd(), "public/images/og-decision-tools.jpg"));
const visualSrc = `data:image/jpeg;base64,${image.toString("base64")}`;
return new ImageResponse(<OgImageContent visualSrc={visualSrc} />, size);
}

165
app/wuerfel-online/page.tsx Normal file
View File

@@ -0,0 +1,165 @@
import type { Metadata } from "next";
import Link from "next/link";
import DiceRoller from "@/components/tools/dice-roller";
import SubpageLayout from "@/components/subpage-layout";
const SITE_URL = "https://entscheidomat.com";
const PAGE_URL = `${SITE_URL}/wuerfel-online`;
const PAGE_TITLE = "Würfel online virtuellen 6-seitigen Würfel werfen";
const PAGE_DESCRIPTION =
"Würfel online direkt im Browser: mit klassischen Augen oder eigenen Texten auf sechs Seiten würfeln. Kostenlos, ohne Anmeldung und sofort nutzbar.";
const UPDATED = "23. Juli 2026";
export const metadata: Metadata = {
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
alternates: { canonical: "/wuerfel-online" },
openGraph: { type: "website", locale: "de_DE", siteName: "Entscheidomat", title: PAGE_TITLE, description: PAGE_DESCRIPTION, url: PAGE_URL, images: ["/opengraph-image"] },
twitter: { card: "summary_large_image", title: PAGE_TITLE, description: PAGE_DESCRIPTION, images: ["/twitter-image"] },
};
const FAQS = [
{
q: "Wie entsteht das Ergebnis beim Online-Würfel?",
a: "Bei jedem Wurf erzeugt das Tool im Browser einen neuen Zufallswert und zeigt eine Würfelseite an. Der Online-Würfel ist für Spiele und spielerische Alltagsentscheidungen gedacht, nicht für verbindliche oder sicherheitskritische Zwecke.",
},
{
q: "Kann ich eigene Texte statt Zahlen verwenden?",
a: "Ja, im Modus „Eigene Texte“ kannst du bis zu 18 Zeichen pro Würfelseite eintragen z. B. für Aufgaben oder Optionen.",
},
{
q: "Werden meine eigenen Würfeltexte gespeichert?",
a: "Ja, lokal im Browser (localStorage). Sie werden nicht an einen Server übertragen und bleiben beim nächsten Besuch erhalten.",
},
{
q: "Kann ich mehrere Würfel gleichzeitig werfen?",
a: "Aktuell simuliert das Tool einen Würfel pro Wurf. Für mehrere Würfe einfach mehrfach hintereinander würfeln.",
},
{
q: "Funktioniert der Würfel auch auf dem Smartphone?",
a: "Ja, das Tool ist vollständig responsiv und funktioniert auf Smartphone, Tablet und Desktop.",
},
{
q: "Wie wahrscheinlich ist jede Seite beim Online-Würfel?",
a: "Bei einem klassischen sechsseitigen Würfel hat jede Zahl von 1 bis 6 bei jedem einzelnen Wurf die gleiche Chance von einem Sechstel. Ein Wurf beeinflusst den nächsten nicht.",
},
{
q: "Wann nutze ich einen Würfel statt Glücksrad oder Ja-Nein-Generator?",
a: "Der Würfel passt für bis zu sechs gleichwertige Optionen, für Brettspiele oder für eigene Aufgaben auf sechs Seiten. Bei zwei Optionen ist der Ja-Nein-Generator schneller; bei mehr als sechs Optionen bietet das Glücksrad mehr Platz und Übersicht.",
},
];
const jsonLd = {
"@context": "https://schema.org",
"@graph": [
{
"@type": "BreadcrumbList",
itemListElement: [
{ "@type": "ListItem", position: 1, name: "Entscheidomat", item: SITE_URL },
{ "@type": "ListItem", position: 2, name: "Würfel Online", item: PAGE_URL },
],
},
{
"@type": "WebApplication",
name: "Würfel Online",
url: PAGE_URL,
description: PAGE_DESCRIPTION,
applicationCategory: "UtilitiesApplication",
operatingSystem: "Any (Web-Browser)",
isPartOf: { "@id": `${SITE_URL}/#website` },
offers: { "@type": "Offer", price: "0", priceCurrency: "EUR" },
},
{
"@type": "FAQPage",
mainEntity: FAQS.map((f) => ({
"@type": "Question",
name: f.q,
acceptedAnswer: { "@type": "Answer", text: f.a },
})),
},
],
};
const STEPS = [
"Wähle zwischen „Zahlen 16“ oder „Eigene Texte“.",
"Bei eigenen Texten: trage bis zu 18 Zeichen pro Seite ein.",
"Tippe auf „Würfeln!“ der Würfel dreht sich in 3D und landet auf einer Seite.",
"Das Ergebnis erscheint direkt darunter.",
];
const EXAMPLES = [
"„Welche Aufgabe mache ich zuerst?“ (6 Aufgaben als eigene Texte)",
"Ersatzwürfel für Brett- und Gesellschaftsspiele",
"Zufallsentscheidung zwischen 6 gleichwertigen Optionen",
];
const VORTEILE = (
<p>
Praktisch als Ersatz für einen echten Würfel, jederzeit griffbereit im Browser.
Für mehr als 6 Optionen eignet sich eher das{" "}
<Link href="/gluecksrad" className="text-[#c97d60] font-medium hover:underline underline-offset-2">
Glücksrad
</Link>{" "}
oder die Listen-Auswahl.
</p>
);
const ADDITIONAL_CONTENT = (
<article className="space-y-4 text-base leading-relaxed text-ink-soft">
<h2 className="font-display text-2xl sm:text-3xl font-semibold text-ink">
Online würfeln: Zufallszahl, Spielhilfe oder sechs Optionen wählen
</h2>
<p>
Ein Online-Würfel simuliert einen klassischen sechsseitigen Würfel direkt im
Browser. Bei jedem Wurf erzeugt das Tool einen neuen browserbasierten Zufallswert und
wählt damit eine Zahl von 1 bis 6 aus. Das macht den virtuellen
Würfel zu einem praktischen Ersatz, wenn kein echter Würfel zur Hand ist etwa
bei Brettspielen, unterwegs oder beim spontanen Entscheiden in einer Gruppe.
</p>
<p>
Besonders flexibel wird der Würfel mit eigenen Texten. Statt Zahlen kannst du
sechs Aufgaben, Aktivitäten oder Namen eintragen und eine Option auslosen:
kochen, aufräumen, spazieren, spielen, lesen oder Pause. Für eine
gleich behandelte Auswahl sollte jeder Eintrag nur auf einer Seite stehen. Sind die Optionen
unterschiedlich wichtig oder sollen manche öfter vorkommen, bildet ein einfacher
Würfel diese Gewichtung nicht ab. Dann solltest du die Auswahl vorher bewusst
festlegen statt ein zufälliges Ergebnis als objektiv zu behandeln.
</p>
<p>
Der Würfel eignet sich am besten für bis zu sechs gleichwertige Möglichkeiten.
Für genau zwei Antworten liefern der Ja-Nein-Generator oder ein Münzwurf ein
klareres Ergebnis. Für sieben bis zwölf Optionen ist ein Glücksrad besser
lesbar, und für lange Namenslisten hilft die Namen-Auslosung. Wie bei allen
Zufallstools gilt: Für Spiele und kleine Alltagsfragen ist der Würfel ideal;
Entscheidungen mit gesundheitlichen, rechtlichen oder finanziellen Folgen
solltest du nicht an einen Zufallswert delegieren.
</p>
</article>
);
export default function WuerfelOnlinePage() {
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(jsonLd).replace(/</g, "\\u003c"),
}}
/>
<SubpageLayout
toolSlug="wuerfel-online"
toolName="Würfel Online"
h1Title="Würfel online werfen dein virtueller 6-seitiger Würfel"
introText="Der virtuelle Würfel simuliert einen echten 6-seitigen Würfel direkt im Browser. Wähle zwischen klassischen Würfelaugen oder eigenen Texten auf den sechs Seiten und würfle mit einem Klick kostenlos und ohne Anmeldung."
steps={STEPS}
examples={EXAMPLES}
vorteileText={VORTEILE}
additionalContent={ADDITIONAL_CONTENT}
faqs={FAQS}
updatedDate={UPDATED}
>
<DiceRoller />
</SubpageLayout>
</>
);
}

View File

@@ -0,0 +1,149 @@
import type { Metadata } from "next";
import Link from "next/link";
import RandomNumber from "@/components/tools/random-number";
import SubpageLayout from "@/components/subpage-layout";
const SITE_URL = "https://entscheidomat.com";
const PAGE_URL = `${SITE_URL}/zufallszahl-generator`;
const PAGE_TITLE = "Zufallszahl-Generator Zahl im Wunschbereich erzeugen";
const PAGE_DESCRIPTION =
"Zufallszahl-Generator mit frei wählbarem Zahlenbereich. Minimum und Maximum eintragen, generieren, Ergebnis erhalten kostenlos, ohne Anmeldung.";
const UPDATED = "23. Juli 2026";
export const metadata: Metadata = {
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
alternates: { canonical: "/zufallszahl-generator" },
openGraph: { type: "website", locale: "de_DE", siteName: "Entscheidomat", title: PAGE_TITLE, description: PAGE_DESCRIPTION, url: PAGE_URL, images: ["/opengraph-image"] },
twitter: { card: "summary_large_image", title: PAGE_TITLE, description: PAGE_DESCRIPTION, images: ["/twitter-image"] },
};
const FAQS = [
{
q: "Kann ich auch negative Zahlen oder sehr große Bereiche eingeben?",
a: "Ja, Minimum und Maximum sind frei wählbare Zahlen. Die Reihenfolge der Eingabe spielt keine Rolle, das Tool sortiert automatisch.",
},
{
q: "Werden auch Dezimalzahlen unterstützt?",
a: "Nein, aktuell erzeugt der Generator ausschließlich ganze Zahlen innerhalb des gewählten Bereichs.",
},
{
q: "Wie entsteht die Zufallszahl?",
a: "Bei jeder Anfrage erzeugt das Tool im Browser einen neuen Zufallswert und leitet daraus eine ganze Zahl im gewählten Bereich ab. Der Generator ist für spielerische und alltägliche Zwecke gedacht, nicht für sicherheitskritische oder verbindliche Anwendungen.",
},
{
q: "Werden meine Einstellungen für Minimum und Maximum gespeichert?",
a: "Ja, lokal im localStorage deines Browsers. Sie werden nicht an einen Server übertragen.",
},
{
q: "Kann ich mehrere Zahlen hintereinander generieren?",
a: "Ja, beliebig oft einfach erneut auf „Zahl generieren“ tippen.",
},
];
const jsonLd = {
"@context": "https://schema.org",
"@graph": [
{
"@type": "BreadcrumbList",
itemListElement: [
{ "@type": "ListItem", position: 1, name: "Entscheidomat", item: SITE_URL },
{ "@type": "ListItem", position: 2, name: "Zufallszahl-Generator", item: PAGE_URL },
],
},
{
"@type": "WebApplication",
name: "Zufallszahl-Generator",
url: PAGE_URL,
description: PAGE_DESCRIPTION,
applicationCategory: "UtilitiesApplication",
operatingSystem: "Any (Web-Browser)",
isPartOf: { "@id": `${SITE_URL}/#website` },
offers: { "@type": "Offer", price: "0", priceCurrency: "EUR" },
},
{
"@type": "FAQPage",
mainEntity: FAQS.map((f) => ({
"@type": "Question",
name: f.q,
acceptedAnswer: { "@type": "Answer", text: f.a },
})),
},
],
};
const STEPS = [
"Trage Minimum und Maximum ein die Reihenfolge ist egal.",
"Tippe auf „Zahl generieren“.",
"Eine Zufallszahl im gewählten Bereich erscheint mit kurzer Animation.",
"Passe den Zahlenraum jederzeit an und generiere erneut.",
];
const EXAMPLES = [
"Losnummern für eine Verlosung ziehen",
"„Wie viele Liegestütze mache ich?“",
"Zufällige Teamnummer oder Startreihenfolge vergeben",
];
const VORTEILE = (
<p>
Beliebiger Zahlenbereich möglich, auch mit negativen Zahlen. Der Generator erzeugt
ausschließlich ganze Zahlen für Entscheidungen zwischen benannten Optionen eignen sich eher das{" "}
<Link href="/gluecksrad" className="text-[#c97d60] font-medium hover:underline underline-offset-2">
Glücksrad
</Link>{" "}
oder die{" "}
<Link href="/namen-auslosen" className="text-[#c97d60] font-medium hover:underline underline-offset-2">
Namen-Auslosung
</Link>
.
</p>
);
const ADDITIONAL_CONTENT = (
<article className="space-y-4 text-base leading-relaxed text-ink-soft">
<h2 className="font-display text-2xl sm:text-3xl font-semibold text-ink">
Zufallszahl im gewünschten Bereich erzeugen
</h2>
<p>
Lege Minimum und Maximum fest, um eine ganze Zufallszahl aus genau diesem Bereich zu
erhalten. Das ist praktisch für Startnummern, kleine Spielaufgaben oder eine zufällige
Reihenfolge. Negative Zahlen sind ebenfalls möglich; die Reihenfolge deiner Eingaben
spielt keine Rolle.
</p>
<h2 className="font-display text-2xl sm:text-3xl font-semibold text-ink">
Wann passt eine Zufallszahl und wann ein anderes Tool?
</h2>
<p>
Nutze diesen Generator, wenn das Ergebnis eine Zahl sein soll. Möchtest du stattdessen
Namen oder Texte ziehen, ist die <Link href="/namen-auslosen" className="text-[#c97d60] font-medium hover:underline underline-offset-2">Namen-Auslosung</Link> passender. Bei mehreren sichtbaren Optionen hilft ein <Link href="/gluecksrad" className="text-[#c97d60] font-medium hover:underline underline-offset-2">Glücksrad</Link> dabei, die Auswahl gemeinsam nachzuvollziehen.
</p>
</article>
);
export default function ZufallszahlGeneratorPage() {
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(jsonLd).replace(/</g, "\\u003c"),
}}
/>
<SubpageLayout
toolSlug="zufallszahl-generator"
toolName="Zufallszahl-Generator"
h1Title="Zufallszahl-Generator Zahl im Wunschbereich erzeugen"
introText="Der Zufallszahl-Generator erzeugt eine zufällige Ganzzahl in einem selbst gewählten Bereich. Trage Minimum und Maximum ein, generiere die Zahl per Klick und erhalte sofort ein zufälliges Ergebnis kostenlos, ohne Anmeldung, direkt im Browser."
steps={STEPS}
examples={EXAMPLES}
vorteileText={VORTEILE}
additionalContent={ADDITIONAL_CONTENT}
faqs={FAQS}
updatedDate={UPDATED}
>
<RandomNumber />
</SubpageLayout>
</>
);
}