Saturday, November 06, 2021

Disney Genie+ review: tips, tricks and how does it compare to FastPass

This article is based on my experience traveling to Disney World for 4 days in Oct 30 through Nov 2nd, 2021 (still during the pandemic) for a family of 4 with the Park Hopper option and Genie+ service added.

What is Disney Genie+ Service in a nutshell?

Disney Genie+ in a nutshell, is a way for Disney to charge you for what FastPass used to be. The FastPass is now called either Genie+ Lightning Lane (included with Genie+) or Individual Lightning Lane (additional cost). 

There are however some key differences:

  1. It is not free, it costs $15 per day per person.
  2. Not every ride that was included in FastPass is included with Genie+, specifically the 2 most “popular” rides per park are not included (more on that later).
  3. You cannot book 30 days in advanced (or 60 with Disney Resort reservation), instead you book the same day at 7am local time and you must have a valid reservation for that park (more on that later)


Rules of engagement

There are similar rules as FastPass:
  • You can only book one LightningLane every 2 hours or until you use your pass (whichever comes first).
  • You can book a second LightningLane 2 hours after park opening
  • Unlike FastPass you cannot use LightningLane for the same ride on the same day.
  • You are allowed to book overlapping times (this used to be a FastPass restriction) - there is a trick to get 2 active LightningLane passes at a time (more on that later)
  • You must have a valid park reservation to book a LightningLane in that park, unless you have ParkHopper and the LightningLane time is after 2pm.

The application experience

Along with the launch of the Disney Genie Service, Disney released a new version of their Disney World experience. The Disney Genie Service is supposed to be a “genie” that suggests the best things to do based on some input you provide. In my opinion they tried to pack too much in the app and the genie is really not that smart, making the app experience worse specially when it comes to the FastApp experience.

There is a new screen called the "Tip board" this will display the estimated wait times as well as the next Genie+ Lightning Lane availability times for one park. This is convenient if you are trying to decide what to do next, but if you are trying to get on one specific ride, there is no such a view anymore. 


With the FastPass experience you used to be able to refresh the screen to view the latest FastPass availability time. You could just pull down to refresh and the time will occasionally change, either due to cancellations during the day or because it was filling up during the morning. My biggest complain is that there is no option to change to the latest time available. You actually have to first cancel your Lightning Lane reservation by going into a different screen then come back via either the map view or Tip Board screen. By the time you do that, the time that was available will often change and you risk losing the reservation you already had. You used to be able to do this with the FastPass experience and it was a way to sneak into a better time. My take is that this will be added to the app later on.


The Lightning Lane experience

The line experience is virtually the same as with FastPass. Where there used to be FastPass lanes/signs, they are now called Lightning Lane. I would say lines may be slightly shorter than before now that they are no longer included and not everybody is paying for it, but it wasn't something significantly different as before.

What is Individual Lightning Lane?

There are 2 rides per park that are not included with Genie+. These rides are presumably the ones with the most demand in each park, which means Disney could arbitrarily change them in the future. The fees for these rides are dynamic and can vary from $9 to $15. The good news is that you do not need to buy Genie+ to buy these individual rides. The Individual Lightning Lane rides available at the time of writing (with approximate price offered at the time):
  • Magic Kingdom
    • Seven Dwarfs Mine Train ($12)
    • Space Mountian ($9)
  • Epcot
    • Frozen Ever After ($9)
    • Remy's Ratatouille Adventure ($15)
  • Hollywood Studios
    • Rise of the Resistance ($15)
    • Mickey & Minnie Runaway train ($12)
  • Animal Kingdom
    • Expedition Everest ($8)
    • Avatar Flight of Passage ($12)
Another restriction I noticed is that the 7am booking time appears to be available only for Disney Hotel Resort guests, otherwise it is available for purchase at 9am or at park opening time.

Although we didn't pay for Individual Lightning Lane this time, the only 2 exceptions I would consider are these (both will sell out within hours so don't wait too long for purchasing): 
  • Remy's Ratatouille Adventure - in case you are not able to get into the virtual queue
  • Rise of the Resistance - if you are not willing to wait 90+ minutes in line or are running short on time.

What is Virtual Queue?

At this point time, it is just one of 2 ways you can get into the Ratatouille ride (the other one being paying for the Individual Lightning Lane). In my opinion is something Disney is experimenting with. If you cannot get into the Virtual Queue either at 7am or 1pm then you are out of luck, unless you're willing (while still available) to pay for Lightning Lane. My only complaint about Virtual Queue, is that for any other ride at Disney, if you're willing to wait in line regardless of wait time, you can get on the ride without paying, except for this one. You also have to still wait approximately 30 minutes in the physical line once your turn to line up comes up.

Genie+ Tips and tricks

  • You can actually get 2 active Lightning Lane tickets at a time, if you book a pass for something that is 2 hrs after opening time. After that 2-hr period you will be able to book a second pass and it will let you keep both active (with the same rules in place, i.e. you can only get a new one after using either one or within 2hrs). For example if you got a 2pm pass for Slinky Dog Dash, and the park opened at 9am, at 11am you could get a second LightningLane pass. This is a good strategy if you got to the park early since that is when the lines have the lowest wait time.
  • Similar to FastPass, you can only book your next pass until you scan the second Lightning Lane checkpoint (there are 2 per ride): one at the entrance and the other one before merging with the rest of the line.
  • Even though you can’t swap to another Genie+ available time for a ride within the same screen, in my experience it was worth risking losing your turn and frequently “refresh” the tip board screen for a better time. I was actually able to get a 9:50am time for the Slinky dog ride around 7:20am even though the best time I got around 7am was 2pm.
  • I noticed if you keep refreshing the window time keeps gradually getting worse but after a few “refreshes” it seems to reset to an earlier time. This may only apply in the morning, not necessarily later in the day as some Genie+ LL will get “sold out”
  • The Individual Lightning Lane passes for the most popular rides, i.e. "Rise of the Resistance" and "Remy's Ratatouille Adventure" will get sold out early in the day, so if you’re considering buying it and get a good time, don’t risk it and take it.

Strategies to minimize your time in line for the Individual Lightning Lane rides

I chose not to pay for any of the Individual LightningLane as I was already paying enough for the Genie+ pass and ParkHopper tickets. I stayed at a Disney Resort for 2 nights so I was able to leverage some of the resort benefits for 3 days. This is what we did to be able to minimize our wait time in line and be able to ride all of the Individual Lightning Lane rides (your mileage may vary):
  • Day 1: Magic Kingdom
    • We got inside the park around 30 minutes after opening time. We headed straight into Seven Dwarfs Mine train as it had a wait time of 40 minutes and we knew that was going to be as good as it gets. We waited around 35 minutes which was fairly reasonable. The other good time to get into this ride is right around the fireworks time, wait times can be as low as 20 minutes or less.
    • For Space Mountain we noticed the time was more variable. We tried going around 2pm when it was 40 minutes, but it was unfortunately broken, so we came back about 2 hours later, and waited around 45 minutes in line.


  • Day 2: Hollywood Studios
    • For Mickey & Minnie’s Runaway Railroad, the best time to get in is in the morning, wait times were as low as 30 minutes at opening time. We ended up going around 2pm when the wait time was around 45 minutes. It seem too much at the time, but I was pleasantly surprised. This ride is worth even longer wait time. It is one of the 3 new trackless rides at Disney World (along with Rise of the Resistance and Ratatouille). You’ll really enjoy it!
    • To get into "Rise of Resistance", since we were checking into a Disney Resort that day we were able to use the "early entry" admission, i.e. 30 minutes before opening time (9am). We got into the park around 8:40am and were in line around 8:50am when the advertised time was around 50minutes. We ended up doing around 40 minutes in line and this ride is definitely worth the wait time even if it's 2 hours.



  • Day 3: EPCOT, Animal Kingdom and back to Epcot
    • I had reservations for Epcot and joined the Virtual Queue right at 7am and got group 63 with an estimated wait time of 6 hours! This ended up being a hight estimate, as we got our turn to join the queue at 2:30pm, i.e. 4.5 hrs after park opening time. You get one hour to join the line, so avoid going outside the park close as your turn approaches. I noticed that there were around 163 groups per day before the passes are fully allocated and if you do not get in the queue on the 7am shift, there is another opportunity to get into the queue by 1pm.


    • I monitored the wait times (5-15 minutes) and noticed that they were very low for Everest Expedition right before closing time (6-7pm). We decided to hop and arrived into Animal Kingdom around 5:15, when the wait time was at 20 minutes. Unfortunately the ride was temporarily closed right before we got to the ride. We decide to go to Avatar Flight of Passage and barely made it back to Everest right past 7pm, but we were able to ride it twice with no wait time even though the park was already closed.


    • For Avatar Flight of Passage we got in line around 5:40pm and the wait time was 65 minutes. We ended up doing over 70 minutes, but we had done this ride before and knew it was worth it.
  • Day 4: Hollywood Studios (half day)
    • We decided to go back to Rise of the Resistance one more time. We got into the park entrance closer to 9am and even the resort entrance had a line. We entered the park right after 9am so we had to rush to the ride. By the time we got there, the ride was temporarily closed (bad luck). We went to Toy Story Mania (normal line) and then used a Genie+ LL entrance we had at 9:50am for Slink Dog Dash. We got back to the Resistance ride shortly after 10am and the wait time was already at 95 minutes. We ended up waiting in line close to 2hrs but this was our last ride for this trip and definitely worth the wait!


My verdict: is it worth paying for Genie+?

Compared to other parks, $15 per day seems inexpensive for line skipping, however for multi-day tickets or larger families it may be cost prohibitive. It was only a matter of time before Disney started charging for "FastPass" and the pandemic was a convenient timing to do this after "FastPass" was paused and by rebranding it as Genie+. In my opinion, they should discount the price for longer multi-day tickets similar to how they do for the base ticket price. Also there is nothing stopping Disney from increasing the price, specially if they have high demand for it. 

From my experience from this trip and given the current cost for a 4-day ticket and a family of 4, the time savings justified paying for Genie+ and I would still recommend it. If you are only going 1-3 days, they I would strongly recommend it. For over tickets over 4 days, I will likely skip buying it, as you will have more time to wait in line.


Tuesday, May 11, 2021

How to get headless chromium to launch from a pipeline using ubi8 image

My goal was to be able to run unit tests from a pipeline for the Angular's "Tour of Heroes" tutorial application which use Karma Jasmine framework. In this case the pipeline was built using Tekton to deploy to a Red Hat OpenShift cluster. 

Step 1: Change Karma Browser Configuration to use Headless Chromium

Launching the unit tests locally was not an issue because I had Chrome installed locally, but in order to get this to work in a pipeline we need to switch to a Headless browser configuration. This can be accomplished by updating karma.conf.js as follows. This configuration prunes all interactivity, not all of these settings are necessary, but these will work both locally and from the pipeline task:

   reporters: ['progress'],

    port: 9876,

    colors: true,

    logLevel: config.LOG_INFO,

    autoWatch: false,

    browserNoActivityTimeout: 30000,

    browsers: ['ChromiumHeadlessNoSandbox'],

    customLaunchers: {

      ChromiumHeadlessNoSandbox: {

          base: 'ChromiumHeadless',

          flags: ['--no-sandbox', '--headless', '--disable-gpu', '--disable-translate', '--disable-extensions', '--remote-debugging-port=9223']

      }

    },    

    singleRun: true,

    restartOnFileChange: false


Step 2: Add Puppeteer to the project

With these changes the local tests were running headless successfully, however they were still failing because they still need a browser binary downloaded. Our pipeline was using the ubi8/nodejs-12 image to run npm tasks. All of the npm tasks (e.g. install, lint, build) were running successfully, except for the test task. One easy solution would have been to install chromium into a modified image using a Dockerfile with ubi8/nodejs-12 as the base. Unfortunately the chrome download url was not whitelisted from the pipeline server and could not go that route. 

This led us to using puppeteer. Puppeteer is a node library which allows you to test using headless chromium. One of the features that we needed is that it downloads the chromium binary.

Step 2.1: Add puppeteer as a dev dependency

Puppeteer can be easily added as a development dependency by adding it to package.json within devDependencies section:

   "puppeteer": "^9.1.0",

Step 2.2: Export download host for puppeteer

This may not be an issue locally, but in case npm install gets stuck downloading puppeteer, this can be addressed by adding this download host environment variable prior to running npm install (ensure this is added to the pipeline task as well):


      export PUPPETEER_DOWNLOAD_HOST=https://npm.taobao.org/mirrors 


Step 2.3: Update karma configuration to use puppeteer

Update karma.conf.js with the following changes:

  • Require puppeteer
  • Export the path to the Chromium executable
  • Wait for chromium to launch (i.e. to ensure it is downloaded if applicable)

 const puppeteer = require('puppeteer');

  process.env.CHROMIUM_BIN = puppeteer.executablePath();

  (async () => {

    const browser = await puppeteer.launch({

      args: ['--no-sandbox', '--disable-setuid-sandbox'],

    });

  })();

Step 3: Add required Linux libraries to ubi8 image

At this point npm test should execute successfully with puppeteer and headless chromium. However tests were failing in our pipeline due to missing Linux libraries in the ubi8 required to run chromium:

06 05 2021 20:58:47.098:ERROR [launcher]: Cannot start ChromiumHeadless /workspace/source/node_modules/puppeteer/.local-chromium/linux-869685/chrome-linux/chrome: error while loading shared libraries: libnss3.so: cannot open shared object file: No such file or directory

To troubleshoot this error the following commands were instrumental:

Command #1 (from troubleshooting puppeteer)

This command will help troubleshoot which libraries are missing in one shot versus adding one library at a time and getting a different error. You can get the path to local-chromium by echoing the output of puppeteer.executablePath() - it should be very similar to the one below except for the linux version number:

ldd /workspace/source/node_modules/puppeteer/.local-chromium/linux-869685/chrome-linux/chrome | grep not

Command #2 (from troubleshooting puppeteer)

The second command that was helpful was to run yum whatprovides on each missing library from the Dockerfile building the custom image. The only caveat is that in a few cases what provides resolved to the i686 library and that did not provide the missing library instead I had to switch to the x86_64 library version.

yum what provides libnss3.so

Magic Dockerfile

The hardest part of this task was to arrive to the correct Dockerfile. After iterating through the commands above, we arrived to the right dockerfile what allowed Puppeteer running headless chromium successfully:

FROM registry.access.redhat.com/ubi8/nodejs-12:latest

USER root

RUN yum install -y alsa-lib.x86_64 atk.x86_64 cups-libs.x86_64 gtk3.x86_64 \

    libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 \

    libXext.x86_64 libXi.x86_64 libXrandr.x86_64 libXScrnSaver.x86_64 \

    libXtst.x86_64 pango.x86_64 xorg-x11-fonts-Type1 libdrm-2.4.101-1.el8.x86_64 \

    mesa-libgbm-20.1.4-1.el8.x86_64 libxshmfence-1.3-2.el8.x86_64 nss.i686 \

    && yum update -y && yum clean all 

USER 1001

Hopefully this guides saves some time for others trying to get this to work on a ubi8 image!