Skip to main content
Check what hardware is available using session.capabilities. Different glasses have different features—displays, cameras, speakers, buttons, LEDs. Your app can detect and adapt to each device.

Accessing Capabilities

protected async onSession(session: AppSession, sessionId: string, userId: string) {
  const caps = session.capabilities;

  if (!caps) {
    session.logger.warn('Capabilities not loaded');
    return;
  }

  session.logger.info('Device:', caps.modelName);
  session.logger.info('Has camera:', caps.hasCamera);
  session.logger.info('Has display:', caps.hasDisplay);
}

Available Capabilities

CapabilityDescriptionCheck With
DisplayScreen for showing contentcaps.hasDisplay
CameraPhoto/video capturecaps.hasCamera
MicrophoneAudio inputcaps.hasMicrophone
SpeakerAudio outputcaps.hasSpeaker
ButtonPhysical controlscaps.hasButton
LEDLight indicatorscaps.hasLight
IMUMotion sensorscaps.hasIMU
WiFiNetwork connectivitycaps.hasWifi

Basic Usage

protected async onSession(session: AppSession, sessionId: string, userId: string) {
  const caps = session.capabilities;
  if (!caps) return;

  // Adapt to available hardware
  if (caps.hasDisplay) {
    session.layouts.showTextWall('Welcome!');
  } else {
    await session.audio.speak('Welcome!');
  }

  if (caps.hasCamera) {
    session.logger.info('Camera available');
  }
}

Detailed Capabilities

Display Details

if (caps.hasDisplay && caps.display) {
  session.logger.info('Resolution:', caps.display.resolution);
  session.logger.info('Color:', caps.display.isColor);
  session.logger.info('Max text lines:', caps.display.maxTextLines);
}

Camera Details

if (caps.hasCamera && caps.camera) {
  session.logger.info('Resolution:', caps.camera.resolution);
  session.logger.info('Can stream:', caps.camera.video.canStream);
  session.logger.info('Can record:', caps.camera.video.canRecord);
}

LED Details

if (caps.hasLight && caps.light) {
  session.logger.info('LED count:', caps.light.count);

  caps.light.lights?.forEach(led => {
    session.logger.info(`${led.id}: ${led.isFullColor ? 'RGB' : led.color}`);
  });
}

Common Device Types

Display Glasses - Have screens, no camera:
  • Even Realities G1
  • Vuzix Z100
Camera Glasses - Have cameras, no display:
  • Mentra Live
See device-specific pages for details:

Adapting Your App

protected async onSession(session: AppSession, sessionId: string, userId: string) {
  const caps = session.capabilities;
  if (!caps) return;

  // Choose interaction mode
  if (caps.hasDisplay) {
    this.useVisualMode(session);
  } else if (caps.hasSpeaker) {
    this.useAudioMode(session);
  }

  // Enable features based on hardware
  if (caps.hasCamera) {
    this.enablePhotoFeatures(session);
  }

  if (caps.hasButton) {
    this.enableButtonControls(session);
  }
}

Capabilities Interface

interface Capabilities {
  modelName: string;

  hasCamera: boolean;
  camera: CameraCapabilities | null;

  hasDisplay: boolean;
  display: DisplayCapabilities | null;

  hasMicrophone: boolean;
  microphone: MicrophoneCapabilities | null;

  hasSpeaker: boolean;
  speaker: SpeakerCapabilities | null;

  hasIMU: boolean;
  imu: IMUCapabilities | null;

  hasButton: boolean;
  button: ButtonCapabilities | null;

  hasLight: boolean;
  light: LightCapabilities | null;

  hasWifi: boolean;
  power: PowerCapabilities;
}

Best Practices

Always check capabilities:
// ✅ Good
if (session.capabilities?.hasCamera) {
  await session.camera.requestPhoto();
}

// ❌ Avoid - may crash
await session.camera.requestPhoto();
Provide fallbacks:
if (caps?.hasDisplay) {
  session.layouts.showTextWall('Message');
} else {
  await session.audio.speak('Message');
}
Check null values:
// Capabilities may be null initially
if (!caps) {
  session.logger.warn('Capabilities not available');
  return;
}

Next Steps