Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
c0f1091
Add macOS support
peteonrails Jan 27, 2026
8410568
macOS: Add SwiftUI setup wizard and improve daemon
peteonrails Jan 29, 2026
55769df
Restore Linux-specific documentation removed during macOS merge
peteonrails Jan 29, 2026
88c9497
Bump version to 0.6.0-rc1
peteonrails Jan 29, 2026
f5283f2
Bump version to 0.6.0-rc.1, add Homebrew formula
peteonrails Jan 29, 2026
df79e87
Document cargo clean requirement for GPU builds
peteonrails Jan 30, 2026
0df8b34
Add X11 and GTK dependencies to Dockerfiles
peteonrails Jan 30, 2026
2843b79
macOS: Polish setup wizard for first release
peteonrails Jan 30, 2026
4a0bc1e
Homebrew: Enable parakeet for macOS builds
peteonrails Jan 30, 2026
1ae51be
Fix Parakeet quantized model detection in setup check
peteonrails Jan 30, 2026
1810cca
Add Homebrew Cask for macOS prebuilt binary installation
peteonrails Jan 30, 2026
6c3adb9
Update Cask SHA256 for rebuilt DMG with Parakeet fix
peteonrails Jan 30, 2026
6e9020e
Auto-start daemon via LaunchAgent in Cask postflight
peteonrails Jan 30, 2026
d54521c
Auto-remove quarantine in Cask postflight for seamless install
peteonrails Jan 30, 2026
3e75c0f
Clean stale state and improve Cask caveats
peteonrails Jan 30, 2026
0dceea5
Update macOS install docs for beta with unsigned binaries
peteonrails Jan 31, 2026
fa44ac8
Add VoxtypeMenubar Swift app for macOS status icon
peteonrails Jan 31, 2026
ab9a350
Improve VoxtypeMenubar menu layout and settings launch
peteonrails Jan 31, 2026
3f1e307
Replace VoxtypeSetup wizard with sidebar settings app
peteonrails Jan 31, 2026
6080247
Fix macOS settings config corruption and improve notifications
peteonrails Jan 31, 2026
5b970dd
Improve macOS menubar layout and settings UX
peteonrails Jan 31, 2026
4845519
Add Christopher Albert to contributors for macOS port
peteonrails Jan 31, 2026
b1562e2
Add Homebrew installation to website download page
peteonrails Jan 31, 2026
bdfc019
Improve macOS Homebrew installation experience
peteonrails Jan 31, 2026
6c08105
Open Settings to Permissions pane on first Homebrew install
peteonrails Jan 31, 2026
c5851fc
Add "Show in Menu Bar" toggle to Settings app
peteonrails Jan 31, 2026
ffa0e6e
Bump version to 0.6.0-rc.2, document 7-binary release process
peteonrails Feb 1, 2026
ad616e0
Fix CI workflow issues for macOS PR
krystophny Feb 3, 2026
e71b76e
Add FN/Function/Globe key support for macOS hotkeys
krystophny Feb 4, 2026
cbc3e19
Add voxtype setup app-bundle for macOS (recommended over launchd)
krystophny Feb 4, 2026
c7dea1c
Unify macOS setup: macos.rs uses app_bundle, deprecate launchd
krystophny Feb 5, 2026
cc70f7e
Merge pull request #171 from peteonrails/fix/ci-workflow-issues
peteonrails Feb 15, 2026
da2cf35
Merge pull request #173 from peteonrails/feature/fn-key-support
peteonrails Feb 15, 2026
1d05c0c
Merge pull request #174 from peteonrails/feature/macos-launcher
peteonrails Feb 15, 2026
16525d0
Merge main into feature/macos-release
krystophny Feb 17, 2026
d499d64
Merge pull request #214 from peteonrails/chore/merge-main-into-macos-…
peteonrails Feb 17, 2026
ef83bcb
Merge origin/main into feature/macos-release
krystophny Feb 18, 2026
35a0137
Merge origin/main into feature/macos-release
krystophny Feb 25, 2026
d047e66
Fix macOS app bundle: self-copy corruption, code signing, and permiss…
krystophny Feb 25, 2026
b8b83a3
Replace menubar polling with kqueue file watching for instant icon up…
krystophny Feb 25, 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
291 changes: 291 additions & 0 deletions .github/workflows/build-linux.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,291 @@
name: Build Linux

on:
push:
tags:
- 'v*'
workflow_dispatch:
inputs:
version:
description: 'Version (without v prefix)'
required: true
default: '0.5.0'

jobs:
# AVX2 build - uses Docker for clean toolchain (no AVX-512 contamination)
build-avx2:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Determine version
id: version
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
else
echo "version=${GITHUB_REF_NAME#v}" >> $GITHUB_OUTPUT
fi

- name: Build AVX2 binary in Docker
run: |
VERSION=${{ steps.version.outputs.version }}
docker build -f Dockerfile.build -t voxtype-avx2 --build-arg VERSION=${VERSION} .
mkdir -p releases/${VERSION}
docker run --rm -v $(pwd)/releases/${VERSION}:/output voxtype-avx2

- name: Verify binary
run: |
VERSION=${{ steps.version.outputs.version }}
releases/${VERSION}/voxtype-${VERSION}-linux-x86_64-avx2 --version

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: linux-avx2
path: releases/${{ steps.version.outputs.version }}/voxtype-*-linux-x86_64-avx2

# Vulkan build - uses Docker for clean toolchain
build-vulkan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Determine version
id: version
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
else
echo "version=${GITHUB_REF_NAME#v}" >> $GITHUB_OUTPUT
fi

- name: Build Vulkan binary in Docker
run: |
VERSION=${{ steps.version.outputs.version }}
docker build -f Dockerfile.vulkan -t voxtype-vulkan --build-arg VERSION=${VERSION} .
mkdir -p releases/${VERSION}
docker run --rm -v $(pwd)/releases/${VERSION}:/output voxtype-vulkan

- name: Verify binary
run: |
VERSION=${{ steps.version.outputs.version }}
releases/${VERSION}/voxtype-${VERSION}-linux-x86_64-vulkan --version

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: linux-vulkan
path: releases/${{ steps.version.outputs.version }}/voxtype-*-linux-x86_64-vulkan

# Parakeet AVX2 build - uses Docker for clean toolchain
build-parakeet-avx2:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Determine version
id: version
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
else
echo "version=${GITHUB_REF_NAME#v}" >> $GITHUB_OUTPUT
fi

- name: Build Parakeet AVX2 binary in Docker
run: |
VERSION=${{ steps.version.outputs.version }}
docker build -f Dockerfile.parakeet -t voxtype-parakeet-avx2 --build-arg VERSION=${VERSION} .
mkdir -p releases/${VERSION}
docker run --rm -v $(pwd)/releases/${VERSION}:/output voxtype-parakeet-avx2

- name: Verify binary
run: |
VERSION=${{ steps.version.outputs.version }}
releases/${VERSION}/voxtype-${VERSION}-linux-x86_64-parakeet-avx2 --version

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: linux-parakeet-avx2
path: releases/${{ steps.version.outputs.version }}/voxtype-*-linux-x86_64-parakeet-avx2

# AVX-512 build - requires AVX-512 capable runner (best effort)
build-avx512:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Check for AVX-512 support
id: check-avx512
run: |
if grep -q avx512f /proc/cpuinfo; then
echo "supported=true" >> $GITHUB_OUTPUT
echo "AVX-512 is supported on this runner"
else
echo "supported=false" >> $GITHUB_OUTPUT
echo "AVX-512 is NOT supported on this runner - skipping build"
fi

- name: Determine version
if: steps.check-avx512.outputs.supported == 'true'
id: version
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
else
echo "version=${GITHUB_REF_NAME#v}" >> $GITHUB_OUTPUT
fi

- name: Install Rust
if: steps.check-avx512.outputs.supported == 'true'
uses: dtolnay/rust-toolchain@stable

- name: Install dependencies
if: steps.check-avx512.outputs.supported == 'true'
run: |
sudo apt-get update
sudo apt-get install -y libasound2-dev libclang-dev cmake \
libgtk-3-dev libglib2.0-dev libx11-dev libxi-dev libxtst-dev

- name: Build AVX-512 binary
if: steps.check-avx512.outputs.supported == 'true'
env:
RUSTFLAGS: "-C target-cpu=native"
run: |
cargo build --release
VERSION=${{ steps.version.outputs.version }}
mkdir -p releases/${VERSION}
cp target/release/voxtype releases/${VERSION}/voxtype-${VERSION}-linux-x86_64-avx512

- name: Verify binary
if: steps.check-avx512.outputs.supported == 'true'
run: |
VERSION=${{ steps.version.outputs.version }}
releases/${VERSION}/voxtype-${VERSION}-linux-x86_64-avx512 --version

- name: Upload artifact
if: steps.check-avx512.outputs.supported == 'true'
uses: actions/upload-artifact@v4
with:
name: linux-avx512
path: releases/${{ steps.version.outputs.version }}/voxtype-*-linux-x86_64-avx512

# Parakeet AVX-512 build - requires AVX-512 capable runner (best effort)
build-parakeet-avx512:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Check for AVX-512 support
id: check-avx512
run: |
if grep -q avx512f /proc/cpuinfo; then
echo "supported=true" >> $GITHUB_OUTPUT
echo "AVX-512 is supported on this runner"
else
echo "supported=false" >> $GITHUB_OUTPUT
echo "AVX-512 is NOT supported on this runner - skipping build"
fi

- name: Determine version
if: steps.check-avx512.outputs.supported == 'true'
id: version
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
else
echo "version=${GITHUB_REF_NAME#v}" >> $GITHUB_OUTPUT
fi

- name: Install Rust
if: steps.check-avx512.outputs.supported == 'true'
uses: dtolnay/rust-toolchain@stable

- name: Install dependencies
if: steps.check-avx512.outputs.supported == 'true'
run: |
sudo apt-get update
sudo apt-get install -y libasound2-dev libclang-dev cmake \
libgtk-3-dev libglib2.0-dev libx11-dev libxi-dev libxtst-dev \
libssl-dev protobuf-compiler libprotobuf-dev

- name: Build Parakeet AVX-512 binary
if: steps.check-avx512.outputs.supported == 'true'
env:
RUSTFLAGS: "-C target-cpu=native"
run: |
cargo build --release --features parakeet
VERSION=${{ steps.version.outputs.version }}
mkdir -p releases/${VERSION}
cp target/release/voxtype releases/${VERSION}/voxtype-${VERSION}-linux-x86_64-parakeet-avx512

- name: Verify binary
if: steps.check-avx512.outputs.supported == 'true'
run: |
VERSION=${{ steps.version.outputs.version }}
releases/${VERSION}/voxtype-${VERSION}-linux-x86_64-parakeet-avx512 --version

- name: Upload artifact
if: steps.check-avx512.outputs.supported == 'true'
uses: actions/upload-artifact@v4
with:
name: linux-parakeet-avx512
path: releases/${{ steps.version.outputs.version }}/voxtype-*-linux-x86_64-parakeet-avx512

# Collect all artifacts and create release
release:
needs: [build-avx2, build-vulkan, build-parakeet-avx2, build-avx512, build-parakeet-avx512]
if: always() && needs.build-avx2.result == 'success'
runs-on: ubuntu-latest
steps:
- name: Determine version
id: version
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
else
echo "version=${GITHUB_REF_NAME#v}" >> $GITHUB_OUTPUT
fi

- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts

- name: Collect binaries
run: |
VERSION=${{ steps.version.outputs.version }}
mkdir -p releases/${VERSION}

# Move all binaries to releases directory
find artifacts -name 'voxtype-*' -type f -exec mv {} releases/${VERSION}/ \;

# List collected binaries
echo "Collected binaries:"
ls -la releases/${VERSION}/

- name: Generate checksums
run: |
VERSION=${{ steps.version.outputs.version }}
cd releases/${VERSION}
sha256sum voxtype-* > SHA256SUMS.txt
echo "Checksums:"
cat SHA256SUMS.txt

- name: Upload combined artifact
uses: actions/upload-artifact@v4
with:
name: linux-release-all
path: |
releases/${{ steps.version.outputs.version }}/voxtype-*
releases/${{ steps.version.outputs.version }}/SHA256SUMS.txt

- name: Upload to release
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v1
with:
files: |
releases/${{ steps.version.outputs.version }}/voxtype-*
releases/${{ steps.version.outputs.version }}/SHA256SUMS.txt
Loading