Documentation
Documentation
Introduction

Getting Started

Getting started
Getting StartedInstallationQuick StartProject Structure

Configuration

Configuration
ConfigurationEnvironment ConfigurationEdge ConfigDatabaseAuth SecretStripeFirebaseStorageGoogle Maps And Cloud Service AccountOAuth ProvidersEmail DeliverySentryFeature Flags

Architecture

Architecture
Architecture OverviewTech StackoRPC MiddlewareDesign Principles

Patterns

Patterns
Code Patterns & ConventionsFeature ModulesError HandlingType Safety

Database

Database
DatabaseSetupSchema DefinitionDatabase OperationsMigrationsCaching
Data Tables

API

oRPCProceduresRoutersoRPC Proxy Setup
APIsOpenAPIREST Endpoints

Auth & Access

AuthenticationConfigurationOAuth ProvidersRolesSession Management
AuthorizationUser RolesPermissions

Routing & i18n

RoutingDeclarative RoutingNavigation
InternationalizationTranslationsLocale Routing

Components & UI

ComponentsButtonsFormsNavigationDialogs
StylesTailwind CSSThemingTypography

Storage

Storage
StorageConfigurationUsageBuckets
Stripe Billing

Extra

Caching

Templates

Templates
Template GuidesCreate New FeatureCreate New PageCreate Database TableCreate oRPC RouterAdd Translations

Development

Development
DevelopmentCommandsAI AgentsBest Practices
Pulling Updates

oRPC Proxy Setup

Client and server integration with TanStack Query

Overview

This project exposes two integration points:

  1. src/rpc/react.tsx for client components.
  2. src/rpc/server.tsx for server prefetch + hydration.

Client Integration

RPCProvider is mounted in src/app/[locale]/providers.tsx.

Use useRpcUtils() to build query/mutation options:

"use client";

import { useRpcUtils } from "@/rpc/react";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";

export function MembersWidget() {
  const rpc = useRpcUtils();
  const queryClient = useQueryClient();

  const members = useQuery(rpc.members.list.queryOptions({ input: { organizationId: "org-id" } }));

  const removeMember = useMutation(
    rpc.members.remove.mutationOptions({
      onSuccess: () => {
        queryClient.invalidateQueries({ queryKey: rpc.members.key() });
      },
    }),
  );

  return null;
}

Server Integration

Use server query utils for prefetching:

import { getServerQueryClient, rpc } from "@/rpc/server";

export default async function DashboardPage() {
  await getServerQueryClient().prefetchQuery(
    rpc.organizations.listUserOrganizations.queryOptions(),
  );

  return null;
}

Transport Routes

  • RPC transport: /api/rpc/[...rpc]
  • OpenAPI transport: /api/[...rpc-openapi]
  • OpenAPI JSON: /api/openapi.json

Notes

  • Client requests include credentials: "include" for cookie-based auth.
  • API key auth is supported for procedures with acceptApiKey: true.
  • Middleware behavior is defined in src/rpc/procedures/rpc.ts.

Next Steps

Procedures

Routers

Middleware Architecture

On this page

Overview
Client Integration
Server Integration
Transport Routes
Notes
Next Steps