Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
26 changes: 24 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
os: [ubuntu-latest, windows-latest, macos-latest]

runs-on: ${{ matrix.os }}

Expand All @@ -28,5 +28,27 @@ jobs:
- run: cargo clippy --all-targets -- -D warnings

# The pack tests decode and measure audio but never open a device, so
# they run fine on a headless runner.
# they run fine on a headless runner. On macOS this run is also the only
# thing that links the binary, and so the only check that every
# `extern "C"` name in keyboard/macos.rs is a symbol that really exists —
# clippy stops before the linker.
- run: cargo test

# Catches a broken cfg on macOS from the Linux and Windows machines most of
# Jaster is written on. No macOS SDK here, so this stops at type checking: it
# finds bad Rust, not a bad framework symbol.
macos-cross-check:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-apple-darwin, x86_64-apple-darwin
components: clippy

# No ALSA step: cpal takes the CoreAudio path for Apple targets, so
# alsa-sys is not in that dependency graph at all.
- run: cargo clippy --target aarch64-apple-darwin --all-targets -- -D warnings
- run: cargo clippy --target x86_64-apple-darwin --all-targets -- -D warnings
54 changes: 54 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,3 +71,57 @@ jobs:
uses: softprops/action-gh-release@v2
with:
files: jaster-windows-x86_64.zip

build-macos:
runs-on: macos-latest

steps:
- uses: actions/checkout@v4

- uses: dtolnay/rust-toolchain@stable
with:
# The runners are Apple Silicon, so the Intel half is the cross
# build. Both targets ship with the same SDK.
targets: aarch64-apple-darwin, x86_64-apple-darwin

# No system dependencies: CoreAudio, CoreGraphics and IOKit are part of
# the OS.
- name: Build both architectures
run: |
cargo build --release --target aarch64-apple-darwin
cargo build --release --target x86_64-apple-darwin

# One universal binary rather than two assets, so install.sh has nothing
# to decide from `uname -m`.
- name: Make one universal binary
run: |
lipo -create -output jaster-universal \
target/aarch64-apple-darwin/release/jaster \
target/x86_64-apple-darwin/release/jaster
lipo -info jaster-universal

# Apple Silicon refuses to execute an unsigned binary at all. The linker
# ad-hoc signs each slice, but lipo is exactly the surgery that can
# invalidate that, so re-sign the finished file. `--sign -` is ad-hoc: no
# certificate, no Apple account, and no notarization — none of which this
# download path needs, because curl never sets the quarantine attribute
# Gatekeeper keys on.
- name: Ad-hoc sign
run: |
codesign --force --sign - jaster-universal
codesign --verify --verbose jaster-universal

- name: Package Release
run: |
mkdir jaster
cp jaster-universal jaster/jaster
cp scripts/install.sh jaster/install.sh
cp -r assets jaster/
chmod +x jaster/jaster jaster/install.sh

tar -czf jaster-macos-universal.tar.gz jaster

- name: Upload Release
uses: softprops/action-gh-release@v2
with:
files: jaster-macos-universal.tar.gz
59 changes: 55 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,14 @@

**Bring mechanical typing sounds to your native keyboard.**

Jaster is a lightweight CLI application that adds realistic mechanical typing sounds to any keyboard on Linux and Windows, providing an immersive typing experience with minimal setup.
Jaster is a lightweight CLI application that adds realistic mechanical typing sounds to any keyboard on Linux, macOS and Windows, providing an immersive typing experience with minimal setup.

---

> [!NOTE]
> **Current Platform Support**
>
> Jaster supports **Linux** and **Windows**.
>
> Support for **macOS** is under active development as part of Jaster's cross-platform roadmap.
> Jaster supports **Linux**, **macOS** and **Windows**.

## Installation

Expand All @@ -35,6 +33,29 @@ exec su - "$USER"
jaster start
```

### macOS

Copy and paste the following into your terminal:

```bash
# Download and install Jaster
curl -fsSL https://raw.githubusercontent.com/JoeCelaster/Jaster/main/install.sh | bash

# Start Jaster and enable typing sounds
jaster start
```

macOS will not let anything read the keyboard until you say so. Open
**System Settings → Privacy & Security → Input Monitoring** and turn on the
entry for the terminal you ran Jaster from, then **quit that terminal
completely** (⌘Q — a new window is not enough) and reopen it.

The permission belongs to the app that *launched* Jaster, not to Jaster, so the
switch is named after your terminal — Terminal, iTerm2, Ghostty, VS Code — and
there may be no "jaster" entry in the list at all.

One universal binary covers both Apple Silicon and Intel.

### Windows

Paste this into PowerShell. No administrator rights are needed — Jaster
Expand Down Expand Up @@ -177,6 +198,13 @@ Jaster listens for keyboard input events and plays synchronized typing sounds in
- Audio system supported by your distribution (ALSA/PipeWire/PulseAudio)
- Permission to access `/dev/input` devices

**macOS**

- macOS 10.15 (Catalina) or later
- Apple Silicon or Intel — the installer ships one universal binary
- Input Monitoring granted to the terminal you start Jaster from
- Nothing else. Audio and key capture both use built-in system frameworks.

**Windows**

- Windows 10 or later
Expand Down Expand Up @@ -209,6 +237,20 @@ sudo usermod -aG input $USER
exec su - "$USER"
```

**On macOS**, four things are worth knowing:

- The Input Monitoring switch carries your *terminal's* name, not Jaster's.
Grant it to every terminal you start Jaster from.
- Granting it only affects processes started afterwards, so quit the terminal
with ⌘Q and reopen it. Opening a new window is not enough.
- Typing is silent in password fields and in any app using Secure Keyboard
Entry (Terminal has it in its own menu). macOS shuts every event tap out of
those deliberately, and there is nothing Jaster can do about it.
- The grant is tied to the exact binary, so `jaster update` needs you to allow
it once more.

`jaster doctor` reports which of these is in the way.

**On Windows**, two things are worth knowing:

- Anti-cheat software (Vanguard, EasyAntiCheat, BattlEye) and some endpoint
Expand All @@ -232,6 +274,15 @@ sudo rm -rf /usr/share/jaster
rm -rf ~/.local/share/jaster
```

**macOS** — remove the installed binary and its sounds, then revoke the
permission under *System Settings → Privacy & Security → Input Monitoring*:

```bash
sudo rm /usr/local/bin/jaster
sudo rm -rf /usr/local/share/jaster
rm -rf ~/.local/share/jaster
```

**Windows** — stop Jaster, then remove its folder and PATH entry:

```powershell
Expand Down
Loading
Loading