docs: async function printServerInfo () {
    await ProjectSettings.readPackagerInfoAsync(projectDir)
    // who knows why qrcode-terminal takes a callback instead of just returning a string
    const address = await UrlUtils.constructManifestUrlAsync(projectDir)
    let emulatorHelp
    if (process.platform === 'darwin') {
      emulatorHelp = `Press ${chalk.bold('a')} (Android) or ${chalk.bold('i')} (iOS) to start an emulator.`
    } else {
      emulatorHelp = `Press ${chalk.bold('a')} to start an Android emulator.`
    }
    qr.generate(address, qrCode => {
      log(`
  ${indent(qrCode, 2)}
  Your app is now running at URL: ${chalk.underline(chalk.cyan(address))}
  ${chalk.bold('View your app with live reloading:')}
    ${chalk.underline('Android device:')}
      -> Point the Expo app to the QR code above.
         (You'll find the QR scanner on the Projects tab of the app.)
    ${chalk.underline('iOS device:')}
      -> Press ${chalk.bold('s')} to email/text the app URL to your phone.
    ${chalk.underline('Emulator:')}
      -> ${emulatorHelp}
  Your phone will need to be on the same local network as this computer.
  For links to install the Expo app, please visit ${chalk.underline(chalk.cyan('https://expo.io'))}.
  Logs from serving your app will appear here. Press Ctrl+C at any time to stop.`
      )
      printUsage()
    })
  }