
Research
/Security News
77 Firefox Extensions Linked to Crypto Wallet and Credential Theft
Socket uncovered 77 linked Firefox extensions, including 40 that steal wallet secrets or credentials and 37 deceptive sports-score shells.
@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" // Optional: for user tracking
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", // Optional: for user tracking
InitialScreen: document.createElement("div"), // Optional custom loading screen
LoadingScreenComponent: document.createElement("div"), // Optional: shows until embed sends isLoading: false
});
}
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", // Optional: for user tracking
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 |
| InitialScreen | React.ReactNode | No | Custom loading screen component |
| 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 |
| 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 |
| InitialScreen | HTMLElement | No | Custom loading screen element |
| 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 |
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 92 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.

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

Security News
NIST disclosed an unreleased AI tool called V-etalon and opened a broad inquiry into NVD modernization after years of automation plans produced no public enrichment system.

Security News
In his AI Council 2026 talk, Feross Aboukhadijeh covers recent package compromises, vulnerability discovery, and a more automated security model.