Claude-skills vite-flare-starter

Scaffold a full-stack Cloudflare app from vite-flare-starter — React 19, Hono, D1+Drizzle, better-auth, Tailwind v4+shadcn/ui, TanStack Query, R2, Workers AI. Run setup.sh to clone, configure, and deploy.

install
source · Clone the upstream repo
git clone https://github.com/jezweb/claude-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/jezweb/claude-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/cloudflare/skills/vite-flare-starter" ~/.claude/skills/jezweb-claude-skills-vite-flare-starter && rm -rf "$T"
manifest: plugins/cloudflare/skills/vite-flare-starter/SKILL.md
source content

Vite Flare Starter

Clone and configure the batteries-included Cloudflare starter into a standalone project. Produces a fully rebranded, deployable full-stack app.

Stack

LayerTechnologyVersion
FrontendReact, Vite, Tailwind CSS, shadcn/ui19, 6.x, v4, latest
BackendHono (on Cloudflare Workers)4.x
DatabaseD1 (SQLite at edge) + Drizzle ORM0.38+
Authbetter-auth (Google OAuth + email/password)latest
StorageR2 (S3-compatible object storage)
AIWorkers AI binding
Data FetchingTanStack Queryv5

Cloudflare Bindings

BindingTypePurpose
DB
D1 DatabasePrimary application database
AVATARS
R2 BucketUser avatar storage
FILES
R2 BucketGeneral file uploads
AI
Workers AIAI model inference

Project Structure

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

Key Commands

CommandPurpose
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

Workflow

Step 1: Gather Project Info

Ask for:

RequiredOptional
Project name (kebab-case)Admin email
Description (1 sentence)Google OAuth credentials
Cloudflare accountCustom domain

Step 2: Clone and Configure

2a. Clone and clean

git clone https://github.com/jezweb/vite-flare-starter.git PROJECT_DIR --depth 1
cd PROJECT_DIR
rm -rf .git
git init

2b. Find-replace targets

Replace

vite-flare-starter
with the project name in these locations:

FileTargetReplace 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
:

  • Remove hardcoded
    account_id
    line (let wrangler prompt or use env var)
  • Replace
    database_id
    value with
    REPLACE_WITH_YOUR_DATABASE_ID

Reset

package.json
version to
"0.1.0"
.

Use the Edit tool for replacements (preferred over sed to avoid macOS/GNU differences).

2c. Generate auth secret

BETTER_AUTH_SECRET=$(openssl rand -hex 32 2>/dev/null || python3 -c "import secrets; print(secrets.token_hex(32))")

2d. Create .dev.vars

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=development

2e. Create Cloudflare resources (optional)

npx 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

2f. Install and migrate

pnpm install
pnpm run db:migrate:local

2g. Initial commit

git add -A
git commit -m "Initial commit from vite-flare-starter"

Step 3: Manual Configuration

  1. Google OAuth (if using): Go to Google Cloud Console, create OAuth 2.0 Client ID, add redirect URI
    http://localhost:5173/api/auth/callback/google
    , copy Client ID and Secret to
    .dev.vars
  2. Favicon: Replace
    public/favicon.svg
  3. CLAUDE.md: Update project description, remove vite-flare-starter references
  4. index.html: Update
    <title>
    and meta description

Step 4: Verify Locally

pnpm dev

Check: http://localhost:5173 loads, shows YOUR app name, sign-up/sign-in works (if OAuth configured).

Step 5: Deploy to Production

# 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.

Security Fingerprints

Change all of these so attackers cannot identify your site uses this starter:

LocationDefault ValueHow 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 linksstarter 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

Environment Variables

Branding (VITE_ prefix = available in frontend)

VariablePurposeExample
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"

Auth

VariablePurposeNotes
BETTER_AUTH_SECRET
Session encryption
openssl rand -hex 32
BETTER_AUTH_URL
Auth base URLMust match actual URL exactly
TRUSTED_ORIGINS
Allowed originsComma-separated, include localhost + prod
GOOGLE_CLIENT_ID
Google OAuthFrom Google Cloud Console
GOOGLE_CLIENT_SECRET
Google OAuthFrom Google Cloud Console
ENABLE_EMAIL_LOGIN
Enable email/password"true" to enable
ENABLE_EMAIL_SIGNUP
Enable email signupRequires ENABLE_EMAIL_LOGIN

Email (Optional)

VariablePurposeNotes
EMAIL_FROM
Sender addressFor verification/password reset
EMAIL_API_KEY
Email service API keyResend recommended

Common Customisations

Adding a New Database Table

  1. Add schema in
    src/server/db/schema.ts
  2. Generate migration:
    pnpm db:generate
  3. Apply locally:
    pnpm db:migrate:local
  4. Apply to production:
    pnpm db:migrate:remote

Adding a New API Route

  1. Create route file in
    src/server/routes/
  2. Register in
    src/server/index.ts
  3. Add TanStack Query hook in
    src/client/hooks/

Changing Auth Providers

Edit

src/server/auth.ts
: add provider to
socialProviders
, add credentials to
.dev.vars
and production secrets, update client-side login buttons.

Feature Flags

Control features via environment variables:

VITE_FEATURE_STYLE_GUIDE=true
,
VITE_FEATURE_COMPONENTS=true
. Add your own in
src/client/lib/features.ts
.

Troubleshooting

SymptomCauseFix
Auth redirects to homepage silentlyMissing TRUSTED_ORIGINSSet TRUSTED_ORIGINS with all valid URLs
"Not authorized" on deployWrong account_idRemove account_id from wrangler.jsonc or set yours
Database 500 errorsMissing migrationsRun
pnpm db:migrate:local
and
pnpm db:migrate:remote
localStorage shows "vite-flare-starter"Missing VITE_APP_IDSet
VITE_APP_ID=yourapp
in .dev.vars
Auth fails in production onlyBETTER_AUTH_URL mismatchMust match actual Worker URL exactly (https, no trailing slash)
"redirect_uri_mismatch" on Google sign-inOAuth redirect URI missingAdd production URL to Google Cloud Console OAuth redirect URIs
Secret changes have no effectNot redeployed
wrangler secret put
does NOT redeploy. Run
pnpm deploy
after

Production Deployment Checklist

  • BETTER_AUTH_SECRET
    set (different from dev!)
  • BETTER_AUTH_URL
    matches actual Worker URL
  • TRUSTED_ORIGINS
    includes all valid URLs
  • Google OAuth redirect URI includes production URL
  • Remote database migrated (
    pnpm db:migrate:remote
    )
  • No
    vite-flare-starter
    references in config files
  • Favicon replaced
  • CLAUDE.md updated
  • .dev.vars
    is NOT committed (check
    .gitignore
    )