Customize mobile/desktop UX

Customizing UX for mobile and desktop

With the Meya Orb integration, you can customize the user’s experience based on the type of device they’re using. For example, you could offer the user a menu-driven experience when they’re on a mobile device, and a natural language-driven experience when they’re on a desktop and can type more easily.


  1. In your app’s integration folder, create a file called orb.yaml, if it doesn’t already exist. Copy this code into the file:
type: meya.orb.integration

Save the file and push it to the Grid using these commands in your terminal:

meya format
meya push
  1. Create a new pen on Codepen. Copy this code into the HTML field:
<script type="text/javascript">
window.mobileCheck = function() {
  let check = false;
  (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
  return check;

window.orbConfig = {
     connectionOptions: {
        gridUrl: "",
        appId: "APP_ID",
        integrationId: "integration.orb",
        pageContext: {
            isMobile: window.mobileCheck()
    windowApi: true,

    var script = document.createElement("script");
    script.type = "text/javascript";
    script.async = true;
    script.src = "";
    var fontStyleSheet = document.createElement("link");
    fontStyleSheet.rel = "stylesheet";
    fontStyleSheet.href = "";


Remember to update APP_ID to your app’s actual ID. You can find this by going to your app’s Settings page in the browser.

This code creates a new Javascript function on line 2 called mobileCheck, which uses regex (line 4) to check the type of device the browser is running on. It returns true if it’s a mobile device.

On lines 13 to 15, we pass the result of mobileCheck to the Orb’s pageContext property. This means we’ll be able to access it in our BFML as flow.context.isMobile.

  1. Create a flow called open_page.yaml and copy this code into it:
  - type: page_open

  - if: (@ flow.context.isMobile | default(false) )
      say: You are on a mobile device.
      say: You are not on a mobile device.

Save the file and push it to the Grid:

meya format
meya push


On line 5 we need to make sure we provide a default value for flow.context.isMobile. Since the isMobile variable is only set by the Orb integration, if the user is interacting with the app via a different integration, this variable won’t exist and the app won’t behave as expected. By providing a default value, we can ensure our app won’t break on other integrations.

Test it out in your app’s simulator: