The framework

Vy reads your code and infers the runtime graph, services, databases, queues, workflows, storage. There's no second config language and no console to keep in sync. Vy Cloud runs that graph at the edge with tracing across every hop.

Read the docs ↗
app/index.ts
ts
1// One file. Vy infers the runtime graph from your imports.
2import { service } from "vy/service";
3import { database } from "vy/storage";
4import { topic } from "vy/pubsub";
5import { workflow } from "vy/workflow";
6
7export const db = database("orders");
8export const events = topic("order.created");
9export const charge = workflow("charge", async (ctx) => { … });
10
11export default service(); // deployed, traced, observable
The runtime graph

One model. The whole stack.

Every primitive, service, database, topic, workflow, becomes a node in a typed graph. That graph is what gets deployed, what gets traced, and what your agent reads when it needs to understand the system.

frontend
typed client
service
/api/orders
workflow
checkout
topic
order.created
database
orders
bucket
uploads
Primitives

The pieces you'd otherwise stitch together.

A small, consistent set of building blocks, each one a TypeScript function. No YAML, no Terraform, no SDK soup.

Services & APIs

A service is a typed unit of code with its own endpoints and dependencies. The framework generates a client for every other service and your frontend, so calls across the stack are fully typed and traced end to end.

services.ts
ts
1export const list = api.get("/orders", () => db.orders.findMany());

Databases & storage

Declare a Postgres database or an object bucket and Vy provisions it, with migrations, branching for previews, and a typed client. The same code runs locally and at the edge; you don't pick a region.

databases.ts
ts
1const db = database("app", { migrations: "./migrations" });
2const files = bucket("uploads");

Async work

Topics, workflows, and cron, the things you'd otherwise glue together from a queue, a scheduler, and a saga library. Each step is durable and shows up in the same trace as the request that started it.

async.ts
ts
1export const checkout = workflow("checkout", async (ctx) => { … });
2cron("0 * * * *", async () => { … });

Stateful actors

Single-instance objects with durable state, useful for sessions, rooms, agent memory. Vy handles persistence, addressing, and lifecycle so you can write the behaviour and forget the plumbing.

stateful.ts
ts
1export const Session = actor("session", { state: { count: 0 } });

The framework is open. The runtime is managed.

Write your app once. Run it locally with one command, ship it to the edge with another.