Header Logo

Adding a Conversational Property Tour Avatar to a Nuxt Real Estate Site

Adding a Conversational Property Tour Avatar to a Nuxt Real Estate Site

Build a Nuxt real estate property tour avatar with client-only rendering, backend-issued sessions, and LiveKit/iframe integration.

Introduction


If you build real estate products, you eventually run into the same issue: listings are rich in detail, but static. A buyer can browse photos and floor plans, yet still has to infer the feel of the space, the flow between rooms, and the “what should I notice here?” context that a human agent would normally provide.


A conversational property tour avatar addresses that gap. In practice, that means a web experience where a visitor can ask questions like “Is the kitchen open to the living room?” or “Show me where the primary bedroom is relative to the street,” and get a spoken answer from a voice agent with a synchronized video face embedded in the page. By the end of this post, you should be able to reason about the architecture, decide where the avatar should live in your Nuxt app, and wire it into a real-time conversation flow without leaking credentials to the browser.


What a property tour avatar actually needs to do


For a real estate site, “avatar” is not the hard part. The hard part is making the interaction feel responsive, reliable, and grounded in the listing the user is viewing.


The system usually has three moving parts:


  • Conversation transport: low-latency audio and control events, usually over WebRTC or a similar realtime path.

  • Speech pipeline: speech-to-text, LLM reasoning, and text-to-speech, with turn-taking and interruption handling.

  • Visual layer: a talking face that stays synchronized to the agent’s audio output, including lip sync and basic expression timing.


That last piece is the one most teams underestimate. A property tour avatar does not need cinematic animation; it needs enough visual continuity that the voice feels anchored to a person. If audio and mouth movement drift, users notice immediately. If the avatar lags behind the conversation, it feels broken even when the text is correct.


In a Nuxt app, the surrounding UI typically remains the source of truth for the listing: photos, key stats, map, notes, and any structured tour state. The avatar should be treated as a conversational interface layered on top of that state, not as a replacement for it.


Designing the Nuxt integration


There are two common patterns for a real estate site:


  1. Embed the avatar as a self-contained panel, typically in a sidebar or floating dock next to the listing content.

  2. Drive the avatar from the page’s current listing context, so the agent knows which property, room, or media asset the visitor is looking at.


The second part matters more than the first. A useful tour avatar needs enough context to answer questions about the active listing. That context can be minimal: listing ID, address, bedrooms, bathrooms, square footage, and optionally a structured summary of the page contents. If you have a richer data model, you can pass in room-level metadata or notes about the tour order.


A practical mental model is:


  • Nuxt page owns listing data and session lifecycle.

  • Avatar session owns realtime conversation state.

  • Backend issues the session token or configuration and enforces access control.


Do not generate or store long-lived secrets in the browser. If your avatar endpoint requires credentials, create session resources server-side and hand the client only the short-lived values it needs to connect.


Server-side session setup with the REST API


For a custom integration, the backend usually creates or prepares the avatar session before the Nuxt client connects. The exact request shape depends on the fields you use, but the flow is straightforward: authenticate with your API key, create a session, and return a session payload to the browser.


curl -X POST https://api.protoface.com/v1/sessions \
}'
curl -X POST https://api.protoface.com/v1/sessions \
}'
curl -X POST https://api.protoface.com/v1/sessions \
}'


Two implementation details are worth calling out:


First, the browser should never see your API key. Use your backend as the trust boundary.


Second, the agent instructions should be specific to the experience. For a property tour, instruct the agent to stay anchored to the listing, avoid hallucinating details, and defer when the page does not contain enough information.


If you already have a session token or ephemeral connection detail returned by your backend, Nuxt can pass that into the client-only component that renders the avatar. Keep that component isolated from SSR so the WebRTC/client runtime only initializes in the browser.


Embedding the avatar in Nuxt


In a Nuxt 3 app, you generally want the avatar widget to mount client-side only. A common pattern is a wrapper component that renders a loading state during SSR and initializes the realtime UI after hydration.


At a high level, the component does three things:


  1. Fetches the current listing context from your app state or API.

  2. Creates or retrieves a realtime avatar session from your backend.

  3. Mounts the avatar UI and connects it to the session.


Example structure:


<script setup lang="ts">
<script setup lang="ts">
<script setup lang="ts">


The actual avatar panel implementation depends on how you connect to the realtime surface, but the key is to keep the listing data and the conversation session in sync. If the user changes from one property to another, create a new session or reconfigure the existing one so the agent context cannot drift across listings.


Turning a voice agent into a talking face


If your stack already includes a voice agent, adding a synchronized face is mostly a transport and rendering problem. The agent still handles dialogue, tool calls, and turn-taking; the avatar is the visual endpoint that mirrors the agent’s speech output.


For teams using LiveKit-based voice agents, Protoface provides a plugin that drops the avatar into the agent pipeline so the voice and face stay synchronized. That is usually the cleanest path when your application already uses LiveKit for audio transport and agent orchestration. The plugin is published on PyPI as livekit-plugins-protoface, and the relevant example code lives in the plugin repo and quickstarts.


from livekit.plugins import protoface<p></p>
from livekit.plugins import protoface<p></p>
from livekit.plugins import protoface<p></p>


In this pattern, your agent can answer questions while the avatar provides the face and lip sync. The practical benefit is consistency: you keep one conversational brain, one audio channel, and one visual representation. That makes barge-in, silence handling, and state updates easier to reason about than if you tried to run separate voice and video agents.


For implementation details and current examples, the plugin repository is the right place to start: https://github.com/protoface-ai/protoface-plugin-pipecat. If your stack is more Python-centric, the SDK gives you programmatic access to avatars and sessions: https://github.com/protoface-ai/protoface-sdk-python.


Using an iframe when you want the fastest path


Not every site needs a custom realtime integration. If your goal is to add an interactive tour avatar to a marketing page or listing page without managing backend code, an iframe embed is the simplest option. In that model, the avatar experience runs in an isolated frame, with parent-origin allowlisting and per-embed controls for voice and instructions. The browser never gets your API key.


That makes the iframe path attractive when you want to validate the UX quickly or ship a controlled experience to a small subset of listings. It also reduces operational risk: you do not need to build session issuance, token exchange, or realtime connection management on day one.


The trade-off is flexibility. Once you need tight integration with listing state, analytics events, or custom UI controls, you will probably outgrow the iframe and move to a backend-issued session flow. For a lot of teams, that is a good progression: start isolated, then graduate to the API when the interaction proves valuable.


Gotchas that matter in production


There are a few issues that show up quickly in realtime avatar deployments:


  • SSR mismatch: only initialize the avatar client-side in Nuxt. Realtime media and DOM-dependent code should not run during server rendering.

  • Session drift: when the user switches listings, reset the agent context. Otherwise the avatar may answer about the wrong property.

  • Instruction quality: keep prompts short and operational. Tell the agent what data it can trust and what to do when information is missing.

  • Latency budget: every extra network hop shows up as awkward silence. Keep your listing context close to the app and avoid fetching large prompts on every turn.

  • Security: API keys stay server-side. If you use an iframe embed, still enforce origin allowlists and sensible rate limits.


It also helps to define clear fallback behavior. If the avatar session fails to start, the page should still function as a normal listing page with a text-based CTA. Realtime should enhance the tour, not block access to the property information.


Conclusion


A conversational property tour avatar is most useful when it is treated as a realtime interface over structured listing data, not as a gimmick layered onto a page. In Nuxt, that usually means server-side session setup, client-only avatar rendering, and a tight mapping between the currently viewed listing and the agent’s context.


If you want the shortest path from idea to working prototype, start with the docs at https://docs.protoface.com, then choose the integration surface that fits your stack: REST API for custom session control, the LiveKit plugin if you already run a voice agent, or an iframe embed if you want a fast, isolated launch. For more examples and quickstarts, the GitHub organization is a useful reference point: https://github.com/protoface-ai.

Add a face to your AI.

No credit card needed.

Add a face to your AI.

No credit card needed.

Add a face to your AI.

No credit card needed.