Skip to main content

Linux daemon for Stream Deck control without GUI through filesystem

Project description

deckfs

Tests Python 3.8+ License: MIT

A Linux daemon for controlling Stream Deck devices without GUI through filesystem interface.

Overview

deckfs provides a simple, filesystem-based interface for configuring and controlling Elgato Stream Deck devices on Linux. Instead of requiring a GUI application, it monitors a directory structure where each numbered folder corresponds to a Stream Deck button.

Features

  • Filesystem-based configuration - No GUI required
  • Hot reload - Changes take effect immediately without restart
  • Multi-format support - PNG, JPEG images and shell/Python/Node.js scripts
  • Symbolic link support - Dynamic image switching
  • Automatic script detection - Supports .sh, .py, .js action scripts
  • Live monitoring - Real-time file system change detection

Installation

pip install deckfs

Quick Start

  1. Initialize configuration structure:
deckfs --init
  1. Add images and scripts to button folders:
# Button 1
cp my-icon.png ~/.local/streamdeck/01/image.png
echo '#!/bin/bash\necho "Button 1 pressed!"' > ~/.local/streamdeck/01/action.sh
chmod +x ~/.local/streamdeck/01/action.sh

# Button 2  
cp another-icon.jpg ~/.local/streamdeck/02/image.png
echo 'print("Button 2 pressed!")' > ~/.local/streamdeck/02/action.py
  1. Start the daemon:
deckfs

Development

Running tests

# Install development dependencies
pip install -e ".[dev]"

# Run tests
make test

# Run tests with coverage
make test-coverage

# Run specific test file
make test-single FILE=test_debouncer.py

Configuration Structure

~/.local/streamdeck/
├── 01/
│   ├── image.png    # Button image (PNG/JPEG)
│   └── action.sh    # Action script (optional)
├── 02/
│   ├── image.jpg
│   └── action.py
├── 03/
│   ├── image.png
│   └── action.js
└── ...

Folder Naming

  • Folders must be named with zero-padded numbers: 01, 02, 03, etc.
  • Each folder corresponds to a Stream Deck button position

Images

  • Supported formats: PNG, JPEG
  • Filename must start with "image" (e.g., image.png, image.jpg)
  • Images are automatically scaled to fit button size
  • Symbolic links supported for dynamic switching

Action Scripts

  • Optional executable scripts triggered on button press
  • Supported types:
    • .sh - Shell scripts (executed with bash)
    • .py - Python scripts (executed with python3)
    • .js - JavaScript scripts (executed with node)
  • Must be named action.{extension}
  • Must be executable for shell scripts

CLI Usage

# Start daemon (default config: ~/.local/streamdeck)
deckfs

# Use custom config directory
deckfs --config-dir /path/to/config

# Initialize basic folder structure
deckfs --init

# Show version
deckfs --version

Requirements

  • Linux operating system
  • Python 3.8+
  • Connected Elgato Stream Deck device
  • Appropriate udev rules for device access

Device Permissions

You may need to set up udev rules for device access:

# Create udev rule file
sudo tee /etc/udev/rules.d/50-streamdeck.rules << EOF
SUBSYSTEM=="usb", ATTRS{idVendor}=="0fd9", TAG+="uaccess"
EOF

# Reload udev rules
sudo udevadm control --reload-rules
sudo udevadm trigger

Examples

See the examples/ directory for comprehensive examples in different programming languages:

  • 01_toggle_mute (Bash) - Toggle system audio mute with visual feedback
  • 02_launch_firefox (Python) - Smart Firefox launcher with profile support
  • 03_next_track (JavaScript) - Advanced media player control via D-Bus

Each example includes detailed setup instructions, documentation, and demonstrates different integration approaches.

Quick Dynamic Image Switching

# Create images
cp status-online.png ~/.local/streamdeck/01/online.png
cp status-offline.png ~/.local/streamdeck/01/offline.png

# Switch between them using symlinks
ln -sf online.png ~/.local/streamdeck/01/image.png   # Shows online
ln -sf offline.png ~/.local/streamdeck/01/image.png  # Shows offline

Troubleshooting

Device Not Found

  • Ensure Stream Deck is connected and powered
  • Check udev rules are properly configured
  • Verify user permissions for USB device access

Images Not Updating

  • Check file permissions and ownership
  • Ensure filename starts with "image"
  • Verify image format is PNG or JPEG

Scripts Not Executing

  • Verify script has executable permissions (chmod +x)
  • Check script interpreter is installed (bash/python3/node)
  • Review daemon output for error messages

Development

Project Structure

src/
├── cli.py              # Main CLI entry point
├── core/
│   └── daemon.py       # Daemon implementation
├── handlers/
│   └── file_handler.py # File system event handling
└── utils/
    ├── config.py       # Configuration constants
    └── device.py       # Stream Deck device management

Dependencies

  • streamdeck - Stream Deck SDK
  • Pillow - Image processing
  • watchdog - File system monitoring

License

MIT License - see LICENSE file for details.

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests if applicable
  5. Submit a pull request

Support

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

deckfs-0.1.0.tar.gz (39.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

deckfs-0.1.0-py3-none-any.whl (32.7 kB view details)

Uploaded Python 3

File details

Details for the file deckfs-0.1.0.tar.gz.

File metadata

  • Download URL: deckfs-0.1.0.tar.gz
  • Upload date:
  • Size: 39.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for deckfs-0.1.0.tar.gz
Algorithm Hash digest
SHA256 7f178fca71ff037afa23e6e544ca93c5254906d37bd918adf6cda257d3d40acc
MD5 f3323ac96ee844d73430003c5d5db726
BLAKE2b-256 88b315f5ab24666c79df82799ce56d7006b5d5d6f392adc9a327bd9d2aeb90fb

See more details on using hashes here.

File details

Details for the file deckfs-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: deckfs-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 32.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for deckfs-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1d4459f0e9f0647ff82baa631091a74080a3d1f8c34fe33288b8ec84a4a744df
MD5 bb50acfc72f34b7fb413dcb549b9596a
BLAKE2b-256 cb98e6e3caec57ecb34eb96e7c222175e9c6a4c7846a524f3a65e52e0f2421d9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page