Minimal macOS menu bar utility for routing the clean DI channel from a BOSS Katana USB device to the Mac built-in output with no intentional DSP.
v0.1.0 is the first working internal release.
Current validated setup:
- macOS 12.x on Intel Mac mini
- BOSS Katana USB input
Channel 3Mono -> Right- system output set to
Built-in Output/Headphones
- auto-detects the Katana input device by name
- routes one selected input channel to the built-in output
- supports
Mono -> Left,Mono -> Right, andMono -> Stereo - persists settings to
~/.katanadi.json - can install a LaunchAgent for
Start at Login - shows route state and live diagnostics in a menu bar app
- builds Intel, Apple Silicon, or universal
.appbundles
- audio effects or amp simulation
- recording
- arbitrary multi-device routing
- custom output device selection UI
- notarized/public macOS distribution
- macOS 12 or newer
- Swift toolchain with Swift Package Manager
- microphone permission granted to
KatanaDI - system output set to the built-in analog output
Important: the app currently renders through the macOS default output unit and explicitly expects that default output to be the built-in output device. If macOS shows Headphones, that is still the same built-in analog output when the 3.5 mm jack is occupied.
Run from source:
swift runBuild an Intel app bundle:
./scripts/build_intel_app.shBuild a universal app bundle:
./scripts/build_app.sh --arch universalArtifacts are written to dist/.
- Launch the app.
- Allow microphone access when macOS asks for it.
- Make sure macOS sound output is
Built-in OutputorHeadphones. - Open the menu bar item.
- For the known-good Katana Air setup, select
Channel 3andMono -> Right.
Without microphone permission the app can appear alive while receiving silence from CoreAudio input.
When routing is active, the menu shows live diagnostics:
Ring Buffer: current fill level and target fillSignal: input and output peak valuesCallbacks: input and output callback countersCorrections: underflows, overflows, dropped frames, duplicated frames
These values should move while playing. If they do not, check the troubleshooting guide.
The build scripts produce plain .app bundles with:
- generated
Info.plist - microphone usage description
- generated
.icnsapp icon - ad-hoc code signing when
codesignis available
Relevant scripts:
scripts/build_app.shscripts/build_intel_app.shscripts/generate_app_icon.swift
- App config:
~/.katanadi.json - LaunchAgent:
~/Library/LaunchAgents/com.oklabs.katanadi.plist
Start at Login uses a LaunchAgent. If the app is started from a bundle, the LaunchAgent reopens the .app. If it is started from a raw executable, the LaunchAgent launches that executable path directly.
- drift compensation is intentionally lightweight; long sessions still need more validation on real hardware
- no resampling path is implemented for incompatible sample rate combinations
- output routing is intentionally locked to the built-in output path for now
- no notarization, installer, or hardened distribution flow yet
- Product spec:
docs/PRD.md - Architecture notes:
docs/ARCHITECTURE.md - Troubleshooting:
docs/TROUBLESHOOTING.md