v0.13.0 is the release where pyRPC stopped inferring and started asking. Your backend framework, entry point, and registration module are now declared configuration; the dev server launches each framework natively; and the TypeScript client grew tRPC-style links with request batching. Here is the tour.
1. Declared backends
{
"backend": { "framework": "flask", "entrypoint": "main:app" },
"clients": [{ "framework": "Next.js", "root": "../frontend" }]
}The wizard asks the framework first, sniffing only preselects, Enter confirms. --yes sniffs or errors; it never guesses. Django additionally requires a types_module (the module where your @rpc decorators live), which also fixes stale-type regeneration for split-module layouts. Existing flat configs are rewritten in place on your next run, that is the whole migration.
2. Native dev servers
fastapi/asgi -> python -m uvicorn module:app --reload flask -> python -m flask --app module:app run --reload django -> python manage.py runserver 127.0.0.1:8000
No WSGI bridges, no ASGI wrappers around WSGI apps. Flask runs under Flask; Django under runserver; tracebacks stay native. And because launch resolution returns data rather than spawning processes, editing the framework in pyrpc.json live-swaps the runtime mid-session.
3. Links and batching
const api = createClient<Types>({
links: [httpBatchLink({ url: "http://localhost:8000" })],
})One terminating link owns transport (httpLink or httpBatchLink); composable links can sit in front later. Batching coalesces operations issued in the same tick into one POST array, dispatched sequentially server-side, capped at 100, each operation resolving independently. All four adapters re-export the links.
4. Quality-of-life
- Client-root autocomplete: live directory completion jailed to the project root (symlinks and dot dirs filtered), Tab to accept.
pyrpc watch --module Xworks without a config file again, and the watchfiles shadowing crash is gone.- Actionable import errors carried forward: failures point at your file and line.
5. Site and docs
A visual redesign unified branding, light/dark theming, and syntax highlighting across landing, docs, and playground. The sidebar now matches how people arrive, adapters first, links documented properly, AI resources (llms.txt, MCP) promoted to a section of their own. All twelve examples were brought up to the same conformance bar.
Upgrading
- Rerun
pyrpc devonce to rewrite legacy configs (the wizard preselects detected values). - Migrate client constructors to the
linksarray, see the migration post; TypeScript flags every call site. - Bump packages:
pyrpc-core==0.13.0, adapters^0.13.0.
Full details live in the changelog; deep dives on each feature are linked from the blog index.

pyRPC