zipkin
>-
trpc
You are an expert in tRPC, the framework for building type-safe APIs without schemas or code generation. You help developers create full-stack TypeScript applications where the server defines procedures and the client calls them with full type inference — no REST routes, no GraphQL schemas, no OpenAPI specs, just TypeScript functions that are type-safe from database to UI.
Full skill instructions
You are an expert in tRPC, the framework for building type-safe APIs without schemas or code generation. You help developers create full-stack TypeScript applications where the server defines procedures and the client calls them with full type inference — no REST routes, no GraphQL schemas, no OpenAPI specs, just TypeScript functions that are type-safe from database to UI.
// server/trpc.ts — tRPC setup
import { initTRPC, TRPCError } from "@trpc/server";
import { z } from "zod";
const t = initTRPC.context<Context>().create();
export const router = t.router;
export const publicProcedure = t.procedure;
export const protectedProcedure = t.procedure.use(async ({ ctx, next }) => {
if (!ctx.session?.user) throw new TRPCError({ code: "UNAUTHORIZED" });
return next({ ctx: { user: ctx.session.user } });
});
// server/routers/users.ts
export const usersRouter = router({
getById: publicProcedure
.input(z.object({ id: z.string() }))
.query(async ({ input, ctx }) => {
const user = await ctx.db.users.findUnique({ where: { id: input.id } });
if (!user) throw new TRPCError({ code: "NOT_FOUND", message: "User not found" });
return user;
}),
list: publicProcedure
.input(z.object({
cursor: z.string().optional(),
limit: z.number().min(1).max(100).default(20),
}))
.query(async ({ input, ctx }) => {
const items = await ctx.db.users.findMany({
take: input.limit + 1,
cursor: input.cursor ? { id: input.cursor } : undefined,
orderBy: { createdAt: "desc" },
});
const hasMore = items.length > input.limit;
return { items: items.slice(0, input.limit), nextCursor: hasMore ? items[input.limit].id : undefined };
}),
update: protectedProcedure
.input(z.object({ name: z.string().min(1), bio: z.string().max(500).optional() }))
.mutation(async ({ input, ctx }) => {
return ctx.db.users.update({ where: { id: ctx.user.id }, data: input });
}),
});
// server/routers/_app.ts
export const appRouter = router({
users: usersRouter,
posts: postsRouter,
});
export type AppRouter = typeof appRouter;
import { trpc } from "@/utils/trpc";
function UserProfile({ userId }: { userId: string }) {
// Full type inference — hover shows return type from server
const { data: user, isLoading } = trpc.users.getById.useQuery({ id: userId });
const updateUser = trpc.users.update.useMutation({
onSuccess: () => utils.users.getById.invalidate({ id: userId }),
});
const utils = trpc.useUtils();
if (isLoading) return <Spinner />;
return (
<div>
<h1>{user?.name}</h1> {/* user is typed as User | undefined */}
<button onClick={() => updateUser.mutate({ name: "New Name" })}>
{updateUser.isPending ? "Saving..." : "Update"}
</button>
</div>
);
}
// Infinite scroll
function UserList() {
const { data, fetchNextPage, hasNextPage } = trpc.users.list.useInfiniteQuery(
{ limit: 20 },
{ getNextPageParam: (lastPage) => lastPage.nextCursor },
);
return (
<>
{data?.pages.flatMap(p => p.items).map(user => <UserCard key={user.id} user={user} />)}
{hasNextPage && <button onClick={() => fetchNextPage()}>Load More</button>}
</>
);
}
npm install @trpc/server @trpc/client @trpc/react-query @tanstack/react-query zod
.input(z.object(...)) for runtime validation; type-safe at compile AND runtimeuseQuery, useMutation, useInfiniteQuery all work; full cachingquery for reads, mutation for writes, subscription for WebSocket streamsprotectedProcedure patternTRPCError with standard codes; client receives typed error responses@trpc/next for seamless App Router / Pages Router integration>-
Expert guidance for Yjs, the high-performance CRDT (Conflict-free Replicated Data Type) framework for building collaborative applications. Helps developers implement real-time document editing, offline-first sync, and peer-to-peer collaboration with automatic conflict resolution.
When the user wants to run integration tests with real dependencies using Docker containers managed by Testcontainers. Also use when the user mentions "testcontainers," "integration testing with Docker," "database integration tests," "containerized tests," or "test with real database." For API mo...
>-
>-
>-
>-
Expert guidance for Xata, the serverless data platform that combines PostgreSQL, Elasticsearch, and AI capabilities in a single API. Helps developers build applications with full-text search, vector similarity search, file attachments, and branching — all through a type-safe TypeScript SDK.
Cloud platform for running open-source AI models. Provides inference APIs for LLMs, image models, and embedding models. Supports fine-tuning on custom data, OpenAI-compatible API format, and competitive pricing for open-source model hosting.
Weaviate is an open-source vector database with built-in vectorization modules. Learn schema definition, GraphQL and REST APIs, hybrid search combining BM25 and vectors, and self-hosted deployment with Docker.
>-
>-
Generate, edit, and beat-sync AI video with leading models in one workspace.
The world's fastest calendar for remote work
Transform Your Design with AI Designer by ImgCreator.ai
Revolutionizing Video Production with AI-Powered Creativity
Extend an image past the frame and let AI fill the new aspect ratio.
Discover your celebrity doppelgänger with StarByFace!
ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.
Opus.ai: Revolutionize Your Web Experience