UI Customization
The Keyless SDK can be customised in order to provide a more familiar UX when integrated in any custom app.
Theme
The SDK theme can be customized to be dark, light or system.
Keyless will use the system defined theme by default.
Keyless.UI.Color.sdkTheme = SdkTheme.SYSTEM
// default theme is SYSTEM
public enum class SdkTheme {
DARK,
LIGHT,
SYSTEM
}Keyless.UI.Color.sdkTheme = .system
// default theme is system
public enum SDKTheme {
case dark
case light
case system
}import Keyless, { SdkTheme } from '@react-native-keyless/sdk';
const ui = new Keyless.UI();
ui.color.sdkTheme = Keyless.SdkTheme.LIGHT;
await Keyless.updateUI(ui);
// default theme is SYSTEM
export enum SdkTheme {
SYSTEM = 'SYSTEM',
LIGHT = 'LIGHT',
DARK = 'DARK',
}Colors
It is possible to customize the following colors:
primary color This color is the one that appears most frequently across the screens and components.
onPrimary color The color used for elements that appear on top of the PrimaryColor, ensuring clear contrast and visibility.
accent color Color used in some small details of the UI (e.g. Camera Frame borders)
Example
Keyless.UI.Color.primary = 0xFF1833B8
Keyless.UI.Color.onPrimary = 0xFFFED900
Keyless.UI.Color.accent = 0xFFFED900Keyless.UI.Color.primary = .magenta
Keyless.UI.Color.onPrimary = .cyan
Keyless.UI.Color.accent = .yellowconst ui = new Keyless.UI();
ui.color.accent = '#1833B8';
ui.color.primary ='#FFFFFF';
ui.color.accent = '#FED900';
await Keyless.updateUI(ui);Text
It is possible to customize the following text across the Introduction, Error, Enrollment and Success screens. Live Filters cannot be customized individually but translation files are available and can be provided.
Introduction
title Should be no longer than two lines
description Should be no longer than four lines
cta Should be no more than two words
Enrollment
We suggest to use no more than three lines of text.
Instruction
title
subtitle
tip1 This typically suggests to stay in a well lit area
tip2 This typically suggests to remove any glasses or eyewear
tip3 This typically suggests to be alone in the frame
continueCta
Error
title
subtitle
cta
Process
title
subtitle
Success
title Showed when the enrollment has been successfully completed.
subtitle Showed when the enrollment has been successfully completed
cta Button text to show on Success screen
Authentication
We suggest to not use more than two lines of text.
loading Shown before the camera opens.
centerFace Shown before the user positions the face.
scan Shown while scanning the user's face.
authenticate Shown while authenticating the user.
success Shown when the user has been authenticated successfully.





Live Filters
These appear dynamically on the camera preview screen during enrollment and guide the user to capture a high quality selfie are core to the product and subject to iterative change over time as we improve the product. Therefore these are not configurable individually however we do support localization – currently English and Italian are available but new ones can be created upon request.
The example below shows a live filter appearing to help the user. The corners/frame turns to the accent color (yellow in this example) once the biometric library is satisfied that a suitable image has been captured.

The following filters are returned though note the first two ("It's a bit dark, move closer to the light" and "The image is too bright, adjust lightning") are due to be added in Q4 2025.

Dynamic Linking
We suggest to not use more than two lines of text.
Authentication.PayloadConfirmation
title
subtitle
denyCta
approveCta

Example
// Custom text for introduction
Keyless.UI.Text.Introduction.title = "(custom) Keyless Secure Authentication"
Keyless.UI.Text.Introduction.description = "(custom) Hereon, you will start face scanning..."
Keyless.UI.Text.Introduction.cta = "(custom) Continue"
// Custom text for enrollment
// prelimiar information for enrollment
Keyless.UI.Text.Enrollment.Instruction.title = "(custom) Enroll your face"
Keyless.UI.Text.Enrollment.Instruction.description = "(custom) On the next screen, we will take a photo of your face to create your account."
Keyless.UI.Text.Enrollment.Instruction.tip1 = "(custom) Center your face in the frame"
Keyless.UI.Text.Enrollment.Instruction.tip2 = "(custom) Look directly at the screen"
Keyless.UI.Text.Enrollment.Instruction.tip3 = "(custom) Ensure you are in a well-lit area"
Keyless.UI.Text.Enrollment.Instruction.continueCta = "(custom) Continue"
// Enrollment loading screen
Keyless.UI.Text.Enrollment.Process.title = "(custom 1) Hold on a few seconds"
Keyless.UI.Text.Enrollment.Process.subtitle = "(custom 2) We're creating your private key"
// Error screen
Keyless.UI.Text.Enrollment.Error.title = "(custom) Something went wrong"
Keyless.UI.Text.Enrollment.Error.subtitle = "(custom) Please try again"
Keyless.UI.Text.Enrollment.Error.cta = "(custom) Continue"
// Success screen
Keyless.UI.Text.Enrollment.Success.title = "(custom) Keyless account created successfully!"
Keyless.UI.Text.Enrollment.Success.subtitle = "(custom) Keyless account created successfully!"
Keyless.UI.Text.Enrollment.Success.cta = "(custom) Keyless account created successfully!"
// Custom text for authentication
Keyless.UI.Text.Authentication.Step1.text1 = "(custom) Please look into the camera"
Keyless.UI.Text.Authentication.Step2.text1 = "(custom) Communicating with the Keyless network"
Keyless.UI.Text.Authentication.Step3.text1 = "(custom) Approved"
// Custom text for dynamic linking
Keyless.UI.Text.Authentication.PayloadConfirmation.title = "(custom) Authentication request"
Keyless.UI.Text.Authentication.PayloadConfirmation.subtitle = "(custom) Please, approve the payment to complete the process"
Keyless.UI.Text.Authentication.PayloadConfirmation.denyCta = "(custom) Deny"
Keyless.UI.Text.Authentication.PayloadConfirmation.approveCta = "(custom) Approve"
// Custom text for introduction
Keyless.UI.Text.Introduction.title = "(custom) Keyless Secure Authentication"
Keyless.UI.Text.Introduction.description = "(custom) Hereon, you will start face scanning..."
Keyless.UI.Text.Introduction.cta = "(custom) Continue"
// Custom text for enrollment
// Prelimiar information for enrollment
Keyless.UI.Text.Enrollment.Instruction.title = "(custom) Enroll your face"
Keyless.UI.Text.Enrollment.Instruction.description = "(custom) On the next screen, we will take a photo of your face to create your account."
Keyless.UI.Text.Enrollment.Instruction.tip1 = "(custom) Center your face in the frame"
Keyless.UI.Text.Enrollment.Instruction.tip2 = "(custom) Look directly at the screen"
Keyless.UI.Text.Enrollment.Instruction.tip3 = "(custom) Ensure you are in a well-lit area"
Keyless.UI.Text.Enrollment.Instruction.continueCta = "(custom) Continue"
// Enrollment loading screen
Keyless.UI.Text.Enrollment.Process.title = "(custom 1) Hold on a few seconds"
Keyless.UI.Text.Enrollment.Process.subtitle = "(custom 2) We're creating your private key"
// Error screen
Keyless.UI.Text.Enrollment.Error.title = "(custom) Something went wrong"
Keyless.UI.Text.Enrollment.Error.subtitle = "(custom) Please try again"
Keyless.UI.Text.Enrollment.Error.cta = "(custom) Continue"
// Success screen
Keyless.UI.Text.Enrollment.Success.title = "(custom) Keyless account created successfully!"
Keyless.UI.Text.Enrollment.Success.subtitle = "(custom) Keyless account created successfully!"
Keyless.UI.Text.Enrollment.Success.cta = "(custom) Keyless account created successfully!"
// Custom text for authentication
Keyless.UI.Text.Authentication.Step1.text1 = "(custom) Please look into the camera"
Keyless.UI.Text.Authentication.Step2.text1 = "(custom) Communicating with the Keyless network"
Keyless.UI.Text.Authentication.Step3.text1 = "(custom) Approved"
// Custom text for dynamic linking
Keyless.UI.Text.Authentication.PayloadConfirmation.title = "(custom) Authentication request"
Keyless.UI.Text.Authentication.PayloadConfirmation.subtitle = "(custom) Please, approve the payment to complete the process"
Keyless.UI.Text.Authentication.PayloadConfirmation.denyCta = "(custom) Deny"
Keyless.UI.Text.Authentication.PayloadConfirmation.approveCta = "(custom) Approve"import Keyless from '@react-native-keyless/sdk';
import Keyless from '@react-native-keyless/sdk';
const ui = new Keyless.UI();
// Custom text for introduction
ui.text.introduction.title = '(custom) Keyless Secure Authentication';
ui.text.introduction.description = '(custom) Hereon, you will start face scanning...';
ui.text.introduction.cta = '(custom) Continue';
// Custom text for enrollment
// Prelimiar information for enrollment
ui.text.enrollment.instruction.title = '(custom) Enroll your face';
ui.text.enrollment.instruction.tip1 = '(custom) Center your face in the frame';
ui.text.enrollment.instruction.tip2 = '(custom) Look directly at the screen';
ui.text.enrollment.instruction.tip3 = '(custom) Ensure you are in a well-lit area';
ui.text.enrollment.instruction.continueCta = '(custom) Continue';
// Enrollment loading screen
ui.text.enrollment.process.title = '(custom) Hold on a few seconds';
ui.text.enrollment.process.subtitle = "(custom) We're creating your private key";
// Error screen
ui.text.enrollment.error.title = '(custom) Something went wrong';
ui.text.enrollment.error.subtitle = '(custom) Please try again';
ui.text.enrollment.error.cta = '(custom) Continue';
// Success screen
ui.text.enrollment.success.title = '(custom) Keyless account created successfully!';
ui.text.enrollment.success.subtitle = '(custom) Keyless account created successfully!';
ui.text.enrollment.success.cta = '(custom) Keyless account created successfully!';
// Custom text for authentication
ui.text.authentication.centerFace = '(custom) Please look into the camera';
ui.text.authentication.scan = '(custom) Communicating with the Keyless network';
ui.text.authentication.authenticate = '(custom) Approved';
ui.text.authentication.success = '(custom) Approved';
// Custom text for dynamic linking
ui.text.authentication.payloadConfirmation.title = '(custom) Authentication request';
ui.text.authentication.payloadConfirmation.subtitle = '(custom) Please, approve the payment to complete the process';
ui.text.authentication.payloadConfirmation.denyCta = '(custom) Deny';
ui.text.authentication.payloadConfirmation.approveCta = '(custom) Approve';
await Keyless.updateUI(ui);Optional Screens
It is possible to show or hide some of the Enrollment and Authentication steps above by setting to false the following fields.
Enrollment
To toggle certain screens in Enrollment flow, use the following fields of a BiomEnrollConfig:
showInstructionsScreen: affects the Instruction screen (by defaulttrue)showSuccessFeedback: affects the Success screen (by defaulttrue)showFailureFeedback: affects the Error screen (by defaulttrue)
Example
// To hide all optional screens
val biomEnrollConfig = BiomEnrollConfig(
showInstructionsScreen = false,
showSuccessFeedback = false,
showFailureFeedback = false
)
Keyless.enroll(
configuration = biomEnrollConfig,
onCompletion = { /* handle completion */ }
)// To hide all optional screens
let biomEnrollConfig = BiomEnrollConfig(
showInstructionsScreen: false,
showSuccessFeedback: false,
showFailureFeedback: false
)
Keyless.enroll(
configuration: biomEnrollConfig,
onCompletion: { _ in /* handle completion */ }
)import Keyless, { BiomEnrollConfig } from '@react-native-keyless/sdk';
const enrollConfig = new BiomEnrollConfig({
showInstructionsScreen: false,
showSuccessFeedback: false,
showFailureFeedback: false
});
const result = await Keyless.enroll(enrollConfig);Authentication
Use the following fields of a BiomAuthConfig:
showSuccessFeedback: affects the Step3
Example
val biomAuthConfig = BiomAuthConfig(
showSuccessFeedback = false
)
Keyless.authenticate(
configuration = biomAuthConfig,
onCompletion = { /* handle completion */ }
)let biomAuthConfig = BiomAuthConfig(
showSuccessFeedback: false
)
Keyless.authenticate(
configuration: biomAuthConfig,
onCompletion: { _ in /* handle completion */ }
)import Keyless, { BiomAuthConfig } from '@react-native-keyless/sdk';
const config = new BiomAuthConfig({
showSuccessFeedback: false,
});
const result = await Keyless.enroll(config);Fonts
It is possible to customize the font.
Android: requires an
android.graphics.Typefaceobject.iOS: requires a
String, the name of the font.
The custom font must be set as soon as available, a good moment to do so is before calling Keyless.configure
Example
Keyless.UI.Font.customFont: Typeface = Typeface.SERIFKeyless.UI.Font.customFont: String = "Serif"Haptic feedback
Haptic feedback provides subtle vibration responses to user interactions.
It is possible to disable/enable haptic feedback.
By default, haptic feedback is enabled (true).
Example
Keyless.UI.hapticFeedbackEnabled = trueKeyless.UI.hapticFeedbackEnabled = falseTheme
The SDK theme can be customized to be dark, light or system.
Keyless will use the system defined theme by default.
Keyless.UI.Color.sdkTheme = SdkTheme.SYSTEM
// default theme is SYSTEM
public enum class SdkTheme {
DARK,
LIGHT,
SYSTEM
}Keyless.UI.Color.sdkTheme = .system
// default theme is system
public enum SDKTheme {
case dark
case light
case system
}Colors
It is possible to customize the following colors:
primary color This color is the one that appears most frequently across the screens and components.
onPrimary color The color used for elements that appear on top of the PrimaryColor, ensuring clear contrast and visibility.
Example
Keyless.UI.Color.primary = 0xFF1833B8
Keyless.UI.Color.onPrimary = 0xFFFED900Keyless.UI.Color.primary = .magenta
Keyless.UI.Color.onPrimary = .cyanfinal uiCustomization = UICustomization(
primaryColor: 0xFF1833B8,
onPrimaryColor: 0xFFFED900,
);
// Pass the UI customization when configuring the SDK
final setupConfiguration = SetupConfiguration(
apiKey: "YOUR_API_KEY",
hosts: ["YOUR_HOSTS"],
uiCustomization: uiCustomization
);Text
It is possible to customize the following text:
Enrollment
We suggest to not use more than three lines of text.
Step0 (information screen before enrollment)
title
description
prerequisiteCenterFace
prerequisiteDirectLook
prerequisiteWellLitArea
prerequisiteRemoveEyeWear
continueCta
closeScreenButtonContentDescription (the content description of the close button for accessibility)
prerequisiteAloneInPhotodeprecated (will no longer be shown)

Step1
text1 Showed before the user face is framed.

step1Success
message Showed after the user face is framed with a successful animation.

Step2
text1 Showed after the user face has been framed and the progress is between 0% and 33%.
text2 Showed after the user face has been framed and the progress is between 34% and 66%.
text3 Showed after the user face has been framed and the progress is between 67% and 100%.
subtitle1 Showed during the entire enrollment progress

Step3
text1 Showed when the enrollment has been successfully completed.
subtitle1 Showed when the enrollment has been successfully completed

Authentication
We suggest to not use more than two lines of text.
Step1
text1 Showed before the user face is framed.
Step2
text1 Showed after the user face has been framed.
Step3
text1
Showed when the authentication has been successfully completed.



Dynamic Linking
We suggest to not use more than two lines of text.
Authentication.PayloadConfirmation
title
subtitle
denyCta
approveCta

Example
// Custom text for enrollment
// prelimiar information for enrollment
Keyless.UI.Text.Enrollment.Step0.title = "(custom) Enroll your face"
Keyless.UI.Text.Enrollment.Step0.description = "(custom) On the next screen, we will take a photo of your face to create your account."
Keyless.UI.Text.Enrollment.Step0.prerequisiteCenterFace = "(custom) Center your face in the frame"
Keyless.UI.Text.Enrollment.Step0.prerequisiteDirectLook = "(custom) Look directly at the screen"
Keyless.UI.Text.Enrollment.Step0.prerequisiteWellLitArea = "(custom) Ensure you are in a well-lit area"
Keyless.UI.Text.Enrollment.Step0.prerequisiteRemoveEyeWear = "(custom) Remove any eyewear or hats"
Keyless.UI.Text.Enrollment.Step0.continueCta = "(custom) Continue"
// remaining steps of the enrollment
Keyless.UI.Text.Enrollment.Step1.text1 = "(custom) Put your face within the frame"
Keyless.UI.Text.Enrollment.Step1Success.message = "(custom) Photo captured successfully"
Keyless.UI.Text.Enrollment.Step2.text1 = "(custom 1) Enrolling, please wait…"
Keyless.UI.Text.Enrollment.Step2.text2 = "(custom 2) Enrolling, please wait…"
Keyless.UI.Text.Enrollment.Step2.text3 = "(custom 3) Enrolling, please wait…"
Keyless.UI.Text.Enrollment.Step3.text1 = "(custom) Keyless account created successfully!"
// Custom text for authentication
Keyless.UI.Text.Authentication.Step1.text1 = "(custom) Please look into the camera"
Keyless.UI.Text.Authentication.Step2.text1 = "(custom) Communicating with the Keyless network"
Keyless.UI.Text.Authentication.Step3.text1 = "(custom) Approved"
// Custom text for dynamic linking
Keyless.UI.Text.Authentication.PayloadConfirmation.title = "(custom) Authentication request"
Keyless.UI.Text.Authentication.PayloadConfirmation.subtitle = "(custom) Please, approve the payment to complete the process"
Keyless.UI.Text.Authentication.PayloadConfirmation.denyCta = "(custom) Deny"
Keyless.UI.Text.Authentication.PayloadConfirmation.approveCta = "(custom) Approve"// Custom text for enrollment
// prelimiar information for enrollment
Keyless.UI.Text.Enrollment.Step0.title = "(custom) Enroll your face"
Keyless.UI.Text.Enrollment.Step0.description = "(custom) On the next screen, we will take a photo of your face to create your account."
Keyless.UI.Text.Enrollment.Step0.prerequisiteCenterFace = "(custom) Center your face in the frame"
Keyless.UI.Text.Enrollment.Step0.prerequisiteDirectLook = "(custom) Look directly at the screen"
Keyless.UI.Text.Enrollment.Step0.prerequisiteWellLitArea = "(custom) Ensure you are in a well-lit area"
Keyless.UI.Text.Enrollment.Step0.prerequisiteRemoveEyeWear = "(custom) Remove any eyewear or hats"
Keyless.UI.Text.Enrollment.Step0.continueCta = "(custom) Continue"
// remaining steps of the enrollment
Keyless.UI.Text.Enrollment.Step1.text1 = "(custom) Put your face within the frame"
Keyless.UI.Text.Enrollment.Step1Success.message = "(custom) Position your face within the frame"
Keyless.UI.Text.Enrollment.Step2.text1 = "(custom 1) Enrolling, please wait…"
Keyless.UI.Text.Enrollment.Step2.text2 = "(custom 2) Enrolling, please wait…"
Keyless.UI.Text.Enrollment.Step2.text3 = "(custom 3) Enrolling, please wait…"
Keyless.UI.Text.Enrollment.Step3.text1 = "(custom) Keyless account created successfully!"
// Custom text for authentication
Keyless.UI.Text.Authentication.Step1.text1 = "(custom) Please look into the camera"
Keyless.UI.Text.Authentication.Step2.text1 = "(custom) Communicating with the Keyless network"
Keyless.UI.Text.Authentication.Step3.text1 = "(custom) Approved"
// Custom text for dynamic linking
Keyless.UI.Text.Authentication.PayloadConfirmation.title = "(custom) Authentication request"
Keyless.UI.Text.Authentication.PayloadConfirmation.subtitle = "(custom) Please, approve the payment to complete the process"
Keyless.UI.Text.Authentication.PayloadConfirmation.denyCta = "(custom) Deny"
Keyless.UI.Text.Authentication.PayloadConfirmation.approveCta = "(custom) Approve"final uiCustomization = UICustomization(
// Enrollment Step 0
enrollmentStep0Title: "(custom) Enroll your face",
enrollmentStep0Description: "(custom) On the next screen, we will take a photo of your face to create your account.",
enrollmentStep0PrerequisiteCenterFace: "(custom) Center your face in the frame",
enrollmentStep0PrerequisiteDirectLook: "(custom) Look directly at the screen",
enrollmentStep0PrerequisiteWellLitArea: "(custom) Ensure you are in a well-lit area",
enrollmentStep0PrerequisiteRemoveEyeWear: "(custom) Remove any eyewear or hats",
enrollmentStep0ContinueCta: "(custom) Continue",
// Enrollment Steps
enrollmentStep1Text: "(custom) Put your face within the frame",
enrollmentStep1SuccessText: "(custom) Photo captured successfully",
enrollmentStep2Text1: "(custom 1) Enrolling, please wait…",
enrollmentStep2Text2: "(custom 2) Enrolling, please wait…",
enrollmentStep2Text3: "(custom 3) Enrolling, please wait…",
enrollmentStep2Subtitle: "(custom) Processing your enrollment",
enrollmentStep3Text: "(custom) Keyless account created successfully!",
enrollmentStep3Subtitle: "(custom) You're all set!",
// Authentication Steps
authenticationStep1: "(custom) Please look into the camera",
authenticationStep2: "(custom) Communicating with the Keyless network",
authenticationStep3: "(custom) Approved",
);
// Pass the UI customization when configuring the SDK
final setupConfiguration = SetupConfiguration(
apiKey: "YOUR_API_KEY",
hosts: ["YOUR_HOSTS"],
uiCustomization: uiCustomization
);Optional Screens
It is possible to show or hide some of the Enrollment and Authentication steps above by setting to false the following fields.
Enrollment
Use the following fields of a BiomEnrollConfig:
showScreenInstructions: affects the Step0showScreenSuccessFaceCapture: affects the Step1SuccessshowScreenSuccessFlow: affects the Step3
Example
val biomEnrollConfig = BiomEnrollConfig(
showScreenInstructions = false,
showScreenSuccessFaceCapture = false,
showScreenSuccessFlow = false
)
Keyless.enroll(
configuration = biomEnrollConfig,
onCompletion = { /* handle completion */ }
)let biomEnrollConfig = BiomEnrollConfig(
showScreenSuccessFlow: false,
showScreenSuccessFaceCapture: false,
showScreenInstructions: false
)
Keyless.enroll(
configuration: biomEnrollConfig,
onCompletion: { _ in /* handle completion */ }
)Authentication
Use the following fields of a BiomAuthConfig:
showScreenSuccessFlow: affects the Step3
Example
val biomAuthConfig = BiomAuthConfig(
showScreenSuccessFlow = false
)
Keyless.authenticate(
configuration = biomAuthConfig,
onCompletion = { /* handle completion */ }
)let biomAuthConfig = BiomAuthConfig(
showScreenSuccessFlow: false
)
Keyless.authenticate(
configuration: biomAuthConfig,
onCompletion: { _ in /* handle completion */ }
)Fonts
It is possible to customize the font.
Android: requires an
android.graphics.Typefaceobject.iOS: requires a
String, the name of the font.
The custom font must be set as soon as available, a good moment to do so is before calling Keyless.configure
Example
Keyless.UI.Font.customFont: Typeface = Typeface.SERIFKeyless.UI.Font.customFont: String = "Serif"final uiCustomization = UICustomization(
customFont: "Serif"
);Last updated
Was this helpful?