Problem
Even with AI coding tools like Cursor or Claude Code, bootstrapping a full-stack project requires setting up a database, authentication, real-time subscriptions, backend functions, and a frontend -- all wired together correctly. Spending a week vibe coding a prototype with Next.js, Prisma, and TypeScript only to find that a one-shot tool produces a better result in 10 minutes is a frustrating lesson.
Solution
Step 1: Generate a full-stack app with Chef
Go to chef.convex.dev and describe your application:
Prompt: "Build a collaborative task management app with real-time updates.
Users can create projects, add tasks with priorities and due dates,
assign tasks to team members, and see live updates when others make
changes. Include authentication and a clean dashboard UI."
Chef generates a complete application with:
- React frontend with Tailwind CSS
- Convex reactive backend with real-time subscriptions
- Authentication built in
- Type-safe database schema and queries
Step 2: Export and customize in your IDE
# Clone the generated project
git clone <chef-generated-repo-url>
cd my-task-app
# Install dependencies
npm install
# Start the dev server with Convex backend
npx convex dev &
npm run dev
Step 3: Extend with Claude Code or Cursor
The generated codebase follows Convex conventions, making it easy for AI tools to extend:
// convex/tasks.ts - Generated query, easy to extend
import { query, mutation } from "./_generated/server";
import { v } from "convex/values";
export const listByProject = query({
args: { projectId: v.id("projects") },
handler: async (ctx, args) => {
return await ctx.db
.query("tasks")
.withIndex("by_project", (q) => q.eq("projectId", args.projectId))
.order("desc")
.collect();
},
});
// Add your custom mutation
export const bulkUpdateStatus = mutation({
args: {
taskIds: v.array(v.id("tasks")),
status: v.string(),
},
handler: async (ctx, args) => {
for (const id of args.taskIds) {
await ctx.db.patch(id, { status: args.status });
}
},
});
Why It Works
Chef is powered by Bolt under the hood but with prompts specifically tuned for Convex's reactive backend. This means the generated code uses Convex queries and mutations with real-time subscriptions out of the box, rather than traditional REST APIs with manual polling. The result is a full-stack app where UI updates appear instantly across all connected clients without writing any WebSocket code. Starting from a working scaffold lets you focus AI coding time on business logic instead of boilerplate.
Context
- Chef is free and available at
chef.convex.dev - Convex provides a generous free tier including real-time subscriptions, scheduled functions, and file storage
- The generated code syncs to git, enabling seamless handoff to Cursor, Zed, or Claude Code
- Compare with alternatives: Lovable (better UI design), v0 (Vercel-focused), Bolt (general purpose)
- For projects that need a traditional SQL database, consider starting with Lovable + Supabase instead
- This pattern works best for real-time collaborative apps where Convex's reactive model shines