站内导读
中文 spank 是一个 macOS 命令行工具,读取 Apple Silicon 内置加速度计(Bosch BMI286 IMU,经 IOKit HID)来识别拍打笔记本的动作并播放对应音效。它把硬件传感器变成输入设备,提供默认痛叫、按 5 分钟内拍打频率升级的 sexy、Halo 死亡音效和自定义 MP3 四种模式,可调灵敏度、冷却与播放速度,单二进制无依赖。适合想在 M 系列 Mac 上做传感器实验的开发者。
日本語 spank は Apple Silicon 内蔵の加速度センサー(Bosch BMI286 IMU、IOKit HID 経由)を使い、MacBook を叩く動作を検出して効果音を再生する macOS 向け CLI ツールです。通常の痛がる音声に加え、5 分間の叩いた回数で段階的に変化する sexy モード、Halo の死亡音、任意の MP3 を再生するカスタムモードを備えます。感度やクールダウン、再生速度を調整でき、依存なしの単一バイナリで動作します。M シリーズ Mac でセンサー入力を試したい開発者向けです。
한국어 spank는 Apple Silicon에 내장된 가속도 센서(Bosch BMI286 IMU, IOKit HID 경유)로 노트북을 때리는 동작을 감지해 효과음을 재생하는 macOS CLI 도구입니다. 기본 통증 모드 외에 5분 내 타격 빈도에 따라 단계가 올라가는 sexy 모드, Halo 사망음, 지정 폴더의 MP3를 쓰는 커스텀 모드를 제공합니다. 민감도와 쿨다운, 재생 속도를 조절할 수 있고 의존성 없는 단일 바이너리로 동작합니다. M 시리즈 Mac에서 센서 입력을 실험하려는 개발자에게 적합합니다.
English spank is a macOS CLI tool that reads the Apple Silicon accelerometer (Bosch BMI286 IMU via IOKit HID) to detect hits on your laptop and play audio in response. Modes include default pain clips, a sexy mode that escalates across 60 levels based on slap frequency over a rolling 5-minute window, Halo death sounds, and custom MP3 playback. Sensitivity, cooldown, and playback speed are tunable, and it ships as a single dependency-free binary for developers experimenting with sensor input on M-series Macs.
README · 详细文档
来源 · 查看原文
<p align="center"> <img src="doc/logo.png" alt="spank logo" width="200"> </p>
spank
English | [简体中文][readme-zh-link]
Slap your MacBook, it yells back.
"this is the most amazing thing i've ever seen" — @kenwheeler
"I just ran sexy mode with my wife sitting next to me...We died laughing" — @duncanthedev
"peak engineering" — @tylertaewook
Uses the Apple Silicon accelerometer (Bosch BMI286 IMU via IOKit HID) to detect physical hits on your laptop and plays audio responses. Single binary, no dependencies.
Requirements
- macOS on Apple Silicon (any M-series chip M2 or greater, or the M1 Pro SKU specifically, no other M1/A-series chips!)
sudo(for IOKit HID accelerometer access)- Go 1.26+ (if building from source)
Install
Download from the latest release.
Or build from source:
go install github.com/taigrr/spank@latest
Note:go installplaces the binary in$GOBIN(if set) or$(go env GOPATH)/bin(which defaults to~/go/bin). Copy it to a system path sosudo spankworks. For example, with the default Go settings: ``bash sudo cp "$(go env GOPATH)/bin/spank" /usr/local/bin/spank``
Usage
# Normal mode — says "ow!" when slapped
sudo spank
# Sexy mode — escalating responses based on slap frequency
sudo spank --sexy
# Halo mode — plays Halo death sounds when slapped
sudo spank --halo
# Fast mode — faster polling and shorter cooldown
sudo spank --fast
sudo spank --sexy --fast
# Custom mode — plays your own MP3 files from a directory
sudo spank --custom /path/to/mp3s
# Adjust sensitivity with amplitude threshold (lower = more sensitive)
sudo spank --min-amplitude 0.1 # more sensitive
sudo spank --min-amplitude 0.25 # less sensitive
sudo spank --sexy --min-amplitude 0.2
# Set cooldown period in millisecond (default: 750)
sudo spank --cooldown 600
# Set playback speed multiplier (default: 1.0)
sudo spank --speed 0.7 # slower and deeper
sudo spank --speed 1.5 # faster
sudo spank --sexy --speed 0.6
Modes
Pain mode (default): Randomly plays from 10 pain/protest audio clips when a slap is detected.
Sexy mode (--sexy): Tracks slaps within a rolling 5-minute window. The more you slap, the more intense the audio response. 60 levels of escalation.
Halo mode (--halo): Randomly plays from death sound effects from the Halo video game series when a slap is detected.
Custom mode (--custom): Randomly plays MP3 files from a custom directory you specify.
Detection tuning
Use --fast for a more responsive profile with faster polling (4ms vs 10ms), shorter cooldown (350ms vs 750ms), higher sensitivity (0.18 vs 0.05 threshold), and larger sample batch (320 vs 200).
You can still override individual values with --min-amplitude and --cooldown when needed.
Sensitivity
Control detection sensitivity with --min-amplitude (default: 0.05):
- Lower values (e.g., 0.05-0.10): Very sensitive, detects light taps
- Medium values (e.g., 0.15-0.30): Balanced sensitivity
- Higher values (e.g., 0.30-0.50): Only strong impacts trigger sounds
The value represents the minimum acceleration amplitude (in g-force) required to trigger a sound.
Running as a Service
To have spank start automatically at boot, create a launchd plist. Pick your mode:
<details> <summary>Pain mode (default)</summary>
sudo tee /Library/LaunchDaemons/com.taigrr.spank.plist > /dev/null << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.taigrr.spank</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/spank</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/spank.log</string>
<key>StandardErrorPath</key>
<string>/tmp/spank.err</string>
</dict>
</plist>
EOF
</details>
<details> <summary>Sexy mode</summary>
sudo tee /Library/LaunchDaemons/com.taigrr.spank.plist > /dev/null << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.taigrr.spank</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/spank</string>
<string>--sexy</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/spank.log</string>
<key>StandardErrorPath</key>
<string>/tmp/spank.err</string>
</dict>
</plist>
EOF
</details>
<details> <summary>Halo mode</summary>
sudo tee /Library/LaunchDaemons/com.taigrr.spank.plist > /dev/null << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.taigrr.spank</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/spank</string>
<string>--halo</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/spank.log</string>
<key>StandardErrorPath</key>
<string>/tmp/spank.err</string>
</dict>
</plist>
EOF
</details>
Note: Update the path tospankif you installed it elsewhere (e.g.~/go/bin/spank).
Load and start the service:
sudo launchctl load /Library/LaunchDaemons/com.taigrr.spank.plist
Since the plist lives in /Library/LaunchDaemons and no UserName key is set, launchd runs it as root — no sudo needed.
To stop or unload:
sudo launchctl unload /Library/LaunchDaemons/com.taigrr.spank.plist
How it works
- Reads raw accelerometer data directly via IOKit HID (Apple SPU sensor)
- Runs vibration detection (STA/LTA, CUSUM, kurtosis, peak/MAD)
- When a significant impact is detected, plays an embedded MP3 response
- Optional volume scaling (
--volume-scaling) — light taps play quietly, hard slaps play at full volume - Optional speed control (
--speed) — adjusts playback speed and pitch (0.5 = half speed, 2.0 = double speed) - 750ms cooldown between responses to prevent rapid-fire, adjustable with
--cooldown
Star History
Credits
Sensor reading and vibration detection ported from olvvier/apple-silicon-accelerometer.
License
MIT
<!-- Links --> [readme-zh-link]: ./README-zh.md