Skip to main content
Vendo is an agent you embed in your product. Your users ask for what they want in plain language, and it acts through your own API, as them. The answer is usually a screen, not a paragraph.

What it looks like

Ask, and a working screen shows up in your product.

It asks before it writes anything, then acts as you.

The path a request takes to get there is in how Vendo works.

Screens in your brand

When the answer is one to look at, the agent writes a screen instead of describing one. It is a real React component running on live data from your own API, in your fonts, colors, and radii. vendo init reads those out of your app and writes them to .vendo/theme.json. Register your own components and the screen renders your real UI rather than the built-in kit. A finished screen can stay. Pin it into a slot on one of your pages and it holds that spot, re-running on every open, so it opens on today’s numbers.
Maple's overview page with its own quick actions, balance chart, and account tiles, and a generated spend by category card holding the slot beside them

Maple's own overview page. The spending card is the one a user asked for.

What it can reach

The agent’s hands are a fixed set, and nothing outside it exists. Wherever a tool came from, it crosses the same guard on the way out.
capability-api

Your API

One command reads your OpenAPI, tRPC, server actions, or routes and writes the tool set.API tools →
capability-accounts

Their accounts

Each user connects their own Gmail, Slack, or GitHub once, and later calls run as them.Connected accounts →
capability-schedule

On a schedule

The same tools, fired by a cron or an event, with nobody there to watch.Automations →

It acts as the signed-in user

Every call runs inside your process, through your routes and your auth, carrying the asking user’s own identity. Vendo’s servers never call your API. Before a call lands, the guard reads its risk grade. Reads go through. Writes and deletes stop and ask, quoting the exact request rather than the tool’s name. A decision can be remembered, and raising a tool’s risk lapses the grants that came before it. Approved or blocked, every call writes an audit line.
The Maple demo bank's assistant panel. An earlier request to move $500 to savings carries the line Send money — you declined it; the next one carries Send money — waiting for your approval, and under it a card asks Send $200.00 to Maple Savings ··8820, noting it sends now, as you, and can't be undone, with Approve and Deny beneath

The ask names the exact request. Every call keeps its own line, approved or not.

Where it lives in your product

One provider carries the wire and your brand. What renders inside it is your call.
  • The overlay — a launcher pill in the corner that opens a panel over your page, or docks beside it and lets the page reflow.
  • The palette⌘K opens the same conversation in its compact form, with the user’s own apps and their activity on the chip strip.
  • Slots — a place in one of your pages that a generated view can occupy.
  • Triggers — a button anywhere in your product that hands the agent one task, composer prefilled, never sent.
  • The bare thread, or the hooks, when the conversation belongs inside your own layout.
Each one re-themes from the same token file, so they cannot drift apart. What they render is in mount the surface.

Start with one package

None of the above is the first step. The agent on its own is: install @vendoai/agents, write one call, and it answers.
Tools, a route, a schedule, and the guard are each one line from there — backend quickstart.

Start where you are

The embedded surface is the step after that, and vendo init asks which of these you are doing and wires that one.
direction-product

Vendo's Full-Stack Agent

Vendo runs the loop and renders screens in your brand.<VendoProvider>Quickstart →
direction-existing-agent

In your existing agent

Keep your loop. Vendo adds tools and renders the result.vendoTools(vendo)Quickstart →
direction-outside-agents

From outside agents

Your own agent, acting as the signed-in user.createVendo({ mcp: true })Quickstart →