Deploy to Cloudflare Pages/Workers with D1 for persistent database storage.
Setup
1. Create D1 Database
wrangler d1 create ai-ready-db
This outputs your database ID:
Created D1 database: ai-ready-db
Database ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
2. Configure wrangler.toml
name = "my-site"
compatibility_date = "2024-01-01"
[[d1_databases]]
binding = "AI_READY_DB"
database_name = "ai-ready-db"
database_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
3. Configure Module
export default defineNuxtConfig({
aiReady: {
database: {
type: 'd1',
bindingName: 'AI_READY_DB'
}
}
})
How It Works
┌────────────────────────────────────────────────────────────┐
│ BUILD TIME (Local/CI) │
│ Uses SQLite to process pages │
│ Creates __ai-ready/pages.dump for initial data │
├────────────────────────────────────────────────────────────┤
│ FIRST DEPLOYMENT │
│ db-restore plugin imports dump into D1 │
│ D1 database populated with prerendered pages │
├────────────────────────────────────────────────────────────┤
│ RUNTIME │
│ D1 database persists across requests │
│ New pages indexed via afterResponse hook │
│ FTS5 search works via MCP tools │
└────────────────────────────────────────────────────────────┘
Key difference from serverless: D1 is persistent, so the dump is only imported once. Subsequent deployments with updated content will re-import the dump if the database is empty.
NuxtHub
If using NuxtHub, D1 is provisioned automatically:
export default defineNuxtConfig({
modules: ['@nuxthub/core'],
hub: {
database: true
},
aiReady: {
database: {
type: 'd1',
bindingName: 'DB' // NuxtHub default binding
}
}
})
Scheduled Tasks (Cron)
Cloudflare Workers supports native cron triggers, but Cloudflare Pages does not.
Cloudflare Workers
When deploying to Cloudflare Workers with cron: true, the module auto-configures wrangler cron triggers:
export default defineNuxtConfig({
aiReady: {
cron: true,
runtimeSyncSecret: process.env.NUXT_SEO_PRO_KEY // or any secret
}
})
Cloudflare Pages
Cloudflare Pages cannot run scheduled tasks. Use an external cron service to call the cron endpoint:
export default defineNuxtConfig({
aiReady: {
runtimeSync: true,
runtimeSyncSecret: process.env.NUXT_SEO_PRO_KEY
}
})
Then set up an external cron (GitHub Actions, cron-job.org, etc.):
name: AI Ready Sync
on:
schedule:
- cron: '*/5 * * * *' # every 5 minutes
jobs:
sync:
runs-on: ubuntu-latest
steps:
- run: curl -X GET "${{ secrets.SITE_URL }}/__ai-ready/cron?secret=${{ secrets.NUXT_SEO_PRO_KEY }}"
# One-time sync
curl -X GET "https://yoursite.pages.dev/__ai-ready/cron?secret=YOUR_SECRET"
# Or just restore from prerendered dump (faster, no re-indexing)
curl -X POST "https://yoursite.pages.dev/__ai-ready/restore?secret=YOUR_SECRET"
The cron endpoint runs the full sync: restore from dump if needed → seed routes from sitemap → index pending pages → submit to IndexNow.
Notes
- Build time: Always uses SQLite (D1 not available during build)
- Local dev: Uses SQLite unless using
wrangler dev - FTS5: D1 fully supports FTS5 full-text search
- Pages cron: Use external scheduler to call
/__ai-ready/cron