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.
できること
- 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
計測したスター増加
- 24時間
- +2
- 7日間
- 履歴を収集中
- 15日間
- 履歴を収集中
- 1か月
- 履歴を収集中
期間ごとの純増数です。期間は重複しており、日別の値ではありません。未計測の値は空欄です。スター数は注目度の指標であり、品質の保証ではありません。
概要
Self-hosted code distribution for indie developers: redemption codes, discount codes and license keys on your own Cloudflare Workers + D1.
セルフホストREADME.ja.md
オリジナル
English · 繁體中文 · 简体中文 · 日本語 · 한국어 · Italiano · Deutsch · العربية
個人開発者のためのセルフホスト型コード配布ツールです。 引き換えコード、割引コード、ライセンスキー、App Store プロモーションコードを、ご自身の Cloudflare アカウント上で管理・配布できます。無料の配布キャンペーン、Stripe 決済、利用権、API、Webhook、MCP サーバーを、ひとつの小さな Next.js アプリにまとめました。
ステータス: 1.0 未満です。主要なフローは Cloudflare 上でエンドツーエンドに動作しますが、1.0 までは互換性のない変更が入る可能性があります。実際の販売に使う前に、ご自身の環境で十分にテストしてください。

![]() |
![]() |
![]() |
![]() |
Keydrop を選ぶ理由
アプリを作ったら、手元にはプロモーションコードのスプレッドシート、数百件のライセンスキー、そして Stripe アカウントが残ります。Keydrop はそれらのコードの置き場所になります。
- あらゆる種類のコードをひとつの在庫で管理 — コードを生成したり、CSV/Excel(App Store のオファーコード、パートナーのキー、Stripe のプロモーションコード)からインポートしたりでき、保存時は暗号化されます。
- 必要な方法で配布 — 参加条件付きの公開/非公開の受け取りページ、Stripe による有料決済、直接割り当て、メール配布、チャットで相手にコードを渡すためのスマートフォン向け Quick handout ページに対応しています。
- 誰が何を持っているかを把握 — 受け取り、注文、手渡し、引き換えはすべて記録されます。履歴を失わずに、コードの取り消し、利用権の回収、返金の処理ができます。
- プロダクトに組み込める — スコープ付き API トークン、REST API、署名付き Webhook、MCP サーバーにより、バックエンドや AI エージェントからコードの発行や確認ができます。
- 自分で運用できる — MIT ライセンス、管理者は 1 人、ご自身の Cloudflare Workers + D1 にデプロイします。ホスティングサービスもコードごとの手数料もありません。
機能
コードと在庫
- 4 種類のコード:引き換えコード、割引コード、ライセンス(デバイス数制限付きのオンラインアクティベーション)、外部プラットフォームのコード
- 生成、インポート(列のマッピングとプレビュー付きの .xlsx / CSV)、Stripe プロモーションコードの同期
- AES-GCM による保存時の暗号化、完全一致検索、エクスポート、取り消し/復元、有効期限、コードごとの使用回数制限
- 一意のコードと共有コード。共有コードはキャンペーンや販売をまたいで受け取り上限を設定できます
配布
- 配布キャンペーン:公開/非公開リンク、匿名/メール認証済み/アカウント限定、1 人あたりと全体の上限、ネストした AND/OR の参加条件(期間、合言葉、招待、購入履歴、独自の HTTP チェック)
- Stripe Checkout:1 回の購入につき 1 コード、割引、コードを取り消せる返金、3 種類の在庫切れ対応(返金、手動での発送、補充後の自動発送)
- まだアカウントを持っていない相手への直接割り当てとメール配布
- Quick handout — コードを取り出して共有し(端末上で描画する 3 種類の共有用画像カードを含む)、誰に渡したかを記録できるモバイルファーストのページ。ホーム画面に追加できます
特典と利用権
- 組み込みのメンバーシップ(期間限定または永久)と、冪等な消費/返却 API を備えたクレジット台帳
- 重複した特典は累積・上書き・拒否から選択。コードを取り消した際は未使用の利用権を回収
- 外部特典はご自身のサービスに届けられ、結果が不明な場合は手動で確認できます
連携
- 細かい権限をプロダクト単位で設定できるトークンを使う REST API と MCP サーバー(MCP はデフォルトで読み取り専用)
- 再試行付きの署名付き送信 Webhook
- 任意で Cloudflare Email Sending を利用し、ワンタイムコードでのサインイン、コードのメール送信、管理者向け通知に対応
管理コンソール
- アクティビティグラフ、⌘K コマンドパレット、ライト/ダークテーマ、モバイルレイアウトを備えた SaaS 風ダッシュボード。beUI コンポーネントで構築しています
- インターフェースは English、简体中文、繁體中文、日本語、한국어、Italiano、Deutsch、العربية に対応(右から左への表示もサポート)。言語は訪問者のブラウザ設定に従い、いつでも切り替えられます
技術スタック
Next.js(App Router)on Cloudflare Workers(OpenNext 経由) · Cloudflare D1 · Better Auth · Stripe(任意) · next-intl · beUI + Tailwind CSS
クイックスタート
Cloudflare にデプロイ
上の Deploy to Cloudflare をクリックします。Cloudflare が
apps/webフォルダーをご自身の GitHub アカウントの新しいリポジトリにコピーし、Worker と D1 データベースを作成します。求められる設定を入力します。
名前 入力内容 APP_URLサイトの HTTPS オリジン。例: https://keydrop.your-subdomain.workers.dev(末尾のスラッシュなし)ADMIN_EMAIL唯一の管理者のメールアドレス BETTER_AUTH_SECRETランダムなシークレット。例: openssl rand -hex 32SETUP_SECRET別のランダムなシークレット。セットアップページで一度だけ使います CODE_ENCRYPTION_KEY16 進数 64 文字。例: openssl rand -hex 32— 必ずバックアップしてください。失うと既存のコードが読めなくなりますシークレットにはそれぞれ異なる値を使ってください。ビルドコマンドは空欄のままにし、デプロイコマンドを
pnpm run deployに設定します。APP_URL/setupを開いてSETUP_SECRETを入力し、管理者パスワードを設定します。その後サインインして、最初のプロダクトを作成します。
無料のコア機能(コード、キャンペーン、受け取り)はこれだけで使えます。Stripe と Email Sending は必要になったら後から追加できます。
ローカルで実行
Node.js 24 以上と 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
http://localhost:3000/setup を開き、生成されたファイルの SETUP_SECRET を使ってください(このファイルはリポジトリの外に置かれ、ターミナルには表示されません)。
手動でデプロイ
cd apps/web
pnpm exec wrangler login
pnpm exec wrangler d1 create keydrop # データベース ID を wrangler.jsonc に記入します
# wrangler.jsonc に Worker 名、APP_URL、ADMIN_EMAIL を設定してから:
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 # ビルド、D1 マイグレーションの適用、デプロイ
設定
| 設定 | 種類 | 必須 | 用途 |
|---|---|---|---|
APP_URL, ADMIN_EMAIL |
var | はい | 公開オリジンと管理者のメールアドレス |
BETTER_AUTH_SECRET, SETUP_SECRET, CODE_ENCRYPTION_KEY |
secret | はい | セッションと ID のハッシュ化、初回セットアップ、コードの暗号化 |
STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET |
secret | 販売時 | Stripe Checkout と /api/stripe/webhook の Webhook |
EMAIL バインディング + EMAIL_FROM |
binding / var | メール利用時 | Cloudflare Email Sending:OTP サインイン、コードのメール送信、管理者向け通知 |
WEBHOOK_SECRETS |
secret | Webhook 利用時 | 送信 Webhook の署名シークレット |
ELIGIBILITY_SECRETS, EXTERNAL_REWARD_SECRETS |
secret | 任意 | 独自の参加条件チェックと外部特典の受信先で使う署名シークレット |
KEYDROP_TELEMETRY |
var | 既定で有効 | 初期設定完了時に 1 回だけ送る匿名通知(ランダム ID+バージョン)。インストール数の集計にのみ使います。off で無効化。詳細 |
Cron トリガーが 5 分ごとに実行され、予約の期限切れ処理、入荷待ち注文の発送、キューに入ったメールの送信、Webhook の配信を行います。wrangler.jsonc を編集したら pnpm run cf-typegen を実行してください。
機能の切り替え(公開ページ、「My codes」、管理者向け通知メール)は apps/web/src/config/site.ts にあり、ブランディングとすべての文言は apps/web/messages/<locale>.json にあります。
自分のものにする
一般的なデプロイで変更する箇所は、ごく少数のファイルにまとまっています。変更をそこに留めておくと、あとで上流の更新を取り込みやすくなります。
| 変更したいもの | 場所(apps/web/ 内) |
|---|---|
| ブランド名、ホームページとページの文言、メール本文 | messages/<locale>.json:common.brand、home、publicSite、email(提供するすべての言語で同じキーを編集してください) |
| ホームページのセクションと並び順、任意の公開ページ、「My codes」と管理者向け通知の切り替え | src/config/site.ts |
| フッターの「Powered by Keydrop」リンクと GitHub リンク(MIT では任意。オフにできます) | src/config/site.ts: poweredBy.enabled, publicSite.repositoryUrl |
| ホームページのレイアウトとビジュアル | src/components/site/landing/sections.tsx、src/components/site/landing/hero-visual.tsx、src/app/page.tsx |
| 機能ページと任意のページ(ドキュメント、料金、デモ、変更履歴) | src/app/features/page.tsx、src/app/[section]/page.tsx |
| ロゴ、ファビコン、アプリアイコン | src/components/site/brand-logo.tsx、public/brand/、public/favicon.svg、src/app/favicon.ico、public/icons/、public/handout.webmanifest |
| 色とライト/ダークテーマ | src/app/globals.css(:root のトークンと --brand-accent) |
| SNS 共有用画像 | ビルドのたびに scripts/generate-share-image.mjs がワードマークと home の文言から生成します |
| インターフェースの言語 | src/i18n/locales.ts と、messages/ 内の言語ごとのファイル |
| Worker 名、公開 URL、Cron スケジュール、バインディング | wrangler.jsonc(編集後に pnpm run cf-typegen を実行してください) |
商品、価格、キャンペーン、参加条件、メール配信、API トークンはコードではなくダッシュボードで管理します。
次の箇所は、理由がわかっている場合にのみ変更してください:migrations/(新しいファイルを追加し、既存のファイルは編集しない)、src/lib/server/(認証、暗号化、決済、在庫のルール)、src/components/motion/(beUI コンポーネント。直接編集せず上流から更新してください)。
ドキュメント
詳しいガイドは docs/api にあり、English、繁體中文、简体中文 で提供しています(日本語版はありません)。
- デプロイ、バックアップと復元 · ローカル開発 · カスタマイズと管理コンソール
- 認証と API トークン · MCP · Webhook
- キャンペーンの条件 · 参加条件フック · 利用権とクレジット · ライセンス
- Stripe · Stripe の割引 · メール · Quick handout
翻訳
インターフェースは 8 言語で提供しています。公開ページには /ja/features のような言語別 URL もあり、対応する hreflang タグとサイトマップのエントリーが付きます。メールは受信者ごとの言語で送信されます。各ロケールは apps/web/messages にある JSON ファイルで、en.json とまったく同じキーを持ちます。すべての翻訳が同じキーと同じ ICU プレースホルダーを持つことをテストで確認しています。言語を追加するには、src/i18n/locales.ts にその言語コードを追加し、対応する JSON ファイルを作成してください。ネイティブスピーカーによる修正を歓迎します。
開発
cd apps/web
pnpm run lint
pnpm run typecheck
pnpm test # 実際の SQLite とマイグレーションを使ったユニットテストと統合テスト
pnpm run build:worker # 本番用 Worker のビルド
CI では Node.js 24 と 26 で同じチェックを実行し、さらに新規のローカル D1 環境でコードの受け取りをエンドツーエンドで確認します。プルリクエストを送る前に CONTRIBUTING.md を、脆弱性の報告については SECURITY.md をご覧ください。
ライセンス
MIT © all right LLC. 同梱の beUI コンポーネントは上流の MIT ライセンスのままです(apps/web/vendor/beui.LICENSE)。
謝辞
Keydrop は次のプロジェクトに支えられています。開発と保守に携わるすべての皆さんに感謝します。
- Next.js と React:アプリのフレームワーク
- OpenNext for Cloudflare、Cloudflare Workers, D1、Wrangler:ホスティング、データベース、デプロイ
- Better Auth:サインイン、セッション、メールのワンタイムコード
- Stripe:決済
- next-intl と FormatJS:翻訳とメッセージの検証
- beUI、Tailwind CSS、Motion、Lucide、Floating UI、TanStack Virtual、next-themes、clsx、tailwind-merge:インターフェース
- Zod:入力の検証
- Kysely と kysely-d1:Better Auth のデータベースアクセス
- Model Context Protocol TypeScript SDK:MCP サーバー
- SheetJS:Excel の取り込み
- Geist と Poppins:インターフェースとロゴの書体
- Vitest、TypeScript、ESLint:テストと開発ツール



