Sees the page
Reads the DOM, forms and whatever the visitor is looking at. No custom integrations.
Get your ot: an agent with its own face, personality and voice. Put it on your website, let it live on your desktop as a pet, or send it to a video call.
On your website
One HTML tag. It fills forms, navigates and calls your team when a person is needed.
Product
Everything a good assistant needs, in a Web Component you can install in minutes.
Reads the DOM, forms and whatever the visitor is looking at. No custom integrations.
A virtual cursor navigates, clicks, fills in and highlights. Sensitive actions ask for confirmation.
Spots hesitation, drop-offs and errors and offers help at the right moment, within limits you set.
Uses the browser’s voice or your own apuchat, ElevenLabs, Grok or Fish Audio account. We host no audio: it integrates. The mouth follows the voice.
Editable 2D character or realistic 3D avatar, designed in minutes.
Integrates with your apuchat and apumail accounts and hands over the full context. Nobody repeats themselves.
Self-hosted Node proxy: keys never reach the browser. MIT, no lock-in.
Spanish, English and Portuguese built in. Replies in the language people write in.
How it works
One script tag or npm. Start the proxy with your Claude or OpenAI key.
Name, face, voice, tone and limits from the backoffice, no code.
Your agent greets, guides and solves. You see what people ask.
Developers
Web standards, JSON Schema and zero magic. If you can write a form, you can give it tools.
<!-- 1 · the agent, with your backoffice settings -->
<script src="https://your-site.com/api/agent/embed.js" defer></script>
<!-- 2 · an existing form becomes a tool -->
<form data-ots-tool="book_demo"
data-ots-description="Book a demo"
data-ots-confirm="Book for {email}?">
<input name="email" type="email" required>
</form>
import { init } from '7ots';
const agent = init({ endpoint: '/api/agent', locale: 'es' });
agent.registerAction({
name: 'add_to_cart',
description: 'Adds a product to the cart',
parameters: { type: 'object', properties: { sku: { type: 'string' } } },
confirm: ({ sku }) => `Add ${sku}?`,
handler: ({ sku }, ctx) => ctx.auth.fetch('/api/cart', { method: 'POST', body: sku }),
});
agent.on('action:end', ({ name }) => analytics.track(name));
# self-hosted proxy: your keys stay here
npm i 7ots
LLM_PROVIDER=anthropic ANTHROPIC_API_KEY=… npx 7ots-server
# → http://localhost:8787/backoffice/ configure everything
# → /api/agent/embed.js paste it into your site
Identity
Design your agent as a character: shape, eyes, mouth, accessories, colors and finish. Try it right here.
Why 7ots
| 7ots | Typical SaaS chatbot | |
|---|---|---|
| Open source (MIT) | Yes | No |
| On your own server | Yes | No |
| Acts on the page | Yes | Sometimes |
| Its own face and voice | Yes | Sometimes |
| Pick your AI model | Yes | No |
| Per-seat pricing | Free | Usual |
FAQ
Nothing: 7ots is MIT. You only pay the AI provider you choose, or nothing with a local OpenAI-compatible model.
In your proxy. The browser talks to your server, and your server to the model. Keys are never sent to visitors.
Claude and OpenAI out of the box, plus any OpenAI-compatible API (Groq, Ollama…) by changing the base URL.
It only uses the actions you enable. Sensitive ones show a confirmation dialog, and everything it does is visible through the virtual cursor.
It never sends passwords, card data or anything marked data-ots-private. You control the server and the logs.
No. The 2D character is a lightweight SVG. The 3D avatar is optional and falls back to 2D.
No. 7ots only integrates: it reaches your team through your apuchat and apumail accounts, and voice comes from the browser or your apuchat, ElevenLabs, Grok or Fish Audio account. We host no messages or audio.
Install it in minutes. Yours forever.
$ npm i 7ots