🪼 XoxoBot es el asistente virtual de OventLabs. Un axolotl morado digital que vive en agents.oventlabs.com, chatea con GPT-4o, manda emails y agenda citas en Google Calendar con Meet automático. Y tiene peluche.

🪼 XoxoBot is the virtual assistant of OventLabs. A purple digital axolotl that lives at agents.oventlabs.com, chats with GPT-4o, sends emails, and schedules appointments in Google Calendar with automatic Meet. And it has a plushie.

Todo empezó con una pregunta simple: ¿cómo hago que los visitantes de mi sitio puedan hablar con alguien… sin que yo esté ahí? La respuesta obvia era un chatbot. La respuesta real fue crear un axolotl con personalidad, herramientas reales y un peluche de la vida real llamado XOXO.

It all started with a simple question: how do I let visitors to my site talk to someone… without me being there? The obvious answer was a chatbot. The real answer was to create an axolotl with personality, real tools, and a real-life plushie named XOXO.

Este post es la historia completa: desde el diseño en ChatGPT hasta el widget en producción. Vamos. 🚀

This post is the full story: from design in ChatGPT to the production widget. Let's go. 🚀

XoxoBot avatar animado
XoxoBot en su forma final: un GIF de 73 frames con background removalXoxoBot in its final form: a 73-frame GIF with background removal

1 El Origen: De Emoji a AvatarThe Origin: From Emoji to Avatar

XoxoBot no nació como un chatbot. Nació como un emoji.

XoxoBot wasn't born as a chatbot. It was born as an emoji.

Cuando estaba diseñando la identidad de OventLabs, quería una mascota que fuera memorable, mexicana y tech-friendly. Los axolotes son endémicos de México, se regeneran (como el buen código después de un refactor), y son adorables. Perfect fit.

When designing OventLabs' identity, I wanted a mascot that was memorable, Mexican, and tech-friendly. Axolotls are endemic to Mexico, they regenerate (like good code after a refactor), and they're adorable. Perfect fit.

La evolución visualThe Visual Evolution

  1. Diseño con ChatGPT — Le pedí a ChatGPT que generara el diseño original del axolotl morado. Varias iteraciones hasta que quedó el look perfecto: cute, morado-azulado, con esos ojos grandes.
  2. Design with ChatGPT — I asked ChatGPT to generate the original purple axolotl design. Several iterations until the perfect look: cute, purple-blue, with those big eyes.
  3. Animación con Grok — Tomé el diseño y se lo pasé a Grok para que lo animara. El resultado: un GIF del axolotl con movimiento, vida propia.
  4. Animation with Grok — I took the design and passed it to Grok to animate it. The result: a GIF of the axolotl with movement, with a life of its own.
  5. Background removal con rembg — El GIF tenía fondo, así que usé rembg para procesarlo frame por frame. 73 frames, cada uno pasado por el modelo de segmentación de IA. El resultado: un axolotl morado flotando en transparencia pura.
  6. Background removal with rembg — The GIF had a background, so I used rembg to process it frame by frame. 73 frames, each passed through an AI segmentation model. The result: a purple axolotl floating in pure transparency.
  7. Peluche real XOXO — El 14 de febrero (sí, San Valentín 🥰), mi novia me regaló un peluche de axolotl morado-azulado que sostiene un corazón con "XOXO". Ella lo eligió porque sabía que estaba construyendo al bot y le pareció perfecto. Tiene razón. Desde entonces, XOXO vive en mi escritorio junto al monitor, cuidando que el código compile. Es la mascota oficial de OventLabs.
  8. Real XOXO Plushie — On February 14th (yes, Valentine's Day 🥰), my girlfriend gave me a purple-blue axolotl plushie holding a heart with "XOXO". She chose it because she knew I was building the bot and thought it was perfect. She's right. Since then, XOXO lives on my desk next to the monitor, watching over the code. It's the official OventLabs mascot.
XOXO, el peluche de axolotl morado
XOXO, el peluche oficial — regalo de San Valentín. Vive en el escritorio junto al monitor. 💜XOXO, the official plushie — a Valentine's Day gift. Lives on the desk next to the monitor. 💜

🧸 Fun fact: El nombre "XoxoBot" viene de XOXO (hugs and kisses) + Bot. Y su emoji oficial es 🪼 — técnicamente es una medusa, pero si entrecierras los ojos, parece un axolotl. Close enough.

🧸 Fun fact: The name "XoxoBot" comes from XOXO (hugs and kisses) + Bot. And its official emoji is 🪼 — technically it's a jellyfish, but if you squint, it looks like an axolotl. Close enough.

2 El Cerebro: GPT-4o + Tool CallingThe Brain: GPT-4o + Tool Calling

Un avatar bonito sin cerebro es solo un GIF. XoxoBot necesitaba poder conversar, entender contexto y ejecutar acciones reales.

A pretty avatar without a brain is just a GIF. XoxoBot needed to be able to converse, understand context, and execute real actions.

Tech Stack

┌──────────┐     SSE      ┌──────────────┐    Copilot API   ┌─────────┐
│  Widget  │◄────────────▶│  Next.js API │◄─────────────────▶│  GPT-4o │
│ (iframe) │              │   Route      │                   │         │
└──────────┘              └──────┬───────┘                   └─────────┘
                                 │
                    ┌────────────┼────────────┐
                    │            │            │
               ┌────▼───┐  ┌────▼───┐  ┌────▼────────┐
               │ SendGrid│  │ Google │  │ Google      │
               │ (email) │  │Calendar│  │ Meet (auto) │
               └─────────┘  └────────┘  └─────────────┘

Arquitectura de XoxoBot: widget → API → GPT-4o → toolsXoxoBot architecture: widget → API → GPT-4o → tools

Marker-based Tool Calling

En vez de usar el function calling nativo de OpenAI (que requiere un segundo request), implementé un sistema de markers. Cuando GPT-4o quiere ejecutar una acción, emite un marker especial en el stream:

Instead of using OpenAI's native function calling (which requires a second request), I implemented a markers system. When GPT-4o wants to execute an action, it emits a special marker in the stream:

Claro, voy a agendar tu cita 📅
[[TOOL:schedule_meeting|{"date":"2026-02-20","time":"10:00","title":"Demo OventLabs"}]]
¡Listo! Tu cita quedó agendada con Google Meet incluido.

El backend detecta el marker [[TOOL:...]], ejecuta la función correspondiente, inyecta el resultado y sigue streameando. Todo en un solo request. Sin round-trips extra. El usuario ve la respuesta fluir en tiempo real.

The backend detects the [[TOOL:...]] marker, executes the corresponding function, injects the result, and keeps streaming. All in a single request. No extra round-trips. The user sees the response flow in real time.

Las herramientasThe Tools

~800ms
Time to first token. El usuario ve la respuesta empezar a aparecer casi inmediatamente gracias a SSE streaming.Time to first token. The user sees the response start appearing almost immediately thanks to SSE streaming.

3 La Personalidad: No Es Solo un BotThe Personality: It's Not Just a Bot

Cualquiera puede conectar GPT-4o a un widget. Lo que hace diferente a XoxoBot es su personalidad.

Anyone can connect GPT-4o to a widget. What makes XoxoBot different is its personality.

El system prompt de XoxoBot define a un personaje muy específico:

XoxoBot's system prompt defines a very specific character:

💡 La clave del system prompt: No le digo "sé amigable". Le doy contexto, ejemplos y límites. Sabe qué puede hacer (agendar citas), qué no puede hacer (dar precios exactos sin contexto) y cuándo escalar a un humano. Un buen system prompt es como onboarding de un empleado, no una lista de reglas.

💡 The key to the system prompt: I don't tell it "be friendly". I give it context, examples, and limits. It knows what it can do (schedule appointments), what it can't do (give exact prices without context), and when to escalate to a human. A good system prompt is like employee onboarding, not a list of rules.

4 El Widget: Embebible y Mobile-FirstThe Widget: Embeddable and Mobile-First

XoxoBot vive como un widget embebible — un botón flotante que abre un chat. Cualquier sitio puede integrarlo con un <script> tag.

XoxoBot lives as an embeddable widget — a floating button that opens a chat. Any site can integrate it with a <script> tag.

Features del widgetWidget Features

1 línealine
de código para integrar XoxoBot en cualquier sitio. Un <script> tag y listo.of code to integrate XoxoBot into any site. One <script> tag and done.

5 La Pipeline del GIF: 73 Frames de MagiaThe GIF Pipeline: 73 Frames of Magic

Esto merece su propia sección porque fue más trabajo del que esperaba.

This deserves its own section because it was more work than I expected.

El GIF original del axolotl tenía un fondo sólido. Para usarlo como avatar flotante necesitaba transparencia. El problema: GIFs con transparencia + background removal = pesadilla.

The original axolotl GIF had a solid background. To use it as a floating avatar I needed transparency. The problem: GIFs with transparency + background removal = nightmare.

El procesoThe Process

  1. Extraer frames — Separé el GIF en 73 imágenes PNG individuales
  2. Extract frames — I split the GIF into 73 individual PNG images
  3. rembg en cada frame — Usé rembg (modelo U2-Net) para remover el fondo de cada frame. Batch processing con un script de Python
  4. rembg on each frame — Used rembg (U2-Net model) to remove the background from each frame. Batch processing with a Python script
  5. Cleanup manual — Algunos frames quedaban con artefactos en las branquias (las partes semi-transparentes del axolotl). Tuve que ajustar thresholds
  6. Manual cleanup — Some frames had artifacts on the gills (the semi-transparent parts of the axolotl). I had to adjust thresholds
  7. Reensamblar — Junté los 73 frames de vuelta en un GIF animado con transparencia
  8. Reassemble — I joined the 73 frames back into an animated GIF with transparency
# El script simplificado
from rembg import remove
from PIL import Image
import glob

for i, frame_path in enumerate(sorted(glob.glob("frames/*.png"))):
    img = Image.open(frame_path)
    output = remove(img)
    output.save(f"clean/{i:03d}.png")

¿El resultado? Un axolotl morado flotando en el vacío digital, listo para saludar a los visitantes. Worth it.

The result? A purple axolotl floating in the digital void, ready to greet visitors. Worth it.

6 Lo Que Viene: El RoadmapWhat's Coming: The Roadmap

XoxoBot ya es funcional, pero apenas estamos empezando. Lo que viene:

XoxoBot is already functional, but we're just getting started. What's coming:

🔮 La visión: XoxoBot no es solo un chatbot — es el primer punto de contacto de OventLabs. La idea es que cualquier persona pueda llegar al sitio, hablar con XoxoBot, entender qué hacemos, agendar una demo y recibir una cotización preliminar… todo sin que un humano intervenga. Cuando el humano entra, ya tiene todo el contexto.

🔮 The vision: XoxoBot is not just a chatbot — it's the first point of contact for OventLabs. The idea is that anyone can come to the site, chat with XoxoBot, understand what we do, schedule a demo, and receive a preliminary quote… all without a human intervening. When the human enters, they already have all the context.

🪼 TL;DR

  • XoxoBot es el asistente virtual de OventLabs — un axolotl morado que chatea con GPT-4o
  • XoxoBot is the virtual assistant of OventLabs — a purple axolotl that chats with GPT-4o
  • Capabilities: chat con IA, envío de emails (SendGrid), agendar citas en Google Calendar con Meet automático
  • Capabilities: AI chat, email sending (SendGrid), scheduling appointments in Google Calendar with automatic Meet
  • Tech: Next.js API route + Copilot API (GPT-4o) + SSE streaming + marker-based tool calling
  • El avatar pasó de diseño en ChatGPT → animación con Grok → background removal con rembg (73 frames) → peluche real llamado XOXO
  • The avatar went from design in ChatGPT → animation with Grok → background removal with rembg (73 frames) → real plushie named XOXO
  • El nombre: XOXO (hugs & kisses) + Bot. Emoji oficial: 🪼
  • The name: XOXO (hugs & kisses) + Bot. Official emoji: 🪼
  • Widget: embebible, fullscreen mobile, markdown, quick actions, rate limiting
  • Widget: embeddable, fullscreen mobile, markdown, quick actions, rate limiting
  • Lo que viene: lead capture, cotizaciones, voice, analytics
  • What's coming: lead capture, quotes, voice, analytics
  • Vive en agents.oventlabs.com — ve a saludarlo 💜
  • Lives at agents.oventlabs.com — go say hi 💜