Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Scaffold a full-stack Cloudflare app from the vite-flare-starter template — React 19 + Hono + D1+Drizzle + better-auth + Tailwind v4+shadcn/ui + TanStack Query + R2 + Workers AI. Run setup.sh to clone, configure, and deploy. Use whenever the user wants a batteries-included Cloudflare full-stack app, vite-flare-starter scaffold, or a React + Cloudflare app with auth + database + Workers AI ready to go.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -13% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 99% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 81% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 53% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 120% | 0% |
Clone and configure the batteries-included Cloudflare starter into a standalone project. Produces a fully rebranded, deployable full-stack app.
| Layer | Technology | Version | |-------|-----------|---------| | Frontend | React, Vite, Tailwind CSS, shadcn/ui | 19, 6.x, v4, latest | | Backend | Hono (on Cloudflare Workers) | 4.x | | Database | D1 (SQLite at edge) + Drizzle ORM | 0.38+ | | Auth | better-auth (Google OAuth + email/password) | latest | | Storage | R2 (S3-compatible object storage) | — | | AI | Workers AI binding | — | | Data Fetching | TanStack Query | v5 |
| Binding | Type | Purpose | |---------|------|---------| | DB | D1 Database | Primary application database | | AVATARS | R2 Bucket | User avatar storage | | FILES | R2 Bucket | General file uploads | | AI | Workers AI | AI model inference |
src/
├── client/ # React frontend
│ ├── components/ # UI components
│ ├── hooks/ # Custom hooks + TanStack Query
│ ├── pages/ # Route pages
│ ├── lib/ # Utilities (auth client, etc.)
│ └── main.tsx # App entry point
├── server/ # Hono backend
│ ├── index.ts # Worker entry point
│ ├── routes/ # API routes
│ ├── middleware/ # Auth, CORS, etc.
│ └── db/ # Drizzle schema + queries
└── shared/ # Shared types between client/server| Command | Purpose | |---------|---------| | pnpm dev | Start local dev server | | pnpm build | Production build | | pnpm deploy | Deploy to Cloudflare | | pnpm db:migrate:local | Apply migrations locally | | pnpm db:migrate:remote | Apply migrations to production | | pnpm db:generate | Generate migration from schema changes |
Ask for:
| Required | Optional | |----------|----------| | Project name (kebab-case) | Admin email | | Description (1 sentence) | Google OAuth credentials | | Cloudflare account | Custom domain |
bashgit clone https://github.com/jezweb/vite-flare-starter.git PROJECT_DIR --depth 1 cd PROJECT_DIR rm -rf .git git init
Replace vite-flare-starter with the project name in these locations:
| File | Target | Replace with | |------|--------|-------------| | wrangler.jsonc | "vite-flare-starter" (worker name) | "PROJECT_NAME" | | wrangler.jsonc | vite-flare-starter-db | PROJECT_NAME-db | | wrangler.jsonc | vite-flare-starter-avatars | PROJECT_NAME-avatars | | wrangler.jsonc | vite-flare-starter-files | PROJECT_NAME-files | | package.json | "name": "vite-flare-starter" | "name": "PROJECT_NAME" | | package.json | vite-flare-starter-db | PROJECT_NAME-db | | index.html | <title> content | App display name (Title Case) |
Also in wrangler.jsonc:
account_id line (let wrangler prompt or use env var)database_id value with REPLACE_WITH_YOUR_DATABASE_IDReset package.json version to "0.1.0".
Use the Edit tool for replacements (preferred over sed to avoid macOS/GNU differences).
bashBETTER_AUTH_SECRET=$(openssl rand -hex 32 2>/dev/null || python3 -c "import secrets; print(secrets.token_hex(32))")
Convert kebab-case project name: my-cool-app becomes Display My Cool App, ID my_cool_app.
# Local Development Environment Variables
# DO NOT COMMIT THIS FILE TO GIT
# Authentication (better-auth)
BETTER_AUTH_SECRET=<generated>
BETTER_AUTH_URL=http://localhost:5173
# Google OAuth (optional)
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
# Email Auth Control (disabled by default)
# ENABLE_EMAIL_LOGIN=true
# ENABLE_EMAIL_SIGNUP=true
# Application Configuration
APP_NAME=<Display Name>
VITE_APP_NAME=<Display Name>
VITE_APP_ID=<app_id>
VITE_TOKEN_PREFIX=<app_id>_
VITE_GITHUB_URL=
VITE_FOOTER_TEXT=
NODE_ENV=developmentbashnpx wrangler d1 create PROJECT_NAME-db # Extract database_id from output, update wrangler.jsonc npx wrangler r2 bucket create PROJECT_NAME-avatars npx wrangler r2 bucket create PROJECT_NAME-files
bashpnpm install pnpm run db:migrate:local
bashgit add -A git commit -m "Initial commit from vite-flare-starter"
http://localhost:5173/api/auth/callback/google, copy Client ID and Secret to .dev.varspublic/favicon.svg<title> and meta descriptionbashpnpm dev
Check: http://localhost:5173 loads, shows YOUR app name, sign-up/sign-in works (if OAuth configured).
bash# Set production secrets openssl rand -base64 32 | npx wrangler secret put BETTER_AUTH_SECRET echo "https://PROJECT_NAME.SUBDOMAIN.workers.dev" | npx wrangler secret put BETTER_AUTH_URL echo "http://localhost:5173,https://PROJECT_NAME.SUBDOMAIN.workers.dev" | npx wrangler secret put TRUSTED_ORIGINS # If using Google OAuth echo "your-client-id" | npx wrangler secret put GOOGLE_CLIENT_ID echo "your-client-secret" | npx wrangler secret put GOOGLE_CLIENT_SECRET # Migrate remote database pnpm run db:migrate:remote # Build and deploy pnpm run build && pnpm run deploy
Critical: After first deploy, update BETTER_AUTH_URL with your actual Worker URL. Add the production URL to Google OAuth redirect URIs.
Change all of these so attackers cannot identify your site uses this starter:
| Location | Default Value | How to Change | |----------|---------------|---------------| | Page title | "Vite Flare Starter" | index.html | | App name in UI | "Vite Flare Starter" | VITE_APP_NAME env var | | localStorage keys | vite-flare-starter-theme | VITE_APP_ID env var | | API tokens | vfs_ prefix | VITE_TOKEN_PREFIX env var | | GitHub links | starter repo | VITE_GITHUB_URL (set empty to hide) | | Worker name | vite-flare-starter | wrangler.jsonc | | Database name | vite-flare-starter-db | wrangler.jsonc | | R2 buckets | vite-flare-starter-* | wrangler.jsonc |
| Variable | Purpose | Example | |----------|---------|---------| | VITE_APP_NAME | Display name in UI | "My Cool App" | | VITE_APP_ID | localStorage prefix, Sentry | "mycoolapp" | | VITE_TOKEN_PREFIX | API token prefix | "mca_" | | VITE_GITHUB_URL | GitHub link (empty = hidden) | "" | | VITE_FOOTER_TEXT | Footer copyright text | "2026 My Company" | | APP_NAME | Server-side app name | "My Cool App" |
| Variable | Purpose | Notes | |----------|---------|-------| | BETTER_AUTH_SECRET | Session encryption | openssl rand -hex 32 | | BETTER_AUTH_URL | Auth base URL | Must match actual URL exactly | | TRUSTED_ORIGINS | Allowed origins | Comma-separated, include localhost + prod | | GOOGLE_CLIENT_ID | Google OAuth | From Google Cloud Console | | GOOGLE_CLIENT_SECRET | Google OAuth | From Google Cloud Console | | ENABLE_EMAIL_LOGIN | Enable email/password | "true" to enable | | ENABLE_EMAIL_SIGNUP | Enable email signup | Requires ENABLE_EMAIL_LOGIN |
| Variable | Purpose | Notes | |----------|---------|-------| | EMAIL_FROM | Sender address | For verification/password reset | | EMAIL_API_KEY | Email service API key | Resend recommended |
src/server/db/schema.tspnpm db:generatepnpm db:migrate:localpnpm db:migrate:remotesrc/server/routes/src/server/index.tssrc/client/hooks/Edit src/server/auth.ts: add provider to socialProviders, add credentials to .dev.vars and production secrets, update client-side login buttons.
Control features via environment variables: VITE_FEATURE_STYLE_GUIDE=true, VITE_FEATURE_COMPONENTS=true. Add your own in src/client/lib/features.ts.
| Symptom | Cause | Fix | |---------|-------|-----| | Auth redirects to homepage silently | Missing TRUSTED_ORIGINS | Set TRUSTED_ORIGINS with all valid URLs | | "Not authorized" on deploy | Wrong account_id | Remove account_id from wrangler.jsonc or set yours | | Database 500 errors | Missing migrations | Run pnpm db:migrate:local and pnpm db:migrate:remote | | localStorage shows "vite-flare-starter" | Missing VITE_APP_ID | Set VITE_APP_ID=yourapp in .dev.vars | | Auth fails in production only | BETTER_AUTH_URL mismatch | Must match actual Worker URL exactly (https, no trailing slash) | | "redirect_uri_mismatch" on Google sign-in | OAuth redirect URI missing | Add production URL to Google Cloud Console OAuth redirect URIs | | Secret changes have no effect | Not redeployed | wrangler secret put does NOT redeploy. Run pnpm deploy after |
BETTER_AUTH_SECRET set (different from dev!)BETTER_AUTH_URL matches actual Worker URLTRUSTED_ORIGINS includes all valid URLspnpm db:migrate:remote)vite-flare-starter references in config files.dev.vars is NOT committed (check .gitignore)Other measured skills in the registry, with their headline benchmark lift.