Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
a5fc1e1
feat: add D-Bus integration with KDE shortcut support
Zebastjan May 4, 2025
6783f0e
Add working global keyboard shortcuts for KDE Wayland
Zebastjan Feb 8, 2026
c2c1aa3
Update README for v0.5 with global keyboard shortcuts
Zebastjan Feb 8, 2026
b367a70
Update version to 0.5 and GitHub URL to Zebastjan fork
Zebastjan Feb 8, 2026
7515d49
Add GPU auto-detection with process restart and improve keyboard shor…
Zebastjan Feb 8, 2026
39b8587
Add CLAUDE.md with project guidance for Claude Code
Zebastjan Feb 8, 2026
b18033c
Fix async shutdown errors by removing racing QTimer.singleShot exit
Zebastjan Feb 8, 2026
1243424
Fix test_calculate_volume int16 overflow by using float64 arrays
Zebastjan Feb 8, 2026
27ef0c3
Fix distil-whisper model support with Systran CTranslate2 repos
Zebastjan Feb 8, 2026
6d209f0
Suppress qasync shutdown errors with custom exception handler
Zebastjan Feb 8, 2026
a0150a6
Also suppress 'Task was destroyed but it is pending' shutdown message
Zebastjan Feb 8, 2026
a6b5938
Rewrite KDE shortcut integration to use kglobalaccel D-Bus service
Zebastjan Feb 9, 2026
3fd059d
WIP: Kirigami QML settings UI rewrite
Zebastjan Feb 9, 2026
10bd3d3
Make dev-update.sh branch-aware with separate deploy targets
Zebastjan Feb 9, 2026
ebf7a2b
Make dev-update.sh branch-aware with separate deploy targets
Zebastjan Feb 9, 2026
f73d970
Add DEVELOPMENT.md with branch workflow documentation
Zebastjan Feb 9, 2026
52ed900
Add DEVELOPMENT.md with branch workflow documentation
Zebastjan Feb 9, 2026
4eacf51
Implement native KDE Kirigami settings UI
Zebastjan Feb 9, 2026
a7d0770
Wire up Python-QML bridge for settings data binding
Zebastjan Feb 9, 2026
334fbfd
Add Kirigami UI implementation status document
Zebastjan Feb 9, 2026
0e4a8f1
Fix About page layout overflow and isolate test settings
Zebastjan Feb 9, 2026
e047135
Update KIRIGAMI_STATUS with test isolation note
Zebastjan Feb 9, 2026
81b0d44
Fix About page padding and improve shortcut display
Zebastjan Feb 9, 2026
1c3f2bf
Fix About page card padding and add System Settings button logging
Zebastjan Feb 9, 2026
f1261ef
Implement Kirigami settings UI with display scaling support
Zebastjan Feb 11, 2026
bdf9575
Merge branch 'kirigami-rewrite'
Zebastjan Feb 11, 2026
0031ca5
Remove deprecated PyQt6 settings window
Zebastjan Feb 11, 2026
eacfe07
Update documentation for Kirigami UI and dev workflow
Zebastjan Feb 11, 2026
1e3e1ff
Implement circular recording dialog with volume visualization
Zebastjan Feb 11, 2026
28a5fbf
Fix recording dialog transparency, drag, and volume visualization
Zebastjan Feb 11, 2026
dbcc5e3
Fix window dragging using Qt native startSystemMove
Zebastjan Feb 11, 2026
e9cb90c
Add recording dialog settings to UI page
Zebastjan Feb 14, 2026
42055e9
Fix null pointer errors in RecordingDialog.qml
Zebastjan Feb 14, 2026
13c88a0
Fix double-click, menu text sync, and add progress window logging
Zebastjan Feb 14, 2026
9a1c11f
Fix null settingsBridge errors in UIPage.qml
Zebastjan Feb 14, 2026
cc0bd3d
Fix settings UI sync and prevent accidental recording on show
Zebastjan Feb 14, 2026
e90b41e
Update documentation for recording dialog and development status
Zebastjan Feb 14, 2026
4c3847f
Implement recording dialog settings persistence and visibility sync
Zebastjan Feb 14, 2026
38655af
WIP: Window management improvements and gitignore updates
Zebastjan Feb 15, 2026
0f61315
Phase 1: Implement settings dependency injection
Zebastjan Feb 15, 2026
e22a6f0
Phase 2: Extract and expand ClipboardManager
Zebastjan Feb 15, 2026
199a1fa
Phase 3: Create ApplicationState as single source of truth
Zebastjan Feb 15, 2026
1c443b2
Phase 4: Refactor visibility via ApplicationState
Zebastjan Feb 15, 2026
1622f17
Phase 5: Refactor AudioBridge/DialogBridge to query ApplicationState
Zebastjan Feb 15, 2026
6f4002c
Phase 6: Extract business logic from ApplicationTrayIcon to managers
Zebastjan Feb 16, 2026
bb70a59
Phase 7: Extract UI & state management from SyllablazeOrchestrator
Zebastjan Feb 16, 2026
5a8669d
Phase 7D + GPU extraction: Final orchestrator cleanup
Zebastjan Feb 16, 2026
b2a1edc
Update CLAUDE.md to reflect Phase 7D completion
Zebastjan Feb 16, 2026
21f1a84
Fix QML error: Remove undefined hasSavedPosition reference
Zebastjan Feb 16, 2026
fa88149
Phase 8A: Remove dead code (window.py, processing_window.py, utils.py…
Zebastjan Feb 16, 2026
54db455
Phase 8B: Split Whisper Model Managers into clean package structure
Zebastjan Feb 16, 2026
787c55c
Phase 8D: Centralize CUDA detection + Phase 8B import fixes
Zebastjan Feb 16, 2026
cbf0b8f
Phase 8C: Add priority tests for Settings, LockManager, and AudioManager
Zebastjan Feb 16, 2026
44b4eaf
Update system tray icon to use new syllablaze.svg
Zebastjan Feb 16, 2026
0810192
Fix installation workflow: Add --force-reinstall, fix Perplexity bugs
Zebastjan Feb 16, 2026
bb0a020
Add SVG-based recording dialog with QSvgRenderer integration
Zebastjan Feb 16, 2026
eaab62f
Fix SVG resource loading in installed package
Zebastjan Feb 16, 2026
134ddc4
Fix GPU detection, recording dialog visual, and CUDA library loading
Zebastjan Feb 16, 2026
f619617
Update docs: clipboard issue possibly resolved, always-on-top minor i…
Zebastjan Feb 16, 2026
bb568bc
Add orchestration layer skeleton and popup mode for recording dialog
Zebastjan Feb 17, 2026
f1aced5
Add recording indicator settings UI redesign (3-card selector)
Zebastjan Feb 17, 2026
44876a3
Update docs to reflect recording indicator UI redesign
Zebastjan Feb 17, 2026
a021d0d
Update CLAUDE.md to reflect current architecture and Feb 2026 changes
Zebastjan Feb 17, 2026
93c1229
Improve shutdown reliability: fix order, thread termination, D-Bus cl…
Zebastjan Feb 18, 2026
569ce06
Add "show on all desktops" option for persistent applet mode
Zebastjan Feb 18, 2026
36c596d
Fix on-all-desktops not applying at startup in persistent mode
Zebastjan Feb 18, 2026
4e8bee3
Replace timer-based window-ready hack with visibilityChanged signal
Zebastjan Feb 18, 2026
9918f93
Fix clipboard not persisting in applet mode on Wayland
Zebastjan Feb 18, 2026
1bb70d2
Fix applet flashing on startup when popup_style is not applet
Zebastjan Feb 18, 2026
932f527
Fix dialog not showing when first switching to applet/persistent mode
Zebastjan Feb 19, 2026
e99864d
Implement SVG-based radial waveform visualization and KWin integration
Zebastjan Feb 19, 2026
fb179c6
Fix window management using KWin exclusively (Wayland-native)
Zebastjan Feb 19, 2026
49ea7aa
Fix applet on-all-desktops and clipboard in popup/persistent modes
Zebastjan Feb 19, 2026
3ef9dc3
Refactor clipboard architecture: decouple from UI with persistent ser…
Zebastjan Feb 19, 2026
286735d
Scale down traditional progress window to half size (280x160)
Zebastjan Feb 19, 2026
6cec102
docs: comprehensive documentation restructuring and improvements
Zebastjan Feb 19, 2026
83628ab
chore: bump version to v0.8 and update GitHub repository references
Zebastjan Feb 19, 2026
07ba14d
fix: add GPU OOM handling with automatic CPU fallback
Zebastjan Feb 21, 2026
b24c232
fix: Python 3.14 multiprocessing compatibility and transcription race…
Zebastjan Feb 23, 2026
27e9689
docs: add transcription cancellation and race condition documentation
Zebastjan Feb 23, 2026
ed8501a
Refine clipboard persistence diagnostics and assets
Zebastjan Mar 3, 2026
50ac082
fix: resolve Wayland clipboard blocking and logging import issues
Zebastjan Mar 3, 2026
142ae61
Fix popup mode first transcription and improve dot curtains visualiza…
Zebastjan Mar 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion .github/workflows/python-app.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ on:
branches: [ "main" ]

permissions:
contents: read
contents: write # Changed from 'read' for gh-pages deployment

jobs:
build:
Expand All @@ -28,6 +28,7 @@ jobs:
python -m pip install --upgrade pip
pip install flake8 pytest
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
if [ -f requirements-dev.txt ]; then pip install -r requirements-dev.txt; fi
- name: Lint with flake8
run: |
# stop the build if there are Python syntax errors or undefined names
Expand All @@ -37,3 +38,10 @@ jobs:
- name: Test with pytest
run: |
pytest
- name: Build documentation
run: |
mkdocs build --strict
- name: Deploy documentation
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
run: |
mkdocs gh-deploy --force
9 changes: 7 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ ENV/

# Whisper model files (can be large)
*.pt
models/
# Whisper cache directory (not our blaze/models/ source code)
~/.cache/whisper/

# Temporary files
temp/
Expand All @@ -38,6 +39,7 @@ tmp/

# Log files
*.log
debug-logs.txt

# Local configuration
.env
Expand All @@ -64,4 +66,7 @@ htmlcov/

# Temporary files created by the application
# These are created in tempfile.mktemp() calls
/tmp*
/tmp*

# Unrelated projects in working directory
archon/
26 changes: 26 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# CLAUDE.md

Syllablaze: PyQt6 system tray app for Whisper-based speech-to-text on KDE Plasma.

## Critical Constraints

**NEVER:**
- Call `show()/hide()` directly on recording dialog → **Use `ApplicationState.set_recording_dialog_visible()`**
- Use `QTimer.singleShot(N, ...)` for Wayland window mapping → **Connect to `QWindow::visibilityChanged`**
- Write audio temp files → **Keep in memory (numpy arrays)**
- Skip KWin rules when changing window properties

**ALWAYS:**
- Use Qt signals/slots for inter-component communication
- Test on both X11 and Wayland when changing window management
- Debounce position/size persistence (500ms)

## Common Gotchas

- **Always-on-top toggle** requires restart on Wayland (compositor limitation)
- **Window position** cannot be restored on Wayland (compositor controls placement)
- Settings use two-level architecture: `popup_style` → derives → backend settings via `SettingsCoordinator`

## If You Get Stuck

Explore using: `blaze/main.py` (entry), `blaze/managers/` (coordinators), `blaze/settings.py` (QSettings wrapper)
305 changes: 305 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,305 @@
# Contributing to Syllablaze

Thank you for your interest in contributing to Syllablaze! This document provides guidelines for contributing to the project.

## 🌟 Project Vision

Syllablaze aims to provide a seamless, privacy-focused speech-to-text experience for KDE Plasma users on Linux. We prioritize:

- **Privacy:** All audio processing happens in-memory (no temp files)
- **Native Integration:** Tight KDE Plasma integration with Kirigami UI
- **User Experience:** Simple, intuitive interface with sensible defaults
- **Performance:** Efficient resource usage with optional GPU acceleration
- **Agent-Friendly Development:** AI-assisted development with comprehensive documentation

## 📋 Code of Conduct

- Be respectful and inclusive
- Focus on constructive feedback
- Welcome newcomers and help them learn
- Report unacceptable behavior to project maintainers

## 🚀 Getting Started

### Fork and Clone

```bash
# Fork the repository on GitHub first, then:
git clone https://github.com/YOUR_USERNAME/syllablaze.git
cd syllablaze
```

### Development Setup

See [Developer Guide: Setup](docs/developer-guide/setup.md) for detailed instructions:

```bash
# Install dependencies
pip install -r requirements.txt

# Run directly during development
python3 -m blaze.main

# Run tests
pytest
```

### Quick Development Update

Use the `dev-update.sh` script to copy changes to your pipx installation and restart:

```bash
./blaze/dev-update.sh
```

## 💻 Development Workflow

### Branch Naming

- **Feature:** `feature/short-description` (e.g., `feature/gpu-detection`)
- **Bug fix:** `fix/issue-description` (e.g., `fix/wayland-clipboard`)
- **Documentation:** `docs/topic` (e.g., `docs/troubleshooting`)
- **Refactoring:** `refactor/component` (e.g., `refactor/settings-coordinator`)

### Commit Messages

Follow the conventional commits style:

```
<type>: <short summary>

<optional detailed description>

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
```

**Types:**
- `feat:` - New feature
- `fix:` - Bug fix
- `docs:` - Documentation changes
- `refactor:` - Code refactoring (no behavior change)
- `test:` - Adding or updating tests
- `chore:` - Build process, dependencies, tooling

**Examples:**
```
feat: add GPU detection for CUDA acceleration

Implements automatic CUDA library detection with LD_LIBRARY_PATH
configuration and process restart for GPU acceleration.
```

```
fix: resolve clipboard copy on Wayland

Use persistent clipboard service to prevent data loss when
recording dialog is hidden on Wayland compositors.
```

## 🔍 Pull Request Process

### Before Submitting

1. **Run tests:** `pytest` - All tests must pass
2. **Run linter:** `flake8 . --max-line-length=127` - No linting errors
3. **Update documentation:** See documentation checklist below
4. **Test on both X11 and Wayland** (if window management changes)

### PR Checklist

When opening a pull request, ensure:

- [ ] All tests pass (`pytest`)
- [ ] Code follows flake8 style (max-line-length=127, max-complexity=10)
- [ ] Docstrings added/updated for new functions/classes (Google style)
- [ ] CLAUDE.md updated if new pattern or module added
- [ ] User-facing documentation updated (troubleshooting, settings reference)
- [ ] Architecture Decision Record (ADR) created if significant design decision
- [ ] Testing scenarios added to `docs/developer-guide/testing.md` if applicable
- [ ] Commit messages follow conventional commits format

### Documentation Checklist

**On every feature addition:**
- [ ] Add docstrings to new classes/methods (Google style)
- [ ] Update CLAUDE.md file map if new module
- [ ] Update `docs/user-guide/settings-reference.md` if new setting
- [ ] Create ADR if significant design decision
- [ ] Update relevant user guide page

**On every bug fix:**
- [ ] Update `docs/getting-started/troubleshooting.md` if user-facing
- [ ] Update `docs/roadmap/Syllablaze Known Issues Bug Tracker.md`
- [ ] Update `docs/explanation/wayland-support.md` if Wayland-specific

**Before PR merge:**
- [ ] Verify doc build passes: `mkdocs build --strict`
- [ ] Check no broken links in changed pages
- [ ] Update `docs/developer-guide/testing.md` if test scenarios change

### Review Process

1. Maintainers will review your PR within 7 days
2. Address feedback by pushing new commits (don't force-push during review)
3. Once approved, maintainers will merge using "Squash and merge"
4. Your contribution will be acknowledged in release notes

## 🤖 Agent-Driven Development

Syllablaze embraces AI-assisted development with Claude Code. When working with AI agents:

### Updating CLAUDE.md

When adding new components or patterns:

1. Update the **File Map** section with the new module location
2. Add to **Critical Constraints** if there are NEVER/ALWAYS patterns
3. Update **Common Agent Tasks** if you've established a new workflow

### Creating Architecture Decision Records (ADRs)

For significant architectural decisions:

1. Copy `docs/adr/template.md` to `docs/adr/XXXX-title.md`
2. Number sequentially (0001, 0002, ...)
3. Fill all sections: Context, Decision, Consequences, Alternatives
4. Reference from code comments where decision is implemented
5. Link from related explanation docs
6. Add to `mkdocs.yml` nav under ADRs section

**When to create an ADR:**
- New manager or coordinator introduced
- Significant refactoring changing multiple components
- Choosing between alternative approaches (e.g., Qt vs D-Bus)
- Establishing new patterns or conventions
- Wayland-specific workarounds with architectural impact

### Best Practices for Agent Collaboration

- Provide clear, specific prompts to agents
- Reference CLAUDE.md file map when asking for changes
- Review agent-generated code for Qt/Wayland best practices
- Test agent changes on both X11 and Wayland
- Update documentation immediately after agent-driven changes

### Code Review with CodeRabbit

Before committing changes, run CodeRabbit to review uncommitted work:

```bash
./scripts/coderabbit-review.sh
```

This runs `coderabbit review --prompt-only --type uncommitted` which provides an informational review without blocking the commit. Address any significant issues before committing to avoid needing a separate fix-up commit.

**For AI agents:** Run this review before every commit as part of the normal workflow. This ensures code quality issues are caught and addressed in the same commit rather than requiring a second pass.

## 🧪 Testing Guidelines

See [Testing Guide](docs/developer-guide/testing.md) for comprehensive testing documentation.

### Test Organization

- `tests/conftest.py` - Shared fixtures and mocks
- `tests/test_*.py` - Unit tests organized by module
- Use pytest markers: `@pytest.mark.audio`, `@pytest.mark.ui`, etc.

### Running Tests

```bash
# Run all tests
pytest

# Run specific category
pytest -m audio
pytest -m ui

# Run specific test file
pytest tests/test_audio_processor.py

# Run with coverage
pytest --cov=blaze --cov-report=html
```

### Writing Tests

- Follow existing test patterns in `tests/conftest.py`
- Use mocks (`MockPyAudio`, `MockSettings`) to avoid hardware dependencies
- Test both success and failure cases
- Add docstrings explaining what each test verifies

## 🎨 Code Style

### Linting

CI enforces **flake8** with these settings:
- `max-line-length=127`
- `max-complexity=10`

Optionally, you can use **ruff** during development:
```bash
ruff check blaze/ --fix
```

**Note:** No formatter (black/autopep8) is configured. Follow existing code style.

### Python Style Guidelines

- Use Google-style docstrings
- Follow PEP 8 naming conventions
- Prefer explicit over implicit
- Use type hints where they improve clarity
- Keep functions focused (single responsibility)

### Qt/PyQt6 Best Practices

See [Patterns & Pitfalls](docs/developer-guide/patterns-and-pitfalls.md) for detailed guidance:

- Use signals/slots for inter-component communication
- Never call `show()/hide()` directly on recording dialog - use `ApplicationState.set_recording_dialog_visible()`
- Connect to `QWindow::visibilityChanged` instead of `QTimer.singleShot()` for window mapping
- Test on both X11 and Wayland
- Update KWin rules when changing window properties

## 🐛 Reporting Bugs

Use [GitHub Issues](https://github.com/Zebastjan/Syllablaze/issues) to report bugs.

### Bug Report Template

```markdown
**Environment:**
- Syllablaze version: (from Settings → About)
- KDE Plasma version: (from `plasmashell --version`)
- Session type: X11 or Wayland (check `echo $XDG_SESSION_TYPE`)
- Linux distribution and version:

**Steps to Reproduce:**
1. Open Syllablaze
2. Click...
3. See error

**Expected Behavior:**
What you expected to happen

**Actual Behavior:**
What actually happened

**Logs:**
Enable debug logging in Settings → About, reproduce the issue, and attach relevant log excerpt from `~/.local/state/syllablaze/syllablaze.log`
```

## 📚 Where to Get Help

- **Documentation:** Start with [docs/index.md](docs/index.md)
- **GitHub Discussions:** Ask questions and share ideas
- **Known Issues:** Check [docs/roadmap/Syllablaze Known Issues Bug Tracker.md](docs/roadmap/Syllablaze%20Known%20Issues%20Bug%20Tracker.md)
- **Troubleshooting:** See [docs/getting-started/troubleshooting.md](docs/getting-started/troubleshooting.md)

## 📝 License

By contributing to Syllablaze, you agree that your contributions will be licensed under the MIT License.

---

Thank you for contributing to Syllablaze! 🎉
Loading