Streamlining Exhibit Installs with Launchpad—An Open Source Tool by Bluecadet
As a creative technologist I get a lot of joy out of building visual experiences for physical spaces. Many of Bluecadet’s projects run in highly trafficked locations for years, and if you’ve ever worked on a long-term media installation, you’re probably aware of the challenges involved in making them bulletproof. As exhibits scale in size and complexity, the process of installing can become a delicate but repetitive chore. To streamline and standardize this process, we developed Launchpad: an open-source tool that facilitates the deployment and management of exhibit apps and content.
Why Build Our Own Tool?
Many of our projects are content-heavy, native apps with long runtimes distributed across many PCs. Our experiences need to be reliable, consistent across exhibits and support many types of frameworks like Unity, Cinder or Web. If things go wrong — especially on a large canvas — they need to fail gracefully and recover quickly. We also often pull content from a wide variety of sources and need to cache that content offline for quick and reliable access.
Typically we need to tick these boxes during our installs:
- Configure Windows OS for exhibit environments
- Run a watchdog to restart processes on exit
- Prevent escape from our apps into the OS
- Regularly sync remote content locally
There are plenty of great tools for some of these tasks, like Helios Interactive’s Phoenix, Stimulant’s AM/PM, Local Projects’ ofxApp, Windows Task Manager, Ansible and PM2. But none of them provide all the specific settings for PC bootstrapping, monitoring capabilities, content pipelines or extensibility that we needed.
Standardizing our Process
Before Launchpad, we had long install checklists for each PC that required manual configuration and testing. However, this was prone to errors and time-consuming to manage. During a project for the Gerald R Ford Presidential Library, we found ourselves spending three days in an AV closet installing dozens of programs one-by-one, manually.
For a long time, our watchdog of choice was Phoenix, which is a robust tool but hard to manage and sequence multiple concurrent apps with. For content, we either wrote custom Python scripts or used rysnc
and ssh
, which was either very specific and time consuming or limited our choice of backends and infrastructure.
echo "Downloading media..."
rsync -rlvz --size-only --ipv4 --progress -e 'ssh -p 2222' --delete --exclude='*.csv' $ENV.$SITE@appserver.$ENV.$SITE.drush.in:code/wp-content/uploads/*/*/ ./media
echo "Downloading data..."
rsync -rlvz --size-only --ipv4 --progress -e 'ssh -p 2222' --delete --include='*.csv' --exclude='*' $ENV.$SITE@appserver.$ENV.$SITE.drush.in:code/wp-content/uploads/*/*/ ./data
Automating at Scale
Our next big project was for The Henry Ford Museum — coincidentally another Michigan-based Ford institution — with one of the more complex installations running on 20 PCs.
Tired of spending days poring over punch lists, we knew we needed a better solution. That’s why we set out to build a suite of scripts that would automated every step of the process—an early version of Launchpad.
This initial version was built as a plugin for AM/PM. While it worked wonders for our first project at The Henry Ford, we quickly realized that it lacked the necessary extension options and control over launch sequences and app states. As we geared up for our next challenge with over 20 individual programs at the MIT Museum, we knew we had to up our game.
Standalone Package
The next version of Launchpad was built from the ground up as a standalone process or a Node dependency. It combined the best parts of our previous AM/PM plugin and was designed to be easily extended and modular. We swapped in PM2 as our watchdog of choice, which allowed us to run it as a subprocess to manage multiple apps at the same time, get better state readings and add add features like window management.
But that’s not all — we revised our content pipeline to support a range of CMS platforms, improve caching and gracefully rollback content in emergencies. We also added text and image processing capabilities, making it easy to resize, filter and crop images or convert CMS-specific syntax to HTML or any other format. Additionally, Launchpad now has streamlined log management and provides hooks to run commands at various stages of your app lifecycle.
Why You Should Use Launchpad
Launchpad has significantly simplified our process of installing complex interactive programs across museums, institutions and other large venues. It takes the guesswork out of configuration and reduces days of work down to minutes for us. After years of testing it on permanent exhibit installs with across many types of backends and frameworks, it’s become a crucial part of our exhibit operations and we’re excited to open source it.
What Launchpad Can Do
- Run multiple apps in parallel, with control over launch sequence and window order
- Fail gracefully and restart apps when they exit
- Automate PC configuration for exhibit environments, e.g. disable consumer features like edge swipes, notifications, updates and prevent PCs from going to sleep
- Sync content from APIs like Sanity, Strapi, Contentful, Airtable, and generic JSON (Wordpress, Drupal, REST APIs)
- Cache content locally in case of network outage, with graceful rollback error handling
- Support for text transformations like markdown to HTML, image processing, resizing, filtering, and cropping
Getting Launchpad
Launchpad is available on NPM and GitHub:
npm i @bluecadet/launchpad
Check out our documentation to get started and learn more.
We’ve deployed many projects with Launchpad and are actively maintaining it. If you have questions or suggestions, submit an issue and we’ll look into it.