尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Mechanical keyboard sounds for every key press, as a tiny native macOS menu bar app written in Rust.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Mechanical keyboard sounds for every key press, as a tiny native macOS menu bar app written in Rust.
rustyvibes.kunalbagaria.com · free and open source (MIT)
Rustyvibes 2 plays the sound of a real mechanical keyboard every time you press a key, in any
app. It lives in the menu bar, ships with 21 soundpacks, and is built to cost nothing while you
are not typing: 0% CPU, no timers, no wakeups, and the audio device is released when idle.檢視完整 README ↗Rustyvibes 2 plays the sound of a real mechanical keyboard every time you press a key, in any app. It lives in the menu bar, ships with 21 soundpacks, and is built to cost nothing while you are not typing: 0% CPU, no timers, no wakeups, and the audio device is released when idle.
Paste this into Terminal:
curl -fsSL https://rustyvibes.kunalbagaria.com/install | bash
The installer downloads the latest release from
rustyvibes.kunalbagaria.com, checks its SHA-256 checksum and
code signature, installs it in /Applications (or ~/Applications) without an admin password, and
opens it. Rustyvibes is signed but not notarised by Apple, so a copy downloaded in a browser would be
stopped by Gatekeeper; installed this way, it isn't. Run the same command again to update, or add
-s -- --uninstall to remove it.
Requires macOS 13 Ventura or later, on Apple Silicon or Intel.
Measured on an M2 Max (macOS 26.2) with the signed release bundle:
| Target | Measured | |
|---|---|---|
| CPU while idle | 0% | 0.0% |
| Wakeups while idle (after the audio idle stop) | 0/s | 0/s |
| CPU while typing 10 keys/s | — | 0.4% |
| Physical memory footprint | < 25 MB | 16–17 MB |
| Universal binary (arm64 + x86_64) | < 3 MB | 1.16 MB (arm64 slice 541 KB) |
| App bundle / DMG | — | 17.5 MB / 12.6 MB |
| Key event handling (event-tap callback) | < 20 µs | ≤ 5 µs |
| Audio render callback (budget 2,667 µs) | ≪ budget | ≤ 8 µs |
| Mixer cost with 32 voices | < 1% | 0.39% (10.5 µs per block) |
| Clip onset (silence before the click) | ≤ 1 ms | ≤ 0.5 ms |
| Loudness spread across packs | ≤ ±1.5 dB | 0.0 dB |
| Launch to menu bar ready (warm) | — | ~140–180 ms |
While you type, sounds go out through a 128-frame buffer (≈2.7 ms at 48 kHz) plus your audio device's own latency. After 15 s of silence Rustyvibes stops and releases the audio device so it never keeps your Mac awake; the next key press restarts it, which takes ~13 ms on a device that is already running and up to ~50 ms on some USB interfaces that start from cold.
┌──────────────────────── main thread (AppKit) ────────────────────────┐
│ status item + NSMenu · onboarding window · NSUserDefaults │
│ writes settings atomics · pushes preview sounds (UI ring) │
└───────────────┬───────────────────────────────────────┬───────────────┘
│ atomics (enabled, volume, pack, …) │ SPSC ring
┌── event-tap thread ──┐ ▼ ▼
│ listen-only │ shared engine state ┌─ CoreAudio IO thread ─┐
│ CGEventTap ├─ SPSC ring (keys) ─────────────────►│ render callback: │
│ key → clip lookup, │ │ start voices, cubic │
│ variation, panning │──wake (only if audio is stopped)──┐ │ resampling, mix, │
└──────────────────────┘ │ │ ramped gain, limiter │
▼ └──────────▲────────────┘
┌─ audio control thread ─┐│ start / stop
│ starts the AUHAL unit ├┘
│ on demand, stops after │
│ 15 s of silence │
└────────────────────────┘
CGEventTap on its own high-priority thread. It needs only the Input
Monitoring permission, ignores auto-repeat, and decodes modifier keys from their device flags.
The callback does two table lookups and pushes one command into a lock-free ring.assets/soundpacks and are converted at build time
into .rvpack files: decoded, trimmed to their transients (some recordings start up to 54 ms
late), loudness-matched, dithered to 16-bit mono, and mapped to every macOS key.
At runtime they are memory-mapped and never decoded; only the active pack's samples are kept
resident.NSMenu with a
header switch, a grouped soundpack submenu with tinted keycap glyphs, a volume slider and
toggles; icons are drawn in code.The crates: crates/rustyvibes (the app), crates/rvpack (the soundpack format and keyboard
geometry) and crates/xtask (soundpack conversion, bundling and signing).
You need Rust (stable) and Xcode's command-line tools.
cargo xtask packs # convert assets/soundpacks → target/packs/*.rvpack
cargo run --release -p rustyvibes # run from the terminal (uses the terminal's Input Monitoring grant)
cargo xtask bundle # target/bundle/Rustyvibes.app (universal, signed)
cargo xtask dmg # target/Rustyvibes-2.0.0.dmg
cargo xtask notarize --keychain-profile <name> # the same, notarised and stapled
cargo xtask bundle signs with the first "Developer ID Application" identity in your keychain
(hardened runtime, secure timestamp) and falls back to an ad-hoc signature; --adhoc forces
ad-hoc and --native builds only for your Mac's architecture.
cargo xtask notarize needs that Developer ID plus a notarytool keychain profile, created once
with xcrun notarytool store-credentials <name> (see its --help for the App Store Connect API
key and Apple ID options; the credentials stay in your keychain). It submits the app, staples the
ticket, builds the DMG around the stapled app, then submits and staples the DMG, so both open
without a Gatekeeper prompt, even offline. A rejection prints Apple's log of what to fix.
The website, its 3D keyboard and the installer live in site/; bun run release
there publishes the app for the installer.
Tests and lints: cargo test --workspace, cargo clippy --workspace --all-targets -- -D warnings.
The full-catalog conversion test runs with cargo test -p xtask --profile xtask -- --ignored.
rustyvibes --selftest [--audible] play every soundpack through the real audio path and report timings
rustyvibes --tap-test check that key events reach the engine (injects one Shift press)
rustyvibes --bench measure the mixer
rustyvibes --snapshot [dir] render the UI pieces to PNG
RUSTYVIBES_LOG=1 rustyvibes log to stderr with timestamps
Rustyvibes is MIT-licensed. The soundpacks come from two MIT-licensed projects:
Mechvibes by Hai Nguyen (the Cherry MX, Topre Purple
Hybrid and Everglide packs) and kbsim by Thomas Lai (all other
packs). Full licence texts, including those of the Rust crates Rustyvibes uses, are in
THIRD_PARTY_NOTICES.md and inside the app bundle under
Contents/Resources/Licenses.