UGC Reactions from Real Creators
실제 크리에이터 영상은 11달러, 이미지 8달러. 맞춤 제작은 영상당 25달러부터, 최소 250달러, 상업 라이선스 포함
오픈소스 프로모션 인프라로 할인, 기프트카드, 로열티 프로그램, 추천을 하나의 자체 호스팅 API로 운영
Open-source promotion infrastructure for running discounts, gift cards, loyalty programs, and referrals through one typed, self-hosted API.
마케팅TypeScript · MDXGitHub @offerkit온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
Agent-first, self-hostable promotion engine for coupons, loyalty, gift cards, referrals, and customer segments.
README 전체를 불러오는 중입니다.
README 전문 보기 ↗OfferKit is open-source promotion infrastructure for coupons, gift cards, loyalty, referrals, customer segments, and validation rules. It ships with a dashboard, REST API, TypeScript SDK, CLI, and MCP server, and runs from one Docker image for self-hosted deployments.
Agent-first. The MCP server is a first-class surface, not bolted on. Every mutating endpoint declares its risk level (safe / mutating / destructive) so LLM hosts can render the right confirmation. New procedures opt into MCP exposure declaratively via .meta() — no separate package to update.
Dev-friendly. The typed SDK is derived directly from the oRPC contract, so client types stay in lockstep with the server with zero codegen. Strict TypeScript, linted against explicit any, with typed contracts at API boundaries. The public website, blog, and documentation share an Astro + Fumadocs workspace that deploys as a static site. Local-first dev with Docker Compose, plus CI and lefthook quality gates.
Open source. MIT-licensed first-party packages. No CLA required. No commercial features paywalled. Built on top of permissive OSS.
Self-hostable. One docker compose up brings up web + worker + Postgres + Redis from ghcr.io/offerkit/offerkit. Railway uses the same published image for both services; no GitHub source deploy required. OpenTelemetry-ready out of the box for any OTLP backend.
New to promotion engines? Start with How OfferKit works and How objects connect. A campaign groups the offer, a voucher is a discount or gift-value code, loyalty tracks points, and referrals link an advocate to the friend they invite. The glossary explains the terms used below.
Requires Docker.
git clone https://github.com/offerkit/offerkit.git
cd offerkit
cp .env.example .env
docker compose up
Visit http://localhost:3000 and sign in with the ADMIN_EMAIL / ADMIN_PASSWORD in .env. The example defaults work locally; edit them before deploying. The first sign-in forces a password change.
To open OfferKit from another device, browse directly to the server's LAN address—for example, http://192.168.1.108:3000. Current source needs no origin configuration for direct localhost or LAN access. The published v0.2.0 image requires an explicit LAN origin in BETTER_AUTH_TRUSTED_ORIGINS; see the version-specific setup note. Set OFFERKIT_PUBLIC_URL when the deployment has a canonical external URL, reverse proxy, OAuth clients, or hosted MCP. If that configured deployment must also accept authentication from other browser origins, add their exact origins to BETTER_AUTH_TRUSTED_ORIGINS.
The docker-compose.yml brings up web + worker + postgres + redis. Both runtime services use the same published image, ghcr.io/offerkit/offerkit. Migrations run automatically on web boot. Background jobs use Redis/BullMQ when REDIS_URL is set, with a Postgres fallback otherwise. See the self-hosting guide for env vars and tuning.
Image channels:
edge follows the latest main commit.latest follows the newest stable image version.v0.2.0 and 0.2.0.In one Railway project, create Postgres and Redis, then create two Docker Image services from ghcr.io/offerkit/offerkit:latest. latest is fine for evaluation; production deployments should pin a release tag such as ghcr.io/offerkit/offerkit:v0.2.0. The public web service uses the default command. The private worker service overrides the command to node apps/worker/dist/index.js and should not have a public domain. Reference Postgres's DATABASE_URL and Redis's REDIS_URL into both app services. Set BETTER_AUTH_SECRET, OFFERKIT_PUBLIC_URL, ADMIN_EMAIL, and ADMIN_PASSWORD on the web service. Set the same WEBHOOK_SECRET_ENCRYPTION_KEY (generate one with openssl rand -base64 32) on both services.
여기까지가 README 앞부분입니다. 나머지는 원문에서 읽을 수 있습니다. README 전문 보기 ↗