146 Commits

Author SHA1 Message Date
Bertrand
454be660a3 Bump version to 2.14.0 v2.14.0 2026-01-08 22:07:58 -08:00
qube
2859e398a8 Add macOS permissions UI section (#184)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 22:06:31 -08:00
qube
1573a25d52 Add uninstall scripts for macOS/Linux and Windows (#183)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 20:49:44 -08:00
Bertrand Quenin
128cf66081 Use windows-capture-interpreter from PyPI instead of direct URL v2.13.0 2026-01-08 00:28:50 -08:00
Bertrand Quenin
eb0ffce39e Bump version to 2.13.0 2026-01-08 00:23:34 -08:00
qube
1ce5e6dff2 Use HWND for Windows capture instead of window title (#181)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 00:22:25 -08:00
Bertrand
e8d7e5996a Bump version to 2.12.0 v2.12.0 2026-01-07 00:16:04 -08:00
qube
7f0b3789f5 Add Models UI section with status and Fix Models button (#139) (#179)
Add Models UI section with per-model status (Loading/Downloading/Ready/Error) and Fix Models button for user-initiated recovery when model downloads are corrupted.

- Add models.py with shared utilities for HuggingFace cache management
- Add validation to detect corrupted/incomplete model downloads
- Add Models group at top of UI showing OCR and Translation status
- Add Fix Models button that clears caches and re-downloads failed models
- Disable Start Capture button until both models are loaded

Fixes #139

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 00:13:48 -08:00
Bertrand Quenin
5ed44057f8 Bump version to 2.11.0
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
v2.11.0
2026-01-05 23:27:55 -08:00
qube
b43668aaf3 Fix Steam Deck/Arch Linux install by using evdev-binary (#174)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 23:26:57 -08:00
Bertrand Quenin
5babbac91d Bump version to 2.10.0
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
v2.10.0
2026-01-05 23:07:21 -08:00
qube
524270cd65 Remember banner position across sessions (#165)
## Summary

- Persists banner overlay position (X and Y) across application sessions
- Position saved to config file on app exit, restored on startup
- Position preserved when switching between Banner and Inplace modes
- Multi-monitor support: banner resizes to match screen width when dragged between monitors
- Snap-to-screen option: optionally snap banner to screen edges (configurable via checkbox)
- Works on all platforms including Linux/Wayland

## Implementation

- Added `banner_x`, `banner_y`, and `banner_snap_to_screen` fields to Config
- Added `set_position()` and `get_position()` methods to both Qt (macOS/Windows) and Tkinter (Linux) overlays
- Qt overlay: Added `_snap_to_current_screen()` and `_resize_to_fit()` for Windows/macOS multi-monitor support
- Fixed Windows DPI scaling issues during cross-screen transitions

Closes #154

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-01-05 23:06:10 -08:00
Bertrand Quenin
d525d25bef Bump version to 2.9.0
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
v2.9.0
2026-01-05 21:00:55 -08:00
qube
15237c550c Fix Windows crash by using Python threading instead of QThread (#168)
## Summary

- Fix Windows crash (access violation 0xc0000374) when using background thread for OCR/translation
- Use Python's native `threading.Thread` instead of Qt's `QThread` to avoid conflicts between ONNX runtime and windows-capture
- Add CUDA inference test during model load for better GPU fallback

## Root Cause

Investigation revealed that QThread + ONNX + windows-capture causes access violations on Windows. The crash occurs during ONNX inference on a QThread when windows-capture is active on the main thread.

## Solution

Replace QThread with Python's native `threading.Thread` and a `FrameBuffer` (Lock + Condition pattern):

1. **workers.py**: Complete rewrite to use Python threading
   - New `FrameBuffer` class using `Lock` + `Condition` for thread-safe signaling
   - "Latest frame" pattern: only the most recent frame is kept, stale frames are automatically dropped
   - Models load on worker thread (non-blocking startup)
   - Results emitted via Qt signals (thread-safe)

2. **main_window.py**: Simplified to use new worker API
   - Removed QThread setup and platform-specific code paths
   - Connected to `models_ready`/`models_failed` signals for async model loading

3. **translate.py**: Added CUDA inference test during load
   - Tests actual inference after model loading (not just load)
   - Catches cuBLAS failures early

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-01-05 20:58:34 -08:00
Bertrand Quenin
2105c98192 Bump version to 2.8.1 v2.8.1 2026-01-04 23:03:21 -08:00
qube
43d755aa94 Fix Windows crash caused by background thread OCR (#167)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-04 23:01:53 -08:00
Bertrand Quenin
4b47674d49 Bump version to 2.8.0
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-04 20:03:04 -08:00
qube
b606b3dc47 Use evdev for global hotkeys on Linux, enabling Wayland support (#162)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-04 19:01:54 -08:00
Bertrand Quenin
b722bada67 Bump version to 2.7.0 v2.7.0 2026-01-04 18:14:10 -08:00
qube
786da34828 Fix UI freeze on Arch Linux (#160) (#161)
## Summary
- Fix app freezing after 30-60 seconds on Arch Linux by moving OCR/translation to a background QThread
- Fix Wayland capture threading issues (missing thread.join, unsynchronized flag access)
- Fix hotkey not being saved/restored from config
- Add error signal for model loading failures

## Details

The app was freezing because OCR and translation ran synchronously on the main Qt thread, blocking the event loop for 500-1100ms per frame.

**Threading fix:**
- Move `ProcessWorker` to a dedicated `QThread` using `moveToThread()`
- Add `process_frame_slot` with skip-if-busy logic to prevent queue buildup
- Initialize OCR/Translator models on worker thread
- Use Qt Signal for cross-thread frame passing

**Wayland fix:**
- Add `thread.join()` in `WaylandCaptureStream.stop()` to prevent race conditions
- Use `threading.Event` for thread-safe `window_invalid` flag access

**Hotkey fix:**
- Load hotkey from `config.hotkeys["toggle_overlay"]` on init
- Save hotkey to config when changed in UI

**Error handling:**
- Add `models_failed` signal to notify UI if model loading fails

Closes #160

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-01-04 18:12:08 -08:00
Bertrand Quenin
89441aaf06 Bump version to 2.6.0
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
v2.6.0
2026-01-04 17:18:04 -08:00
qube
329169bfb9 Add native Wayland window capture support (#159)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-04 17:16:52 -08:00
Bertrand Quenin
9fcfd16e3f Bump version to 2.5.0
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
v2.5.0
2026-01-03 21:57:29 -08:00
qube
8fc5bca0cc Add diagnostic logging and error handling for capture issues (#152)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 21:55:58 -08:00
Bertrand
65a707dfc5 Revert "Add GitHub Actions workflow for PyPI releases"
This reverts commit fbd54ad06e.
2026-01-03 20:54:19 -08:00
Bertrand
fbd54ad06e Add GitHub Actions workflow for PyPI releases
Triggers on version tags (v*.*.*) to automatically build and publish to PyPI.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 20:53:49 -08:00
Bertrand
fee8efe8db Bump version to 2.4.0
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
v2.4.0
2026-01-03 20:47:03 -08:00
qube
ef3caec786 Optimize capture: defer BGRA→RGB conversion to consumers (#150)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 20:45:43 -08:00
Bertrand Quenin
535c1e376b Add .ruff_cache to .gitignore 2026-01-03 19:02:25 -08:00
Bertrand Quenin
73a8d8577a Remove experiments folder 2026-01-03 19:00:46 -08:00
Bertrand Quenin
64d25d0aac Update uv.lock 2026-01-03 18:58:51 -08:00
Bertrand Quenin
9850558230 Update README for GUI-only interface 2026-01-03 18:55:03 -08:00
Bertrand Quenin
2456f17d47 Fix version duplication - read from package metadata v2.3.1 2026-01-03 18:48:20 -08:00
Bertrand Quenin
995fb1d9a7 Bump version to 2.3.0 v2.3.0 2026-01-03 18:38:21 -08:00
qube
9b297fa552 Refactor overlay module and add Ruff linter (#146)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 18:33:03 -08:00
qube
df9bb84877 Install from PyPI instead of Git (#145)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 14:53:14 -08:00
Bertrand Quenin
a0fe9fb16d Bump version to 2.2.1
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
v2.2.1
2026-01-03 14:11:04 -08:00
qube
933376f4fb Fix Linux keyboard hotkeys and overlay flicker (#144)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 14:10:14 -08:00
Bertrand Quenin
ce5a9a8abd Fix compileall warning for PySide6 template files
Exclude .tmpl.py files from bytecode compilation as they are
Jinja templates, not valid Python.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
v2.2.0
2026-01-03 13:29:49 -08:00
Bertrand Quenin
3c7659d9b9 Bump version to 2.2.0
- Restrict Python to <3.13 (uv-managed 3.12 has tkinter, 3.13+ doesn't)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 13:15:17 -08:00
Bertrand Quenin
f7fd87a13b Log version at startup
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 13:10:45 -08:00
Bertrand Quenin
c372262be5 Remove Qt fallback for Linux overlay
No longer needed since we use Python 3.12 which includes tkinter.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 13:08:40 -08:00
Bertrand Quenin
126c58ac3a Use Python 3.12 for tkinter compatibility
uv-managed Python 3.12 includes tkinter, while system Python 3.13+ often
doesn't have it installed. This ensures the Linux tkinter overlay works
out of the box.

- Update install.sh to use Python 3.12
- Update .python-version to 3.12 for local development

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 13:07:30 -08:00
Bertrand Quenin
0fbf92e7dc Add Qt fallback for Linux overlay when tkinter unavailable
uv-managed Python doesn't include tkinter by default. This adds a Qt-based
fallback overlay for Linux that's used when tkinter is not available.

- Add overlay_linux_qt.py with Qt-based BannerOverlay and InplaceOverlay
- Update overlay.py to try tkinter first, fall back to Qt
- Qt overlay may have some limitations but works without system dependencies

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 13:02:23 -08:00
Bertrand Quenin
a7ada54afb Use X11 keyboard listener on Linux instead of pynput
pynput depends on evdev on Linux, which requires Python headers to build.
This change uses python-xlib (already a dependency for capture) for global
hotkey handling on Linux, avoiding the compilation requirement.

- Add gui/keyboard.py with platform-specific keyboard listener
- Make pynput conditional on non-Linux platforms in pyproject.toml
- Update main_window.py to use the new keyboard abstraction

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 13:00:04 -08:00
qube
018f86fc9a Replace CLI with PySide6 GUI application (#140)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 12:54:27 -08:00
Bertrand Quenin
3690c748f2 Bump version to 2.1.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
v2.1.4
2026-01-02 00:43:09 -08:00
qube
2464c6ee70 Document Git requirement and Python 3.14 limitation (#135)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 00:42:50 -08:00
Bertrand Quenin
185fccd75b Add .claude/ and debug files to .gitignore
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 00:35:27 -08:00
Bertrand Quenin
dc5852e617 Bump version to 2.1.3
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
v2.1.3
2026-01-02 00:34:17 -08:00