Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
f4899ae
fix: harden playback lifecycle, metadata, and accessibility (WIP from…
Sep 25, 2026
94bfb57
feat(theme): contrast-safe semantic tokens and Increase Contrast support
Sep 26, 2026
832a0a0
fix(theme): leave the menu bar status item on the system appearance
Sep 26, 2026
1eabc21
fix(export): keep export names visible and extractable on Windows
Sep 26, 2026
9852c09
fix(export): align limited mixes and keep the time/pitch tail
Sep 26, 2026
be87d35
fix(export): stop 24-bit stem exports from hard-clipping
Sep 26, 2026
57c6ecc
feat(export): report render progress and store ZIP entries
Sep 26, 2026
bd5667e
fix(export): flag non-ASCII stem ZIP names as UTF-8
Sep 26, 2026
c518669
fix(export): keep staging copies out of the export folder; stop zip o…
Sep 26, 2026
d10f8f8
fix(library): keep the library in Isolate's own SwiftData store
Sep 26, 2026
ebd6547
fix(app): confirm quit mid-work and reopen the main window from the m…
Sep 26, 2026
d55c4d9
fix(now-playing): keep numeric titles and stop republishing every second
Sep 26, 2026
0092651
fix(library): make search, Next/Previous and folder headers match the…
Sep 26, 2026
b22987a
fix(ui): keep Escape and deletion from interrupting a separation
Sep 26, 2026
1b8ae6d
fix(install): offer the move for translocated downloads and never ove…
Sep 26, 2026
9deec6d
fix(design): theme tokens for library and modals, spoken errors, styl…
Sep 26, 2026
877e450
test: cover the shell fixes with hosted regression tests
Sep 26, 2026
d6415d7
perf(separation): read the model output buffer once per chunk
Sep 26, 2026
926a449
fix(audio): downmix surround sources and reject truncated decodes
Sep 26, 2026
e70c259
fix(separation): report unusable models, cancel during load, release …
Sep 26, 2026
e89e6a2
fix(separation): sweep abandoned staging, preflight disk space, fetch…
Sep 26, 2026
29d8969
fix(import): name batch failures, expose batch progress, accept folders
Sep 26, 2026
e666434
fix(audio): start stems together and pause through the engine
Sep 26, 2026
60ce9e2
fix(audio): keep loops and mixes across reselection and bad entries
Sep 26, 2026
59747b7
fix(meters): analyse whole tap buffers and blank stems during compare
Sep 26, 2026
b2b041d
fix(metadata): decode artwork and probe the source off the main actor
Sep 26, 2026
a222344
fix(settings): scroll the full shortcut list and use theme tokens
Sep 26, 2026
637e224
fix(fader): restore thumb hover and keep red for the clip LED
Sep 26, 2026
e550045
fix(player): fit the header and transport, fix controls and accessibi…
Sep 26, 2026
3e88129
test(ui): cover HUD fit, transport density, resets and shortcuts
Sep 26, 2026
d0e064a
fix(export): name exports truthfully and snapshot before the save panel
Sep 26, 2026
7c30d96
Merge fix/exporter into launch/v1.3.0
Sep 26, 2026
f41d75e
Merge fix/separation into launch/v1.3.0
Sep 26, 2026
f57a8d1
Merge fix/engine into launch/v1.3.0
Sep 26, 2026
37fe2cd
Merge fix/shell into launch/v1.3.0
Sep 26, 2026
6e71b72
Merge fix/ui into launch/v1.3.0
Sep 26, 2026
97ea878
fix: wire cross-cluster export, import, and loop behavior
Sep 26, 2026
bafaf86
fix(ui): make switches, tabs, and toast dismiss clickable across thei…
Sep 26, 2026
7b18ab3
fix(window): open at the intended size on first launch and remember it
Sep 26, 2026
107579f
chore(release): set version 1.3.0 and describe folder access
Sep 26, 2026
987c0eb
chore(git): stop tracking Xcode user state and ignore release archives
Sep 26, 2026
3a1f0d1
fix(release): check the version before building and harden ad-hoc builds
Sep 26, 2026
03ed014
fix(scripts): accept an uppercase model checksum and name the mismatch
Sep 26, 2026
2172bd6
fix(install): explain installer failures instead of printing raw errors
Sep 26, 2026
fcd77f1
fix(scripts): render icon and DMG background at exact pixel sizes
Sep 26, 2026
60fa302
ci(release): fail fast on version mismatch and draft user-facing notes
Sep 26, 2026
97b031b
ci: run real inference when the model is available and test on macOS 26
Sep 26, 2026
30f57ec
chore(cask): add first-launch caveats, livecheck and complete zap
Sep 26, 2026
9271c0c
docs: rewrite the README for the v1.3.0 launch and add a changelog
Sep 26, 2026
7fbb353
docs: update install and troubleshooting guides for v1.3.0
Sep 26, 2026
89d1971
test: add shared waits, fixtures and a model gate for hardening tests
Sep 26, 2026
7f3b3ca
test: replace fixed sleeps with condition waits in regression suites
Sep 26, 2026
7ad1146
test: make vacuous IsolateTests assertions check real behavior
Sep 26, 2026
a9351bd
test: cover new imports, stem order, tags, rendered EQ and device cha…
Sep 26, 2026
789f963
test: check model output across chunk boundaries and stem order
Sep 26, 2026
0b27ec5
test(ui): wait for state changes and cover new export, loop and Escap…
Sep 26, 2026
9972c88
docs: describe the current engine, import transaction and library store
Sep 26, 2026
a9057d5
docs: document the hosted model archive and the v1.3.0 release process
Sep 26, 2026
b9ec2df
docs: align design, roadmap and notices with the shipped app
Sep 26, 2026
e64009a
docs: state the measured installed size
Sep 26, 2026
1f2ba46
test(ui): report which conditional UI checks ran
Sep 26, 2026
aa80431
chore(github): add a bug report form that points to first-launch help
Sep 26, 2026
194588c
docs: describe the measured memory footprint precisely
Sep 26, 2026
032f0f9
perf(meters): give each stem its own observable meter read by leaf views
Sep 26, 2026
4352186
perf(hud): draw the 32-band spectrum in one Canvas
Sep 26, 2026
a76fc5b
perf(engine): hold back meter and timecode updates while the player i…
Sep 26, 2026
cb5dd66
test: cover per-stem meters, hidden-player gating, spectrum Canvas an…
Sep 26, 2026
5be0718
Merge wave2/release-docs into launch/v1.3.0
Sep 26, 2026
6aa441e
Merge wave2/perf into launch/v1.3.0
Sep 26, 2026
b303a59
Merge wave2/tests into launch/v1.3.0
Sep 26, 2026
3711e45
docs: add real app screenshots and social preview; complete icon sizes
Sep 26, 2026
0c52f60
fix: keep stems aligned and mixes on time on macOS 15
Sep 26, 2026
018d00c
fix(audio): start stems on one render-timeline frame
Sep 26, 2026
c824ef2
fix(separation): verify the model separates correctly before using it
Sep 26, 2026
ae34480
docs: document the macOS 14/15 model check and render-timeline start
Sep 26, 2026
63492ae
fix(audio): anchor the synchronized start to real time and verify it
Sep 26, 2026
b6013c5
fix(release): reliable hardened-runtime check, macOS 26 release gate,…
Sep 26, 2026
5ab2512
fix(import): prefetch one iCloud file ahead and wait out a separation…
Sep 26, 2026
be93b83
fix(cache): lock live staging so another running copy does not sweep it
Sep 26, 2026
d02f0e3
perf(library): build folder labels in linear time and reuse them
Sep 26, 2026
d13e935
fix(player): export state for VoiceOver, marquee widths, HUD polish
Sep 26, 2026
f79d6a4
test(ui): cover export announcements, folder labels and HUD fixes
Sep 26, 2026
a5aafbc
fix(library): never strand the library in a backup, and search artist…
Sep 26, 2026
2463ff7
fix(shell): always answer a deferred quit, cancel exports at quit, ha…
Sep 26, 2026
dc35f71
test: cover library recovery, search, legacy retry, quit replies and …
Sep 26, 2026
0cc518d
fix(audio): start seeks and loop wraps three IO cycles after the newe…
Sep 26, 2026
4fcf1da
fix(audio): replay a finished track when its row is selected again
Sep 26, 2026
2e3f24c
fix(export): keep the destination when an export is cancelled after r…
Sep 26, 2026
227045b
fix(audio): keep the Mac awake while stems are separated or exported
Sep 26, 2026
b54c0f3
test(engine): wait for the short track to end instead of a fixed 1.6 s
Sep 26, 2026
e980fd4
Merge final/separation into launch/v1.3.0
Sep 26, 2026
78f95e2
Merge final/engine into launch/v1.3.0
Sep 26, 2026
9395768
Merge final/library into launch/v1.3.0
Sep 26, 2026
4510bcf
Merge final/ui into launch/v1.3.0
Sep 26, 2026
375f702
fix(ui): add File › Cancel Export; docs: match the final-wave behavior
Sep 26, 2026
4b217a6
docs(release): mention the macOS 26 recommendation in release notes
Sep 26, 2026
13472da
test: keep a HUD layout test within Xcode 26.3's type-check limits
Sep 26, 2026
42398cc
fix: verify model and audio paths for v1.3.0 launch
Sep 26, 2026
e458e3f
ci: run model tests in release configuration
Sep 26, 2026
de11929
ci: use compatibility icon on macOS 15 runner
Sep 26, 2026
9d55c2d
Polish drag install and clarify system requirements
Sep 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: Bug report
description: Something in Isolate doesn't work as expected
labels: [bug]
body:
- type: markdown
attributes:
value: |
Thanks for reporting a problem. If macOS won't open Isolate, see [First launch](https://github.com/neokumar1/Isolate#first-launch); many other problems are covered in [Troubleshooting](https://github.com/neokumar1/Isolate/blob/main/TROUBLESHOOTING.md).
- type: input
id: version
attributes:
label: Isolate version
description: Shown in About Isolate.
placeholder: "1.3.0"
validations:
required: true
- type: input
id: macos
attributes:
label: macOS version and Mac model
placeholder: "macOS 15.6, MacBook Air M2"
validations:
required: true
- type: textarea
id: steps
attributes:
label: What did you do?
description: The steps that lead to the problem.
placeholder: |
1. Imported a 4-minute FLAC file with ⌘O
2. ...
validations:
required: true
- type: textarea
id: result
attributes:
label: What happened, and what did you expect?
description: Include the exact message Isolate showed, if any.
validations:
required: true
- type: input
id: audio
attributes:
label: Audio file details
description: Format, sample rate, channels and length, if the problem involves a song. Please don't attach copyrighted or private audio.
placeholder: "FLAC, 48 kHz, stereo, 4:05"
8 changes: 8 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
blank_issues_enabled: true
contact_links:
- name: macOS won't open Isolate
url: https://github.com/neokumar1/Isolate#first-launch
about: Releases are ad-hoc signed; approve the first launch in System Settings › Privacy & Security.
- name: Troubleshooting guide
url: https://github.com/neokumar1/Isolate/blob/main/TROUBLESHOOTING.md
about: Model errors, iCloud Drive files, disk space, stuck imports, library backups and exports.
51 changes: 43 additions & 8 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ on:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch:

permissions:
contents: read
Expand All @@ -15,26 +16,60 @@ concurrency:

jobs:
build:
runs-on: macos-15
timeout-minutes: 30
name: Build & Test (${{ matrix.runner }})
strategy:
fail-fast: false
matrix:
runner: [macos-15, macos-26]
runs-on: ${{ matrix.runner }}
timeout-minutes: 45
env:
# Pull requests from forks get no repository variables; they build and
# test without the model, and the inference tests skip.
ISOLATE_MODEL_ARCHIVE_URL: ${{ vars.ISOLATE_MODEL_ARCHIVE_URL }}
ISOLATE_MODEL_ARCHIVE_SHA256: ${{ vars.ISOLATE_MODEL_ARCHIVE_SHA256 }}
# macOS 15 checks safe refusal of its known-bad Core ML runtime. macOS 26
# must actually separate; an incompatible model there fails the build.
TEST_RUNNER_ISOLATE_ALLOW_INCOMPATIBLE_MODEL: ${{ matrix.runner == 'macos-15' && '1' || '0' }}
steps:
- uses: actions/checkout@v5
- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- run: brew install xcodegen
- run: xcodegen generate
- name: Check shell scripts and whitespace
- name: Generate Xcode project
run: |
bash -n install.sh scripts/package_release.sh scripts/fetch_release_model.sh
if [[ "${{ matrix.runner }}" == macos-15 ]]; then
ruby scripts/ci_legacy_icon.rb
xcodegen generate --spec project.ci-legacy.yml
else
xcodegen generate
fi
- name: Check scripts, version metadata and whitespace
run: |
for script in install.sh scripts/*.sh; do bash -n "$script"; done
ruby -c Casks/isolate.rb
bash scripts/check_version.sh
git diff --exit-code -- Info.plist
git diff --check
- name: Fetch and validate the pinned model
if: env.ISOLATE_MODEL_ARCHIVE_URL != '' && env.ISOLATE_MODEL_ARCHIVE_SHA256 != ''
run: |
bash scripts/fetch_release_model.sh
# Xcode forwards TEST_RUNNER_ variables to the tests, which then fail
# instead of skipping when the model cannot run.
echo "TEST_RUNNER_ISOLATE_REQUIRE_MODEL=1" >> "$GITHUB_ENV"
- name: Note skipped inference
if: env.ISOLATE_MODEL_ARCHIVE_URL == '' || env.ISOLATE_MODEL_ARCHIVE_SHA256 == ''
run: echo "::notice::The model variables are not available to this run, so Core ML inference tests will skip."
- name: Build Apple Silicon release
run: xcodebuild build -project Isolate.xcodeproj -scheme Isolate -configuration Release -destination 'platform=macOS,arch=arm64' -derivedDataPath build/DerivedData CODE_SIGNING_ALLOWED=NO
- name: Run unit and audio regression tests
run: xcodebuild test -project Isolate.xcodeproj -scheme Isolate -destination 'platform=macOS,arch=arm64' -derivedDataPath build/DerivedData -only-testing:IsolateTests CODE_SIGNING_ALLOWED=NO
# Exercise the release configuration already built above.
run: xcodebuild test -project Isolate.xcodeproj -scheme Isolate -configuration Release -destination 'platform=macOS,arch=arm64' -derivedDataPath build/DerivedData -only-testing:IsolateTests CODE_SIGNING_ALLOWED=NO ENABLE_TESTABILITY=YES
- name: Preserve test results
if: always()
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7.0.1
with:
name: test-results
name: test-results-${{ matrix.runner }}
path: build/DerivedData/Logs/Test/*.xcresult
51 changes: 33 additions & 18 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,30 @@ concurrency:

jobs:
release:
runs-on: macos-15
timeout-minutes: 45
# Core ML computes the model incorrectly on hosted macOS 14 and 15 (Isolate refuses to
# separate there), so the inference gate must run where separation is verified.
runs-on: macos-26
timeout-minutes: 60
env:
ISOLATE_MODEL_ARCHIVE_URL: ${{ vars.ISOLATE_MODEL_ARCHIVE_URL }}
ISOLATE_MODEL_ARCHIVE_SHA256: ${{ vars.ISOLATE_MODEL_ARCHIVE_SHA256 }}
TEST_RUNNER_ISOLATE_REQUIRE_MODEL: '1'
TEST_RUNNER_ISOLATE_ALLOW_INCOMPATIBLE_MODEL: '0'
RELEASE_TAG: ${{ github.ref_name }}
steps:
- uses: actions/checkout@v5
- name: Require a release tag
# Fail in seconds, before the model download and test run, when the tag,
# project.yml, Info.plist and CHANGELOG.md do not agree.
- name: Require a version tag that matches the app
env:
REF_TYPE: ${{ github.ref_type }}
run: test "$REF_TYPE" = tag
run: |
if [[ "$REF_TYPE" != tag ]]; then
echo "::error::Run this workflow from a version tag such as v1.3.0, not a branch."
exit 1
fi
bash scripts/check_version.sh "$RELEASE_TAG"
bash scripts/release_notes.sh "$RELEASE_TAG" > /dev/null
- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
Expand All @@ -36,31 +48,34 @@ jobs:
- name: Require passing tests including actual model inference
run: xcodebuild test -project Isolate.xcodeproj -scheme Isolate -destination 'platform=macOS,arch=arm64' -derivedDataPath build/DerivedData -only-testing:IsolateTests CODE_SIGNING_ALLOWED=NO
- name: Package release with bundled model
env:
RELEASE_TAG: ${{ github.ref_name }}
run: bash scripts/package_release.sh "$RELEASE_TAG"
- name: Write release notes
run: bash scripts/release_notes.sh "$RELEASE_TAG" > dist/RELEASE_NOTES.md
- name: Create draft for manual review
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@v3.0.3
with:
name: Isolate ${{ github.ref_name }}
body_path: dist/RELEASE_NOTES.md
files: |
dist/Isolate.dmg
dist/Isolate-${{ github.ref_name }}.dmg
dist/Isolate-${{ github.ref_name }}-macOS.zip
dist/SHA256SUMS.txt
fail_on_unmatched_files: true
generate_release_notes: true
draft: true
body: |
Apple Silicon · macOS 14+
Includes the validated Core ML separation model.

These CI artifacts are ad-hoc signed and are not notarized. Before publishing,
complete the platform and distribution checks in RELEASE.md. Download the DMG,
drag Isolate into Applications, and follow Apple's Privacy & Security guidance
if macOS requests explicit approval.
- name: Summarize maintainer checks
run: |
{
echo "### Draft release ${RELEASE_TAG} created"
echo "The artifacts are ad-hoc signed and not notarized. Before publishing, work through the publication checks in RELEASE.md,"
echo "then set the Homebrew cask's version and sha256 from the published Isolate.dmg."
echo
echo '```'
cat dist/SHA256SUMS.txt
echo '```'
} >> "$GITHUB_STEP_SUMMARY"
- name: Preserve test results
if: always()
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7.0.1
with:
name: release-test-results
path: build/DerivedData/Logs/Test/*.xcresult
11 changes: 6 additions & 5 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,14 @@ build/
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
xcuserdata/
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
*.xcresult

# SwiftPackageManager
.build/
Expand All @@ -28,14 +29,14 @@ Manifest.lock
*.swp
*~.nib

# Other
xcuserdata/

# CoreML Model Binaries (>100MB)
# CoreML Model Binaries (>100MB) and archives made from them
*.mlmodelc
*.mlpackage
*.mlmodel
/HTDemucs*

# Distribution Artifacts
dist/
*.dmg
*.zip
Assets/AppIcon.iconset/
Loading