Skip to Content

Write the procedure. Get the whole API.

Vovk.ts is your back-end architect: every endpoint designed, typed, documented and ready for AI.

npx skills add finom/vovk
then ask your agent to build your API

Demo: the createTask procedure. Each field you add or rename, and the description, appears at once in the endpoint, the AI tool's input, the TypeScript RPC library and server actions, the Python and Rust types, the OpenAPI request body and the README.

Universal procedures: one definition is an endpoint, a server call, an AI tool and a typed client.

Try it: rename a field, add one or edit the description. Everything else follows.

src/modules/tasks/TaskController.ts
@operation({ description: '' })
@post()
static createTask = procedure({
body: z.object({
: z.string(),
: z.boolean(),
: z.enum(['low', 'high']),
: z.iso.date(),
: z.int(),
}),
}).handle(async (req) =>
TaskService.createTask(
await req.vovk.body()));
vovk devon every save
  • Endpoint
    curl -X POST /api/tasks -d '{"title":"Ship it",​"done":false}'
  • AI tool
    { name: "TaskRPC_createTask", description: "Create a task", input: { title: string, done: boolean } }
  • RPC librarynpm
    TaskRPC.createTask({ body: { title: string; done: boolean } })
  • Server actions
    TaskController.createTask.fn({ body: { title: string; done: boolean } })
  • Python clientPyPI
    class CreateTaskBody(TypedDict):
    title: str; done: bool
  • Rust clientcrates.io
    struct body { title: String, done: bool }
  • OpenAPI 3.1
    description: Create a task
    requestBody: { title: string, done: boolean }
  • README
    ### TaskRPC.createTask
    > Create a task
    POST /api/tasks

What you get

Typed clients

TypeScriptPythonRust

Generated from your procedures as TypeScript, Python and Rust packages, ready to publish.

tsTaskRPC.createTask({ body })
pyTaskRPC.create_task(body=body)
rstask_rpc::create_task(body, (),
(), None, None, false).await?

OpenAPI docs

DocsExample

The OpenAPI spec and a docs page come from the same code, so they match what runs.

/api/tasks:
post:
description: Create a task
x-codeSamples: [ts, python, rust]

AI tools and MCP

ToolsMCP

deriveTools turns your procedures into tools for AI SDKs and MCP servers.

const tools = deriveTools({
modules: { TaskRPC },
});

Streaming

Docs

An async generator sends JSON Lines, and the client reads them with types.

.handle(async function* () {
yield { token: 'Hello' };
})
for await (const item of stream)

Multitenancy

Docs

multitenant() in the Next.js proxy sends each subdomain to its own pages and API segment.

admin.example.com
→ admin segment
customer.example.com
→ customer segment

Plain Next.js

Docs

It runs in route handlers, with no custom server, and deploys wherever Next.js does.

// app/api/[[...vovk]]/route.ts
export const { GET, POST } =
initSegment({ controllers });

Build it with your agent

Add the Vovk.ts skills to Claude Code, Cursor, Windsurf, GitHub Copilot or Cline, then ask for the API you need.

npx skills add finom/vovk
or start a new project:
npx vovk-cli@latest init

Examples