You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A fast, full-featured URL shortener and QR redirect manager with password protection, device routing, OG previews, world-map analytics, UTM breakdown, and social OAuth — deployed entirely on Cloudflare's edge.
Features
Short Links
Feature
Description
Instant shortening
Create short links with optional custom aliases — including emoji slugs
Password protection
Lock any link behind a password; served as a native HTML form (no JS needed)
Max-click limit
Automatically disable a link after N clicks
Device routing
Send iOS users to an App Store URL and Android users to a Play Store URL
Social / OG preview
Custom OG title, description & image shown when a link is shared on social media
World map analytics
Choropleth map of clicks by country using react-simple-maps
UTM breakdown
Per-link source / medium / campaign analytics rows
Time-range tabs
Filter analytics by 24 h, 7 d, 30 d, or all-time
Bot tracking
Social-crawler clicks counted separately and badged in the analytics panel
Edit modal
Edit destination URL, password, max clicks, device URLs, and OG fields in-place
QR codes
One-click QR generation with live preview and download
Expiry control
Set links to expire after minutes, hours, or days
Link toggles
Enable/disable any link instantly without deleting it
10 expiry pages
Unique, animated "link disabled" art pages per link
QR Redirect Manager
Feature
Description
Named QR redirects
Create permanent /qr/:slug redirects with a human-readable name and notes
Full CRUD
Create, edit, toggle, and delete QR entries from the dashboard
Per-slug analytics
Scan count, country map, device/browser breakdown, time-range filters
Active / Paused
Pause any QR redirect — shows a branded dark-themed paused page
404 page
Custom dark-themed not-found page for unknown slugs
Admin panel tab
Admins can view, toggle, and delete all QR redirects across all users
git clone https://github.com/DhakadG/url-baunafier.git
cd url-baunafier
2. Worker setup
cd worker
npm install
# Create a KV namespace
wrangler kv namespace create KV
# Copy the returned KV namespace ID into wrangler.toml# Deploy
wrangler deploy
Set secrets:
wrangler secret put JWT_SECRET
# GitHub OAuth (if using):
wrangler secret put GITHUB_CLIENT_SECRET
# Discord OAuth (if using):
wrangler secret put DISCORD_CLIENT_SECRET
3. Frontend setup
cd ../frontend
npm install
# Create frontend/.env.local
VITE_API_URL=https://go.baunafier.qzz.io
VITE_GOOGLE_CLIENT_ID=your_google_client_id_here
npm run dev # http://localhost:5173
npm run build # → dist/
4. Deploy frontend
# Cloudflare Pages — must use --branch prod-v1 for the custom domain
wrangler pages deploy dist --project-name url-shortener-frontend --branch prod-v1
Important: The Cloudflare Pages project uses prod-v1 as its production branch. Deploying to main or production creates a preview URL only — the custom domain baunafier.qzz.io will not update.
5. Seed QR redirects (optional)
To pre-populate QR slugs (e.g. the ARTH ATELIER fabric collection), run from the repo root after deploying the worker:
# Optional: set an owner ID for seeded entriesexport SEED_OWNER_ID=your-user-id
node worker/seed-qr.js
# Append --env production to target the production KV namespace
Environment Variables
Worker — wrangler.toml[vars]
Variable
Required
Description
ADMIN_EMAIL
✅
Email address auto-promoted to admin
GOOGLE_CLIENT_ID
For Google OAuth
Google OAuth 2.0 Client ID
GITHUB_CLIENT_ID
For GitHub OAuth
GitHub OAuth App Client ID
DISCORD_CLIENT_ID
For Discord OAuth
Discord Application Client ID
FRONTEND_URL
For OAuth
Frontend origin, e.g. https://baunafier.qzz.io
Worker secrets (wrangler secret put)
Secret
Description
JWT_SECRET
Random secret for session tokens
GITHUB_CLIENT_SECRET
GitHub OAuth App client secret
DISCORD_CLIENT_SECRET
Discord OAuth2 client secret
Frontend — .env.local
Variable
Description
VITE_API_URL
Worker base URL, e.g. https://go.baunafier.qzz.io
VITE_GOOGLE_CLIENT_ID
Google OAuth 2.0 Client ID
Never commit .env or .env.local files. They are excluded by .gitignore.
OAuth Setup
Google
Google Cloud Console → APIs & Services → Credentials → Create OAuth 2.0 Client ID (Web application)