How to Set Up Your Own Raspberry Pi Airplay Receiver?

How to Set Up Your Own Raspberry Pi Airplay Receiver?

AirPlay, Apple’s proprietary wireless streaming protocol, has revolutionized the way we experience media content. While Apple offers dedicated devices like Apple TV for AirPlay functionality, the world of Raspberry Pi allows us to delve deeper into customization and creativity. With a Raspberry Pi, a few essential components, and a bit of technical prowess, you can harness the power of AirPlay to connect your iOS or macOS devices to a wide array of audio systems and displays, making your entertainment hub more dynamic and interactive.

In this step-by-step guide, we will walk you through each stage of the process, from gathering the necessary equipment and setting up the Raspberry Pi to installing the required software and enabling AirPlay functionality. You’ll learn how to navigate the world of AirPlay, streamlining the setup while maximizing audio and video quality.

As you embark on this exciting DIY project, you’ll gain insights into networking, software configuration, and multimedia integration, expanding your knowledge and skills in the process.

What Is An Airplay Receiver?

An AirPlay receiver is a device or software application that can receive and play audio, video, and other media content wirelessly streamed from Apple devices such as iPhones, iPads, and Mac computers[1] .

What Is An Airplay Receiver?

AirPlay is a proprietary wireless technology developed by Apple that allows users to share multimedia content from their Apple devices with compatible receivers.

When using AirPlay, you can display photos, and videos, or play music and other audio content on a larger screen, such as a television, home theater system, or external speakers, without the need for physical cables. AirPlay receivers are designed to be compatible with this technology and can mirror or display the content being streamed from the Apple device.

AirPlay receivers can come in various forms, including:

  • Apple TV: The most well-known AirPlay receiver is the Apple TV. It’s a dedicated streaming media player that can receive AirPlay content and display it on television;
  • Smart TVs and Speakers: Many modern smart TVs, soundbars, and wireless speakers come with built-in AirPlay support, allowing you to stream content directly to them from your Apple devices;
  • Third-Party Devices: Some third-party manufacturers create standalone AirPlay receivers or adapters that can be connected to existing TVs, audio systems, or speakers to enable AirPlay functionality;
  • Software Applications: Certain software applications, like media players or screen mirroring apps, can turn a computer or mobile device into an AirPlay receiver, allowing you to stream content to your computer screen;

It’s important to note that both the sending device (like an iPhone) and the receiving device (the AirPlay receiver) need to be connected to the same Wi-Fi network for AirPlay to work. This technology provides a convenient way to enjoy your multimedia content on larger screens or through higher-quality audio systems without the need for physical connections.

Why Should You Use AirPlay on Raspberry Pi?

Using AirPlay on a Raspberry Pi offers several compelling advantages and use cases that make it a popular choice for many users. Here are some reasons why you might want to use AirPlay on a Raspberry Pi.

Cost-Effectiveness

Setting up AirPlay on a Raspberry Pi is a cost-effective way to transform a relatively inexpensive single-board computer into an AirPlay receiver. This allows you to enjoy the benefits of AirPlay without investing in dedicated, often pricier, AirPlay-enabled devices.

Home Entertainment

You can enhance your home entertainment system by using AirPlay on a Raspberry Pi. It enables you to stream music, podcasts, videos, and even screen mirroring from your iOS or macOS devices to your TV, speakers, or audio system, creating a more immersive multimedia experience.

Why Should You Use AirPlay on Raspberry Pi?

Multi-Room Audio

By installing AirPlay on multiple Raspberry Pi devices around your home, you can create a multi-room audio setup. This allows you to synchronize audio playback in different rooms, providing a seamless and synchronized audio experience throughout your living space.

DIY Projects

AirPlay on Raspberry Pi is a popular choice for DIY enthusiasts and makers who want to incorporate wireless media streaming into their projects. Whether you’re building a smart mirror, a custom audio system, or a home automation setup, AirPlay can add a layer of interactivity and functionality [2].

Learning and Exploration

Using AirPlay on a Raspberry Pi provides an opportunity to learn about networking, software installation, and multimedia streaming. It’s a practical way to explore the capabilities of both the Raspberry Pi and the AirPlay protocol.

Legacy Audio Systems

If you have older audio equipment that lacks modern connectivity options, AirPlay on Raspberry Pi can bridge the gap. You can connect a Raspberry Pi to your legacy audio system and stream content wirelessly from your Apple devices, breathing new life into older technology.

Customizability

AirPlay on Raspberry Pi allows you to customize the software and functionality according to your preferences. You can choose different AirPlay receiver software, fine-tune audio settings, and even integrate additional features like multi-room synchronization or custom user interfaces.

Convenience

AirPlay offers a convenient way to share and stream media content from your iOS or macOS devices to a larger screen or better speakers. It eliminates the need for cables and physical connections, making it easy to switch between different devices and rooms.

Screen Mirroring

In addition to audio streaming, AirPlay on Raspberry Pi supports screen mirroring. This can be useful for sharing presentations, videos, or other content from your Apple devices to a larger display.

Why Should You Use AirPlay on Raspberry Pi?

Experimentation

If you’re a tech enthusiast or hobbyist, using AirPlay on a Raspberry Pi allows you to experiment with wireless media streaming, explore software configurations, and expand your knowledge of both the Raspberry Pi ecosystem and AirPlay technology.

Setting Up a Raspberry Pi AirPlay Receiver:

1. Necessary Equipment:

  • Raspberry Pi: The heart of your AirPlay receiver project;
  • Micro SD Card: A storage medium for the Raspberry Pi’s operating system and software;
  • Power Supply: A compatible power adapter to provide electricity to your Raspberry Pi;
  • Ethernet Cable or Wi-Fi: Choose between a wired Ethernet connection or Wi-Fi, depending on your setup;
  • Speakers: The audio output for your AirPlay receiver;
  • AirPlay Enabled Device: This could be your iPhone, iPad, or Mac computer;
  • Raspberry Pi Case: A protective case for your Raspberry Pi to keep it safe from dust and damage;

2. Check for Updates:

Before you begin, it’s a good practice to update Raspberry Pi’s software to ensure you’re working with the latest features and security patches. Open a terminal and run the following commands:

sudo apt-get update
sudo apt-get upgrade

3. Install the Necessary Packages

To build your AirPlay receiver, you’ll need a few packages installed. Enter the following commands in the terminal:

sudo apt-get install git
sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install libtool
sudo apt-get install libdaemon-dev
sudo apt-get install libasound2-dev
sudo apt-get install libpopt-dev
sudo apt-get install libconfig-dev

4. Clone the Shairport Sync Repository:

Shairport Sync is an open-source AirPlay audio player that will enable your Raspberry Pi to receive and play audio streams from Apple devices. Clone the Shairport Sync repository using the following command [3]:

git clone https://github.com/mikebrady/shairport-sync.git

5. Build and Install Shairport Sync

Navigate to the Shairport Sync directory:

cd shairport-sync

Setting Up a Raspberry Pi AirPlay Receiver:

Build and install Shairport Sync using the provided installation script:

autoreconf -fi
./configure
make
sudo make install

6. Enable Shairport Sync to Start on Boot

To ensure Shairport Sync starts automatically when your Raspberry Pi boots up, you need to create a systemd service file. Open a new file using the following command:

sudo nano /etc/systemd/system/shairport-sync.service

Copy and paste the following content into the file:

[Unit] Description=Shairport Sync – AirPlay Audio Receiver
After=network.target

[Service] ExecStart=/usr/local/bin/shairport-sync
Restart=on-abort
User=pi

[Install] WantedBy=default.target

Save the file (Ctrl + O) and exit (Ctrl + X).

7. Start Shairport Sync Service on Raspberry Pi:

Start the Shairport Sync service and enable it to run on boot:

sudo systemctl enable shairport-sync.service
sudo systemctl start shairport-sync.service

8. Connect AirPlay to Raspberry Pi:

With Shairport Sync up and running, it’s time to connect your AirPlay-enabled device. Follow these steps:

  1. Ensure your Raspberry Pi and AirPlay device are connected to the same Wi-Fi network;
  2. On your AirPlay device (e.g., iPhone), open the Control Center and tap on “Screen Mirroring” or “AirPlay”;
  3. Select your Raspberry Pi’s name from the list of available devices;
  4. Once connected, your audio output will be directed to the Raspberry Pi. Play music or any audio on your AirPlay device to test the connection;

How to Improve the Audio Output with Raspberry Pi Receiver Setup?

Quality Speakers or Audio System

Investing in high-quality speakers or an audio system can significantly enhance the audio output. Look for speakers that provide good frequency response, clarity, and sufficient power to complement your Raspberry Pi’s capabilities [4].

How to Improve the Audio Output with Raspberry Pi Receiver Setup?

Audio DAC (Digital-to-Analog Converter)

Consider adding an external DAC to your Raspberry Pi setup. A DAC can improve the analog audio signal conversion, resulting in clearer and more accurate sound reproduction. There are DACs available specifically designed for Raspberry Pi, and they can provide a noticeable improvement in audio quality.

Audio Cables

Use quality audio cables to connect your Raspberry Pi to your speakers or audio system. Shielded cables can help reduce interference and noise, leading to cleaner audio output.

Audio Software Settings

Adjust the audio settings on your Raspberry Pi to optimize sound quality. You can access these settings through Raspberry Pi’s desktop environment or by using the command line. Consider experimenting with settings such as volume levels, equalization, and audio output formats to find the best configuration for your setup.

Audio Enhancements and Equalization

Utilize software-based audio enhancements and equalization to tailor the sound to your preferences. There are various software tools and plugins available that can help you adjust bass, treble, balance, and other audio parameters to achieve the desired sound profile.

Advanced Audio Players

Explore alternative audio player software that offers advanced features and audio processing capabilities. Some software options allow for bit-perfect audio output and support for various audio formats, which can result in improved audio fidelity.

Network Quality

Ensure a stable and high-quality network connection between your AirPlay-enabled device and the Raspberry Pi. A strong and reliable Wi-Fi or Ethernet connection can prevent audio dropouts and interruptions.

Noise Reduction and Isolation

Place your Raspberry Pi and audio equipment in an area with minimal interference and noise. Additionally, using isolation pads or stands for your speakers can help reduce vibrations and unwanted resonance.

Power Supply Quality

Consider using a high-quality power supply for your Raspberry Pi. Clean and stable power can contribute to better audio performance by minimizing electronic noise.

Audio Format and Bitrate

Choose higher-quality audio formats and bitrates when streaming content from your AirPlay-enabled device. Higher bitrates can result in more detailed and accurate sound.

Optimize Shairport Sync Settings

Explore the settings of the Shairport Sync software to fine-tune the audio output. Adjust parameters such as audio buffer size and sample rate to optimize audio playback performance.

Room Acoustics

Pay attention to the acoustics of the room where your setup is located. Properly positioning speakers and using acoustic treatments can enhance audio clarity and reduce unwanted reflections.

How to Improve the Audio Output with Raspberry Pi Receiver Setup?

How to Improve the Raspberry Pi AirPlay Receivers WiFi Performance?

Improving the Wi-Fi performance of your Raspberry Pi AirPlay receiver is crucial for seamless media streaming and a smoother user experience.

Here are several strategies to enhance your Raspberry Pi’s Wi-Fi performance:

Optimize Wi-Fi Signal Strength

Position your Raspberry Pi and Wi-Fi router for optimal signal strength. Ensure that there are minimal obstacles, walls, or interference between the two devices. Elevating the Raspberry Pi and router can help improve signal reception.

Use a High-Quality Wi-Fi Antenna

Consider upgrading to a high-gain external Wi-Fi antenna for both your Raspberry Pi and Wi-Fi router. These antennas can provide better signal coverage and range, especially if you’re dealing with weak or distant Wi-Fi signals.

Choose the Right Wi-Fi Channel

Select a less congested Wi-Fi channel to reduce interference from neighboring networks. You can use Wi-Fi analyzer tools to identify the least crowded channel and adjust your router’s settings accordingly.

Upgrade to 5GHz Wi-Fi

If your router supports dual-band Wi-Fi, connect your Raspberry Pi to the 5GHz band instead of the 2.4GHz band. The 5GHz band usually offers higher speeds and less interference, resulting in improved performance.

Reduce Interference

Minimize sources of wireless interference, such as other electronic devices, microwave ovens, cordless phones, and Bluetooth devices. These can disrupt Wi-Fi signals and impact performance.

Use Wi-Fi Extenders or Mesh Networks

If your Raspberry Pi is far from the router, consider using Wi-Fi extenders or setting up a mesh network to expand coverage and maintain a strong signal throughout your home [5].

Update Router Firmware

Ensure your router’s firmware is up to date. Manufacturers often release updates that improve performance, stability, and security.

Reduce Bandwidth-Hungry Devices

Limit or prioritize bandwidth usage for devices that consume a lot of data, such as streaming video or large downloads, to ensure there’s sufficient bandwidth available for your Raspberry Pi AirPlay receiver.

Adjust Router QoS Settings

Quality of Service (QoS) settings on your router can prioritize specific types of traffic, like media streaming. Adjusting QoS settings can help allocate more bandwidth to your Raspberry Pi for smoother AirPlay streaming.

How to Improve the Raspberry Pi AirPlay Receivers WiFi Performance?

Use a Wi-Fi USB Adapter

Consider using a high-quality Wi-Fi USB adapter that provides better reception and performance compared to the built-in Wi-Fi module of the Raspberry Pi.

Check for Wi-Fi Interference

Use Wi-Fi analyzer tools to detect potential sources of interference and adjust your setup accordingly. These tools can help you identify which channels are less crowded and provide insights into your network’s performance.

Use Wired Ethernet Connection

If possible, connect your Raspberry Pi to your router using an Ethernet cable. Wired connections are generally more stable and offer higher speeds than Wi-Fi.

Monitor Network Performance

Regularly monitor your network’s performance using tools like speed tests and network analyzers. This can help you identify any fluctuations in Wi-Fi performance and take appropriate action.

Why Not Use the 3.5MM Audio Out with Raspberry Pi AirPlay?

Using the 3.5mm audio output on a Raspberry Pi for your AirPlay setup is certainly an option, but there are several factors to consider when deciding whether to use this method or opt for other audio output options.

Here are some points to keep in mind:

Audio Quality

The 3.5mm audio output on the Raspberry Pi provides basic analog audio. While it can work for casual listening, it may not deliver the best audio quality, especially if you’re aiming for a high-fidelity audio experience.

Noise and Interference

Analog audio outputs can be susceptible to noise and interference, which can lead to lower audio quality and unwanted audio artifacts. Digital audio outputs, like HDMI or USB audio, tend to have better noise immunity.

Limited Connectivity

The 3.5mm audio output provides a single analog audio channel. If you’re looking to create a more complex audio setup, such as a multi-speaker configuration, you might benefit from using digital audio outputs that support higher channel counts [6].

Compatibility and Flexibility

Using the 3.5mm audio output may limit your compatibility with various audio systems and speakers. Digital audio outputs provide greater flexibility and compatibility with a wider range of audio equipment.

Why Not Use the 3.5MM Audio Out with Raspberry Pi AirPlay?

Digital-to-Analog Conversion (DAC)

When using the 3.5mm audio output, the Raspberry Pi’s internal DAC performs the digital-to-analog conversion. Depending on your audio setup and preferences, you might achieve better audio quality by using an external DAC through other audio output options.

Synchronization and Latency

For video playback or scenarios where precise audio synchronization is important, using digital audio outputs can offer better synchronization with video content.

Advanced Audio Features

Digital audio outputs can support advanced audio features such as high-resolution audio formats, surround sound, and bit-perfect audio reproduction.

Longer Cable Runs

Analog audio signals can degrade over longer cable runs, potentially resulting in lower audio quality. Digital audio signals are less susceptible to signal degradation.

Upgradability

If you decide to upgrade your audio setup in the future, using digital audio outputs provides more flexibility for integrating new audio equipment and technologies.

FAQ:

1. Can you use AirPlay on Raspberry Pi 3?

Yes, you can use AirPlay on a Raspberry Pi 3. By setting up an AirPlay receiver software, such as Shairport Sync, on your Raspberry Pi 3, you can enable it to receive and play audio streamed from Apple devices using the AirPlay protocol.

2. How to implement an AirPlay receiver?

To implement an AirPlay receiver on a Raspberry Pi, you can follow these general steps:

  1. Prepare Equipment: You’ll need a Raspberry Pi, micro SD card, power supply, speakers, and a network connection (Wi-Fi or Ethernet);
  2. Install Required Software: Install an AirPlay receiver software like Shairport Sync by cloning the repository, building, and installing the software on your Raspberry Pi;
  3. Configure Audio: Set your Raspberry Pi’s audio output to your desired speakers or audio system;
  4. Connect to Wi-Fi: Connect your Raspberry Pi to your Wi-Fi network;
  5. Test AirPlay: Use your AirPlay-enabled device (e.g., iPhone) to stream audio to your Raspberry Pi by selecting it as the AirPlay receiver [7];

3. How to use AirPlay on Osmc?

To use AirPlay on OSMC (Open Source Media Center), follow these steps:

  1. Enable AirPlay: Navigate to OSMC’s settings, go to the Services section, and enable “AirPlay support”;
  2. Connect to OSMC: On your AirPlay-enabled device, connect to the same Wi-Fi network as your OSMC device;
  3. Start AirPlay: Open the media player on your AirPlay device, and look for the AirPlay icon. Select your OSMC device to start streaming audio or video;

4. How to broadcast with AirPlay?

To broadcast using AirPlay, you’ll need an AirPlay-enabled device (e.g., iPhone) and an AirPlay receiver (e.g., Apple TV, Raspberry Pi with AirPlay software). Connect both devices to the same Wi-Fi network. On your AirPlay-enabled device, select the AirPlay icon in media apps, and choose the target receiver to start broadcasting content to the receiver’s display or speakers.

5. Does AirPlay allow screen mirroring?

Yes, AirPlay supports screen mirroring. You can mirror the entire screen of your iOS device (iPhone, iPad) or Mac computer to an AirPlay-enabled receiver, such as an Apple TV, or certain software-based receivers like those on Raspberry Pi using software like AirServer or Reflector.

6. What is the alternative to an AirPlay receiver?

An alternative to an AirPlay receiver is Google’s Cast technology, commonly used with Google Chromecast devices. This technology allows you to stream media content from your compatible devices (Android phones, Chromebooks, etc.) to a Cast-enabled receiver, similar to AirPlay.

7. Can a Raspberry Pi handle streaming?

Yes, a Raspberry Pi can handle streaming tasks. It can serve as a versatile media center, supporting audio and video streaming using various software applications and protocols like AirPlay, DLNA, Plex, Kodi, and more.

8. What is an AirPlay-compatible device?

An AirPlay-compatible device is one that can send or receive media content using Apple’s AirPlay technology. This includes devices like iPhones, iPads, Mac computers, Apple TV, and third-party devices or software that support AirPlay functionality [8].

9. Is HDMI cable better than AirPlay?

HDMI cables provide a direct and high-quality connection between devices, resulting in potentially better audio and video quality compared to wireless technologies like AirPlay. However, AirPlay offers the convenience of wireless streaming and allows for multi-room audio setups, making it a suitable option for specific use cases.

10. Can you AirPlay without Wi-Fi?

No, AirPlay requires a Wi-Fi network for communication between devices. Both the sender and receiver need to be connected to the same Wi-Fi network to use AirPlay.

11. Does AirPlay drain the battery?

Using AirPlay to stream media from one device to another may consume some battery power on the sender device (e.g., iPhone). However, the impact on battery life is generally not significant during normal usage.

12. What kbps is AirPlay?

AirPlay uses different bitrates depending on the content being streamed. Audio can range from around 44 kbps for low-quality streaming to 320 kbps for higher quality. Video streaming bitrates can vary based on factors like resolution and frame rate.

13. Why is AirPlay so good?

AirPlay is considered good because it offers seamless wireless streaming of media content between Apple devices and compatible receivers. It provides high-quality audio and video transmission, supports screen mirroring, and enables multi-room audio setups. Additionally, AirPlay is user-friendly and integrated into Apple’s ecosystem, making it a convenient way to share and enjoy content across devices.

14. Can I use AirPlay on a Raspberry Pi?

Yes, you can use AirPlay on a Raspberry Pi. By installing AirPlay receiver software like Shairport Sync, you can transform your Raspberry Pi into an AirPlay-enabled device [9].

15. Which Raspberry Pi models are compatible with AirPlay?

Most Raspberry Pi models can be used for AirPlay. The Raspberry Pi 3 and later models are popular choices due to their built-in Wi-Fi capabilities.

16. What software do I need to install on my Raspberry Pi for AirPlay?

To enable AirPlay on your Raspberry Pi, you’ll need to install AirPlay receiver software such as Shairport Sync. This software allows your Raspberry Pi to receive and play media content from AirPlay-enabled devices.

17. How do I set up AirPlay on my Raspberry Pi?

To set up AirPlay on your Raspberry Pi, follow these general steps:

  1. Prepare your Raspberry Pi and install the necessary software packages;
  2. Install the AirPlay receiver software (e.g., Shairport Sync) by cloning the repository and building the software;
  3. Configure audio output to your desired speakers or audio system;
  4. Connect your Raspberry Pi to Wi-Fi;
  5. Start the AirPlay receiver service and use your AirPlay-enabled device to stream media content [10];

18. Can I stream both audio and video using AirPlay on Raspberry Pi?

Yes, AirPlay on Raspberry Pi supports both audio and video streaming. You can stream audio to play through your Raspberry Pi’s connected speakers or use screen mirroring to display your device’s screen on a larger display.

19. What devices can I stream from using AirPlay?

You can stream from AirPlay-enabled Apple devices, including iPhones, iPads, and Mac computers. These devices can send audio, video, and screen mirroring content to your Raspberry Pi.

20. Is AirPlay on Raspberry Pi as reliable as other AirPlay receivers?

The reliability of AirPlay on Raspberry Pi depends on factors such as the quality of your Wi-Fi network, the performance of your Raspberry Pi, and the specific software you use. While it may not match the seamless experience of official AirPlay receivers, many users find it to be a reliable and cost-effective solution.

21. Can I use AirPlay on Raspberry Pi without an internet connection?

AirPlay requires a local Wi-Fi network connection between your AirPlay-enabled device and your Raspberry Pi. However, an active internet connection is not necessary for the devices to communicate and stream media locally.

22. Can I improve AirPlay’s performance on Raspberry Pi?

Yes, you can optimize AirPlay performance on Raspberry Pi by using a stable Wi-Fi connection, ensuring your Raspberry Pi is adequately powered, optimizing your audio setup, and using quality software.

23. What audio formats does AirPlay support on Raspberry Pi?

AirPlay supports various audio formats, including AAC, MP3, ALAC (Apple Lossless), and more. The specific formats supported may depend on the AirPlay receiver software you’re using.

24. Can I use AirPlay to stream content from non-Apple devices to Raspberry Pi?

AirPlay is primarily designed for streaming content from Apple devices. While there are some third-party applications that claim to enable AirPlay from non-Apple devices, compatibility, and performance may vary.

25. Is AirPlay on Raspberry Pi legal?

Using AirPlay on Raspberry Pi with compatible software is generally considered legal, as it involves creating an AirPlay receiver to receive content from authorized AirPlay-enabled devices. However, always ensure you’re using legitimate software and complying with relevant copyright and licensing laws.

26. Is there a difference between AirPlay and AirPlay 2 on Raspberry Pi?

AirPlay 2 introduces features like multi-room audio and improved synchronization, but not all AirPlay receiver software on Raspberry Pi supports AirPlay 2. Make sure to check the capabilities of the software you’re using.

Setting up AirPlay on Raspberry Pi can bring wireless media streaming capabilities to your projects, allowing you to enjoy audio and video content from your Apple devices on your Raspberry Pi-based setup.

Useful Video: How to Set Up Your Raspberry Pi as an AirPlay Receiver

References

  1. https://linuxhint.com/turn-raspberry-pi-into-airplay-receiver/
  2. https://pimylifeup.com/raspberry-pi-airplay-receiver/
  3. https://thepi.io/how-to-set-up-a-raspberry-pi-airplay-receiver/
  4. https://www.airplayguru.com/how-to-set-up-a-raspberry-pi-airplay-receiver/
  5. https://www.jeffreythompson.org/blog/2020/04/29/build-an-airplay-receiver-using-raspberry-pi/
  6. https://www.techradar.com/how-to/computing/how-to-build-an-airplay-receiver-with-raspberry-pi-zero-1318771
  7. https://computers.tutsplus.com/using-a-raspberry-pi-as-an-airplay-receiver–mac-54316a
  8. https://raspberrypihq.com/how-to-turn-your-raspberry-pi-into-a-airplay-receiver-to-stream-music-from-your-iphone/
  9. https://lifehacker.com/turn-a-raspberry-pi-into-an-airplay-receiver-for-stream-5978594
  10. https://mattbotsford.com/?p=6