# Build brief — a focused alternative to eqMac

> **Verdict:** Partly, if you narrow it · **Buildability:** 63/100 · **Category:** Audio
> **Source:** https://www.canitbevibecoded.com/eqmac
> Independent editorial assessment from Can It Be Vibe Coded? Not affiliated with, endorsed by, or derived from eqMac. Verify current pricing and capabilities before acting.

## Context

**eqMac** — A menu bar equalizer, volume booster and audio router that sits on top of everything macOS plays. It currently costs $3/mo.

The DSP is the easy part: a cascade of biquad filters driven by sliders is textbook, and an agent will write it correctly on the first try. The hard part is getting system audio into your process at all, which on macOS means a virtual output device and a Core Audio server plugin, signed and notarized, plus graceful handling of sample rate changes, device hotplug and headphone unplug. You can dodge most of that by installing BlackHole and building a loopback app that pulls from it and pushes to your real output, which is a genuine focused project and works fine on your own machine. What you will not match in a focused implementation is the invisible-ness: no driver install prompts, no latency you can hear, no manual switching every time you plug in AirPods. Good build, mediocre replacement for something you want to forget exists.

This brief describes a focused, single-operator replacement for the part of eqMac that is genuinely reproducible. It is deliberately narrower than the product it replaces, and it says so in writing. Build the useful core; do not pretend to have rebuilt the rest.

## What you are building

A SwiftUI menu bar app that captures system audio via a BlackHole virtual device, runs it through a multiband biquad EQ plus gain stage, and plays it back out to your chosen physical output with saveable presets.

- Record, edit, and export tracks with effects applied in a predictable order.
- A responsive interface with real empty, loading, success, and error states.

## Requirements

### Functional

- MacOS with Xcode and a Swift toolchain.
- BlackHole (or another virtual audio device) installed, e.g. via Homebrew.
- Willingness to set your system output to the virtual device and let the app do the routing.
- Microphone/audio permissions granted to the app.
- Basic tolerance for a few ms of added latency.

### Non-functional

- Accessibility: semantic markup, labelled controls, visible focus, and reduced-motion support.
- Security: server-side secrets, validated input, and no credentials in the client bundle.
- Reliability: retries with backoff on external calls, and a clear failure state when a provider is down.
- Portability: the operator can export their data and leave without losing it.

## Implementation brief

Build a macOS menu bar system audio equalizer in Swift, targeting macOS 13+, as an Xcode-less Swift Package with a SwiftUI app target is not possible, so scaffold a normal Xcode project via `xcodegen`-style project.yml or a plain SwiftPM executable using AppKit + SwiftUI if simpler. Pick one and commit to it.

Architecture:
- Assume a virtual audio device named "BlackHole 2ch" exists and is the current system output. Print clear setup instructions in the README, including the Homebrew install command, and fail with a readable error if the device is missing.
- Use AVAudioEngine: input node reads from the BlackHole aggregate/input device, output node writes to a user-selected physical output device enumerated via Core Audio (AudioObjectGetPropertyData on kAudioHardwarePropertyDevices).
- Insert a DSP chain between them: 10 band peaking EQ (31.25 Hz to 16 kHz, octave spaced) implemented as cascaded biquad peaking filters, plus a preamp gain stage with a soft clipper so boosting cannot produce digital clipping.
- Implement biquads yourself in a small `Biquad.swift` (RBJ cookbook coefficients), processed per channel in an AVAudioUnit tap or via AVAudioSourceNode. No third party DSP libraries.
- Handle sample rate: read the device's actual rate, recompute coefficients on change, and log rate mismatches instead of crashing.

UI:
- Menu bar extra (NSStatusItem) with a SwiftUI popover: 10 vertical sliders in dB (-12 to +12), a preamp slider, a master bypass toggle, and an output device picker.
- Named presets saved as JSON in ~/Library/Application Support/DIYEQ/presets.json. Ship Flat, Bass Boost, Vocal, Podcast.

Explicitly out of scope: writing our own Core Audio server plugin or driver, code signing and notarization, per-app volume, spatial audio, auto updates, telemetry, accounts, any network calls at all.

Deliver: working project, `make run` or an xcodebuild one-liner, and a README with the BlackHole setup steps, the known latency caveat, and how to restore normal audio if the app dies mid-session.

## Delivery standard

- Inspect the repository first, then write a short implementation plan before writing code.
- Deliver the smallest complete end-to-end workflow first; every primary control must work against persisted data.
- Use real validation and storage; never substitute fake dashboards, decorative controls, hard-coded success states, or mock integrations.
- Include responsive layouts plus genuine empty, loading, success, validation, and failure states.
- Keep secrets server-side in environment variables, provide .env.example, and never commit credentials or user data.
- Add structured logs around every external call and return actionable errors without leaking sensitive details.
- Write unit tests for the core logic and one automated test of the main user journey.
- Finish with a README covering setup, architecture, data location, backups, tests, deployment, and known limitations.

## Acceptance criteria

- [ ] A clean install starts the app using only the README and .env.example.
- [ ] The primary journey works from first visit through saved result, reload, edit, export, and deletion where applicable.
- [ ] Invalid input, missing configuration, provider failure, and an empty database each have a usable state.
- [ ] The interface works at 390px and 1440px, is keyboard navigable, and shows visible focus on every control.
- [ ] Tests, type checking, linting, and a production build all pass with no ignored failures.
- [ ] No part of the interface implies a live integration, security guarantee, or scale capability that was not actually built and verified.

## Non-goals

Do not build these, and do not claim to have replaced them:

- A first-party, notarized audio driver: you are borrowing someone else's virtual device instead.
- Automatic output-device following, so plugging in headphones means switching things by hand.
- Very low latency and rock-solid handling of sample rate mismatches and hotplug events.
- Extras like per-device presets, balance control, and a curated preset library.
- Updates, crash fixes, and someone else's problem when a macOS point release breaks audio.

## What you still own after launch

- Run migrations, backups, restores, and dependency updates.
- Test the critical journey after every model, API, or hosting change.
- Monitor failures and fix the edge cases a first prompt will miss.

## Risk

**Manageable.** A personal version is realistic if you test the critical journey and keep reliable backups.

Editorial confidence in this assessment: medium. No reviewed project implementation is linked yet.

---

Generated by [Can It Be Vibe Coded?](https://www.canitbevibecoded.com) · Full report: https://www.canitbevibecoded.com/eqmac
