Documentation Index Fetch the complete documentation index at: https://cloud-docs.mentra.glass/llms.txt
Use this file to discover all available pages before exploring further.
Overview
Events are the primary way your app receives data from the glasses. All event handlers are accessed through session.events.
Available Events
Transcription Events
// Default language (en-US)
session . events . onTranscription (( data ) => {
console . log ( `Text: ${ data . text } ` );
console . log ( `Final: ${ data . isFinal } ` );
console . log ( `Language: ${ data . transcribeLanguage } ` );
});
// Specific language
session . events . onTranscriptionForLanguage ( 'es-ES' , ( data ) => {
console . log ( `Spanish text: ${ data . text } ` );
});
TranscriptionData fields
text: The transcribed text
isFinal: Whether this is a final or interim result
transcribeLanguage: Language code (e.g., ‘en-US’)
startTime: Timestamp when speech started
endTime: Timestamp when speech ended
confidence: Confidence score (0-1)
provider: Transcription provider used
session . events . onButtonPress (( data ) => {
console . log ( `Button: ${ data . buttonId } ` );
console . log ( `Type: ${ data . pressType } ` );
});
ButtonPress fields
buttonId: Button identifier (e.g., ‘main’)
pressType: ‘short’ or ‘long’
Head Position Events
session . events . onHeadPosition (( data ) => {
if ( data . position === 'up' ) {
console . log ( 'User looked up' );
} else if ( data . position === 'down' ) {
console . log ( 'User looked down' );
}
});
Photo Events
session . events . onPhotoTaken (( data ) => {
console . log ( `Photo received: ${ data . mimeType } ` );
// data.photoData is an ArrayBuffer
processPhoto ( data . photoData );
});
Location Events
// First subscribe to location updates
session . location . subscribeToStream ({}, ( data ) => {
console . log ( `Location: ${ data . lat } , ${ data . lng } ` );
if ( data . accuracy ) {
console . log ( `Accuracy: ${ data . accuracy } meters` );
}
});
Phone Notifications
session . events . onPhoneNotifications (( notifications ) => {
notifications . forEach ( notification => {
console . log ( ` ${ notification . app } : ${ notification . title } ` );
console . log ( `Content: ${ notification . content } ` );
});
});
Connection Events
// When connection is lost
session . events . onDisconnected (() => {
console . log ( 'Connection lost' );
});
// When connection is restored
session . events . onReconnected (() => {
console . log ( 'Connection restored' );
});
// When session starts
session . events . onConnected (( settings ) => {
console . log ( 'Connected with settings:' , settings );
});
// When errors occur
session . events . onError (( error ) => {
console . error ( 'Session error:' , error );
});
Event Patterns
Debouncing Events
let timeout : NodeJS . Timeout ;
session . events . onTranscription (( data ) => {
clearTimeout ( timeout );
// Wait for user to stop speaking
timeout = setTimeout (() => {
processCompleteUtterance ( data . text );
}, 1000 );
});
State Machines
enum State {
IDLE ,
LISTENING ,
PROCESSING
}
let currentState = State . IDLE ;
session . events . onButtonPress (( data ) => {
switch ( currentState ) {
case State . IDLE :
currentState = State . LISTENING ;
session . layouts . showTextWall ( 'Listening...' );
break ;
case State . LISTENING :
currentState = State . PROCESSING ;
session . layouts . showTextWall ( 'Processing...' );
processInput ();
break ;
}
});
Event Filtering
// Only respond to specific phrases
session . events . onTranscription (( data ) => {
if ( ! data . isFinal ) return ; // Skip interim results
const keywords = [ 'weather' , 'time' , 'news' ];
const hasKeyword = keywords . some ( word =>
data . text . toLowerCase (). includes ( word )
);
if ( hasKeyword ) {
handleCommand ( data . text );
}
});
Multi-User Events
For apps that support multiple users:
// Listen for messages from other users
session . events . onAppMessage (( message ) => {
console . log ( `From ${ message . senderUserId } : ${ message . payload } ` );
});
// User joined
session . events . onAppUserJoined (( userId ) => {
console . log ( ` ${ userId } joined` );
});
// User left
session . events . onAppUserLeft (( userId ) => {
console . log ( ` ${ userId } left` );
});
Best Practices
Event handlers are automatically cleaned up when the session ends, but you can manually remove them: const cleanup = session . events . onTranscription ( handler );
// Later...
cleanup (); // Remove this handler
session . events . onError (( error ) => {
console . error ( 'Session error:' , error );
// Show user-friendly message
session . layouts . showTextWall ( 'Something went wrong. Please try again.' );
});
let lastTranscript = '' ;
let lastButtonPress = Date . now ();
session . events . onTranscription (( data ) => {
lastTranscript = data . text ;
});
session . events . onButtonPress (( data ) => {
const timeSinceLastPress = Date . now () - lastButtonPress ;
if ( timeSinceLastPress < 500 ) {
// Double press detected
processCommand ( lastTranscript );
}
lastButtonPress = Date . now ();
});
Filter events early : Return early from handlers if the event isn’t relevant
Debounce rapid events : Use timeouts to batch rapid events
Avoid blocking operations : Use async/await for long-running tasks
Clean up resources : Remove handlers and clear timers when done