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.
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";67export const db = database("orders");8export const events = topic("order.created");9export const charge = workflow("charge", async (ctx) => { … });1011export default service(); // deployed, traced, observableEvery 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.
A small, consistent set of building blocks, each one a TypeScript function. No YAML, no Terraform, no SDK soup.
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.
1export const list = api.get("/orders", () => db.orders.findMany());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.
1const db = database("app", { migrations: "./migrations" });2const files = bucket("uploads");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.
1export const checkout = workflow("checkout", async (ctx) => { … });2cron("0 * * * *", async () => { … });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.
1export const Session = actor("session", { state: { count: 0 } });Write your app once. Run it locally with one command, ship it to the edge with another.