# Changelog

All notable changes to YouAreNotCrazy are documented here.

## [1.1.0] (2026-07-27)

### Added

- **Capture slots.** Six named slots along the bottom of the window store a
  detection threshold, detection mode and the reading that was on screen, under
  a name like "Desk" or "From couch", so you can switch between rooms,
  instruments or mic positions without re-tuning and compare what each one
  measured. Each slot shows its saved offset and hit count. Click an empty slot
  to save, click a saved slot to load, click the loaded slot again to overwrite
  it, right-click for rename / clear. Captures are stored per machine, not per
  project, so they follow you into every session.
- **The recommendation is no longer withheld.** It appears as soon as 8 hits
  have been collected, qualified with its uncertainty (`±X.X ms`) and a "still
  settling" note if it is still moving, rather than hiding behind "Collecting
  measurements" indefinitely.
- **Usage mode (Recording / On a Track).** The plugin cannot tell by itself
  whether it is listening to a live input or sitting on an already-recorded
  track, because both look identical. Set it to "On a Track" and the advice changes
  from "set your DAW recording latency to X ms" to "shift this track left
  (earlier) X ms (N samples)", with the direction and a sample count.
- **Grid selector (1/4, 1/8, 1/16).** Choose the note value you are actually
  playing. See the fix below for why this matters.
- **"Update available" button.** An amber badge appears in the control strip
  when `version.txt` advertises a newer build, and opens brucejames.studio.
  It reuses the promo banner's existing fetch, so it adds no network call, and
  the result is cached so the badge still shows when offline. An optional
  `YouAreNotCrazy-<win|macOS|linux>:` line supersedes the plain
  `YouAreNotCrazy:` line for that platform, so a build cut for one OS can be
  offered to only those users.
- **A user guide now ships with the plugin** on all three platforms, as
  `YouAreNotCrazy User Guide.html` (Windows also gets a Start Menu shortcut).
  It is generated from `USERGUIDE.md` by `installer/make_userguide_html.py`, so
  the markdown stays the source of truth. HTML rather than the markdown source
  because a `.md` opens in a text editor with the syntax showing.
- **Linux support.** VST3 and CLAP, with an `install.sh` (per-user or
  `--system`) and a `.tar.gz` packaging script.
- **AAX support** for Pro Tools on macOS and Windows, built via `-DBUILD_AAX=ON`
  and PACE-signed during packaging, matching the convention used across the
  rest of the plugin line.

### Fixed: measurement accuracy

- **The threshold slider no longer changes your measurement.** Detection used
  to fire on the first raw sample to cross the threshold, which happens further
  into a note's attack the higher you set it, so adjusting sensitivity shifted
  the reported offset by milliseconds. Detection now runs on a peak-follower
  envelope with instant attack, and on a crossing it walks back through recent
  envelope history to where the signal was still near silence, reporting the
  *start* of the hit instead of the crossing point.
- **Playing anything other than quarter notes no longer poisons the average.**
  Hits were always rounded to the nearest whole quarter note, so at 120 BPM an
  8th-note off-beat scored as a ~250 ms error and was still inside the accept
  window. Hits are now measured against the selected grid, and the accept
  window is relative to that grid rather than a flat 450 ms.
- **The onset cooldown expired at double speed in "Both" mode**, because it was
  decremented once in the block loop and again inside the audio detector. It is
  now a single sample-accurate deadline shared by the MIDI and audio paths, so
  a MIDI note and the audio transient from the same hit can no longer both be
  counted.
- **The cooldown is now tempo-relative** (half a grid interval, capped at
  250 ms). The old fixed 250 ms window silently discarded most 16th notes.
- **A single stray transient no longer moves the recommendation.** The average
  and standard deviation are computed over a trimmed set with the extremes
  dropped, instead of a plain mean over everything.
- **Most players could never reach a recommendation.** Readings were only
  trusted once the standard deviation of individual hits dropped below 5 ms,
  but normal human timing jitter is 10 to 25 ms, so the plugin sat on
  "Collecting measurements" forever even with a full history. Confidence is now
  judged on the standard error of the mean (how well the *average* is pinned
  down) rather than the spread of individual hits, and the history holds 64
  hits instead of 32 so the estimate keeps improving.
- **Division by zero when a host reported a tempo of 0** while relocating.
- **The detector no longer carries stale state across a transport stop**, which
  could produce a spurious reading on the first hit after restarting playback.
- Loaded plugin state is now range-checked, so a corrupt or truncated project
  can't leave the plugin in an invalid mode.

### Fixed: build and packaging

- **`installer/build_mac.sh` had CRLF line endings, including its `#!/bin/bash`
  shebang, which fails on macOS with a "bad interpreter" error.** Converted to
  LF and added a `.gitattributes` rule so a Windows checkout cannot reintroduce
  it.
- **JUCE was not tracked by the repository at all.** It was listed in
  `.gitignore` and was not a submodule, so a fresh clone could not build on any
  platform. It is now a proper submodule pinned to a commit verified present on
  its remote.
- Network requests now run on a single owned, cancellable background thread
  that is cancelled and joined on teardown, instead of two detached threads. A
  detached request thread can outlive the plugin during a host scan. Connection
  timeouts reduced from 8 s to 3 s.
- `VST3_AUTO_MANIFEST FALSE` is now set, because the post-build manifest
  helper can deadlock on DLL unload under the Windows loader lock. The
  installer no longer references the `moduleinfo.json` it stopped producing.
- HTTPS now works on Linux. JUCE's native Linux socket has no TLS, so the build
  links curl there, and only there, since Windows and macOS use the OS stack.
- The first-use ping now sends the `fingerprint` and `os` keys the server
  expects, using a machine id that stays stable across Rosetta/native slices
  and OS updates.
- `.gitignore` now covers every build tree (`build-*/`) and static libraries,
  and no longer tracks build artifacts under `installer/Output/`.

## [1.0.0]

Initial release.
