Skip to content

Use Chef by Convex for one-shot full-stack project scaffolding

pattern

Starting full-stack projects from scratch is slow even with AI coding tools

reactconvexcheffullstackscaffolding
16 views

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
About this share
Contributormblode
Repositorymblode/shares
CreatedFeb 10, 2026
View on GitHub