
Product
Socket Now Protects the Firefox Extension Ecosystem
Socket is bringing experimental protection to Firefox, scanning 97,000+ extensions in Mozilla's official directory for malware and risky updates.
@convai/experience-embed
Advanced tools
A library for embedding Pixel Streaming functionality in web applications, supporting both React and vanilla JavaScript/TypeScript implementations.
A library for embedding Pixel Streaming functionality in web applications, supporting both React and vanilla JavaScript/TypeScript implementations.
npm install @convai/experience-embed
First, import the PixelStreamComponent in your React application:
import { PixelStreamComponent } from "@convai/experience-embed";
Create a ref to access the component's methods:
import { useRef } from "react";
import { PixelStreamComponentHandles } from "@convai/experience-embed";
// Inside your component:
const pixelStreamRef = useRef<PixelStreamComponentHandles>(null);
The component provides several methods through the ref:
enableCamera(): Enables the camera for the experiencedisableCamera(): Disables the cameraenableCharacterAudio(): Enables character audiodisableCharacterAudio(): Disables character audioinitializeExperience(): Initializes the experienceExample usage:
const handleEnableCamera = async () => {
await pixelStreamRef.current?.enableCamera();
};
Add the PixelStreamComponent to your JSX with the required props:
<PixelStreamComponent
ref={pixelStreamRef}
expId="your-experiment-id"
endUserId="user-123" // Required when using endUserMetadata
endUserMetadata={{ // Optional: additional user context
plan: "pro",
region: "us-east",
}}
InitialScreen={<div>Loading your experience...</div>}
/>
You can create a custom loading screen:
const CustomLoadingScreen = () => (
<div
style={{
width: "100%",
height: "100%",
display: "flex",
alignItems: "center",
justifyContent: "center",
background: "#000",
color: "#fff",
}}
>
<h2>Loading your experience...</h2>
</div>
);
// Use it in your component:
<PixelStreamComponent
ref={pixelStreamRef}
expId="your-experiment-id"
InitialScreen={<CustomLoadingScreen />}
/>;
Show a loading overlay until the embed sends isLoading: false:
<PixelStreamComponent
ref={pixelStreamRef}
expId="your-experiment-id"
LoadingScreenComponent={<div>Preparing experience...</div>}
/>
Import the PixelStreamClient in your TypeScript file:
import { PixelStreamClient } from "@convai/experience-embed";
Create a container element in your HTML:
<div id="pixel-stream-container" style="width: 100%; height: 600px;"></div>
Create a new instance of PixelStreamClient:
const container = document.getElementById("pixel-stream-container");
if (container) {
const pixelStream = new PixelStreamClient({
container: container,
expId: "your-experiment-id",
endUserId: "user-123", // Required when using endUserMetadata
endUserMetadata: { // Optional: additional user context
plan: "pro",
region: "us-east",
},
InitialScreen: document.createElement("div"),
LoadingScreenComponent: document.createElement("div"),
});
}
The client provides the following methods:
// Enable camera
pixelStream.enableCamera().then((success) => {
console.log("Camera enabled:", success);
});
// Disable camera
pixelStream.disableCamera().then((success) => {
console.log("Camera disabled:", success);
});
// Enable character audio
pixelStream.enableCharacterAudio();
// Disable character audio
pixelStream.disableCharacterAudio();
// Initialize experience
pixelStream.initializeExperience();
You can use the @convai/experience-embed package directly in your HTML without any build tools by loading it from a CDN.
Include the library via CDN in your HTML:
<script src="https://unpkg.com/@convai/experience-embed/dist/core/convai-embed.umd.js"></script>
Create a container element in your HTML:
<div id="pixel-stream-container" style="width: 100%; height: 600px;"></div>
Create a new instance of PixelStreamClient:
<script>
const container = document.getElementById("pixel-stream-container");
const customInitialScreen = document.createElement("div");
customInitialScreen.style.cssText = `
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
z-index: 10;
display: flex;
align-items: center;
justify-content: center;
background: rgba(0, 0, 0, 0.8);
color: white;
font-family: Arial, sans-serif;
`;
customInitialScreen.innerHTML = `
<div style="text-align: center;">
<h2>Welcome to the Experience</h2>
<p>Click anywhere to start</p>
</div>
`;
const pixelStream = new PixelStreamCore.PixelStreamClient({
expId: "your-experiment-id",
container: container,
endUserId: "user-123", // Required when using endUserMetadata
endUserMetadata: { // Optional: additional user context
plan: "pro",
region: "us-east",
},
InitialScreen: customInitialScreen,
});
// Make it available globally for debugging if needed
window.pixelStream = pixelStream;
</script>
Once initialized, the following methods are available on the pixelStream object:
initializeExperience() Starts the pixel streaming session:
pixelStream.initializeExperience();
enableCamera() Requests access to the user’s camera and sends the video stream to the experience:
pixelStream.enableCamera().then((success) => {
console.log("Camera enabled:", success);
});
disableCamera() Stops the camera stream:
pixelStream.disableCamera().then((success) => {
console.log("Camera disabled:", success);
});
enableCharacterAudio() Enables audio from the character (from Unreal/Convai):
pixelStream.enableCharacterAudio();
disableCharacterAudio() Enables audio from the character (from Unreal/Convai):
pixelStream.disableCharacterAudio();
You can add buttons in your HTML to trigger these methods:
<div class="controls">
<button onclick="pixelStream.initializeExperience()">Start Experience</button>
<button onclick="pixelStream.enableCamera()">Enable Camera</button>
<button onclick="pixelStream.disableCamera()">Disable Camera</button>
<button onclick="pixelStream.enableCharacterAudio()">Enable Audio</button>
<button onclick="pixelStream.disableCharacterAudio()">Disable Audio</button>
</div>
| Prop | Type | Required | Description |
|---|---|---|---|
| expId | string | Yes | Your experiment ID |
| endUserId | string | No* | User identifier for tracking and long-term memory |
| endUserMetadata | Record<string, any> | No | Additional user context (requires endUserId) |
| InitialScreen | React.ReactNode | No | Custom splash screen shown before experience starts |
| LoadingScreenComponent | React.ReactNode | No | Loading overlay shown until embed sends isLoading: false |
| serviceUrls | object | No | Custom service URLs configuration |
| serviceUrls.sessionFetch | string | No | Custom URL for fetching the session |
| serviceUrls.pixelStreamBase | string | No | Custom base URL for the pixel stream |
*
endUserIdis required if you want to passendUserMetadata. TypeScript will enforce this at compile time.
| Option | Type | Required | Description |
|---|---|---|---|
| container | HTMLElement | Yes | The container element for the stream |
| expId | string | Yes | Your experiment ID |
| endUserId | string | No* | User identifier for tracking and long-term memory |
| endUserMetadata | Record<string, any> | No | Additional user context (requires endUserId) |
| InitialScreen | HTMLElement | No | Custom splash screen shown before experience starts |
| LoadingScreenComponent | HTMLElement | No | Loading overlay shown until embed sends isLoading: false |
| serviceUrls | object | No | Custom service URLs configuration |
| serviceUrls.sessionFetch | string | No | Custom URL for fetching the session |
| serviceUrls.pixelStreamBase | string | No | Custom base URL for the pixel stream |
*
endUserIdis required if you want to passendUserMetadata. TypeScript will enforce this at compile time.
FAQs
A library for embedding Pixel Streaming functionality in web applications, supporting both React and vanilla JavaScript/TypeScript implementations.
The npm package @convai/experience-embed receives a total of 91 weekly downloads. As such, @convai/experience-embed popularity was classified as not popular.
We found that @convai/experience-embed demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Product
Socket is bringing experimental protection to Firefox, scanning 97,000+ extensions in Mozilla's official directory for malware and risky updates.

Research
/Security News
Three compromised Rust crates pulled in a malicious dependency that downloaded and executed cross-platform malware during Cargo builds.

Research
/Security News
Socket uncovered 77 linked Firefox extensions, including 40 that steal wallet secrets or credentials and 37 deceptive sports-score shells.