
Convex Create Component
Scaffold reusable Convex components with isolated tables and a small app-facing API instead of dumping logic into convex/.
Overview
Convex Create Component is an agent skill for the Build phase that builds reusable Convex components with isolated tables and app-facing APIs.
Install
npx skills add https://github.com/get-convex/agent-skills --skill convex-create-componentWhat is this skill?
- Decision tree for component vs app code vs plain TypeScript library
- Workflow to define owned tables, public functions, and app-passed context (auth, env, parent IDs)
- Guidance for third-party integrations that need their own Convex tables
- Boundary rules for what stays in the main app orchestration layer
Adoption & trust: 61.9k installs on skills.sh; 31 GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
Your Convex app is a monolith and you need reusable backend modules without leaking every table into the main schema.
Who is it for?
Builders creating new Convex components, extracting integration logic, or packaging backend modules for reuse across apps.
Skip if: One-off route handlers, thin utilities without Convex tables, or features better served by a non-Convex npm library.
When should I use this skill?
Creating a new Convex component, extracting reusable backend logic, building a third-party integration with its own tables, or defining component boundaries.
What do I get? / Deliverables
You get a component shape plan—tables, public functions, and app boundaries—before the agent scaffolds files and wiring.
- Component scaffold plan
- Owned schema and function surface
- Documented app vs component responsibilities
Recommended Skills
Journey fit
How it compares
Component packaging skill for Convex—not a generic CRUD generator or frontend styling helper.
Common Questions / FAQ
Who is convex-create-component for?
Solo and indie developers structuring Convex backends who want agent-guided component boundaries instead of copying folders between repos.
When should I use convex-create-component?
When starting a new Convex component, pulling reusable logic out of convex/, or building a third-party integration that should own its tables and workflows.
Is convex-create-component safe to install?
It guides scaffolding in your repository; check the Security Audits panel on this page and review generated Convex functions before deploying.
SKILL.md
READMESKILL.md - Convex Create Component
# Convex Create Component Create reusable Convex components with clear boundaries and a small app-facing API. ## When to Use - Creating a new Convex component in an existing app - Extracting reusable backend logic into a component - Building a third-party integration that should own its own tables and workflows - Packaging Convex functionality for reuse across multiple apps ## When Not to Use - One-off business logic that belongs in the main app - Thin utilities that do not need Convex tables or functions - App-level orchestration that should stay in `convex/` - Cases where a normal TypeScript library is enough ## Workflow 1. Ask the user what they are building and what the end goal is. If the repo already makes the answer obvious, say so and confirm before proceeding. 2. Choose the shape using the decision tree below and read the matching reference file. 3. Decide whether a component is justified. Prefer normal app code or a regular library if the feature does not need isolated tables, backend functions, or reusable persistent state. 4. Make a short plan for: - what tables the component owns - what public functions it exposes - what data must be passed in from the app (auth, env vars, parent IDs) - what stays in the app as wrappers or HTTP mounts 5. Create the component structure with `convex.config.ts`, `schema.ts`, and function files. 6. Implement functions using the component's own `./_generated/server` imports, not the app's generated files. 7. Wire the component into the app with `app.use(...)`. If the app does not already have `convex/convex.config.ts`, create it. 8. Call the component from the app through `components.<name>` using `ctx.runQuery`, `ctx.runMutation`, or `ctx.runAction`. 9. If React clients, HTTP callers, or public APIs need access, create wrapper functions in the app instead of exposing component functions directly. 10. Run `npx convex dev` and fix codegen, type, or boundary issues before finishing. ## Choose the Shape Ask the user, then pick one path: | Goal | Shape | Reference | | ------------------------------------------------- | ---------------- | ----------------------------------- | | Component for this app only | Local | `references/local-components.md` | | Publish or share across apps | Packaged | `references/packaged-components.md` | | User explicitly needs local + shared library code | Hybrid | `references/hybrid-components.md` | | Not sure | Default to local | `references/local-components.md` | Read exactly one reference file before proceeding. ## Default Approach Unless the user explicitly wants an npm package, default to a local component: - Put it under `convex/components/<componentName>/` - Define it with `defineComponent(...)` in its own `convex.config.ts` - Install it from the app's `convex/convex.config.ts` with `app.use(...)` - Let `npx convex dev` generate the component's own `_generated/` files ## Component Skeleton A minimal local component with a table and two functions, plus the app wiring. ```ts // convex/components/notifications/convex.config.ts import { defineComponent } from "convex/server"; export default defineComponent("notifications"); ``` ```ts // convex/components/notifications/schema.ts import { defineSchema, defineTable } from "convex/server"; import { v } from "convex/values"; export default defineSchema({ notifications: defineTable({ userId: v.string(), message: v.string(), read: v.boolean(), }).index("by_user", ["userId"]), }); ``` ```ts // convex/components/notif