Vibe Coding with HeartCo
Code with AI, not against it.
HeartCo isn't just a boilerplate. It's a codebase that Claude, Cursor and Copilot natively understand.
17
AI prompts
70+
tRPC routers
160+
Prisma models
4,000+
tests
Why LLMs love HeartCo
An architecture designed so AI understands, navigates and produces production-ready code.
Consistent conventions
The same pattern everywhere: findFirst + organizationId, TRPCError, ctx.orgDb. LLMs spot the pattern in one file and apply it everywhere.
Exhaustive types
Strict TypeScript, noUncheckedIndexedAccess, zero `any`. LLMs navigate the type system to generate correct code on the first try.
Explicit architecture
`~/` path alias, routers in `src/server/api/routers/`, components in `src/components/`. No ambiguity about where things go.
Inline documentation
CLAUDE.md, clear conventions, explicit names. The context lives in the code, not in your head.
Try these prompts
Copy, paste, and watch AI build on solid foundations.
Claude finds the existing tRPC routers, the Prisma schema and the React components. It extends the code following the conventions — guards, multi-tenant isolation, shadcn components.
The organizationId guards and security tests are already in place. The AI understands the pattern and applies it systematically to every query and mutation.
The conventions are clear. The AI reuses the existing shadcn components and wires up Pusher for live dashboard updates.
The webhook pattern lives in src/app/api/webhooks/stripe. Claude duplicates the route, adds the refund handler, updates the switch case.
The existing tests in __tests__/security/ act as a template. Claude generates the IDOR, permission and multi-tenant isolation tests.
Compatible with your tools
Whatever your AI setup, HeartCo works out of the box.
Claude Code
Compatible ✓Cursor
Compatible ✓GitHub Copilot
Compatible ✓Windsurf
Compatible ✓Codex
Compatible ✓Gemini
Compatible ✓A real router, not a TODO
Production-ready code that LLMs understand and reproduce.
// src/server/api/routers/clients.ts
export const clientsRouter = createTRPCRouter({
list: requirePermission("clients:read")
.input(z.object({ search: z.string().optional() }))
.query(async ({ ctx, input }) => {
return ctx.orgDb.client.findMany({
where: input.search
? { name: { contains: input.search } }
: undefined,
orderBy: { createdAt: "desc" },
});
}),
});LLMs see this pattern and reproduce it. No prompt engineering needed — the code explains itself.
Ready to vibe code?
Clone the repo, open Cursor or Claude Code, and start building.