Skip to content

Migration from Webgazer.js

Migrating from the original Webgazer.js to Webgazer.ts is straightforward - the API is 100% backward compatible.

Installation

Replace the original package:

bash
# Remove old package
npm uninstall webgazer

# Install new package
npm install @webgazer-ts/core

Import Changes

Update your imports:

javascript
import webgazer from 'webgazer';
// or
const webgazer = require('webgazer');
typescript
import webgazer from '@webgazer-ts/core';
// or
const webgazer = require('@webgazer-ts/core');

API Compatibility

All existing code works without changes!

typescript
// This exact code works in both versions
webgazer
  .setRegression('ridge')
  .setTracker('TFFacemesh')
  .setGazeListener((data, timestamp) => {
    console.log(data);
  })
  .begin();

All 28 Methods Supported

Every method from Webgazer.js v3.x is implemented:

MethodStatusNotes
begin()Identical behavior
end()Identical behavior
pause()Identical behavior
resume()Identical behavior
setGazeListener()Identical signature
setTracker()Supports 'TFFacemesh'
setRegression()Supports 'ridge', 'ridgeThreaded', 'ridgeWeighted'
showVideo()Identical behavior
showPredictionPoints()Identical behavior
showFaceOverlay()Identical behavior
showFaceFeedbackBox()Identical behavior
saveDataAcrossSessions()Identical behavior
applyKalmanFilter()Identical behavior
getCurrentPrediction()Identical return type
getTracker()Returns tracker instance
getRegression()Returns regressor instance
clearData()Identical behavior
getVideoElementCanvas()Identical return
All 28 methodsSee API docs

Breaking Changes

There are ZERO breaking changes for core functionality. However, some improvements in v0.2.0:

1. Default Data Persistence (CHANGED in v0.2.0)

typescript
// v0.1.0 - saved by default
webgazer.begin(); // Data saved to localStorage

// v0.2.0 - NOT saved by default (privacy-first)
webgazer.begin(); // Data NOT saved

// Explicitly enable if needed
webgazer.saveDataAcrossSessions(true).begin();

Why? Privacy-first design. Users should opt-in to data storage.

2. TypeScript Types (NEW)

Now you get full type checking:

typescript
import webgazer, { GazePrediction } from '@webgazer-ts/core';

// Type-safe callback
webgazer.setGazeListener((data: GazePrediction | null, timestamp: number) => {
  if (data) {
    // TypeScript knows data has x, y properties
    console.log(data.x, data.y);
  }
});

3. ES Modules (IMPROVED)

Webgazer.ts uses modern ES modules:

typescript
// Tree-shaking works!
import webgazer from '@webgazer-ts/core';
// Only imports what you use

// CommonJS still supported
const webgazer = require('@webgazer-ts/core');

New Features in Webgazer.ts

While maintaining compatibility, we added new capabilities:

1. React Integration

tsx
// NEW: React hooks!
import { useWebgazer } from '@webgazer-ts/react';

function MyComponent() {
  const { gazeData, start } = useWebgazer({ autoStart: true });
  return <div>Gaze: {gazeData?.x}, {gazeData?.y}</div>;
}

2. Better Mouse Event Handling

typescript
// NEW: More control over mouse events
webgazer.addMouseEventListeners(); // Enable both clicks and moves
webgazer.removeMouseEventListeners(); // Clean up

// Fine-grained control
webgazer.recordScreenPosition(x, y, 'click'); // Explicit type

3. Improved Type Definitions

typescript
import type {
  GazePrediction,
  WebgazerConfig,
  Tracker,
  Regressor,
  EyeFeatures
} from '@webgazer-ts/core';

// All types available for custom implementations

Migration Examples

Example 1: Basic Tracking

No changes needed!

typescript
// Works in both Webgazer.js and Webgazer.ts
import webgazer from '@webgazer-ts/core';

await webgazer.begin();
webgazer.setGazeListener((data) => {
  console.log(data);
});

Example 2: Custom Regression

Same API:

typescript
// Works in both versions
import webgazer from '@webgazer-ts/core';

class MyRegressor {
  predict(eyeFeatures) {
    // Your logic
    return { x: 500, y: 300 };
  }
  
  addData(eyes, screenPos, type) {
    // Your training logic
  }
}

webgazer.setRegression(new MyRegressor());

Example 3: Configuration

Identical syntax:

typescript
// Works in both versions
webgazer
  .setTracker('TFFacemesh')
  .setRegression('ridge')
  .showVideo(true)
  .showFaceOverlay(true)
  .showPredictionPoints(true)
  .applyKalmanFilter(true)
  .saveDataAcrossSessions(false)
  .begin();

Testing Your Migration

  1. Install Webgazer.ts

    bash
    npm install @webgazer-ts/core
  2. Update imports

    typescript
    import webgazer from '@webgazer-ts/core';
  3. Test your app - Everything should work!

  4. Check for deprecation warnings - None! All APIs supported.

  5. Optional: Add types - Enjoy TypeScript benefits

typescript
// Add type annotations for better DX
import webgazer, { GazePrediction } from '@webgazer-ts/core';

const handleGaze = (data: GazePrediction | null) => {
  if (data) {
    // TypeScript knows about x, y properties
    console.log(data.x, data.y);
  }
};

webgazer.setGazeListener(handleGaze);

Gradual Migration Strategy

You can migrate incrementally:

Phase 1: Drop-in Replacement

typescript
// Just change the import
import webgazer from '@webgazer-ts/core';
// All existing code works

Phase 2: Add Type Safety

typescript
// Add types gradually
import webgazer, { GazePrediction } from '@webgazer-ts/core';

const handleGaze = (data: GazePrediction | null) => {
  // Now type-safe
};

Phase 3: Use New Features

typescript
// Adopt new capabilities
import webgazer from '@webgazer-ts/core';

// Explicit mouse event control
webgazer.addMouseEventListeners();

// Better lifecycle management
await webgazer.begin();
// vs
webgazer.begin(); // Still works, but prefer await

Phase 4: React Integration (Optional)

tsx
// Migrate to React hooks
import { useWebgazer } from '@webgazer-ts/react';

function MyComponent() {
  const { gazeData } = useWebgazer({ autoStart: true });
  // Much cleaner than manual lifecycle
}

Performance Comparison

MetricWebgazer.jsWebgazer.ts
Bundle Size~200KB~15KB (gzipped)
Prediction Rate60 FPS60 FPS
Initialization~800ms~800ms
Memory Usage~50MB~50MB
Tree Shaking

Need Help?

Summary

100% API Compatible - Drop-in replacement
Zero Breaking Changes - All code works
New Features - TypeScript, React, better DX
Same Performance - No speed degradation
Better DX - Types, tree-shaking, modern tooling

Migration time: < 5 minutes for most projects!

Based on Webgazer.js by Brown HCI