Create your own AI Santa variation with Tavus! This is a fully functional, festive microsite template that you can fork and customize to create any Santa personality you can imagine.
By default, this template features Bad Santa - but you can easily customize it to create a tropical Santa, a mall-cop Santa, a Santa who's clearly in witness protection... or something completely cursed.
- Talk to Bad Santa: https://badsanta.tavuslabs.org/
- Talk to Regular AI Santa: https://santa.tavus.io/
Before you start: You'll need to create your own persona in Tavus - you cannot use the persona ID from this template. See step 4 for details!
Click the "Fork" button at the top of this page to create your own copy.
- Go to Tavus to learn more, then sign up for a developer account
- Get your API key from the Tavus dashboard
This project uses a pre-made Santa replica. The replica ID is already configured in the code:
- Replica ID:
raa1d440ec4a
You don't need to change this - just use it as-is!
p472056757c3 from this template - it's tied to a specific Tavus account and won't work with your API key. You must create your own persona!
Want to recreate Bad Santa? Steal the prompt and make your own:
- Open
BAD_SANTA_PROMPT.mdin this repo - it contains the full Bad Santa personality prompt - Go to your Tavus dashboard and create a new Persona
- Copy the entire prompt from
BAD_SANTA_PROMPT.mdand paste it into the persona creation form - Save your persona and copy your Persona ID (it will look like
p472056757c3)
Create a completely custom Santa personality:
- In the Tavus dashboard, create a new Persona
- Write a personality prompt describing your Santa variant. Examples:
- "A tropical Santa who lives on a beach, wears flip-flops, and talks about surfing instead of reindeer"
- "A mall-cop Santa who's very serious about security and asks visitors for ID"
- "A Santa who's clearly in witness protection and keeps looking over his shoulder"
- Save your persona and copy your Persona ID
- Open
api/create-conversation.js - Find these lines (around line 232-233):
const HARDCODED_PERSONA_ID = 'p472056757c3' // Replace with YOUR persona ID const HARDCODED_REPLICA_ID = 'raa1d440ec4a'
- Replace
'p472056757c3'with your Persona ID:const HARDCODED_PERSONA_ID = 'your_persona_id_here'
- Create a
.envfile in the root directory:TAVUS_API_KEY=your_tavus_api_key_here
- For production on Vercel, add
TAVUS_API_KEYin your Vercel project settings (Environment Variables)
npm install
npm run buildDeploy to Vercel (or your preferred hosting):
- Connect your GitHub repo to Vercel
- Add the
TAVUS_API_KEYenvironment variable - Deploy!
Boom! Your very own Santa variant is live! π
This template includes:
- β Retro pixelated UI with draggable windows
- β Full video call experience with AI Santa
- β Camera/mic setup (hair check)
- β Flappy Bird-style mini-game
- β Christmas countdown timer
- β Mobile-responsive design
- β Multi-language support (20+ languages)
Edit src/index.css and src/App.css for global styles, or component-specific CSS modules.
- Hero text:
src/components/HeroText/HeroText.jsx - Button text:
src/components/CallControls/CallControls.jsx - End screen message:
src/components/CallEndedScreen/CallEndedScreen.jsx
- Replace files in the
public/directory - Update paths in
src/utils/assetPaths.js
Edit src/hooks/useCountdown.js to change the target date or countdown behavior.
Edit src/utils/translations.js to add or modify translations.
- Node.js 18+ and npm
- A Tavus account (sign up for a developer account)
- A Tavus API key (get it from your Tavus dashboard)
Learn more about Tavus at tavus.io
src/
βββ components/ # React components
β βββ VideoCallWindow/ # Main Santa video call window
β βββ FlappySanta/ # Mini-game component
β βββ CallControls/ # Answer call button
β βββ cvi/ # Tavus CVI components
βββ hooks/ # Custom React hooks
β βββ useTavusConversation.js # Tavus API integration
β βββ useCountdown.js # Christmas countdown
βββ utils/ # Utility functions
βββ assetPaths.js # Asset path constants
βββ translations.js # Multi-language support
api/
βββ create-conversation.js # Serverless function (edit persona ID here!)
-
Install dependencies:
npm install
-
Create
.envfile:TAVUS_API_KEY=your_api_key_here
-
Start development server:
vercel dev
This runs both the Vite frontend and serverless functions locally.
-
Open
http://localhost:3000in your browser
Note: Use vercel dev (not npm run dev) to run the serverless functions. The npm run dev command runs Vite only for quick frontend-only development.
npm run buildThe built files will be in the dist/ directory.
You only need one environment variable to get started:
TAVUS_API_KEY- Your Tavus API key (get it from platform.tavus.io)
- Make sure you've created a
.envfile withTAVUS_API_KEY=your_key - For Vercel, add the environment variable in project settings
- Verify your API key is correct
- Check that your Persona ID is valid in the Tavus dashboard
- Make sure the replica ID
raa1d440ec4ais accessible with your account
- Check browser console for errors
- Verify asset paths in
src/utils/assetPaths.js - Make sure files exist in
public/directory
- React 19.2.0 - UI framework
- Vite 7.2.2 - Build tool
- @tavus/cvi-ui - Tavus Conversational Video Interface
- @daily-co/daily-react - Video calling infrastructure
- Jotai - State management
This project uses the Tavus Conversational Video Interface (CVI) React Component Library to style and manage the video call UI. The library provides pre-built components that let you create a conversational video interface in seconds.
The Tavus CVI React component library is a complete set of pre-built components and hooks for integrating AI-powered video conversations into React applications. It includes:
- Pre-built video chat components - Ready-to-use conversation UI
- Device management - Camera, microphone, and screen sharing controls
- Real-time audio/video processing - Handles all the video call complexity
- Customizable styling - Fully customizable to match your brand
- TypeScript support - Full type definitions included
If you want to use the Tavus React Component Library in a different project (outside of this Santa template), here's how to get started:
npx @tavus/cvi-ui@latest initThis command:
- Creates a
cvi-components.jsonconfig file - Prompts for TypeScript preference
- Installs npm dependencies (
@daily-co/daily-react,@daily-co/daily-js,jotai)
npx @tavus/cvi-ui@latest add conversationIn your root file (main.tsx or index.tsx):
import { CVIProvider } from './components/cvi/components/cvi-provider';
function App() {
return <CVIProvider>{/* Your app content */}</CVIProvider>;
}import { Conversation } from './components/cvi/components/conversation';
function CVI() {
const handleLeave = () => {
// handle leave
};
return (
<div
style={{
width: '100%',
height: '100%',
maxWidth: '1200px',
margin: '0 auto',
}}
>
<Conversation
conversationUrl='YOUR_TAVUS_MEETING_URL'
onLeave={handleLeave}
/>
</div>
);
}Note: The Conversation component requires a parent container with defined dimensions to display properly. Ensure your body element has full dimensions (width: 100% and height: 100%) in your CSS.
- Tavus CVI Component Library Documentation
- CVI UI Haircheck Conversation Example - Example project with HairCheck and Conversation blocks
- Create Conversation API Reference - Learn how to generate conversation URLs
In this Santa template, we use the Tavus CVI library components located in src/components/cvi/:
- Conversation component - The main video call interface
- HairCheck component - Camera/mic setup screen
- CVI Provider - Wraps the app to provide CVI context
You can customize these components or use them as-is - they're fully functional out of the box!
- Tavus - Learn more about Tavus
- Tavus Documentation
- Sign up for Tavus - Developer account sign-up
- React Documentation
- Vite Documentation
- Daily.co Documentation
Found a bug? Want to add a feature? Pull requests are welcome!
MIT License
Copyright (c) 2024 Tavus Engineering
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Made with β€οΈ for the holiday season. Now go make something cursed! π πΉ