OpenLightShow is a powerful Python-based audio-reactive lightshow controller that turns your music into mesmerizing visual effects. Originally designed for projector shows, it's perfect for parties, events, DJ sets, or creative visual performances.
Download the standalone EXE installer from the GitHub Releases page. No Python installation required!
Install directly from PyPI:
# Install from PyPI
pip install openlightshow
# Run the application
openlightshow
For developers who want to modify the source code:
# Clone the repository
git clone https://github.com/digidigital/openlightshow.git
cd openlightshow
# Create virtual environment (recommended)
python -m venv venv
# Activate virtual environment
# On Linux/Mac:
source venv/bin/activate
# On Windows:
venv\Scripts\activate
# Install in development mode
pip install -e .
# Run the application
openlightshow
Automatically installed with the package:
openlightshow command, or development run)The effects panel shows all available effects with:
Use the preset dropdown to quickly load pre-configured settings:
openlightshow/
โโโ src/
โ โโโ openlightshow/
โ โโโ main.py # Main application
โ โโโ effect_base.py # Base effect class
โ โโโ effect_loader.py # Auto-discovery system
โ โโโ presets.toml # Preset configurations
โ โโโ exclude_list.toml # Effect conflict rules
โ โโโ icons/ # Application icons
โ โโโ effects/ # Effect modules (58+ effects)
โ โโโ beat_strobe.py
โ โโโ disco_derby.py
โ โโโ starfield.py
โ โโโ ...
โโโ pyproject.toml # Package configuration
โโโ README.md # Documentation
All effects inherit from the Effect base class and are automatically discovered by the loader. Copy the prompt below and paste it into your AI assistant with your effect idea!
The base class is included in the AI prompt above for easy copy-paste!
class Effect:
"""Base class for all lightshow effects."""
name: str = "Effect Name"
effect_class: str = "unique_class"
def __init__(self, size: QSize):
self.size = size
# Initialize your effect state here
def resize(self, size: QSize):
self.size = size
# Recalculate positions/sizes
def update(self, dt_ms: int, energies: dict,
sensitivity: float, flash_thresh: float):
# energies: {'low': 0.0-1.0, 'mid': 0.0-1.0, 'high': 0.0-1.0}
# Update animation state
def paint(self, painter: QPainter, brightness: float):
# Draw your effect using QPainter
def on_beat(self):
# Optional: triggered on detected beats
git checkout -b feature/amazing-effectsrc/openlightshow/effects/git commit -m 'Add amazing effect'git push origin feature/amazing-effectresize()paint() fast - it runs at 60 FPSeffect_class to group similar effects (prevents conflicts)exclude_list.toml if effects shouldn't play togetherDefine custom presets with effect selections and weights:
["My Custom Preset"]
sensitivity = 80
brightness = 120
flash_threshold = 85
effect_period = 12.0
star_spacing = 50
max_active = 3
effects = [
"Effect Name 1",
"Effect Name 2",
"Effect Name 3"
]
["My Custom Preset".effect_weights]
"Effect Name 1" = 50
"Effect Name 2" = 30
"Effect Name 3" = 20
Define groups of effects that shouldn't play together:
my_conflict_group = [
"Effect A",
"Effect B",
"Effect C"
]
OpenLightShow is released under the MIT License.
View Full License Text | Project Homepage
OpenLightShow is built using the following open-source libraries. We gratefully acknowledge their contributions:
All third-party libraries used in OpenLightShow are licensed under permissive open-source licenses (MIT, BSD, ISC, LGPL) that are compatible with OpenLightShow's MIT license. These licenses allow:
We are grateful to the open-source community and the developers of these excellent libraries. Without their work, OpenLightShow would not be possible.