NuxtHub v0.10 introduces a significant shift toward multi-cloud support and self-hosting, moving away from the Cloudflare-exclusive approach of older versions. This guide will help you migrate your existing project.
| Feature | v0.x | v0.10 |
|---|---|---|
| Database config | hub.database: true | hub.db: 'sqlite' (or 'postgresql', 'mysql') |
| Database directory | server/database/ | server/db/ |
| Database access | hubDatabase() | db from hub:db (Drizzle ORM) |
| Blob access | hubBlob() | blob from hub:blob |
| KV access | hubKV() | kv from hub:kv |
| AI & AutoRAG | hubAI() | Removed (use AI SDK) |
| NuxtHub Admin | Supported | Deprecated (sunset Dec 31, 2025) |
nuxthub deploy | Supported | Deprecated (sunset Jan 31, 2026) |
The database option has been renamed to db and now requires specifying the SQL dialect:
export default defineNuxtConfig({
hub: {
- database: true
+ db: 'sqlite' // or 'postgresql', 'mysql'
}
})
For advanced configuration with explicit driver and connection details:
export default defineNuxtConfig({
hub: {
db: {
dialect: 'postgresql',
driver: 'postgres-js', // Optional: auto-detected from env vars
connection: {
connectionString: process.env.DATABASE_URL
}
}
}
})
Move your database files from server/database/ to server/db/:
# Move schema files
mv server/database/schema.ts server/db/schema.ts
# Move migrations
mv server/database/migrations/ server/db/migrations/
These features remain largely the same but now support multiple providers:
export default defineNuxtConfig({
hub: {
blob: true, // Auto-configures based on provider
kv: true, // Auto-configures based on provider
cache: true // Auto-configures based on provider
}
})
Replace hubDatabase() with Drizzle ORM:
Before (v0.x):
export default eventHandler(async () => {
const db = hubDatabase()
const users = await db.prepare('SELECT * FROM users').all()
return users.results
})
After (v0.10):
import { db, schema } from 'hub:db'
export default eventHandler(async () => {
return await db.select().from(schema.users)
})
db instance is auto-imported on server-side, so you can use it directly without importing.Create your schema using Drizzle ORM syntax:
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core'
export const users = sqliteTable('users', {
id: integer().primaryKey({ autoIncrement: true }),
name: text().notNull(),
email: text().notNull().unique(),
createdAt: integer({ mode: 'timestamp' }).notNull()
})
import { pgTable, text, serial, timestamp } from 'drizzle-orm/pg-core'
export const users = pgTable('users', {
id: serial().primaryKey(),
name: text().notNull(),
email: text().notNull().unique(),
createdAt: timestamp().notNull().defaultNow()
})
import { mysqlTable, text, serial, timestamp } from 'drizzle-orm/mysql-core'
export const users = mysqlTable('users', {
id: serial().primaryKey(),
name: text().notNull(),
email: text().notNull().unique(),
createdAt: timestamp().notNull().defaultNow()
})
Then generate migrations:
npx nuxt db generate
Replace hubBlob() with the new blob import:
Before (v0.x):
export default eventHandler(async (event) => {
const { pathname } = getRouterParams(event)
return hubBlob().serve(event, pathname)
})
After (v0.10):
import { blob } from 'hub:blob'
export default eventHandler(async (event) => {
const { pathname } = getRouterParams(event)
return blob.serve(event, pathname)
})
Replace hubKV() with the new kv import:
Before (v0.x):
export default eventHandler(async () => {
const kv = hubKV()
return await kv.get('my-key')
})
After (v0.10):
import { kv } from 'hub:kv'
export default eventHandler(async () => {
return await kv.get('my-key')
})
With NuxtHub v0.10, you deploy your project directly to your cloud provider using their tooling.
hub.db)hub.kv or hub.cache)hub.blob)wrangler.jsonc file in your project root:{
"$schema": "node_modules/wrangler/config-schema.json",
"d1_databases": [
{
"binding": "DB",
"database_name": "<database-name>",
"database_id": "<database-id>"
}
],
"r2_buckets": [
{
"binding": "BLOB",
"bucket_name": "<bucket-name>"
}
],
"kv_namespaces": [
{
"binding": "KV",
"id": "<kv-namespace-id>"
},
{
"binding": "CACHE",
"id": "<cache-namespace-id>"
}
]
}
# For blob storage
npm install @vercel/blob
# For KV/Cache (Upstash Redis)
npm install @upstash/redis
# For PostgreSQL database
npm install drizzle-orm drizzle-kit postgres @electric-sql/pglite
The following features have been removed in v0.10 as part of the multi-cloud strategy:
Use the AI SDK with the Workers AI Provider instead:
// Before (v0.x)
const ai = hubAI()
const result = await ai.run('@cf/meta/llama-2-7b-chat-int8', { prompt: 'Hello' })
// After (v0.10) - use AI SDK
import { generateText } from 'ai'
import { workersai } from 'workers-ai-provider'
const result = await generateText({
model: workersai('@cf/meta/llama-2-7b-chat-int8'),
prompt: 'Hello'
})
Access Cloudflare's Browser Rendering directly via process.env.BROWSER binding.
Use Cloudflare's Vectorize binding directly or consider alternatives like Pinecone or Weaviate.
Replace npx nuxthub deploy with your provider's deployment method:
wrangler deploy or Workers/Pages CIvercel deploy or Git integrationnuxt.config.ts: Change database: true to db: '<dialect>'server/database/ to server/db/npx nuxt db generatehubDatabase() calls with db from hub:dbhubBlob() calls with blob from hub:blobhubKV() calls with kv from hub:kvIf you encounter issues during migration: