Π ΡΡΡΠΊΠΈΠΉ | English
Open-source generator for Cloudflare WARP configs (WireGuard / AmneziaWG / Clash / Throne / Nekoray / Husi / Karing / WireSock). This is the public branch β no captcha, no analytics, no promo blocks. Deploy your own.
Pre-built image is published to GHCR on every push to master:
docker run -d --name warp-generator \
-p 3000:3000 \
--restart unless-stopped \
ghcr.io/nellimonix/warp-config-generator-vercel-public:latestOpen http://localhost:3000.
docker build -t warp-generator-public .
docker run -d -p 3000:3000 --name warp-generator warp-generator-publicservices:
warp-generator:
image: ghcr.io/nellimonix/warp-config-generator-vercel-public:latest
container_name: warp-generator
ports:
- "3000:3000"
restart: unless-stopped- Or via CLI:
vercel deploy - Local dev:
vercel dev
- Or via CLI:
netlify deploy - Local dev:
netlify dev
- Or via Wrangler:
wrangler deploy - Local dev:
wrangler dev
The same wrangler.jsonc deploys to Pages with the static export.
CLOUDFLARE_WORKERS=1 npm run build
npx wrangler pages deploy out --project-name=warp-generatorOr connect the repo in the Cloudflare dashboard:
- Build command:
CLOUDFLARE_WORKERS=1 npm run build - Output directory:
out
npm install
npm run dev # dev server on :3000
npm run build # production build
npm run start # serve production build
npm run lintThe generator exposes the same options in the UI and in POST /api/generate:
| Option | Behavior and constraints |
|---|---|
| DNS | Providers come from config/dns.ts. Community providers are marked with β’; selecting one forces All sites and clears selected services because they do not support split tunneling. An unknown provider ID falls back to Cloudflare DNS. |
| IPv6 | Enabled by default. Disabling it removes IPv6 from the interface address, DNS list, and the default all-sites AllowedIPs. |
| Exclude LAN | Available only in All sites mode. It replaces the default routes with public address ranges so private/reserved LAN ranges stay outside the tunnel. |
| PersistentKeepalive | Disabled by default. Enabling it with an empty UI field uses 25; the API accepts integers from 1 through 65535 and omits invalid values. It is emitted by WireGuard and WireSock configs. |
| Custom I1 | A non-empty value is trimmed and must be at most 253 characters with no whitespace. AmneziaWG WireGuard uses it to generate a QUIC I1 mask; WireSock uses it as Id. Empty or invalid input silently falls back to a bundled random mask/domain. |
Example request against a local deployment:
curl -X POST http://localhost:3000/api/generate \
-H 'Content-Type: application/json' \
-d '{
"selectedServices": [],
"siteMode": "all",
"deviceType": "awg15",
"endpoint": "engage.cloudflareclient.com:4500",
"configFormat": "wireguard",
"dnsId": "cf",
"ipv6": false,
"excludeLan": true,
"persistentKeepalive": 25,
"customI1Domain": "google.com"
}'A successful response has success: true and a content object containing
configBase64, qrCodeBase64, configFormat, and fileName. configBase64
contains the Base64-encoded configuration; qrCodeBase64 is an image data URL.
The "specific sites" mode lets users select services to route through WARP. To add one:
- Fork the repo and create a branch (e.g.
feat/service-newsite). - Create
config/services/<your-service-key>.json:{ "name": "Display Name", "icon": "FaIconName", "iconLibrary": "fa", "type": "new", "ips": "1.2.3.0/24, 5.6.7.0/24, ..." }nameβ user-visible service name.iconβ icon name from react-icons. Verify the name exists in the chosen library.iconLibraryβ one of:fa,fa6,si,bi,md,ri, etc. (matches react-icons sub-package).typeβ optional. Set"new"to show a "NEW" badge.ipsβ comma-separated CIDR ranges. Use a real ASN/IP lookup tool β Cloudflare's whois, BGP.tools, orwhois -h whois.cymru.com " -v <ip>".
- Do NOT edit
worker/api-handler.jsorfunctions/api/generate.js. A GitHub Action (build-ip-ranges) rebuilds theIP_RANGESblocks in both files automatically on merge tomaster, and syncs the new service into theproductionbranch. - Open a PR to
master.
node scripts/build-ip-ranges.mjsRuns against config/services/*.json and rewrites the // IP_RANGES:BEGIN ... // IP_RANGES:END block in both worker/functions files. Safe to run repeatedly β idempotent.
- Add the provider to
DNS_PROVIDERSinconfig/dns.tswith a uniqueid, displaylabel, IPv4/IPv6 arrays, andisCommunity. - Set
isCommunity: trueif the provider cannot be used with specific-site routing. Both the UI and API enforce the all-sites restriction. - Mirror the entry in the embedded
DNS_PROVIDERSarrays inworker/api-handler.jsandfunctions/api/generate.js. Unlike IP ranges and I1 masks, DNS providers do not currently have an automatic sync script. - Run
npm run buildbefore opening the PR.
Docker and Vercel use config/dns.ts directly, while Cloudflare Workers and
Netlify execute the embedded handlers. Keeping all three provider lists in sync
prevents a provider shown by the static UI from falling back to Cloudflare DNS
at generation time.
lib/builders/shared.ts is the source of truth for masks used when no custom
I1 domain is supplied:
- Edit only the
I1_MASKSarray between the// I1_MASKS:BEGINand// I1_MASKS:ENDmarkers. - Run
node scripts/build-i1-masks.mjs. - Commit the generated changes to
worker/api-handler.jsandfunctions/api/generate.jswith the source change.
The script validates the markers and mask format, updates both embedded
handlers, and is idempotent. The build-i1-masks workflow also runs when its
source, script, or workflow changes on master and rebuilds the production
handlers. Do not hand-edit generated I1 blocks.
βββ app/
β βββ layout.tsx Root layout (Geist font, meta)
β βββ page.tsx Server component β loads services
β βββ not-found.tsx 404 page
β βββ api/generate/route.ts POST endpoint (config generation)
β
βββ components/
β βββ home-client.tsx Client shell (tabs, state)
β βββ layout/
β β βββ topbar.tsx Logo + tab navigation
β β βββ sidebar.tsx GitHub link + server list (sticky)
β β βββ footer.tsx
β βββ generator/
β β βββ config-selectors.tsx Custom dropdowns (format, device, etc.)
β β βββ advanced-settings.tsx IPv6, keepalive, and custom I1 controls
β β βββ service-picker.tsx Service selection grid
β β βββ result-panel.tsx Download / copy / QR result block
β β βββ formats-tab.tsx Supported formats list
β β βββ about-tab.tsx About + compatible clients
β βββ icons/ Icon resolver + flag icons
β
βββ config/
β βββ services/ JSON files β one per service (IP ranges)
β βββ services-loader.ts Auto-loads all JSONs at startup
β βββ dns.ts DNS providers and split-tunnel constraints
β βββ endpoints.ts Cloudflare WARP endpoints
β βββ formats.ts Config format definitions
β
βββ lib/
β βββ builders/ One file per config format
β β βββ wireguard.ts
β β βββ throne.ts
β β βββ clash.ts
β β βββ nekoray.ts
β β βββ husi.ts
β β βββ karing.ts
β β βββ wiresock.ts
β β βββ shared.ts Device profiles and default I1 masks
β β βββ index.ts Dispatcher β buildConfig(format, params)
β βββ warp-service.ts Orchestrator (keys β CF β build β QR)
β βββ quic.ts Custom QUIC I1 mask generation
β βββ cloudflare-client.ts Cloudflare WARP API registration
β βββ crypto.ts Key generation (tweetnacl)
β βββ qr-generator.ts QR via external API + SVG fallback
β βββ ip-ranges.ts Re-exports from services-loader
β
βββ hooks/
β βββ use-generator.ts Client-side generation logic
β βββ use-mobile.ts Responsive breakpoint hook
β
βββ scripts/
β βββ build-ip-ranges.mjs Regenerates IP_RANGES in worker + functions
β βββ build-i1-masks.mjs Regenerates I1_MASKS in worker + functions
β
βββ worker/ Cloudflare Workers runtime
βββ functions/ Netlify Functions runtime
βββ types/ TypeScript type definitions
βββ styles/globals.css Design tokens + dark theme
βββ .github/workflows/ CI: Docker, IP_RANGES, I1_MASKS rebuilds
βββ Dockerfile Standalone production build (public)
βββ next.config.mjs
βββ package.json
No environment variables required for the public build. The generator runs anonymously against the public Cloudflare WARP registration API.
next.config.mjs switches output based on environment:
| Env var | Output | Used by |
|---|---|---|
DOCKER_BUILD=1 |
standalone |
Docker / Dokploy |
CLOUDFLARE_WORKERS / CF_PAGES |
export |
CF Workers / CF Pages |
| none | default | Vercel / Netlify |
| Platform | Support | Notes |
|---|---|---|
| Docker (self-host) | β Full | standalone Next.js server |
| Vercel | β Full | default runtime |
| Netlify | β Full | Edge functions |
| Cloudflare Workers | β Full | static export + worker |
| Cloudflare Pages | β Full | static export |
MIT License β see LICENCE
- Fork the repository
- Create a feature branch
- Make your changes
- Open a Pull Request
- Telegram Bot: t.me/warp_generator_bot
- Main Site: warp3.llimonix.pw
- Vercel Mirror: warply2.vercel.app
- Netlify Mirror: getwarp2.netlify.app
- Cloudflare Mirror: warp.llimonix.workers.dev
- Telegram Channel: Π»Π»ΠΈΠΌΠΎΠ½ΠΈΠΊΡ </>
