Wappkit is an English-first multi-tool product website built for lightweight desktop and web utilities.
This project includes:
- a platform homepage
- tool directory pages
- per-tool product pages
- a shared blog
- shared docs
- Creem checkout integration
- license retrieval by
order ID + purchase email - remote license validation for the desktop app
- device-bound license activation and deactivate flows
- internal admin support page for license search and manual unbind
- optional email resend support via Resend
- Next.js 14
- React 18
- Tailwind CSS
- Contentlayer
- Creem
- Upstash Redis
- Resend
- Vercel
- Install dependencies:
npm install-
Copy
.env.exampleto.env.localand fill in the required values. -
Start development:
npm run dev- Run validation when needed:
npm test
npm run lint
npm run buildNEXT_PUBLIC_APP_URL=http://localhost:3000
NEXT_PUBLIC_SUPPORT_EMAIL=support@wappkit.com
WAPPKIT_APP_SETUP_DOWNLOAD_URL=
WAPPKIT_APP_SETUP_RELEASE_URL=
WAPPKIT_APP_SETUP_CHECKSUM_URL=
WAPPKIT_APP_SETUP_SHA256=
CREEM_API_KEY=
CREEM_TEST_MODE=true
CREEM_PRODUCT_WAPPKIT_APP_SETUP_ID=
CREEM_PRODUCT_REDDIT_TOOLBOX_ID=
CREEM_WEBHOOK_SECRET=
UPSTASH_REDIS_REST_URL=
UPSTASH_REDIS_REST_TOKEN=
CRON_SECRET=
RESEND_API_KEY=
EMAIL_FROM=
INTERNAL_ADMIN_TOKEN=Current product-specific billing env keys:
CREEM_PRODUCT_REDDIT_TOOLBOX_IDCREEM_PRODUCT_WAPPKIT_APP_SETUP_IDWAPPKIT_APP_SETUP_DOWNLOAD_URLWAPPKIT_APP_SETUP_RELEASE_URLWAPPKIT_APP_SETUP_CHECKSUM_URLWAPPKIT_APP_SETUP_SHA256
Creemissues licensesWappkitmirrors order and license data for retrieval- current retrieval flow shows licenses directly on the page
- the desktop app validates licenses against
/api/license/validate - each license key can stay bound to one active device at a time
- users can unbind through
/license/retrieve - internal support can search and unbind through
/ops/licenses - optional email resend is reserved for later enablement
- Upstash is the first persistence layer, with room to migrate later
- a Vercel cron keeps the Upstash database active with a daily keepalive write
- deployment model: GitHub + Vercel
- GitHub repository:
https://github.com/alicekellings/wappkit-web - pushes to the main repository are expected to trigger automatic Vercel deployments
- current Vercel deployment URL:
https://wappkit-web.vercel.app/ - final production domain target:
https://wappkit.com/ - add the required environment variables in Vercel
- use the public webhook endpoint:
https://wappkit.com/api/webhook/creem - test payments in Creem test mode before switching the production domain
As of 2026-04-24, the Vercel project UI already shows these env variable names as present.
This is a deployment snapshot only; secret values are intentionally not stored in repo docs.
Confirmed visible in Vercel:
NEXT_PUBLIC_SUPPORT_EMAILCREEM_WEBHOOK_SECRETCREEM_PRODUCT_REDDIT_TOOLBOX_IDCREEM_API_KEYCREEM_TEST_MODEINTERNAL_ADMIN_TOKENNEXT_PUBLIC_APP_URLUPSTASH_REDIS_REST_URLUPSTASH_REDIS_REST_TOKENCRON_SECRET
vercel.jsonregisters a daily cron for/api/internal/upstash-keepalive- Vercel Hobby cron jobs currently run at most once per day, so daily is the safe minimum
- set
CRON_SECRETin Vercel so the cron request carriesAuthorization: Bearer <CRON_SECRET> - the keepalive route writes a timestamped marker key into Upstash, which is enough to prevent free-tier inactivity archival as long as production keeps running
- Vercel cron jobs hit the production deployment URL, so this protects the production Upstash database; preview-only databases can still archive if left unused
Current action for Wappkit App Setup:
- add or confirm
CREEM_PRODUCT_WAPPKIT_APP_SETUP_ID - confirm
NEXT_PUBLIC_APP_URLmatches the domain being tested - set
NEXT_PUBLIC_SUPPORT_EMAIL=support@wappkit.com - set
WAPPKIT_APP_SETUP_DOWNLOAD_URLto the final hosted installer - set
WAPPKIT_APP_SETUP_SHA256after the signed build is uploaded - confirm the current webhook target matches the same domain
For isolated Creem test-mode work that must not affect www.wappkit.com, use:
PREVIEW_TESTING.mdDEPLOYMENT_ENVIRONMENTS.md
Current dedicated preview branch recorded there:
wappkit-app-setup-preview-test
- rotate
CREEM_API_KEY,CREEM_WEBHOOK_SECRET, andUPSTASH_REDIS_REST_TOKENbefore going live if the test values were exposed - switch
CREEM_TEST_MODEtofalseafter validating the live Creem product setup - replace the temporary Creem product naming and media with the final
Wappkitproduct assets - confirm the production webhook target is
https://wappkit.com/api/webhook/creem
The following flow has already been verified end to end:
- start checkout from
https://www.wappkit.com/tools/reddit-toolbox - complete Creem payment
- receive order details on the Wappkit success page
- retrieve the license from
https://www.wappkit.com/license/retrieve - activate the desktop app with the issued license
- confirm the device binding appears on the retrieval page