Repository files navigation

RainingKeys (Python)

RainingKeysPython Icon

LicensePythonPlatformCIReleaseko-fi

A high-performance, external rhythm game input visualizer.

RainingKeys is a purely external overlay application that visualizes keyboard inputs as falling bars, similar to "Rain" mode found in various rhythm game mods. It provides visual feedback on rhythm stability, micro-jitter, and input timing without injecting code into game process.

This project is a standalone external tool. It is NOT a game mod and does NOT perform DLL injection or memory hooking. It is safe to use with anti-cheat software that permits external overlays.


Features

  • External overlay with transparent, always-on-top, click-through window
  • Graphic interface for live configuration
  • Configurable X/Y overlay positioning
  • Supports both Down (Classic) and Up (Reverse) fall directions
  • High-resolution monotonic clocks for smooth animation
  • Configurable key-to-lane mapping (e.g., WASD, Space, Enter)
  • Visual keyboard representation showing key presses and counts
  • Adjustable opacity for inactive keys
  • Customizable RGBA colors and overlay speed
  • Long press support with variable-length bars
  • Performance optimized with object pooling and efficient rendering

Tech Stack

  • Python 3.10+
  • PySide6 (Qt) for high-performance rendering and window management
  • pynput for global low-level keyboard hook
  • pywin32 for Windows API integration

Project Structure

RainingKeysPython/
├── core/
│ ├── configuration.py # Dataclasses for application configuration
│ ├── gui.py # Configuration Window GUI
│ ├── input_mon.py # Global input listener (thread-safe)
│ ├── logging_config.py # Logging configuration
│ ├── overlay.py # Main rendering loop and window logic
│ ├── settings_manager.py # Handles config loading/saving (atomic writes, migration)
│ └── ui/
│ ├── components.py # Reusable UI components
│ └── theme.py # Theme definitions
├── .github/
│ ├── workflows/
│ │ ├── ci.yml # Code quality validation (Windows)
│ │ └── release.yml # Automated releases with git-cliff
│ ├── scripts/
│ │ ├── syntax_check.py # Python syntax validation
│ │ ├── type_check.py # Type hints validation
│ │ ├── config_validation.py # Configuration validation
│ │ └── monitor_ci.py # CI monitoring script
│ └── README.md # Workflow documentation
├── cliff.toml # Git-cliff configuration for changelog generation
├── run_local_ci.py # Local CI runner script
├── build.py # Build script for creating standalone executable
├── main.py # Application entry point
└── requirements.txt # Dependencies

Installation

  1. Ensure you have Python 3.10 or newer installed
  2. Clone repository or download source
  3. Install dependencies:
pip install -r requirements.txt

Optional: Build Standalone Executable

For a portable executable without Python installation:

python build.py

This creates RainingKeysPython.exe in the dist/ folder.

Usage

  1. Run the application:
python main.py
  1. The application launches two windows:
  • Transparent Overlay: The visualizer (click-through)
  • Config Window: The controls (Alt+Tab to find if hidden)
  1. Configure lanes:
  • Click "Record Lane Keys" in the config window
  • Press keys to bind (e.g., Z, X, ., /)
  • Click "Stop Recording" to save
  1. Customize settings:
  • Adjust Scroll Speed and Bar Color
  • Enable KeyViewer to see the static key panel
  • Drag Inactive Opacity to change faintness of unpressed keys
  • Change KeyViewer Position (Above/Below) to flip fall direction

Configuration

Settings are stored in config.ini (automatically created on first run). You can edit this file manually or use the GUI Settings Window.

Config Options

SectionParameterDescription
Visualscroll_speedFalling speed in pixels per second
Visualbar_colorRGBA color string (e.g., 0,255,255,200)
Visualfall_directionup or down - falling animation direction
PositionxOverlay X position (pixels)
PositionyOverlay Y position (pixels)
LaneskeysComma-separated list of keys (e.g., Z,X,./,)
KeyViewerenabledShow/Hide KeyViewer panel
KeyViewerpanel_positionabove or below - Affects fall direction
KeyVieweropacityOpacity of inactive keys (0.0 - 1.0)

The configuration file includes a CONFIG_VERSION field for automatic migration. When updating to a new version with breaking config changes, the application will automatically migrate your settings.

Developer Guide

This project is open to contributions. For detailed development guides, see the following documentation:

Quick Start

  1. Run local CI (fast quality check):
python run_local_ci.py
  1. Install dependencies:
pip install -r requirements.txt
  1. Make changes and test locally:
python run_local_ci.py
  1. Commit with conventional format:
git commit -m "feat: Add new feature"
  1. Push to GitHub:
git push

See LOCAL_CI.md for complete local CI runner documentation.

GitHub Actions CI/CD

This project uses GitHub Actions for automated quality validation and release management.

Workflows

Code Quality

  • Runs on every push and pull request
  • Windows-based CI for consistency with production
  • Syntax validation, linting, type checking, import testing

Release

  • Triggered by tag push (format: v*)
  • Generates changelog using git-cliff
  • Creates GitHub releases with build artifacts:
    • RainingKeysPython.zip - Release build
    • RainingKeysPython-debug.zip - Debug build

Conventional Commits

Use the following format for commit messages:

<type>[optional scope]: <subject>
[optional body]
[optional footer(s)]

Types:feat, fix, perf, refactor, chore, test, docs, style

Local CI Runner

Run GitHub Actions CI checks locally for faster development iteration.

Usage

# Run all checks
python run_local_ci.py
# Run individual checks
python run_local_ci.py --syntax # Syntax check
python run_local_ci.py --lint # Linting
python run_local_ci.py --import # Import check
python run_local_ci.py --type # Type check
python run_local_ci.py --config # Config check
python run_local_ci.py --build # Build test

Benefits

  • 10-100x faster than GitHub Actions
  • Interactive debugging
  • Unlimited runs
  • Free (uses own computer)
  • Same environment as development (Windows)

Contributing

Contributions are welcome! We'd love to make this tool better together.

Have a big idea or found a bug?

Open an Issue and tell us about it!

Want to help implement a feature?

Fork repository and submit a Pull Request.

Before Submitting

  1. Run local CI: python run_local_ci.py
  2. Use conventional commits (format above)
  3. Write tests for new features
  4. Update documentation where needed

Credits

This project is inspired by RainingKeys mod for A Dance of Fire and Ice, originally created by paring-chan.

Also credits to AdofaiTweaks by PizzaLovers007.

License

MIT License. See LICENSE for details.

Links


Made with love by the RainingKeysPython community

About

Standalone "Rain" style input visualizer for rhythm games. External, safe, and transparent.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

RainingKeys (Python)

RainingKeysPython Icon

LicensePythonPlatformCIReleaseko-fi

A high-performance, external rhythm game input visualizer.

RainingKeys is a purely external overlay application that visualizes keyboard inputs as falling bars, similar to "Rain" mode found in various rhythm game mods. It provides visual feedback on rhythm stability, micro-jitter, and input timing without injecting code into game process.

This project is a standalone external tool. It is NOT a game mod and does NOT perform DLL injection or memory hooking. It is safe to use with anti-cheat software that permits external overlays.


Features

  • External overlay with transparent, always-on-top, click-through window
  • Graphic interface for live configuration
  • Configurable X/Y overlay positioning
  • Supports both Down (Classic) and Up (Reverse) fall directions
  • High-resolution monotonic clocks for smooth animation
  • Configurable key-to-lane mapping (e.g., WASD, Space, Enter)
  • Visual keyboard representation showing key presses and counts
  • Adjustable opacity for inactive keys
  • Customizable RGBA colors and overlay speed
  • Long press support with variable-length bars
  • Performance optimized with object pooling and efficient rendering

Tech Stack

  • Python 3.10+
  • PySide6 (Qt) for high-performance rendering and window management
  • pynput for global low-level keyboard hook
  • pywin32 for Windows API integration

Project Structure

RainingKeysPython/
├── core/
│ ├── configuration.py # Dataclasses for application configuration
│ ├── gui.py # Configuration Window GUI
│ ├── input_mon.py # Global input listener (thread-safe)
│ ├── logging_config.py # Logging configuration
│ ├── overlay.py # Main rendering loop and window logic
│ ├── settings_manager.py # Handles config loading/saving (atomic writes, migration)
│ └── ui/
│ ├── components.py # Reusable UI components
│ └── theme.py # Theme definitions
├── .github/
│ ├── workflows/
│ │ ├── ci.yml # Code quality validation (Windows)
│ │ └── release.yml # Automated releases with git-cliff
│ ├── scripts/
│ │ ├── syntax_check.py # Python syntax validation
│ │ ├── type_check.py # Type hints validation
│ │ ├── config_validation.py # Configuration validation
│ │ └── monitor_ci.py # CI monitoring script
│ └── README.md # Workflow documentation
├── cliff.toml # Git-cliff configuration for changelog generation
├── run_local_ci.py # Local CI runner script
├── build.py # Build script for creating standalone executable
├── main.py # Application entry point
└── requirements.txt # Dependencies

Installation

  1. Ensure you have Python 3.10 or newer installed
  2. Clone repository or download source
  3. Install dependencies:
pip install -r requirements.txt

Optional: Build Standalone Executable

For a portable executable without Python installation:

python build.py

This creates RainingKeysPython.exe in the dist/ folder.

Usage

  1. Run the application:
python main.py
  1. The application launches two windows:
  • Transparent Overlay: The visualizer (click-through)
  • Config Window: The controls (Alt+Tab to find if hidden)
  1. Configure lanes:
  • Click "Record Lane Keys" in the config window
  • Press keys to bind (e.g., Z, X, ., /)
  • Click "Stop Recording" to save
  1. Customize settings:
  • Adjust Scroll Speed and Bar Color
  • Enable KeyViewer to see the static key panel
  • Drag Inactive Opacity to change faintness of unpressed keys
  • Change KeyViewer Position (Above/Below) to flip fall direction

Configuration

Settings are stored in config.ini (automatically created on first run). You can edit this file manually or use the GUI Settings Window.

Config Options

SectionParameterDescription
Visualscroll_speedFalling speed in pixels per second
Visualbar_colorRGBA color string (e.g., 0,255,255,200)
Visualfall_directionup or down - falling animation direction
PositionxOverlay X position (pixels)
PositionyOverlay Y position (pixels)
LaneskeysComma-separated list of keys (e.g., Z,X,./,)
KeyViewerenabledShow/Hide KeyViewer panel
KeyViewerpanel_positionabove or below - Affects fall direction
KeyVieweropacityOpacity of inactive keys (0.0 - 1.0)

The configuration file includes a CONFIG_VERSION field for automatic migration. When updating to a new version with breaking config changes, the application will automatically migrate your settings.

Developer Guide

This project is open to contributions. For detailed development guides, see the following documentation:

Quick Start

  1. Run local CI (fast quality check):
python run_local_ci.py
  1. Install dependencies:
pip install -r requirements.txt
  1. Make changes and test locally:
python run_local_ci.py
  1. Commit with conventional format:
git commit -m "feat: Add new feature"
  1. Push to GitHub:
git push

See LOCAL_CI.md for complete local CI runner documentation.

GitHub Actions CI/CD

This project uses GitHub Actions for automated quality validation and release management.

Workflows

Code Quality

  • Runs on every push and pull request
  • Windows-based CI for consistency with production
  • Syntax validation, linting, type checking, import testing

Release

  • Triggered by tag push (format: v*)
  • Generates changelog using git-cliff
  • Creates GitHub releases with build artifacts:
    • RainingKeysPython.zip - Release build
    • RainingKeysPython-debug.zip - Debug build

Conventional Commits

Use the following format for commit messages:

<type>[optional scope]: <subject>
[optional body]
[optional footer(s)]

Types:feat, fix, perf, refactor, chore, test, docs, style

Local CI Runner

Run GitHub Actions CI checks locally for faster development iteration.

Usage

# Run all checks
python run_local_ci.py
# Run individual checks
python run_local_ci.py --syntax # Syntax check
python run_local_ci.py --lint # Linting
python run_local_ci.py --import # Import check
python run_local_ci.py --type # Type check
python run_local_ci.py --config # Config check
python run_local_ci.py --build # Build test

Benefits

  • 10-100x faster than GitHub Actions
  • Interactive debugging
  • Unlimited runs
  • Free (uses own computer)
  • Same environment as development (Windows)

Contributing

Contributions are welcome! We'd love to make this tool better together.

Have a big idea or found a bug?

Open an Issue and tell us about it!

Want to help implement a feature?

Fork repository and submit a Pull Request.

Before Submitting

  1. Run local CI: python run_local_ci.py
  2. Use conventional commits (format above)
  3. Write tests for new features
  4. Update documentation where needed

Credits

This project is inspired by RainingKeys mod for A Dance of Fire and Ice, originally created by paring-chan.

Also credits to AdofaiTweaks by PizzaLovers007.

License

MIT License. See LICENSE for details.

Links


Made with love by the RainingKeysPython community

About

Standalone "Rain" style input visualizer for rhythm games. External, safe, and transparent.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

RainingKeys (Python)

RainingKeysPython Icon

LicensePythonPlatformCIReleaseko-fi

A high-performance, external rhythm game input visualizer.

RainingKeys is a purely external overlay application that visualizes keyboard inputs as falling bars, similar to "Rain" mode found in various rhythm game mods. It provides visual feedback on rhythm stability, micro-jitter, and input timing without injecting code into game process.

This project is a standalone external tool. It is NOT a game mod and does NOT perform DLL injection or memory hooking. It is safe to use with anti-cheat software that permits external overlays.


Features

  • External overlay with transparent, always-on-top, click-through window
  • Graphic interface for live configuration
  • Configurable X/Y overlay positioning
  • Supports both Down (Classic) and Up (Reverse) fall directions
  • High-resolution monotonic clocks for smooth animation
  • Configurable key-to-lane mapping (e.g., WASD, Space, Enter)
  • Visual keyboard representation showing key presses and counts
  • Adjustable opacity for inactive keys
  • Customizable RGBA colors and overlay speed
  • Long press support with variable-length bars
  • Performance optimized with object pooling and efficient rendering

Tech Stack

  • Python 3.10+
  • PySide6 (Qt) for high-performance rendering and window management
  • pynput for global low-level keyboard hook
  • pywin32 for Windows API integration

Project Structure

RainingKeysPython/
├── core/
│ ├── configuration.py # Dataclasses for application configuration
│ ├── gui.py # Configuration Window GUI
│ ├── input_mon.py # Global input listener (thread-safe)
│ ├── logging_config.py # Logging configuration
│ ├── overlay.py # Main rendering loop and window logic
│ ├── settings_manager.py # Handles config loading/saving (atomic writes, migration)
│ └── ui/
│ ├── components.py # Reusable UI components
│ └── theme.py # Theme definitions
├── .github/
│ ├── workflows/
│ │ ├── ci.yml # Code quality validation (Windows)
│ │ └── release.yml # Automated releases with git-cliff
│ ├── scripts/
│ │ ├── syntax_check.py # Python syntax validation
│ │ ├── type_check.py # Type hints validation
│ │ ├── config_validation.py # Configuration validation
│ │ └── monitor_ci.py # CI monitoring script
│ └── README.md # Workflow documentation
├── cliff.toml # Git-cliff configuration for changelog generation
├── run_local_ci.py # Local CI runner script
├── build.py # Build script for creating standalone executable
├── main.py # Application entry point
└── requirements.txt # Dependencies

Installation

  1. Ensure you have Python 3.10 or newer installed
  2. Clone repository or download source
  3. Install dependencies:
pip install -r requirements.txt

Optional: Build Standalone Executable

For a portable executable without Python installation:

python build.py

This creates RainingKeysPython.exe in the dist/ folder.

Usage

  1. Run the application:
python main.py
  1. The application launches two windows:
  • Transparent Overlay: The visualizer (click-through)
  • Config Window: The controls (Alt+Tab to find if hidden)
  1. Configure lanes:
  • Click "Record Lane Keys" in the config window
  • Press keys to bind (e.g., Z, X, ., /)
  • Click "Stop Recording" to save
  1. Customize settings:
  • Adjust Scroll Speed and Bar Color
  • Enable KeyViewer to see the static key panel
  • Drag Inactive Opacity to change faintness of unpressed keys
  • Change KeyViewer Position (Above/Below) to flip fall direction

Configuration

Settings are stored in config.ini (automatically created on first run). You can edit this file manually or use the GUI Settings Window.

Config Options

SectionParameterDescription
Visualscroll_speedFalling speed in pixels per second
Visualbar_colorRGBA color string (e.g., 0,255,255,200)
Visualfall_directionup or down - falling animation direction
PositionxOverlay X position (pixels)
PositionyOverlay Y position (pixels)
LaneskeysComma-separated list of keys (e.g., Z,X,./,)
KeyViewerenabledShow/Hide KeyViewer panel
KeyViewerpanel_positionabove or below - Affects fall direction
KeyVieweropacityOpacity of inactive keys (0.0 - 1.0)

The configuration file includes a CONFIG_VERSION field for automatic migration. When updating to a new version with breaking config changes, the application will automatically migrate your settings.

Developer Guide

This project is open to contributions. For detailed development guides, see the following documentation:

Quick Start

  1. Run local CI (fast quality check):
python run_local_ci.py
  1. Install dependencies:
pip install -r requirements.txt
  1. Make changes and test locally:
python run_local_ci.py
  1. Commit with conventional format:
git commit -m "feat: Add new feature"
  1. Push to GitHub:
git push

See LOCAL_CI.md for complete local CI runner documentation.

GitHub Actions CI/CD

This project uses GitHub Actions for automated quality validation and release management.

Workflows

Code Quality

  • Runs on every push and pull request
  • Windows-based CI for consistency with production
  • Syntax validation, linting, type checking, import testing

Release

  • Triggered by tag push (format: v*)
  • Generates changelog using git-cliff
  • Creates GitHub releases with build artifacts:
    • RainingKeysPython.zip - Release build
    • RainingKeysPython-debug.zip - Debug build

Conventional Commits

Use the following format for commit messages:

<type>[optional scope]: <subject>
[optional body]
[optional footer(s)]

Types:feat, fix, perf, refactor, chore, test, docs, style

Local CI Runner

Run GitHub Actions CI checks locally for faster development iteration.

Usage

# Run all checks
python run_local_ci.py
# Run individual checks
python run_local_ci.py --syntax # Syntax check
python run_local_ci.py --lint # Linting
python run_local_ci.py --import # Import check
python run_local_ci.py --type # Type check
python run_local_ci.py --config # Config check
python run_local_ci.py --build # Build test

Benefits

  • 10-100x faster than GitHub Actions
  • Interactive debugging
  • Unlimited runs
  • Free (uses own computer)
  • Same environment as development (Windows)

Contributing

Contributions are welcome! We'd love to make this tool better together.

Have a big idea or found a bug?

Open an Issue and tell us about it!

Want to help implement a feature?

Fork repository and submit a Pull Request.

Before Submitting

  1. Run local CI: python run_local_ci.py
  2. Use conventional commits (format above)
  3. Write tests for new features
  4. Update documentation where needed

Credits

This project is inspired by RainingKeys mod for A Dance of Fire and Ice, originally created by paring-chan.

Also credits to AdofaiTweaks by PizzaLovers007.

License

MIT License. See LICENSE for details.

Links


Made with love by the RainingKeysPython community

About

Standalone "Rain" style input visualizer for rhythm games. External, safe, and transparent.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

RainingKeys (Python)

RainingKeysPython Icon

LicensePythonPlatformCIReleaseko-fi

A high-performance, external rhythm game input visualizer.

RainingKeys is a purely external overlay application that visualizes keyboard inputs as falling bars, similar to "Rain" mode found in various rhythm game mods. It provides visual feedback on rhythm stability, micro-jitter, and input timing without injecting code into game process.

This project is a standalone external tool. It is NOT a game mod and does NOT perform DLL injection or memory hooking. It is safe to use with anti-cheat software that permits external overlays.


Features

  • External overlay with transparent, always-on-top, click-through window
  • Graphic interface for live configuration
  • Configurable X/Y overlay positioning
  • Supports both Down (Classic) and Up (Reverse) fall directions
  • High-resolution monotonic clocks for smooth animation
  • Configurable key-to-lane mapping (e.g., WASD, Space, Enter)
  • Visual keyboard representation showing key presses and counts
  • Adjustable opacity for inactive keys
  • Customizable RGBA colors and overlay speed
  • Long press support with variable-length bars
  • Performance optimized with object pooling and efficient rendering

Tech Stack

  • Python 3.10+
  • PySide6 (Qt) for high-performance rendering and window management
  • pynput for global low-level keyboard hook
  • pywin32 for Windows API integration

Project Structure

RainingKeysPython/
├── core/
│ ├── configuration.py # Dataclasses for application configuration
│ ├── gui.py # Configuration Window GUI
│ ├── input_mon.py # Global input listener (thread-safe)
│ ├── logging_config.py # Logging configuration
│ ├── overlay.py # Main rendering loop and window logic
│ ├── settings_manager.py # Handles config loading/saving (atomic writes, migration)
│ └── ui/
│ ├── components.py # Reusable UI components
│ └── theme.py # Theme definitions
├── .github/
│ ├── workflows/
│ │ ├── ci.yml # Code quality validation (Windows)
│ │ └── release.yml # Automated releases with git-cliff
│ ├── scripts/
│ │ ├── syntax_check.py # Python syntax validation
│ │ ├── type_check.py # Type hints validation
│ │ ├── config_validation.py # Configuration validation
│ │ └── monitor_ci.py # CI monitoring script
│ └── README.md # Workflow documentation
├── cliff.toml # Git-cliff configuration for changelog generation
├── run_local_ci.py # Local CI runner script
├── build.py # Build script for creating standalone executable
├── main.py # Application entry point
└── requirements.txt # Dependencies

Installation

  1. Ensure you have Python 3.10 or newer installed
  2. Clone repository or download source
  3. Install dependencies:
pip install -r requirements.txt

Optional: Build Standalone Executable

For a portable executable without Python installation:

python build.py

This creates RainingKeysPython.exe in the dist/ folder.

Usage

  1. Run the application:
python main.py
  1. The application launches two windows:
  • Transparent Overlay: The visualizer (click-through)
  • Config Window: The controls (Alt+Tab to find if hidden)
  1. Configure lanes:
  • Click "Record Lane Keys" in the config window
  • Press keys to bind (e.g., Z, X, ., /)
  • Click "Stop Recording" to save
  1. Customize settings:
  • Adjust Scroll Speed and Bar Color
  • Enable KeyViewer to see the static key panel
  • Drag Inactive Opacity to change faintness of unpressed keys
  • Change KeyViewer Position (Above/Below) to flip fall direction

Configuration

Settings are stored in config.ini (automatically created on first run). You can edit this file manually or use the GUI Settings Window.

Config Options

SectionParameterDescription
Visualscroll_speedFalling speed in pixels per second
Visualbar_colorRGBA color string (e.g., 0,255,255,200)
Visualfall_directionup or down - falling animation direction
PositionxOverlay X position (pixels)
PositionyOverlay Y position (pixels)
LaneskeysComma-separated list of keys (e.g., Z,X,./,)
KeyViewerenabledShow/Hide KeyViewer panel
KeyViewerpanel_positionabove or below - Affects fall direction
KeyVieweropacityOpacity of inactive keys (0.0 - 1.0)

The configuration file includes a CONFIG_VERSION field for automatic migration. When updating to a new version with breaking config changes, the application will automatically migrate your settings.

Developer Guide

This project is open to contributions. For detailed development guides, see the following documentation:

Quick Start

  1. Run local CI (fast quality check):
python run_local_ci.py
  1. Install dependencies:
pip install -r requirements.txt
  1. Make changes and test locally:
python run_local_ci.py
  1. Commit with conventional format:
git commit -m "feat: Add new feature"
  1. Push to GitHub:
git push

See LOCAL_CI.md for complete local CI runner documentation.

GitHub Actions CI/CD

This project uses GitHub Actions for automated quality validation and release management.

Workflows

Code Quality

  • Runs on every push and pull request
  • Windows-based CI for consistency with production
  • Syntax validation, linting, type checking, import testing

Release

  • Triggered by tag push (format: v*)
  • Generates changelog using git-cliff
  • Creates GitHub releases with build artifacts:
    • RainingKeysPython.zip - Release build
    • RainingKeysPython-debug.zip - Debug build

Conventional Commits

Use the following format for commit messages:

<type>[optional scope]: <subject>
[optional body]
[optional footer(s)]

Types:feat, fix, perf, refactor, chore, test, docs, style

Local CI Runner

Run GitHub Actions CI checks locally for faster development iteration.

Usage

# Run all checks
python run_local_ci.py
# Run individual checks
python run_local_ci.py --syntax # Syntax check
python run_local_ci.py --lint # Linting
python run_local_ci.py --import # Import check
python run_local_ci.py --type # Type check
python run_local_ci.py --config # Config check
python run_local_ci.py --build # Build test

Benefits

  • 10-100x faster than GitHub Actions
  • Interactive debugging
  • Unlimited runs
  • Free (uses own computer)
  • Same environment as development (Windows)

Contributing

Contributions are welcome! We'd love to make this tool better together.

Have a big idea or found a bug?

Open an Issue and tell us about it!

Want to help implement a feature?

Fork repository and submit a Pull Request.

Before Submitting

  1. Run local CI: python run_local_ci.py
  2. Use conventional commits (format above)
  3. Write tests for new features
  4. Update documentation where needed

Credits

This project is inspired by RainingKeys mod for A Dance of Fire and Ice, originally created by paring-chan.

Also credits to AdofaiTweaks by PizzaLovers007.

License

MIT License. See LICENSE for details.

Links


Made with love by the RainingKeysPython community

About

Standalone "Rain" style input visualizer for rhythm games. External, safe, and transparent.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

RainingKeys (Python)

RainingKeysPython Icon

LicensePythonPlatformCIReleaseko-fi

A high-performance, external rhythm game input visualizer.

RainingKeys is a purely external overlay application that visualizes keyboard inputs as falling bars, similar to "Rain" mode found in various rhythm game mods. It provides visual feedback on rhythm stability, micro-jitter, and input timing without injecting code into game process.

This project is a standalone external tool. It is NOT a game mod and does NOT perform DLL injection or memory hooking. It is safe to use with anti-cheat software that permits external overlays.


Features

  • External overlay with transparent, always-on-top, click-through window
  • Graphic interface for live configuration
  • Configurable X/Y overlay positioning
  • Supports both Down (Classic) and Up (Reverse) fall directions
  • High-resolution monotonic clocks for smooth animation
  • Configurable key-to-lane mapping (e.g., WASD, Space, Enter)
  • Visual keyboard representation showing key presses and counts
  • Adjustable opacity for inactive keys
  • Customizable RGBA colors and overlay speed
  • Long press support with variable-length bars
  • Performance optimized with object pooling and efficient rendering

Tech Stack

  • Python 3.10+
  • PySide6 (Qt) for high-performance rendering and window management
  • pynput for global low-level keyboard hook
  • pywin32 for Windows API integration

Project Structure

RainingKeysPython/
├── core/
│ ├── configuration.py # Dataclasses for application configuration
│ ├── gui.py # Configuration Window GUI
│ ├── input_mon.py # Global input listener (thread-safe)
│ ├── logging_config.py # Logging configuration
│ ├── overlay.py # Main rendering loop and window logic
│ ├── settings_manager.py # Handles config loading/saving (atomic writes, migration)
│ └── ui/
│ ├── components.py # Reusable UI components
│ └── theme.py # Theme definitions
├── .github/
│ ├── workflows/
│ │ ├── ci.yml # Code quality validation (Windows)
│ │ └── release.yml # Automated releases with git-cliff
│ ├── scripts/
│ │ ├── syntax_check.py # Python syntax validation
│ │ ├── type_check.py # Type hints validation
│ │ ├── config_validation.py # Configuration validation
│ │ └── monitor_ci.py # CI monitoring script
│ └── README.md # Workflow documentation
├── cliff.toml # Git-cliff configuration for changelog generation
├── run_local_ci.py # Local CI runner script
├── build.py # Build script for creating standalone executable
├── main.py # Application entry point
└── requirements.txt # Dependencies

Installation

  1. Ensure you have Python 3.10 or newer installed
  2. Clone repository or download source
  3. Install dependencies:
pip install -r requirements.txt

Optional: Build Standalone Executable

For a portable executable without Python installation:

python build.py

This creates RainingKeysPython.exe in the dist/ folder.

Usage

  1. Run the application:
python main.py
  1. The application launches two windows:
  • Transparent Overlay: The visualizer (click-through)
  • Config Window: The controls (Alt+Tab to find if hidden)
  1. Configure lanes:
  • Click "Record Lane Keys" in the config window
  • Press keys to bind (e.g., Z, X, ., /)
  • Click "Stop Recording" to save
  1. Customize settings:
  • Adjust Scroll Speed and Bar Color
  • Enable KeyViewer to see the static key panel
  • Drag Inactive Opacity to change faintness of unpressed keys
  • Change KeyViewer Position (Above/Below) to flip fall direction

Configuration

Settings are stored in config.ini (automatically created on first run). You can edit this file manually or use the GUI Settings Window.

Config Options

SectionParameterDescription
Visualscroll_speedFalling speed in pixels per second
Visualbar_colorRGBA color string (e.g., 0,255,255,200)
Visualfall_directionup or down - falling animation direction
PositionxOverlay X position (pixels)
PositionyOverlay Y position (pixels)
LaneskeysComma-separated list of keys (e.g., Z,X,./,)
KeyViewerenabledShow/Hide KeyViewer panel
KeyViewerpanel_positionabove or below - Affects fall direction
KeyVieweropacityOpacity of inactive keys (0.0 - 1.0)

The configuration file includes a CONFIG_VERSION field for automatic migration. When updating to a new version with breaking config changes, the application will automatically migrate your settings.

Developer Guide

This project is open to contributions. For detailed development guides, see the following documentation:

Quick Start

  1. Run local CI (fast quality check):
python run_local_ci.py
  1. Install dependencies:
pip install -r requirements.txt
  1. Make changes and test locally:
python run_local_ci.py
  1. Commit with conventional format:
git commit -m "feat: Add new feature"
  1. Push to GitHub:
git push

See LOCAL_CI.md for complete local CI runner documentation.

GitHub Actions CI/CD

This project uses GitHub Actions for automated quality validation and release management.

Workflows

Code Quality

  • Runs on every push and pull request
  • Windows-based CI for consistency with production
  • Syntax validation, linting, type checking, import testing

Release

  • Triggered by tag push (format: v*)
  • Generates changelog using git-cliff
  • Creates GitHub releases with build artifacts:
    • RainingKeysPython.zip - Release build
    • RainingKeysPython-debug.zip - Debug build

Conventional Commits

Use the following format for commit messages:

<type>[optional scope]: <subject>
[optional body]
[optional footer(s)]

Types:feat, fix, perf, refactor, chore, test, docs, style

Local CI Runner

Run GitHub Actions CI checks locally for faster development iteration.

Usage

# Run all checks
python run_local_ci.py
# Run individual checks
python run_local_ci.py --syntax # Syntax check
python run_local_ci.py --lint # Linting
python run_local_ci.py --import # Import check
python run_local_ci.py --type # Type check
python run_local_ci.py --config # Config check
python run_local_ci.py --build # Build test

Benefits

  • 10-100x faster than GitHub Actions
  • Interactive debugging
  • Unlimited runs
  • Free (uses own computer)
  • Same environment as development (Windows)

Contributing

Contributions are welcome! We'd love to make this tool better together.

Have a big idea or found a bug?

Open an Issue and tell us about it!

Want to help implement a feature?

Fork repository and submit a Pull Request.

Before Submitting

  1. Run local CI: python run_local_ci.py
  2. Use conventional commits (format above)
  3. Write tests for new features
  4. Update documentation where needed

Credits

This project is inspired by RainingKeys mod for A Dance of Fire and Ice, originally created by paring-chan.

Also credits to AdofaiTweaks by PizzaLovers007.

License

MIT License. See LICENSE for details.

Links


Made with love by the RainingKeysPython community

About

Standalone "Rain" style input visualizer for rhythm games. External, safe, and transparent.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

RainingKeys (Python)

RainingKeysPython Icon

LicensePythonPlatformCIReleaseko-fi

A high-performance, external rhythm game input visualizer.

RainingKeys is a purely external overlay application that visualizes keyboard inputs as falling bars, similar to "Rain" mode found in various rhythm game mods. It provides visual feedback on rhythm stability, micro-jitter, and input timing without injecting code into game process.

This project is a standalone external tool. It is NOT a game mod and does NOT perform DLL injection or memory hooking. It is safe to use with anti-cheat software that permits external overlays.


Features

  • External overlay with transparent, always-on-top, click-through window
  • Graphic interface for live configuration
  • Configurable X/Y overlay positioning
  • Supports both Down (Classic) and Up (Reverse) fall directions
  • High-resolution monotonic clocks for smooth animation
  • Configurable key-to-lane mapping (e.g., WASD, Space, Enter)
  • Visual keyboard representation showing key presses and counts
  • Adjustable opacity for inactive keys
  • Customizable RGBA colors and overlay speed
  • Long press support with variable-length bars
  • Performance optimized with object pooling and efficient rendering

Tech Stack

  • Python 3.10+
  • PySide6 (Qt) for high-performance rendering and window management
  • pynput for global low-level keyboard hook
  • pywin32 for Windows API integration

Project Structure

RainingKeysPython/
├── core/
│ ├── configuration.py # Dataclasses for application configuration
│ ├── gui.py # Configuration Window GUI
│ ├── input_mon.py # Global input listener (thread-safe)
│ ├── logging_config.py # Logging configuration
│ ├── overlay.py # Main rendering loop and window logic
│ ├── settings_manager.py # Handles config loading/saving (atomic writes, migration)
│ └── ui/
│ ├── components.py # Reusable UI components
│ └── theme.py # Theme definitions
├── .github/
│ ├── workflows/
│ │ ├── ci.yml # Code quality validation (Windows)
│ │ └── release.yml # Automated releases with git-cliff
│ ├── scripts/
│ │ ├── syntax_check.py # Python syntax validation
│ │ ├── type_check.py # Type hints validation
│ │ ├── config_validation.py # Configuration validation
│ │ └── monitor_ci.py # CI monitoring script
│ └── README.md # Workflow documentation
├── cliff.toml # Git-cliff configuration for changelog generation
├── run_local_ci.py # Local CI runner script
├── build.py # Build script for creating standalone executable
├── main.py # Application entry point
└── requirements.txt # Dependencies

Installation

  1. Ensure you have Python 3.10 or newer installed
  2. Clone repository or download source
  3. Install dependencies:
pip install -r requirements.txt

Optional: Build Standalone Executable

For a portable executable without Python installation:

python build.py

This creates RainingKeysPython.exe in the dist/ folder.

Usage

  1. Run the application:
python main.py
  1. The application launches two windows:
  • Transparent Overlay: The visualizer (click-through)
  • Config Window: The controls (Alt+Tab to find if hidden)
  1. Configure lanes:
  • Click "Record Lane Keys" in the config window
  • Press keys to bind (e.g., Z, X, ., /)
  • Click "Stop Recording" to save
  1. Customize settings:
  • Adjust Scroll Speed and Bar Color
  • Enable KeyViewer to see the static key panel
  • Drag Inactive Opacity to change faintness of unpressed keys
  • Change KeyViewer Position (Above/Below) to flip fall direction

Configuration

Settings are stored in config.ini (automatically created on first run). You can edit this file manually or use the GUI Settings Window.

Config Options

SectionParameterDescription
Visualscroll_speedFalling speed in pixels per second
Visualbar_colorRGBA color string (e.g., 0,255,255,200)
Visualfall_directionup or down - falling animation direction
PositionxOverlay X position (pixels)
PositionyOverlay Y position (pixels)
LaneskeysComma-separated list of keys (e.g., Z,X,./,)
KeyViewerenabledShow/Hide KeyViewer panel
KeyViewerpanel_positionabove or below - Affects fall direction
KeyVieweropacityOpacity of inactive keys (0.0 - 1.0)

The configuration file includes a CONFIG_VERSION field for automatic migration. When updating to a new version with breaking config changes, the application will automatically migrate your settings.

Developer Guide

This project is open to contributions. For detailed development guides, see the following documentation:

Quick Start

  1. Run local CI (fast quality check):
python run_local_ci.py
  1. Install dependencies:
pip install -r requirements.txt
  1. Make changes and test locally:
python run_local_ci.py
  1. Commit with conventional format:
git commit -m "feat: Add new feature"
  1. Push to GitHub:
git push

See LOCAL_CI.md for complete local CI runner documentation.

GitHub Actions CI/CD

This project uses GitHub Actions for automated quality validation and release management.

Workflows

Code Quality

  • Runs on every push and pull request
  • Windows-based CI for consistency with production
  • Syntax validation, linting, type checking, import testing

Release

  • Triggered by tag push (format: v*)
  • Generates changelog using git-cliff
  • Creates GitHub releases with build artifacts:
    • RainingKeysPython.zip - Release build
    • RainingKeysPython-debug.zip - Debug build

Conventional Commits

Use the following format for commit messages:

<type>[optional scope]: <subject>
[optional body]
[optional footer(s)]

Types:feat, fix, perf, refactor, chore, test, docs, style

Local CI Runner

Run GitHub Actions CI checks locally for faster development iteration.

Usage

# Run all checks
python run_local_ci.py
# Run individual checks
python run_local_ci.py --syntax # Syntax check
python run_local_ci.py --lint # Linting
python run_local_ci.py --import # Import check
python run_local_ci.py --type # Type check
python run_local_ci.py --config # Config check
python run_local_ci.py --build # Build test

Benefits

  • 10-100x faster than GitHub Actions
  • Interactive debugging
  • Unlimited runs
  • Free (uses own computer)
  • Same environment as development (Windows)

Contributing

Contributions are welcome! We'd love to make this tool better together.

Have a big idea or found a bug?

Open an Issue and tell us about it!

Want to help implement a feature?

Fork repository and submit a Pull Request.

Before Submitting

  1. Run local CI: python run_local_ci.py
  2. Use conventional commits (format above)
  3. Write tests for new features
  4. Update documentation where needed

Credits

This project is inspired by RainingKeys mod for A Dance of Fire and Ice, originally created by paring-chan.

Also credits to AdofaiTweaks by PizzaLovers007.

License

MIT License. See LICENSE for details.

Links


Made with love by the RainingKeysPython community

About

Standalone "Rain" style input visualizer for rhythm games. External, safe, and transparent.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

RainingKeys (Python)

RainingKeysPython Icon

LicensePythonPlatformCIReleaseko-fi

A high-performance, external rhythm game input visualizer.

RainingKeys is a purely external overlay application that visualizes keyboard inputs as falling bars, similar to "Rain" mode found in various rhythm game mods. It provides visual feedback on rhythm stability, micro-jitter, and input timing without injecting code into game process.

This project is a standalone external tool. It is NOT a game mod and does NOT perform DLL injection or memory hooking. It is safe to use with anti-cheat software that permits external overlays.


Features

  • External overlay with transparent, always-on-top, click-through window
  • Graphic interface for live configuration
  • Configurable X/Y overlay positioning
  • Supports both Down (Classic) and Up (Reverse) fall directions
  • High-resolution monotonic clocks for smooth animation
  • Configurable key-to-lane mapping (e.g., WASD, Space, Enter)
  • Visual keyboard representation showing key presses and counts
  • Adjustable opacity for inactive keys
  • Customizable RGBA colors and overlay speed
  • Long press support with variable-length bars
  • Performance optimized with object pooling and efficient rendering

Tech Stack

  • Python 3.10+
  • PySide6 (Qt) for high-performance rendering and window management
  • pynput for global low-level keyboard hook
  • pywin32 for Windows API integration

Project Structure

RainingKeysPython/
├── core/
│ ├── configuration.py # Dataclasses for application configuration
│ ├── gui.py # Configuration Window GUI
│ ├── input_mon.py # Global input listener (thread-safe)
│ ├── logging_config.py # Logging configuration
│ ├── overlay.py # Main rendering loop and window logic
│ ├── settings_manager.py # Handles config loading/saving (atomic writes, migration)
│ └── ui/
│ ├── components.py # Reusable UI components
│ └── theme.py # Theme definitions
├── .github/
│ ├── workflows/
│ │ ├── ci.yml # Code quality validation (Windows)
│ │ └── release.yml # Automated releases with git-cliff
│ ├── scripts/
│ │ ├── syntax_check.py # Python syntax validation
│ │ ├── type_check.py # Type hints validation
│ │ ├── config_validation.py # Configuration validation
│ │ └── monitor_ci.py # CI monitoring script
│ └── README.md # Workflow documentation
├── cliff.toml # Git-cliff configuration for changelog generation
├── run_local_ci.py # Local CI runner script
├── build.py # Build script for creating standalone executable
├── main.py # Application entry point
└── requirements.txt # Dependencies

Installation

  1. Ensure you have Python 3.10 or newer installed
  2. Clone repository or download source
  3. Install dependencies:
pip install -r requirements.txt

Optional: Build Standalone Executable

For a portable executable without Python installation:

python build.py

This creates RainingKeysPython.exe in the dist/ folder.

Usage

  1. Run the application:
python main.py
  1. The application launches two windows:
  • Transparent Overlay: The visualizer (click-through)
  • Config Window: The controls (Alt+Tab to find if hidden)
  1. Configure lanes:
  • Click "Record Lane Keys" in the config window
  • Press keys to bind (e.g., Z, X, ., /)
  • Click "Stop Recording" to save
  1. Customize settings:
  • Adjust Scroll Speed and Bar Color
  • Enable KeyViewer to see the static key panel
  • Drag Inactive Opacity to change faintness of unpressed keys
  • Change KeyViewer Position (Above/Below) to flip fall direction

Configuration

Settings are stored in config.ini (automatically created on first run). You can edit this file manually or use the GUI Settings Window.

Config Options

SectionParameterDescription
Visualscroll_speedFalling speed in pixels per second
Visualbar_colorRGBA color string (e.g., 0,255,255,200)
Visualfall_directionup or down - falling animation direction
PositionxOverlay X position (pixels)
PositionyOverlay Y position (pixels)
LaneskeysComma-separated list of keys (e.g., Z,X,./,)
KeyViewerenabledShow/Hide KeyViewer panel
KeyViewerpanel_positionabove or below - Affects fall direction
KeyVieweropacityOpacity of inactive keys (0.0 - 1.0)

The configuration file includes a CONFIG_VERSION field for automatic migration. When updating to a new version with breaking config changes, the application will automatically migrate your settings.

Developer Guide

This project is open to contributions. For detailed development guides, see the following documentation:

Quick Start

  1. Run local CI (fast quality check):
python run_local_ci.py
  1. Install dependencies:
pip install -r requirements.txt
  1. Make changes and test locally:
python run_local_ci.py
  1. Commit with conventional format:
git commit -m "feat: Add new feature"
  1. Push to GitHub:
git push

See LOCAL_CI.md for complete local CI runner documentation.

GitHub Actions CI/CD

This project uses GitHub Actions for automated quality validation and release management.

Workflows

Code Quality

  • Runs on every push and pull request
  • Windows-based CI for consistency with production
  • Syntax validation, linting, type checking, import testing

Release

  • Triggered by tag push (format: v*)
  • Generates changelog using git-cliff
  • Creates GitHub releases with build artifacts:
    • RainingKeysPython.zip - Release build
    • RainingKeysPython-debug.zip - Debug build

Conventional Commits

Use the following format for commit messages:

<type>[optional scope]: <subject>
[optional body]
[optional footer(s)]

Types:feat, fix, perf, refactor, chore, test, docs, style

Local CI Runner

Run GitHub Actions CI checks locally for faster development iteration.

Usage

# Run all checks
python run_local_ci.py
# Run individual checks
python run_local_ci.py --syntax # Syntax check
python run_local_ci.py --lint # Linting
python run_local_ci.py --import # Import check
python run_local_ci.py --type # Type check
python run_local_ci.py --config # Config check
python run_local_ci.py --build # Build test

Benefits

  • 10-100x faster than GitHub Actions
  • Interactive debugging
  • Unlimited runs
  • Free (uses own computer)
  • Same environment as development (Windows)

Contributing

Contributions are welcome! We'd love to make this tool better together.

Have a big idea or found a bug?

Open an Issue and tell us about it!

Want to help implement a feature?

Fork repository and submit a Pull Request.

Before Submitting

  1. Run local CI: python run_local_ci.py
  2. Use conventional commits (format above)
  3. Write tests for new features
  4. Update documentation where needed

Credits

This project is inspired by RainingKeys mod for A Dance of Fire and Ice, originally created by paring-chan.

Also credits to AdofaiTweaks by PizzaLovers007.

License

MIT License. See LICENSE for details.

Links


Made with love by the RainingKeysPython community

About

Standalone "Rain" style input visualizer for rhythm games. External, safe, and transparent.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

RainingKeys (Python)

RainingKeysPython Icon

LicensePythonPlatformCIReleaseko-fi

A high-performance, external rhythm game input visualizer.

RainingKeys is a purely external overlay application that visualizes keyboard inputs as falling bars, similar to "Rain" mode found in various rhythm game mods. It provides visual feedback on rhythm stability, micro-jitter, and input timing without injecting code into game process.

This project is a standalone external tool. It is NOT a game mod and does NOT perform DLL injection or memory hooking. It is safe to use with anti-cheat software that permits external overlays.


Features

  • External overlay with transparent, always-on-top, click-through window
  • Graphic interface for live configuration
  • Configurable X/Y overlay positioning
  • Supports both Down (Classic) and Up (Reverse) fall directions
  • High-resolution monotonic clocks for smooth animation
  • Configurable key-to-lane mapping (e.g., WASD, Space, Enter)
  • Visual keyboard representation showing key presses and counts
  • Adjustable opacity for inactive keys
  • Customizable RGBA colors and overlay speed
  • Long press support with variable-length bars
  • Performance optimized with object pooling and efficient rendering

Tech Stack

  • Python 3.10+
  • PySide6 (Qt) for high-performance rendering and window management
  • pynput for global low-level keyboard hook
  • pywin32 for Windows API integration

Project Structure

RainingKeysPython/
├── core/
│ ├── configuration.py # Dataclasses for application configuration
│ ├── gui.py # Configuration Window GUI
│ ├── input_mon.py # Global input listener (thread-safe)
│ ├── logging_config.py # Logging configuration
│ ├── overlay.py # Main rendering loop and window logic
│ ├── settings_manager.py # Handles config loading/saving (atomic writes, migration)
│ └── ui/
│ ├── components.py # Reusable UI components
│ └── theme.py # Theme definitions
├── .github/
│ ├── workflows/
│ │ ├── ci.yml # Code quality validation (Windows)
│ │ └── release.yml # Automated releases with git-cliff
│ ├── scripts/
│ │ ├── syntax_check.py # Python syntax validation
│ │ ├── type_check.py # Type hints validation
│ │ ├── config_validation.py # Configuration validation
│ │ └── monitor_ci.py # CI monitoring script
│ └── README.md # Workflow documentation
├── cliff.toml # Git-cliff configuration for changelog generation
├── run_local_ci.py # Local CI runner script
├── build.py # Build script for creating standalone executable
├── main.py # Application entry point
└── requirements.txt # Dependencies

Installation

  1. Ensure you have Python 3.10 or newer installed
  2. Clone repository or download source
  3. Install dependencies:
pip install -r requirements.txt

Optional: Build Standalone Executable

For a portable executable without Python installation:

python build.py

This creates RainingKeysPython.exe in the dist/ folder.

Usage

  1. Run the application:
python main.py
  1. The application launches two windows:
  • Transparent Overlay: The visualizer (click-through)
  • Config Window: The controls (Alt+Tab to find if hidden)
  1. Configure lanes:
  • Click "Record Lane Keys" in the config window
  • Press keys to bind (e.g., Z, X, ., /)
  • Click "Stop Recording" to save
  1. Customize settings:
  • Adjust Scroll Speed and Bar Color
  • Enable KeyViewer to see the static key panel
  • Drag Inactive Opacity to change faintness of unpressed keys
  • Change KeyViewer Position (Above/Below) to flip fall direction

Configuration

Settings are stored in config.ini (automatically created on first run). You can edit this file manually or use the GUI Settings Window.

Config Options

SectionParameterDescription
Visualscroll_speedFalling speed in pixels per second
Visualbar_colorRGBA color string (e.g., 0,255,255,200)
Visualfall_directionup or down - falling animation direction
PositionxOverlay X position (pixels)
PositionyOverlay Y position (pixels)
LaneskeysComma-separated list of keys (e.g., Z,X,./,)
KeyViewerenabledShow/Hide KeyViewer panel
KeyViewerpanel_positionabove or below - Affects fall direction
KeyVieweropacityOpacity of inactive keys (0.0 - 1.0)

The configuration file includes a CONFIG_VERSION field for automatic migration. When updating to a new version with breaking config changes, the application will automatically migrate your settings.

Developer Guide

This project is open to contributions. For detailed development guides, see the following documentation:

Quick Start

  1. Run local CI (fast quality check):
python run_local_ci.py
  1. Install dependencies:
pip install -r requirements.txt
  1. Make changes and test locally:
python run_local_ci.py
  1. Commit with conventional format:
git commit -m "feat: Add new feature"
  1. Push to GitHub:
git push

See LOCAL_CI.md for complete local CI runner documentation.

GitHub Actions CI/CD

This project uses GitHub Actions for automated quality validation and release management.

Workflows

Code Quality

  • Runs on every push and pull request
  • Windows-based CI for consistency with production
  • Syntax validation, linting, type checking, import testing

Release

  • Triggered by tag push (format: v*)
  • Generates changelog using git-cliff
  • Creates GitHub releases with build artifacts:
    • RainingKeysPython.zip - Release build
    • RainingKeysPython-debug.zip - Debug build

Conventional Commits

Use the following format for commit messages:

<type>[optional scope]: <subject>
[optional body]
[optional footer(s)]

Types:feat, fix, perf, refactor, chore, test, docs, style

Local CI Runner

Run GitHub Actions CI checks locally for faster development iteration.

Usage

# Run all checks
python run_local_ci.py
# Run individual checks
python run_local_ci.py --syntax # Syntax check
python run_local_ci.py --lint # Linting
python run_local_ci.py --import # Import check
python run_local_ci.py --type # Type check
python run_local_ci.py --config # Config check
python run_local_ci.py --build # Build test

Benefits

  • 10-100x faster than GitHub Actions
  • Interactive debugging
  • Unlimited runs
  • Free (uses own computer)
  • Same environment as development (Windows)

Contributing

Contributions are welcome! We'd love to make this tool better together.

Have a big idea or found a bug?

Open an Issue and tell us about it!

Want to help implement a feature?

Fork repository and submit a Pull Request.

Before Submitting

  1. Run local CI: python run_local_ci.py
  2. Use conventional commits (format above)
  3. Write tests for new features
  4. Update documentation where needed

Credits

This project is inspired by RainingKeys mod for A Dance of Fire and Ice, originally created by paring-chan.

Also credits to AdofaiTweaks by PizzaLovers007.

License

MIT License. See LICENSE for details.

Links


Made with love by the RainingKeysPython community

About

Standalone "Rain" style input visualizer for rhythm games. External, safe, and transparent.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Contributors

Languages