尚未检测到更新。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.