diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 508f88d..9224091 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -180,245 +180,9 @@ jobs: chatrixcd-linux-${{ matrix.arch }} retention-days: 90 - build-windows: - name: Build Windows ${{ matrix.arch }} - needs: test - runs-on: windows-latest - strategy: - fail-fast: false - matrix: - arch: [x86_64] - - permissions: - contents: write - - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Fetch all tags - run: git fetch --tags --force - - - name: Calculate version - id: version - shell: bash - run: | - # Determine version type (default to patch for PR merges) - if [ "${{ github.event_name }}" == "pull_request" ]; then - VERSION_TYPE="patch" - else - VERSION_TYPE="${{ github.event.inputs.version_type }}" - fi - - # Call centralized version calculation script - VERSION=$(.github/scripts/calculate-version.sh "${VERSION_TYPE}") - echo "version=${VERSION}" >> "$GITHUB_OUTPUT" - echo "Generated version: ${VERSION}" - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.12' - cache: 'pip' - - - name: Setup CMake - uses: lukka/get-cmake@latest - - - name: Install libolm (Windows) - shell: pwsh - run: | - # Download and build libolm (pinned to v3.2.16 for reproducible builds) - git clone --branch 3.2.16 --depth 1 https://gitlab.matrix.org/matrix-org/olm.git C:\olm - cd C:\olm - - # Patch CMakeLists.txt to require CMake 3.5+ (for compatibility with modern CMake) - $originalContent = Get-Content CMakeLists.txt -Raw - $patchedContent = $originalContent -replace 'cmake_minimum_required\(VERSION [0-9]+\.[0-9]+(?:\.[0-9]+)?\)', 'cmake_minimum_required(VERSION 3.5)' - if ($patchedContent -ne $originalContent) { - Set-Content CMakeLists.txt $patchedContent - Write-Host "Successfully patched CMakeLists.txt to require CMake 3.5+" - } else { - Write-Host "Warning: CMakeLists.txt patch pattern not found, continuing anyway..." - } - - cmake -S . -B build ` - -DCMAKE_INSTALL_PREFIX=C:\olm-install ` - -DCMAKE_BUILD_TYPE=Release ` - -DBUILD_SHARED_LIBS=OFF - cmake --build build --config Release - cmake --install build --config Release - - # Debug: Show what files were created - Write-Host "Contents of C:\olm-install\lib:" - Get-ChildItem -Path C:\olm-install\lib -Recurse - - # python-olm expects olm.lib, but CMake creates olm_static.lib when BUILD_SHARED_LIBS=OFF - # Copy the static library with the expected name - if (Test-Path "C:\olm-install\lib\olm_static.lib") { - Copy-Item "C:\olm-install\lib\olm_static.lib" "C:\olm-install\lib\olm.lib" - Write-Host "Copied olm_static.lib to olm.lib" - } else { - Write-Error "ERROR: olm_static.lib not found in C:\olm-install\lib. Build cannot continue." - exit 1 - } - - # Set environment variables for python-olm build - # Include both the include and lib paths, and also set CMAKE_PREFIX_PATH for FindOlm - echo "INCLUDE=C:\olm-install\include;$env:INCLUDE" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - echo "LIB=C:\olm-install\lib;$env:LIB" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - echo "CMAKE_PREFIX_PATH=C:\olm-install;$env:CMAKE_PREFIX_PATH" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -r requirements.txt - - - name: Update version in files - shell: bash - run: | - VERSION="${{ steps.version.outputs.version }}" - python3 -c " - import re - version = '$VERSION' - with open('chatrixcd/__init__.py', 'r') as f: - content = f.read() - content = re.sub(r'__version__ = \".*\"', f'__version__ = \"{version}\"', content) - with open('chatrixcd/__init__.py', 'w') as f: - f.write(content) - print(f'Updated version to {version}') - " - - - name: Build with Nuitka - uses: Nuitka/Nuitka-Action@main - with: - nuitka-version: main - script-name: chatrixcd/main.py - mode: onefile - output-file: chatrixcd-windows-${{ matrix.arch }}.exe - enable-plugins: anti-bloat - assume-yes-for-downloads: true - company-name: "ChatrixCD Contributors" - product-name: "ChatrixCD" - file-version: ${{ steps.version.outputs.version }} - product-version: ${{ steps.version.outputs.version }} - file-description: "Matrix bot for CI/CD automation with Semaphore UI" - copyright: "Copyright (c) 2024 ChatrixCD Contributors" - windows-icon-from-ico: assets/icon.ico - onefile-tempdir-spec: "%TEMP%\\chatrixcd" - windows-console-mode: force - include-data-dir: assets=assets - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: chatrixcd-windows-${{ matrix.arch }} - path: | - chatrixcd-windows-${{ matrix.arch }}.exe - retention-days: 90 - - build-macos: - name: Build macOS Universal - needs: test - runs-on: macos-latest - - permissions: - contents: write - - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Fetch all tags - run: git fetch --tags --force - - - name: Calculate version - id: version - shell: bash - run: | - # Determine version type (default to patch for PR merges) - if [ "${{ github.event_name }}" == "pull_request" ]; then - VERSION_TYPE="patch" - else - VERSION_TYPE="${{ github.event.inputs.version_type }}" - fi - - # Call centralized version calculation script - VERSION=$(.github/scripts/calculate-version.sh "${VERSION_TYPE}") - echo "version=${VERSION}" >> "$GITHUB_OUTPUT" - echo "Generated version: ${VERSION}" - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.12' - cache: 'pip' - - - name: Install build dependencies (macOS) - run: | - # Install libolm and cmake from homebrew to avoid building from source - brew install libolm pkg-config cmake - - - name: Set PKG_CONFIG_PATH for subsequent steps - run: | - # Detect homebrew prefix (Apple Silicon uses /opt/homebrew, Intel uses /usr/local) - HOMEBREW_PREFIX=$(brew --prefix) - - # Set environment variables for subsequent steps - { - echo "PKG_CONFIG_PATH=${HOMEBREW_PREFIX}/lib/pkgconfig:${PKG_CONFIG_PATH}" - echo "CFLAGS=-I${HOMEBREW_PREFIX}/include" - echo "LDFLAGS=-L${HOMEBREW_PREFIX}/lib" - } >> "$GITHUB_ENV" - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -r requirements.txt - - - name: Update version in files - run: | - VERSION="${{ steps.version.outputs.version }}" - python3 -c " - import re - version = '$VERSION' - with open('chatrixcd/__init__.py', 'r') as f: - content = f.read() - content = re.sub(r'__version__ = \".*\"', f'__version__ = \"{version}\"', content) - with open('chatrixcd/__init__.py', 'w') as f: - f.write(content) - print(f'Updated version to {version}') - " - - - name: Build with Nuitka - uses: Nuitka/Nuitka-Action@main - with: - nuitka-version: main - script-name: chatrixcd/main.py - mode: onefile - output-file: chatrixcd-macos-universal - enable-plugins: anti-bloat - assume-yes-for-downloads: true - macos-create-app-bundle: true - macos-app-icon: assets/icon.png - macos-app-name: "ChatrixCD" - macos-app-version: ${{ steps.version.outputs.version }} - macos-target-arch: universal2 - include-data-dir: assets=assets - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: chatrixcd-macos-universal - path: | - chatrixcd-macos-universal - ChatrixCD.app/**/* - retention-days: 90 - release: name: Create Release - needs: [build-linux, build-windows, build-macos] + needs: [build-linux] runs-on: ubuntu-latest if: success() permissions: diff --git a/CHANGELOG.md b/CHANGELOG.md index ed807bc..114d3b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,19 +18,25 @@ and this project adheres to Semantic Calendar Versioning with format YYYY.MM.DD. ### Changed - **Bot Messages**: Updated task start confirmation to use proper British Army Voice Procedure - Changed "Roger that!" to "Roger!" (single word affirmative as per military radio protocol) +- **Platform Support**: Removed Windows and macOS pre-built binary support + - Linux binaries (x86_64, i686, arm64) remain fully supported + - Windows and macOS users can install from source, use Docker, or use WSL2 (Windows only) + - See [INSTALL.md](INSTALL.md) for detailed alternative installation methods +- **Documentation**: Updated all documentation to reflect Linux-only binary support + - README.md: Added alternative installation methods for Windows/macOS + - INSTALL.md: Added comprehensive platform-specific installation guides + - docs/: Updated GitHub Pages documentation with alternative installation options + +### Removed +- **Build Workflow**: Removed Windows and macOS build jobs from CI/CD pipeline + - Windows and macOS builds encountered persistent issues with python-olm native dependency compilation + - After 14 iterations, decided to focus on Linux-only binary releases + - Windows/macOS users can still install from source with appropriate dependencies ### Fixed -- **Build and Release Workflow**: Fixed multiple critical build failures +- **Build and Release Workflow**: Fixed Linux build configuration - Updated Nuitka Action to use `mode=onefile` instead of deprecated `onefile/standalone` options - Added QEMU setup for ARM64 cross-compilation on Linux - - Installed libolm build dependency via homebrew on macOS - - Setup CMake and libolm build environment on Windows - - **Windows Build**: Patched libolm CMakeLists.txt to require CMake 3.5+ for compatibility - - **macOS Build**: Set CFLAGS and LDFLAGS to use homebrew libolm instead of building from source - - Fixed compatibility issues with python-olm native extension builds - - Enhanced Windows libolm build configuration with CMAKE_BUILD_TYPE and proper install paths - - Added CMAKE_PREFIX_PATH and PATH environment variables for Windows python-olm builds - - Fixed macOS PKG_CONFIG_PATH detection to support both Apple Silicon and Intel architectures - Re-added pull_request trigger to build workflow for automatic builds on PR merge - **Log Formatting**: Fixed `!cd log` command rendering issues - Added `_ansi_to_html_for_pre()` function that strips ANSI codes and preserves newlines in `
` tags
diff --git a/INSTALL.md b/INSTALL.md
index bb5185f..0779199 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -10,29 +10,22 @@ Choose the method that best suits your needs:
 2. **From Source** - For development or custom modifications
 3. **Docker** - For containerized deployments
 
-## Method 1: Pre-built Binary (Recommended)
+## Method 1: Pre-built Binary (Recommended for Linux)
 
-The easiest way to get started - no Python installation required!
+The easiest way to get started on Linux - no Python installation required!
 
 ### Download
 
-Download the appropriate binary for your platform:
+Download the appropriate binary for your Linux platform:
 
 #### Linux
 - [x86_64 (64-bit)](https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-linux-x86_64) - Most common
 - [i686 (32-bit)](https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-linux-i686)
 - [ARM64](https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-linux-arm64) - Raspberry Pi, ARM servers
 
-#### Windows
-- [x86_64 (64-bit)](https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-windows-x86_64.exe)
-- [ARM64](https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-windows-arm64.exe)
-
-#### macOS
-- [Universal Binary](https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-macos-universal) - Intel and Apple Silicon
-
 ### Setup and Run
 
-**Linux/macOS:**
+**Linux:**
 
 ```bash
 # Download (example for Linux x86_64)
@@ -45,15 +38,6 @@ chmod +x chatrixcd-linux-x86_64
 ./chatrixcd-linux-x86_64
 ```
 
-**Windows:**
-
-1. Download the appropriate `.exe` file
-2. Double-click to run, or use Command Prompt/PowerShell:
-
-```cmd
-chatrixcd-windows-x86_64.exe
-```
-
 **First Run:**
 
 On first run, the bot will create a sample configuration file if one doesn't exist. You'll need to:
@@ -64,19 +48,66 @@ On first run, the bot will create a sample configuration file if one doesn't exi
 
 Continue to the [Configuration](#configuration) section below.
 
+### Windows and macOS Users
+
+Pre-built binaries are not currently available for Windows and macOS due to build complexity with native dependencies. Please use one of these alternatives:
+
+#### Windows Installation Options
+
+**Option A: Install from Source (Recommended)**
+- Requires Python 3.12+ (see Method 2 below)
+- Native Windows installation with full TUI support
+
+**Option B: Windows Subsystem for Linux (WSL2)**
+```powershell
+# Install WSL2 (run as Administrator)
+wsl --install
+
+# After reboot, in WSL terminal:
+wget https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-linux-x86_64
+chmod +x chatrixcd-linux-x86_64
+./chatrixcd-linux-x86_64
+```
+
+**Option C: Docker Desktop**
+- Install [Docker Desktop for Windows](https://www.docker.com/products/docker-desktop/)
+- See Method 3 below for Docker instructions
+
+#### macOS Installation Options
+
+**Option A: Install from Source (Recommended)**
+- Requires Python 3.12+ and homebrew (see Method 2 below)
+- Native macOS installation with full TUI support
+
+**Option B: Docker Desktop**
+- Install [Docker Desktop for Mac](https://www.docker.com/products/docker-desktop/)
+- See Method 3 below for Docker instructions
+
 ## Method 2: Install from Source
 
-For development or if you prefer to run from source.
+For development, Windows/macOS users, or if you prefer to run from source.
 
 ### Prerequisites
 
 - Python 3.12 or higher (3.12, 3.13, 3.14 supported)
 - [uv](https://docs.astral.sh/uv/) - Fast Python package installer (recommended) or pip
+- Platform-specific dependencies (see below)
 
-### Prerequisites
+### Platform-Specific Prerequisites
 
-- Python 3.12 or higher (3.12, 3.13, 3.14 supported)
-- [uv](https://docs.astral.sh/uv/) - Fast Python package installer (recommended) or pip
+**macOS:**
+```bash
+# Install system dependencies via homebrew
+brew install libolm pkg-config
+```
+
+**Windows:**
+- libolm will be installed automatically via pip
+- If you encounter build issues, consider using WSL2 or Docker instead
+
+**Linux:**
+- Most distributions include required dependencies
+- If libolm is missing: `sudo apt install libolm-dev` (Debian/Ubuntu) or `sudo yum install libolm-devel` (RHEL/CentOS)
 
 ### Install uv (if not already installed)
 
@@ -84,7 +115,7 @@ For development or if you prefer to run from source.
 # On Linux/macOS:
 curl -LsSf https://astral.sh/uv/install.sh | sh
 
-# On Windows:
+# On Windows (PowerShell):
 powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
 ```
 
diff --git a/README.md b/README.md
index 0effa05..defe6f5 100644
--- a/README.md
+++ b/README.md
@@ -33,7 +33,7 @@ ChatrixCD integrates with Semaphore UI to enable CI/CD automation through chat.
 
 ## Installation
 
-### Option 1: Pre-built Binaries (Recommended)
+### Option 1: Pre-built Binaries (Recommended for Linux)
 
 **No Python installation required!** Download the standalone executable for your platform:
 
@@ -42,28 +42,27 @@ ChatrixCD integrates with Semaphore UI to enable CI/CD automation through chat.
 - [i686 (32-bit)](https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-linux-i686)
 - [ARM64](https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-linux-arm64) - For Raspberry Pi, ARM servers
 
-#### Windows
-- [x86_64 (64-bit)](https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-windows-x86_64.exe)
-- [ARM64](https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-windows-arm64.exe) - For ARM-based Windows devices
-
-#### macOS
-- [Universal Binary](https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-macos-universal) - Works on both Intel and Apple Silicon
-
-**Quick Start:**
+**Quick Start (Linux):**
 
 ```bash
-# Linux/macOS - Download and make executable
+# Download and make executable
 wget https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-linux-x86_64
 chmod +x chatrixcd-linux-x86_64
 ./chatrixcd-linux-x86_64
-
-# Or for macOS
-wget https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-macos-universal
-chmod +x chatrixcd-macos-universal
-./chatrixcd-macos-universal
 ```
 
-**Windows:** Simply download the `.exe` file and double-click to run, or run from Command Prompt/PowerShell.
+#### Windows and macOS
+
+Pre-built binaries are not currently available for Windows and macOS due to build complexity with native dependencies. Please use one of the following alternatives:
+
+**Windows:**
+- **Option A (Recommended)**: Install from source (see below) using Python 3.12+
+- **Option B**: Use [Docker Desktop](https://www.docker.com/products/docker-desktop/) with the Linux containers (see [INSTALL.md](INSTALL.md))
+- **Option C**: Use [WSL2 (Windows Subsystem for Linux)](https://learn.microsoft.com/en-us/windows/wsl/install) and run the Linux binary
+
+**macOS:**
+- **Option A (Recommended)**: Install from source (see below) using Python 3.12+ and homebrew dependencies
+- **Option B**: Use [Docker Desktop](https://www.docker.com/products/docker-desktop/) with the Linux containers (see [INSTALL.md](INSTALL.md))
 
 See [Installation Guide](INSTALL.md) for detailed setup instructions including configuration.
 
@@ -71,13 +70,18 @@ See [Installation Guide](INSTALL.md) for detailed setup instructions including c
 
 **Prerequisites:**
 - Python 3.12 or higher (3.12, 3.13, 3.14 supported)
-- [uv](https://docs.astral.sh/uv/) - Fast Python package installer
-
-**Common Requirements (both options):**
+- [uv](https://docs.astral.sh/uv/) - Fast Python package installer (recommended) or pip
 - Access to a Matrix homeserver
 - Access to a Semaphore UI instance with API access
 
-### Install from source
+**Platform-specific prerequisites:**
+
+**macOS:** Install system dependencies via homebrew:
+```bash
+brew install libolm pkg-config
+```
+
+**Windows:** libolm will be installed automatically via pip. If you encounter issues, consider using WSL2 or Docker instead.
 
 **Installation steps:**
 
@@ -92,8 +96,10 @@ uv venv
 # Activate the virtual environment
 # On Linux/macOS:
 source .venv/bin/activate
-# On Windows:
-# .venv\Scripts\activate
+# On Windows (PowerShell):
+# .venv\Scripts\Activate.ps1
+# On Windows (Command Prompt):
+# .venv\Scripts\activate.bat
 
 # Install dependencies
 uv pip install -r requirements.txt
diff --git a/docs/index.md b/docs/index.md
index e34c401..ccd0809 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -50,9 +50,9 @@ nav_order: 1
 
 ChatrixCD makes it easy to manage CI/CD tasks through Matrix chat. Choose your installation method:
 
-### Quick Install (Pre-built Binary)
+### Quick Install (Pre-built Binary - Linux Only)
 
-**No Python required!** Download the standalone executable:
+**No Python required!** Download the standalone executable for Linux:
 
 **Linux (x86_64):**
 ```bash
@@ -61,16 +61,11 @@ chmod +x chatrixcd-linux-x86_64
 ./chatrixcd-linux-x86_64
 ```
 
-**macOS (Universal):**
-```bash
-wget https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-macos-universal
-chmod +x chatrixcd-macos-universal
-./chatrixcd-macos-universal
-```
-
-**Windows:** Download [chatrixcd-windows-x86_64.exe](https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-windows-x86_64.exe)
+**Other Linux architectures:**
+- [i686 (32-bit)](https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-linux-i686)
+- [ARM64](https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-linux-arm64) - For Raspberry Pi, ARM servers
 
-**[See all platforms and architectures](https://github.com/CJFWeatherhead/ChatrixCD/releases/latest)**
+**Windows and macOS:** Pre-built binaries are not available. Use [source installation](installation.html#method-2-install-from-source), [Docker](installation.html#method-3-docker), or WSL2 (Windows only). See the [Installation Guide](installation.html) for details.
 
 ### Install from Source
 
diff --git a/docs/installation.md b/docs/installation.md
index 0b8451d..cc8c57d 100644
--- a/docs/installation.md
+++ b/docs/installation.md
@@ -29,16 +29,9 @@ Download the appropriate binary for your platform:
 - [i686 (32-bit)](https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-linux-i686)
 - [ARM64](https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-linux-arm64) - Raspberry Pi, ARM servers
 
-#### Windows
-- [x86_64 (64-bit)](https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-windows-x86_64.exe)
-- [ARM64](https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-windows-arm64.exe)
-
-#### macOS
-- [Universal Binary](https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-macos-universal) - Intel and Apple Silicon
-
 ### Setup and Run
 
-**Linux/macOS:**
+**Linux:**
 
 ```bash
 # Download (example for Linux x86_64)
@@ -51,16 +44,46 @@ chmod +x chatrixcd-linux-x86_64
 ./chatrixcd-linux-x86_64
 ```
 
-**Windows:**
+On first run, create a `config.json` file in the same directory. See the [Configuration Guide](configuration.html) for details.
 
-1. Download the appropriate `.exe` file
-2. Double-click to run, or use Command Prompt/PowerShell
+### Windows and macOS Users
 
-On first run, create a `config.json` file in the same directory. See the [Configuration Guide](configuration.html) for details.
+Pre-built binaries are not currently available for Windows and macOS due to build complexity with native dependencies. Please use one of these alternatives:
+
+#### Windows Installation Options
+
+**Option A: Install from Source (Recommended)**
+- Requires Python 3.12+ (see Method 2 below)
+- Native Windows installation with full TUI support
+
+**Option B: Windows Subsystem for Linux (WSL2)**
+```powershell
+# Install WSL2 (run as Administrator)
+wsl --install
+
+# After reboot, in WSL terminal:
+wget https://github.com/CJFWeatherhead/ChatrixCD/releases/latest/download/chatrixcd-linux-x86_64
+chmod +x chatrixcd-linux-x86_64
+./chatrixcd-linux-x86_64
+```
+
+**Option C: Docker Desktop**
+- Install [Docker Desktop for Windows](https://www.docker.com/products/docker-desktop/)
+- See Method 3 below for Docker instructions
+
+#### macOS Installation Options
+
+**Option A: Install from Source (Recommended)**
+- Requires Python 3.12+ and homebrew (see Method 2 below)
+- Native macOS installation with full TUI support
+
+**Option B: Docker Desktop**
+- Install [Docker Desktop for Mac](https://www.docker.com/products/docker-desktop/)
+- See Method 3 below for Docker instructions
 
 ## Method 2: Install from Source
 
-For development or if you prefer to run from source.
+For development, Windows/macOS users, or if you prefer to run from source.
 
 ### Prerequisites
 
@@ -68,6 +91,23 @@ For development or if you prefer to run from source.
 - [uv](https://docs.astral.sh/uv/) - Fast Python package installer (recommended)
 - Access to a Matrix homeserver
 - Access to a Semaphore UI instance with API access
+- Platform-specific dependencies (see below)
+
+### Platform-Specific Prerequisites
+
+**macOS:**
+```bash
+# Install system dependencies via homebrew
+brew install libolm pkg-config
+```
+
+**Windows:**
+- libolm will be installed automatically via pip
+- If you encounter build issues, consider using WSL2 or Docker instead
+
+**Linux:**
+- Most distributions include required dependencies
+- If libolm is missing: `sudo apt install libolm-dev` (Debian/Ubuntu) or `sudo yum install libolm-devel` (RHEL/CentOS)
 
 ### Installation Steps
 
@@ -82,8 +122,10 @@ uv venv
 # Activate the virtual environment
 # On Linux/macOS:
 source .venv/bin/activate
-# On Windows:
-# .venv\Scripts\activate
+# On Windows (PowerShell):
+# .venv\Scripts\Activate.ps1
+# On Windows (Command Prompt):
+# .venv\Scripts\activate.bat
 
 # Install dependencies
 uv pip install -r requirements.txt
diff --git a/tests/test_workflow.py b/tests/test_workflow.py
index 8f10051..1da7d82 100644
--- a/tests/test_workflow.py
+++ b/tests/test_workflow.py
@@ -86,32 +86,16 @@ def test_build_workflow_has_platform_builds(self):
         self.assertIn('i686', linux_archs, "Should build for Linux i686")
         self.assertIn('arm64', linux_archs, "Should build for Linux arm64")
         
-        # Should have Windows build job
-        self.assertIn('build-windows', jobs)
-        windows_job = jobs['build-windows']
-        self.assertIn('strategy', windows_job)
-        self.assertIn('matrix', windows_job['strategy'])
-        windows_archs = windows_job['strategy']['matrix']['arch']
-        self.assertIn('x86_64', windows_archs, "Should build for Windows x86_64")
-        # Note: ARM64 Windows builds are not feasible on GitHub Actions without ARM64 runners
-        
-        # Should have macOS build job
-        self.assertIn('build-macos', jobs)
-        macos_job = jobs['build-macos']
-        # macOS builds universal binary, check in steps
-        macos_steps = macos_job['steps']
-        macos_step_names = [step.get('name', '') for step in macos_steps]
-        self.assertTrue(
-            any('nuitka' in name.lower() for name in macos_step_names),
-            "macOS job should include Nuitka build step"
-        )
+        # Windows and macOS build jobs removed due to python-olm build issues
+        self.assertNotIn('build-windows', jobs, "Windows builds removed")
+        self.assertNotIn('build-macos', jobs, "macOS builds removed")
     
     def test_build_workflow_uses_nuitka_action(self):
         """Test that build workflow uses Nuitka-Action."""
         jobs = self.build_workflow['jobs']
         
-        # Check each build job for Nuitka-Action usage
-        for job_name in ['build-linux', 'build-windows', 'build-macos']:
+        # Check Linux build job for Nuitka-Action usage (Windows/macOS removed)
+        for job_name in ['build-linux']:
             job = jobs[job_name]
             steps = job['steps']
             
@@ -138,8 +122,8 @@ def test_build_workflow_has_version_calculation(self):
         """Test that build workflow calculates versions correctly."""
         jobs = self.build_workflow['jobs']
         
-        # Check each build job has version calculation
-        for job_name in ['build-linux', 'build-windows', 'build-macos']:
+        # Check Linux build job has version calculation (Windows/macOS removed)
+        for job_name in ['build-linux']:
             job = jobs[job_name]
             steps = job['steps']
             
@@ -160,12 +144,13 @@ def test_build_workflow_has_release_job(self):
         
         release_job = jobs['release']
         
-        # Should depend on all build jobs
+        # Should depend on all build jobs (Linux only)
         self.assertIn('needs', release_job)
         needs = release_job['needs']
         self.assertIn('build-linux', needs)
-        self.assertIn('build-windows', needs)
-        self.assertIn('build-macos', needs)
+        # Windows and macOS builds removed due to python-olm build issues
+        self.assertNotIn('build-windows', needs)
+        self.assertNotIn('build-macos', needs)
         
         # Should download artifacts
         steps = release_job['steps']
@@ -189,33 +174,17 @@ def test_build_workflow_has_release_job(self):
         )
     
     def test_build_workflow_has_metadata(self):
-        """Test that build workflow includes appropriate metadata."""
-        jobs = self.build_workflow['jobs']
-        
-        # Check Windows build for metadata
-        windows_job = jobs['build-windows']
-        steps = windows_job['steps']
-        
-        nuitka_steps = [
-            step for step in steps
-            if 'uses' in step and 'Nuitka' in step['uses']
-        ]
-        
-        for nuitka_step in nuitka_steps:
-            with_config = nuitka_step.get('with', {})
-            # Should have metadata
-            self.assertIn('company-name', with_config)
-            self.assertIn('product-name', with_config)
-            self.assertIn('file-description', with_config)
-            self.assertIn('copyright', with_config)
-            # Should have icon
-            self.assertIn('windows-icon-from-ico', with_config)
+        """Test that build workflow includes appropriate metadata (Windows build removed)."""
+        # Windows and macOS builds removed due to python-olm build issues
+        # This test is kept for potential future re-enablement but currently skipped
+        self.skipTest("Windows and macOS builds removed - test no longer applicable")
     
     def test_build_workflow_includes_assets(self):
         """Test that build workflow includes assets directory."""
         jobs = self.build_workflow['jobs']
         
-        for job_name in ['build-linux', 'build-windows', 'build-macos']:
+        # Check Linux build job for assets (Windows/macOS removed)
+        for job_name in ['build-linux']:
             job = jobs[job_name]
             steps = job['steps']