A talking assistant that actually does things in your app.

Drop it into any website. It reads the page, runs your real features by voice or text, and never makes up results. It even publishes an llm.txt so other AI agents can drive your app.

Open source · MIT · built from the strive assistant, Daisy voice, and AI-OS memory.

Why it doesn't hallucinate

Most "AI on your site" widgets let the model claim it did something. This one can't.

1 · It can only do what you register

You expose real functions as "capabilities". No capability for a request? It says so — it never pretends.

2 · Your numbers, not the model's

Each capability returns the real result and renders the user-facing text. The model narrates around facts, it doesn't invent them.

3 · A validator catches lies

If the model writes a number no function actually returned, it's rejected and replaced with the real output. Proven in tests.

See it work — for real

In this demo a user asks, by voice, to simulate a high-yield cross, get the predicted plant height, and re-run with a shorter parent when it's too tall — and the live assistant does every step on the real app. Two voices: the user (male) and the assistant (female).

Live on greenpert.6x7.gr — the assistant scanned the real app (6 pages, 21 controls) and ran the real breeding simulator.

Add it in three steps

1

Run the backend

A tiny Node service holds your API keys and proxies the model + voice. Keys never reach the browser.

npm i @page-assistant/server
# set ANTHROPIC_API_KEY (or OpenAI / OpenRouter)
npx page-assistant-server   # :8787
2

Embed the widget

One script tag, or an import in React/Next/Vue. A floating mascot appears bottom-right.

<script src="https://unpkg.com/@page-assistant/widget/dist/page-assistant.global.js"></script>
3

Register your real actions

Map the things your app can do to functions. That's the whole integration.

PageAssistant.init({
  serverUrl: "http://localhost:8787",
  appName: "My App",
  voice: true,
  capabilities: [{
    name: "simulate_cross",
    description: "Simulate a cross and predict yield + height.",
    parameters: { type:"object", properties:{
      a:{type:"string"}, b:{type:"string"} }, required:["a","b"] },
    run: ({a,b}) => myApp.simulate(a,b),   // your REAL function
    render: (r,a) => `Yield ${r.yield}/100, height ${r.low}–${r.high} cm.`
  }]
});

It talks. And listens.

Free out of the box using the browser's built-in voices, or switch on ElevenLabs + Whisper for studio-quality speech. Talk over it and it stops instantly — a real conversation, not a press-to-talk toy.

The page assistant widget open on a page

Other AI agents can use your app too

The assistant publishes a machine-readable contract. Any agent can discover what your app does and drive it — getting the same grounded, validated results a human would.

GET /llm.txt

A plain-language description of your app and every action its assistant can take.

GET /.well-known/llm-actions.json

The same, machine-first: a JSON manifest of capabilities and their parameters.

POST /v1/agent

The living assistant. Another agent sends a request in plain English; your app does it.