all-right-LLC/keydrop
all-right-LLC/keydrop has 21 GitHub stars and 5 forks. GitHot measured +2 stars in 24 hours. Last checked 2026-11-14 10:09 UTC. Last push 2026-11-10.
What you can do
- Four code kinds: redemption, discount, license (online activation with per-device limits) and external-platform codes
- Generate, import (.xlsx / CSV with column mapping and preview) and sync Stripe promotion codes
- AES-GCM encryption at rest, exact-match search, export, revoke / restore, expiry and per-code usage limits
- Unique or shared codes, with shared-claim limits across campaigns and sales
Gemessener Sternzuwachs
- in 24h
- +2
- in 7 days
- Verlauf wird gesammelt
- in 15 days
- Verlauf wird gesammelt
- in 1 month
- Verlauf wird gesammelt
Nettoänderungen in überlappenden Zeiträumen, keine Tagessummen. Fehlende Messwerte bleiben leer. Sterne zeigen Interesse, nicht Qualität.
Über uns
Self-hosted code distribution for indie developers: redemption codes, discount codes and license keys on your own Cloudflare Workers + D1.
Selbst gehostetREADME.de.md
Original
English · 繁體中文 · 简体中文 · 日本語 · 한국어 · Italiano · Deutsch · العربية
Selbst gehostete Code-Verteilung für Indie-Entwickler. Verwalte und verteile Einlösecodes, Rabattcodes, Lizenzschlüssel und App-Store-Promo-Codes aus deinem eigenen Cloudflare-Konto – kostenlose Claim-Kampagnen, Stripe Checkout, Berechtigungen, eine API, Webhooks und ein MCP-Server, alles in einer kleinen Next.js-App.
Status: vor 1.0. Die Kernabläufe laufen auf Cloudflare durchgängig, aber rechne vor 1.0 mit Breaking Changes. Teste es in deiner eigenen Umgebung, bevor du dich bei echten Verkäufen darauf verlässt.

![]() |
![]() |
![]() |
![]() |
Warum Keydrop
Du hast eine App gebaut und jetzt eine Tabelle voller Promo-Codes, ein paar hundert Lizenzschlüssel und ein Stripe-Konto. Keydrop gibt diesen Codes ein Zuhause:
- Ein Bestand für jede Art von Code – erzeuge Codes, importiere sie aus CSV/Excel (App-Store-Angebotscodes, Partner-Schlüssel, Stripe-Promotion-Codes) und speichere sie verschlüsselt.
- Verteile sie, wie du es brauchst – öffentliche oder private Claim-Seiten mit Teilnahmeregeln, bezahlter Checkout über Stripe, direkte Zuweisung, Verteilung per E-Mail oder eine handyfreundliche Quick handout-Seite, um jemandem im Chat einen Code zu geben.
- Wisse, wer was hat – jeder Claim, jede Bestellung, jede Ausgabe und jede Einlösung wird protokolliert; widerrufe Codes, fordere Berechtigungen zurück und bearbeite Rückerstattungen, ohne den Verlauf zu verlieren.
- Binde es in dein Produkt ein – API-Tokens mit eingeschränkten Rechten, eine REST-API, signierte Webhooks und ein MCP-Server, damit dein Backend oder deine KI-Agenten Codes ausgeben und prüfen können.
- Du betreibst es selbst – MIT-lizenziert, ein einzelner Administrator, wird in deine eigenen Cloudflare Workers + D1 deployt. Kein gehosteter Dienst, keine Gebühren pro Code.
Funktionen
Codes & Bestand
- Vier Code-Arten: Einlösecodes, Rabattcodes, Lizenzen (Online-Aktivierung mit Gerätelimits) und Codes externer Plattformen
- Erzeugen, Importieren (.xlsx / CSV mit Spaltenzuordnung und Vorschau) und Synchronisieren von Stripe-Promotion-Codes
- AES-GCM-Verschlüsselung im Ruhezustand, Suche nach exakter Übereinstimmung, Export, Widerrufen / Wiederherstellen, Ablaufdatum und Nutzungslimits pro Code
- Eindeutige oder gemeinsam genutzte Codes, mit Limits für gemeinsame Claims über Kampagnen und Verkäufe hinweg
Verteilung
- Claim-Kampagnen: öffentliche oder private Links, anonym / mit verifizierter E-Mail / nur mit Konto, Limits pro Person und insgesamt, verschachtelte UND/ODER-Teilnahmeregeln (Zeitfenster, Passphrasen, Einladungen, Kaufhistorie, deine eigene HTTP-Prüfung)
- Stripe Checkout: ein Code pro Kauf, Rabatte, Rückerstattungen, die den Code widerrufen können, und drei Strategien bei fehlendem Bestand (Rückerstattung, manuelle Erfüllung, automatische Erfüllung nach Nachschub)
- Direkte Zuweisung und Verteilung per E-Mail an Personen, die noch kein Konto haben
- Quick handout – eine Mobile-First-Seite, um einen Code zu nehmen, ihn zu teilen (inklusive drei teilbarer Bildkarten, die auf dem Gerät gezeichnet werden) und zu notieren, wer ihn bekommen hat; lässt sich auf dem Startbildschirm installieren
Belohnungen & Berechtigungen
- Integrierte Mitgliedschaften (befristet oder dauerhaft) und Guthabenkonten mit idempotenten APIs zum Abbuchen / Erstatten
- Wiederholte Belohnungen addieren, ersetzen oder ablehnen; ungenutzte Berechtigungen zurückfordern, wenn ein Code widerrufen wird
- Externe Belohnungen, die an deinen eigenen Dienst geliefert werden, mit manueller Prüfung, wenn das Ergebnis unklar ist
Integrationen
- REST-API und ein MCP-Server mit fein granularen, produktbezogenen Tokens (MCP ist standardmäßig schreibgeschützt)
- Signierte ausgehende Webhooks mit Wiederholungsversuchen
- Optional Cloudflare Email Sending für die Anmeldung per Einmalcode, Code-E-Mails und Admin-Benachrichtigungen
Admin-Konsole
- Dashboard im SaaS-Stil mit Aktivitätsdiagrammen, ⌘K-Befehlspalette, hellem / dunklem Design und mobilem Layout, gebaut mit beUI-Komponenten
- Oberfläche auf English, 简体中文, 繁體中文, 日本語, 한국어, Italiano, Deutsch und العربية (Rechts-nach-links wird unterstützt); die Sprache folgt dem Browser des Besuchers und lässt sich jederzeit umschalten
Tech-Stack
Next.js (App Router) auf Cloudflare Workers via OpenNext · Cloudflare D1 · Better Auth · Stripe (optional) · next-intl · beUI + Tailwind CSS
Schnellstart
Auf Cloudflare deployen
Klicke oben auf Deploy to Cloudflare. Cloudflare kopiert den Ordner
apps/webin ein neues Repository in deinem GitHub-Konto und legt einen Worker und eine D1-Datenbank an.Fülle die abgefragten Einstellungen aus:
Name Was du einträgst APP_URLDer HTTPS-Origin der Seite, z. B. https://keydrop.your-subdomain.workers.dev(ohne abschließenden Schrägstrich)ADMIN_EMAILDie E-Mail-Adresse des einzigen Administrators BETTER_AUTH_SECRETEin zufälliges Secret, z. B. openssl rand -hex 32SETUP_SECRETEin weiteres zufälliges Secret, das einmalig auf der Setup-Seite verwendet wird CODE_ENCRYPTION_KEY64 Hex-Zeichen, z. B. openssl rand -hex 32– sichere diesen Wert; geht er verloren, sind vorhandene Codes nicht mehr lesbarVerwende für jedes Secret einen anderen Wert. Lass den Build-Befehl leer und setze den Deploy-Befehl auf
pnpm run deploy.Öffne
APP_URL/setup, gibSETUP_SECRETein und wähle das Administrator-Passwort. Melde dich dann an und lege dein erstes Produkt an.
Der kostenlose Kern (Codes, Kampagnen, Claims) braucht nichts weiter. Stripe und Email Sending kannst du später hinzufügen, wenn du sie brauchst.
Lokal ausführen
Benötigt Node.js 24+ und pnpm.
cd apps/web
pnpm install --frozen-lockfile
node scripts/create-local-env.mjs "$HOME/.config/keydrop/local.env" [email protected]
pnpm run db:migrate
KEYDROP_DEV_ENV_FILE="$HOME/.config/keydrop/local.env" pnpm dev
Öffne http://localhost:3000/setup und verwende das SETUP_SECRET aus der erzeugten Datei (liegt außerhalb des Repositorys und wird nie im Terminal ausgegeben).
Manuell deployen
cd apps/web
pnpm exec wrangler login
pnpm exec wrangler d1 create keydrop # Datenbank-ID in wrangler.jsonc eintragen
# Worker-Namen, APP_URL und ADMIN_EMAIL in wrangler.jsonc setzen, dann:
pnpm exec wrangler secret put BETTER_AUTH_SECRET
pnpm exec wrangler secret put SETUP_SECRET
pnpm exec wrangler secret put CODE_ENCRYPTION_KEY
pnpm run deploy # baut, wendet D1-Migrationen an, deployt
Konfiguration
| Einstellung | Typ | Erforderlich | Zweck |
|---|---|---|---|
APP_URL, ADMIN_EMAIL |
var | ja | Öffentlicher Origin und Administrator-E-Mail |
BETTER_AUTH_SECRET, SETUP_SECRET, CODE_ENCRYPTION_KEY |
secret | ja | Sessions und Identitäts-Hashing, einmaliges Setup, Code-Verschlüsselung |
STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET |
secret | für Verkäufe | Stripe Checkout und der Webhook unter /api/stripe/webhook |
EMAIL binding + EMAIL_FROM |
binding / var | für E-Mail | Cloudflare Email Sending: OTP-Anmeldung, Code-E-Mails, Admin-Benachrichtigungen |
WEBHOOK_SECRETS |
secret | für Webhooks | Signatur-Secrets für ausgehende Webhooks |
ELIGIBILITY_SECRETS, EXTERNAL_REWARD_SECRETS |
secret | optional | Signatur-Secrets für deine eigenen Teilnahmeprüfungen und Empfänger externer Belohnungen |
KEYDROP_TELEMETRY |
var | standardmäßig an | Einmaliger anonymer Ping (zufällige ID + Version) nach der Einrichtung, nur zum Zählen der Installationen; mit off deaktivieren. Details |
Ein Cron-Trigger läuft alle fünf Minuten, um Reservierungen ablaufen zu lassen, Nachbestellungen zu erfüllen, wartende E-Mails zu senden und Webhooks zuzustellen. Führe nach dem Bearbeiten von wrangler.jsonc pnpm run cf-typegen aus.
Funktionsschalter (öffentliche Seiten, „My codes“, Admin-Benachrichtigungen per E-Mail) liegen in apps/web/src/config/site.ts; Branding und alle Texte liegen in apps/web/messages/<locale>.json.
Mach es zu deinem
Alles, was ein typisches Deployment anpasst, liegt in einer Handvoll Dateien. Wenn du deine Änderungen dort hältst, kannst du Upstream-Updates später leichter übernehmen.
| Was du ändern willst | Wo (in apps/web/) |
|---|---|
| Markenname, Texte der Startseite und anderer Seiten, E-Mail-Texte | messages/<locale>.json: common.brand, home, publicSite, email (ändere denselben Schlüssel in jeder Sprache, die du auslieferst) |
| Abschnitte der Startseite und ihre Reihenfolge, optionale öffentliche Seiten, Schalter für „My codes“ und Admin-Benachrichtigungen | src/config/site.ts |
| „Powered by Keydrop“-Link im Footer und GitHub-Links (unter MIT optional, du kannst sie abschalten) | src/config/site.ts: poweredBy.enabled, publicSite.repositoryUrl |
| Layout und Grafiken der Startseite | src/components/site/landing/sections.tsx, src/components/site/landing/hero-visual.tsx, src/app/page.tsx |
| Funktionsseite und optionale Seiten (Doku, Preise, Demo, Changelog) | src/app/features/page.tsx, src/app/[section]/page.tsx |
| Logo, Favicon und App-Icons | src/components/site/brand-logo.tsx, public/brand/, public/favicon.svg, src/app/favicon.ico, public/icons/, public/handout.webmanifest |
| Farben und helles / dunkles Theme | src/app/globals.css (die :root-Tokens und --brand-accent) |
| Vorschaubild für soziale Netzwerke | Wird bei jedem Build von scripts/generate-share-image.mjs aus der Wortmarke und den home-Texten erzeugt |
| Sprachen der Oberfläche | src/i18n/locales.ts plus eine Datei pro Sprache in messages/ |
| Worker-Name, öffentliche URL, Cron-Zeitplan, Bindings | wrangler.jsonc (danach pnpm run cf-typegen ausführen) |
Produkte, Preise, Kampagnen, Teilnahmeregeln, E-Mail-Versand und API-Tokens verwaltest du im Dashboard, nicht im Code.
Ändere Folgendes nur, wenn du weißt, warum: migrations/ (neue Dateien hinzufügen, bestehende nie bearbeiten), src/lib/server/ (Authentifizierung, Verschlüsselung, Zahlungs- und Bestandsregeln) und src/components/motion/ (beUI-Komponenten; aktualisiere sie stattdessen aus dem Upstream).
Dokumentation
Die vollständigen Anleitungen liegen in docs/api auf Englisch, 繁體中文 und 简体中文. Eine deutsche Fassung gibt es nicht; die folgenden Links führen zur englischen Version:
- Deployment, Backup & Wiederherstellung · Lokale Entwicklung · Anpassung & Admin-Konsole
- Authentifizierung & API-Tokens · MCP · Webhooks
- Kampagnenbedingungen · Teilnahme-Hooks · Berechtigungen & Guthaben · Lizenzen
- Stripe · Stripe-Rabatte · E-Mail · Quick handout
Übersetzungen
Die Oberfläche gibt es in acht Sprachen. Öffentliche Seiten haben außerdem Sprach-URLs wie /ja/features mit passenden hreflang-Tags und Sitemap-Einträgen, und E-Mails werden in der Sprache des jeweiligen Empfängers verschickt. Jede Sprache ist eine JSON-Datei in apps/web/messages mit genau denselben Schlüsseln wie en.json; ein Test prüft, dass jede Übersetzung dieselben Schlüssel und dieselben ICU-Platzhalter hat. Um eine Sprache hinzuzufügen, trag ihren Code in src/i18n/locales.ts ein und lege die passende JSON-Datei an. Korrekturen von Muttersprachlern sind sehr willkommen.
Entwicklung
cd apps/web
pnpm run lint
pnpm run typecheck
pnpm test # Unit- und Integrationstests gegen echtes SQLite + Migrationen
pnpm run build:worker # Produktions-Build des Workers
Die CI führt dieselben Prüfungen auf Node.js 24 und 26 aus, dazu ein frisches lokales D1-Setup, das Codes durchgängig claimt. Lies CONTRIBUTING.md, bevor du einen Pull Request öffnest, und SECURITY.md, um eine Sicherheitslücke zu melden.
Lizenz
MIT © all right LLC. Die mitgelieferten beUI-Komponenten behalten ihre ursprüngliche MIT-Lizenz (apps/web/vendor/beui.LICENSE).
Danksagung
Keydrop steht auf den Schultern dieser Projekte. Danke an alle, die sie bauen und pflegen:
- Next.js und React: das App-Framework
- OpenNext for Cloudflare, Cloudflare Workers, D1 und Wrangler: Hosting, Datenbank und Deployment
- Better Auth: Anmeldung, Sitzungen und E-Mail-Einmalcodes
- Stripe: Zahlungen
- next-intl und FormatJS: Übersetzungen und Nachrichtenprüfung
- beUI, Tailwind CSS, Motion, Lucide, Floating UI, TanStack Virtual, next-themes, clsx und tailwind-merge: die Oberfläche
- Zod: Eingabevalidierung
- Kysely und kysely-d1: Datenbankzugriff für Better Auth
- Model Context Protocol TypeScript SDK: der MCP-Server
- SheetJS: Excel-Import
- Geist und Poppins: Schriften für Oberfläche und Logo
- Vitest, TypeScript und ESLint: Tests und Tooling
Ähnliche Projekte entdecken
awesome-selfhosted/awesome-selfhosted
Eine Liste von Netzwerkdiensten und Webanwendungen aus Freier Software, die auf eigenen Servern gehostet werden können.
336,891 Sterneimmich-app/immich
Leistungsstarke, selbst gehostete Lösung zur Verwaltung von Fotos und Videos.
119,135 SterneStirling-Tools/Stirling-PDF
Die PDF-Anwendung Nr. 1 auf GitHub, mit der sich PDFs auf jedem Gerät und überall bearbeiten lassen.
96,552 Sternelouislam/uptime-kuma
Ein schickes, selbst gehostetes Monitoring-Tool
94,019 Sterne


