--- features: nimbus-system: description: | Configuration of the Nimbus System in Fenix. variables: refresh-interval-foreground: description: | The minimum interval in minutes between fetching experiment recipes in the foreground. type: Int default: 60 # 1 hour messaging: description: | Configuration for the messaging system. In practice this is a set of growable lookup tables for the message controller to piece together. variables: message-under-experiment: description: Id or prefix of the message under experiment. type: Option default: null messages: description: A growable collection of messages type: Map default: {} triggers: description: > A collection of out the box trigger expressions. Each entry maps to a valid JEXL expression. type: Map default: {} styles: description: > A map of styles to configure message appearance. type: Map default: {} actions: type: Map description: A growable map of action URLs. default: {} on-control: type: ControlMessageBehavior description: What should be displayed when a control message is selected. default: show-next-message notification-config: description: Configuration of the notification worker for all notification messages. type: NotificationConfig default: {} defaults: - value: triggers: # Using attributes built into the Nimbus SDK USER_RECENTLY_INSTALLED: days_since_install < 7 USER_RECENTLY_UPDATED: days_since_update < 7 && days_since_install != days_since_update USER_TIER_ONE_COUNTRY: ('US' in locale || 'GB' in locale || 'CA' in locale || 'DE' in locale || 'FR' in locale) USER_EN_SPEAKER: "'en' in locale" USER_ES_SPEAKER: "'es' in locale" USER_DE_SPEAKER: "'de' in locale" USER_FR_SPEAKER: "'fr' in locale" DEVICE_ANDROID: os == 'Android' DEVICE_IOS: os == 'iOS' ALWAYS: "true" NEVER: "false" DAY_1_AFTER_INSTALL: days_since_install == 1 DAY_2_AFTER_INSTALL: days_since_install == 2 DAY_3_AFTER_INSTALL: days_since_install == 3 DAY_4_AFTER_INSTALL: days_since_install == 4 DAY_5_AFTER_INSTALL: days_since_install == 5 # Using custom attributes for the browser I_AM_DEFAULT_BROWSER: "is_default_browser" I_AM_NOT_DEFAULT_BROWSER: "is_default_browser == false" USER_ESTABLISHED_INSTALL: "number_of_app_launches >=4" FUNNEL_PAID: "adjust_campaign != ''" FUNNEL_ORGANIC: "adjust_campaign == ''" # Using Glean events, specific to the browser INACTIVE_1_DAY: "'app_launched'|eventLastSeen('Hours') >= 24" INACTIVE_2_DAYS: "'app_launched'|eventLastSeen('Days', 0) >= 2" INACTIVE_3_DAYS: "'app_launched'|eventLastSeen('Days', 0) >= 3" INACTIVE_4_DAYS: "'app_launched'|eventLastSeen('Days', 0) >= 4" INACTIVE_5_DAYS: "'app_launched'|eventLastSeen('Days', 0) >= 5" # Has the user signed in the last 4 years FXA_SIGNED_IN: "'sync_auth.sign_in'|eventLastSeen('Years', 0) <= 4" FXA_NOT_SIGNED_IN: "'sync_auth.sign_in'|eventLastSeen('Years', 0) > 4" # https://mozilla-hub.atlassian.net/wiki/spaces/FJT/pages/11469471/Core+Active USER_INFREQUENT: "'app_launched'|eventCountNonZero('Days', 28) >= 1 && 'app_launched'|eventCountNonZero('Days', 28) < 7" USER_CASUAL: "'app_launched'|eventCountNonZero('Days', 28) >= 7 && 'app_launched'|eventCountNonZero('Days', 28) < 14" USER_REGULAR: "'app_launched'|eventCountNonZero('Days', 28) >= 14 && 'app_launched'|eventCountNonZero('Days', 28) < 21" USER_CORE_ACTIVE: "'app_launched'|eventCountNonZero('Days', 28) >= 21" LAUNCHED_ONCE_THIS_WEEK: "'app_launched'|eventSum('Days', 7) == 1" actions: ENABLE_PRIVATE_BROWSING: ://enable_private_browsing INSTALL_SEARCH_WIDGET: ://install_search_widget MAKE_DEFAULT_BROWSER: ://make_default_browser VIEW_BOOKMARKS: ://urls_bookmarks VIEW_COLLECTIONS: ://home_collections VIEW_HISTORY: ://urls_history VIEW_HOMESCREEN: ://home OPEN_SETTINGS_ACCESSIBILITY: ://settings_accessibility OPEN_SETTINGS_ADDON_MANAGER: ://settings_addon_manager OPEN_SETTINGS_DELETE_BROWSING_DATA: ://settings_delete_browsing_data OPEN_SETTINGS_LOGINS: ://settings_logins OPEN_SETTINGS_NOTIFICATIONS: ://settings_notifications OPEN_SETTINGS_PRIVACY: ://settings_privacy OPEN_SETTINGS_SEARCH_ENGINE: ://settings_search_engine OPEN_SETTINGS_TRACKING_PROTECTION: ://settings_tracking_protection OPEN_SETTINGS_WALLPAPERS: ://settings_wallpapers OPEN_SETTINGS: ://settings TURN_ON_SYNC: ://turn_on_sync styles: DEFAULT: priority: 50 max-display-count: 5 SURVEY: priority: 55 max-display-count: 10 PERSISTENT: priority: 50 max-display-count: 20 WARNING: priority: 60 max-display-count: 10 URGENT: priority: 100 max-display-count: 10 NOTIFICATION: priority: 50 max-display-count: 1 messages: default-browser: text: default_browser_experiment_card_text surface: homescreen action: "MAKE_DEFAULT_BROWSER" trigger: [ "I_AM_NOT_DEFAULT_BROWSER","USER_ESTABLISHED_INSTALL" ] style: "PERSISTENT" button-label: preferences_set_as_default_browser default-browser-notification: title: nimbus_notification_default_browser_title text: nimbus_notification_default_browser_text surface: notification style: NOTIFICATION trigger: - I_AM_NOT_DEFAULT_BROWSER - DAY_3_AFTER_INSTALL action: MAKE_DEFAULT_BROWSER - channel: developer value: styles: DEFAULT: priority: 50 max-display-count: 100 EXPIRES_QUICKLY: priority: 100 max-display-count: 1 notification-config: refresh-interval: 120 # minutes (2 hours) objects: MessageData: description: > An object to describe a message. It uses human readable strings to describe the triggers, action and style of the message as well as the text of the message and call to action. fields: action: type: Text description: > A URL of a page or a deeplink. This may have substitution variables in. # This should never be defaulted. default: empty_string title: type: Option description: "The title text displayed to the user" default: null text: type: Text description: "The message text displayed to the user" # This should never be defaulted. default: empty_string is-control: type: Boolean description: "Indicates if this message is the control message, if true shouldn't be displayed" default: false button-label: type: Option description: > The text on the button. If no text is present, the whole message is clickable. default: null style: type: String description: > The style as described in a `StyleData` from the styles table. default: DEFAULT surface: description: The surface identifier for this message. type: MessageSurfaceId default: homescreen trigger: type: List description: > A list of strings corresponding to targeting expressions. The message will be shown if all expressions `true`. default: [] StyleData: description: > A group of properties (predominantly visual) to describe the style of the message. fields: priority: type: Int description: > The importance of this message. 0 is not very important, 100 is very important. default: 50 max-display-count: type: Int description: > How many sessions will this message be shown to the user before it is expired. default: 5 NotificationConfig: description: Attributes controlling the global configuration of notification messages. fields: refresh-interval: type: Int description: > How often, in minutes, the notification message worker will wake up and check for new messages. default: 240 # 4 hours enums: ControlMessageBehavior: description: An enum to influence what should be displayed when a control message is selected. variants: show-next-message: description: The next eligible message should be shown. show-none: description: The surface should show no message. MessageSurfaceId: description: The identity of a message surface variants: homescreen: description: A banner in the homescreen. notification: description: A local notification in the background, like a push notification. fullscreen: description: A full screen dialog that is intended to be disruptive.