For your users
They talk to your app. The app does it.
Product
OwlLayer AI adds an agent inside your web app. Your users ask for what they want, in text or by voice. The agent calls the actions your interface declares, and your code does the work.
Nothing to install, update or switch on
Logos and names belong to their owners and only indicate compatibility.
Two sides, one product
They talk to your app. The app does it.
You declare actions. Your code still does the work.
What your team writes
Put it on the component that owns the action, or on a plain HTML element with a few attributes. No framework is required, and nothing else in your app changes. Docs
Before: your code today
import { useState } from 'react'; export function ProductPage({ product }) { const [quantity, setQuantity] = useState(1); const [added, setAdded] = useState(false); async function addToCart(productId, qty) { await cart.add(productId, qty); setAdded(true); } return ( <article> <h1>{product.name}</h1> <input type="number" min={1} value={quantity} onChange={(e) => setQuantity(Number(e.target.value))} /> <button onClick={() => addToCart(product.id, quantity)}> {added ? 'Added' : 'Add to cart'} </button> </article> );}After: with OwlLayer AI
import { useState } from 'react';import { useAgentTool } from '@owllayer/react';import { z } from 'zod'; export function ProductPage({ product }) { const [quantity, setQuantity] = useState(1); const [added, setAdded] = useState(false); async function addToCart(productId, qty) { await cart.add(productId, qty); setAdded(true); } // The same action, now callable by the agent. useAgentTool( { name: 'add_to_cart', description: `Add a product to the cart. On screen: ${product.name} (id ${product.id})`, schema: z.object({ productId: z.string(), quantity: z.number().int().min(1), }), risk: 'low', }, async ({ productId, quantity }) => { await addToCart(productId, quantity); setQuantity(quantity); return { productId, quantity }; }, ); return ( <article> {/* …same markup as before… */} </article> );}Nothing else changes: same state, same handler, same markup. The highlighted lines are all you add. Docs
Neural-DOM Binding
Neural-DOM Binding is the link between the model that understands your user and the living page they are using. The model never clicks: it picks an action your page has declared, by name.
Animation. A user asks to add two items to the cart. The model reads the actions declared on the screen and picks add_to_cart with quantity 2. The call travels to the page, your code runs it, the cart shows 2, and the result goes back to the model, which replies. Below, a cursor hunting for a button selector is crossed out.
Next to MCP
If you know MCP, OwlLayer AI completes it. One declares what your services can do; the other declares what your interface can do, right now.
They work together: the same agent can use both.
MCP bridges are on the roadmap.
Your web clients connect to one OwlLayer AI server. It holds the model keys, talks to the model and routes each call back to the page that declared it.
Your interfaces
OwlLayer AI Server
ws://localhost:3000/owllayer
Provider keys stay here
Your model
The packages are published under the @owllayer scope, MIT licensed. Versions checked on October 7, 2026
Install the server and one client, declare one action, and ask for it.
owlLaunch() · pending
OwlLayer AI is finishing its first public release. See you on the date below.
Tool resultowlLaunch()
{
"ok": false,
"status": "scheduled",
"opens_at": "2026-10-05T09:00:00.000Z"
}