@framefind/coreIdentify whether a face is wearing glasses and return a calibrated confidence score.
Add gaze, blink, head-pose and face-attribute signals to your product without streaming camera frames to a server.
*ONNX model-only benchmark; full frame latency depends on the device and runtime.
import { useRef } from 'react';
import {
useGlassesDetector,
useHeadPoseDetector,
useBlinkDetector,
} from '@framefind/react';
export function App() {
const videoRef = useRef(null);
const glasses = useGlassesDetector({ videoRef });
const headPose = useHeadPoseDetector({ videoRef });
const blink = useBlinkDetector({
videoRef,
onBlink: (ear) => console.log('blink!', ear),
onFaceLost: () => console.log('face lost'),
});
return (
<div>
<video ref={videoRef} autoPlay playsInline muted />
{glasses.loading && <p>Loading…</p>}
{glasses.result && <p>Glasses: {glasses.result.glasses ? 'yes' : 'no'}</p>}
{headPose.result && <p>Yaw: {headPose.result.yaw.toFixed(1)}°</p>}
{blink.result && <p>Blinking: {blink.result.isBlinking ? 'yes' : 'no'}</p>}
</div>
);
}npm install @framefind/core @framefind/reactAll detectors live in @framefind/core with React hooks in @framefind/react. Choose the browser or Node.js runtime and keep the integration focused on the signals you actually use.
@framefind/coreIdentify whether a face is wearing glasses and return a calibrated confidence score.
@framefind/coreTrack yaw, pitch and roll to understand how a face is oriented.
@framefind/coreDetect blink events with adaptive per-eye calibration and temporal smoothing.
@framefind/coreClassify a face as masked, unmasked or wearing a mask incorrectly.
@framefind/coreEstimate gaze direction and map it to a normalized screen region.
@framefind/coreAnti-spoof challenge for KYC and onboarding flows
@framefind/coreMouth-open detector for meeting UX and speaker indicators
@framefind/coreFatigue scoring from blink rate, yawns, and eye closure
@framefind/coreEngagement score from head pose and eye state
@framefind/coreHeart-rate estimation from facial micro-color changes
A network round-trip on every frame adds latency where it matters most. Local inference keeps feedback immediate and responsive.
FrameFind processes video in the browser or on your server-side runtime. Raw camera frames are not sent to a FrameFind service.
Detectors are modular and runtimes remain peer dependencies, so you can choose the browser or Node.js path that fits your application.
Use the core classes directly or start with the React hooks. Every detector returns predictable typed results with faceDetected and confidence data.
Frame 04 / How it works
FrameFind detects landmarks once, derives the signal you need and returns a typed result to your application.
Input frame
Camera · image · Node.js
Face landmarks
Shared tracking layer
Signal extraction
Eyes · face region · pose
Local inference
ONNX · geometry · WASM
Typed result
Class · angle · event
Input frame
Camera · image · Node.js
Face landmarks
Shared tracking layer
Signal extraction
Eyes · face region · pose
Local inference
ONNX · geometry · WASM
Typed result
Class · angle · event
5
live detectors
0 bytes
data sent to server
112²
ONNX input pixels
Choose your runtime, initialize a detector and start reading typed results.
Choose a runtime and install the package
npm install @framefind/core @framefind/react onnxruntime-webnpm install @framefind/core onnxruntime-nodeCreate the detector
const { videoRef, result, loading } = useGlassesDetector();Or use the vanilla API: new GlassesDetector()
Read the result in your application
if (result?.glasses) {
console.log(`Glasses! ${(result.probability * 100).toFixed(1)}% confidence`);
}import { useRef, useEffect } from 'react';
import { useGlassesDetector, useBlinkDetector } from '@framefind/react';
export default function App() {
const videoRef = useRef<HTMLVideoElement>(null);
const { result: glasses, loading } = useGlassesDetector({
videoRef,
threshold: 0.35,
});
const { result: blink } = useBlinkDetector({
videoRef,
onBlink: (ear) => console.log('blink!', ear),
onFaceLost: () => console.log('face lost'),
onEARChange: (ear) => console.log('ear:', ear),
});
useEffect(() => {
let stream: MediaStream;
navigator.mediaDevices
.getUserMedia({ video: true })
.then((s) => {
stream = s;
if (videoRef.current) videoRef.current.srcObject = s;
});
return () => stream?.getTracks().forEach((t) => t.stop());
}, []);
return (
<div className="max-w-sm p-4">
<video ref={videoRef} autoPlay playsInline muted className="w-full" />
{loading && <p>Loading model…</p>}
{glasses && (
<p>Glasses: {glasses.glasses ? 'Yes' : 'No'} ({(glasses.probability * 100).toFixed(1)}%)</p>
)}
{blink && (
<>
<p>State: {blink.isBlinking ? 'closed' : 'open'}</p>
<p>EAR: {blink.smoothedEar?.toFixed(3) ?? '—'}</p>
<p>Baseline: {blink.baselineEar?.toFixed(3) ?? '—'}</p>
</>
)}
</div>
);
}Frame 06 / Use cases
Use the detector that matches your interface, with a processing model that respects the camera frame.
EdTech
Study interfaces
Build optional gaze and blink signals into learning tools without uploading classroom video.
Telemedicine
Remote assessments
Use local face signals to support guided assessments while keeping sensitive video on the device.
Gaming
Hands-free controls
Turn gaze and head pose into lightweight interaction signals for browser-based experiences.
Accessibility
Accessible interfaces
Prototype gaze-assisted navigation and alternative controls with a local processing path.
Automotive
Attention-aware tools
Explore blink, gaze and head-pose signals in controlled, user-consented interfaces.
Video Conferencing
Meeting experiences
Add optional presence and interaction cues without making raw video part of your backend.