Skip to content

Commit 3aa347f

Browse files
Make the setup wizard do the work, and correct the macOS launch advice
The wizard explained the workflow but performed none of it, which made it a tour rather than setup. Each step now previews a real operation against the real library and offers to run it: clean up tags, collapse duplicate copies, file everything by genre and write the playlists, and gather tracks that need Mixed In Key into 'To Be Processed'. Every step is skippable and shows counts before it touches anything, and the run is wrapped in a testing session by default so a first pass can be undone in one go. Also corrects the macOS instructions, which were wrong. Approving the app in System Settings is sufficient; clearing the quarantine flag is not needed. The proof is that a still-fully-quarantined copy (453 flagged files) runs fine once approved. The earlier diagnosis mistook the symptom: a blocked launch leaves a process parked in dyld, and opening the app again just fronts that stuck copy instead of starting a working one, so it looks like approval did nothing. The fix is to quit the bouncing icon and open it again. The first-run helper script is therefore removed - it addressed a problem that was not the problem, and told people to run a command they do not need. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent 8fed8ca commit 3aa347f

6 files changed

Lines changed: 420 additions & 188 deletions

File tree

.github/workflows/release.yml

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -89,19 +89,17 @@ jobs:
8989
## Installing
9090
9191
**macOS** — the app is signed ad-hoc, not notarised (notarising needs a
92-
paid Apple Developer account). macOS therefore quarantines every file
93-
inside the bundle on download. Approving the app in System Settings only
94-
clears the outer one, so it will **bounce in the Dock and never open a
95-
window** until the flag is cleared from the whole bundle.
92+
paid Apple Developer account), so macOS blocks the first launch.
9693
97-
Unzip, then either double-click `Sortero-first-run.command` (included), or
98-
run once:
94+
1. Drag `Sortero.app` where you want it; Applications is fine.
95+
2. Open it once — macOS refuses, and it may bounce in the Dock with no
96+
window.
97+
3. **System Settings → Privacy & Security**, scroll to Security, click
98+
**Open Anyway**.
99+
4. **Quit the bouncing icon if it's still there**, then open it again.
99100
100-
```
101-
xattr -dr com.apple.quarantine /Applications/Sortero.app
102-
```
103-
104-
Then open it normally. Only needed once per download.
101+
Step 4 matters: the blocked launch leaves a stuck process behind, and
102+
opening the app again just brings that one to the front. Once per download.
105103
106104
**Windows** — unzip and run `Sortero.exe`. SmartScreen may warn about an
107105
unknown publisher; choose More info → Run anyway.

README.md

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -122,24 +122,21 @@ from the [Releases page](../../releases):
122122
| Windows | `Sortero-windows-x86_64.zip` |
123123
| Linux | `Sortero-linux-x86_64.zip` |
124124

125-
### macOS: clear the quarantine flag first
125+
### macOS: first launch
126126

127127
Builds are signed ad-hoc, not notarised — notarising requires a paid Apple
128-
Developer account. macOS stamps a quarantine flag on the app **and on every one
129-
of the ~450 files inside it** when you download the zip. Approving the app in
130-
System Settings only clears the outer bundle, so the dynamic loader stalls on
131-
the nested libraries: **the app bounces in the Dock and no window ever appears.**
132-
Right-click → Open does not fix this.
133-
134-
Unzip, then either double-click the included `Sortero-first-run.command`, or run:
135-
136-
```bash
137-
xattr -dr com.apple.quarantine /Applications/Sortero.app
138-
```
139-
140-
Then open Sortero normally. Only needed once per download. If Sortero is in
141-
`/Applications`, macOS may ask permission before another program can modify apps
142-
there — approve it, or run the app from `~/Downloads` instead.
128+
Developer account — so macOS blocks the first launch.
129+
130+
1. Drag `Sortero.app` wherever you want it; Applications is fine.
131+
2. Open it once. macOS refuses, and the icon may bounce in the Dock without a
132+
window appearing.
133+
3. **System Settings → Privacy & Security**, scroll to Security, click
134+
**Open Anyway** next to Sortero.
135+
4. **Quit the bouncing icon if it's still there**, then open Sortero again.
136+
137+
Step 4 matters: the blocked launch leaves a stuck process behind, and while it's
138+
running, opening the app again just brings that stuck copy to the front rather
139+
than starting a working one. Only needed once per download.
143140

144141
**Windows** — SmartScreen may warn about an unknown publisher; More info → Run anyway.
145142
**Linux** — needs Tk (`apt install python3-tk`).

build/Sortero-first-run.command

Lines changed: 0 additions & 49 deletions
This file was deleted.

build/build_app.py

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,6 @@ def main():
9696
arch = "-".join(arches) or "unknown"
9797
zip_path = os.path.join(DIST, f"Sortero-macOS-{arch}.zip")
9898

99-
# Ship the first-run helper beside the app. Downloading the zip stamps
100-
# com.apple.quarantine on every file inside the bundle, and approving
101-
# the app in System Settings only clears the outer one - the loader
102-
# then stalls on the nested libraries and no window appears.
103-
helper_src = os.path.join(BUILD, "Sortero-first-run.command")
10499
payload = os.path.join(DIST, "Sortero")
105100
# --windowed also leaves a onedir build at dist/Sortero. The .app is
106101
# self-contained, so that folder is dead weight - drop it before reusing
@@ -109,26 +104,24 @@ def main():
109104
shutil.rmtree(payload)
110105
os.makedirs(payload)
111106
shutil.move(app, os.path.join(payload, "Sortero.app"))
112-
if os.path.exists(helper_src):
113-
helper_dst = os.path.join(payload, "Sortero-first-run.command")
114-
shutil.copy2(helper_src, helper_dst)
115-
os.chmod(helper_dst, 0o755)
116107
readme = os.path.join(payload, "READ ME FIRST.txt")
117108
with open(readme, "w") as fh:
118109
fh.write(
119110
"Sortero for macOS\n"
120111
"=================\n\n"
121-
"Sortero is signed ad-hoc, not notarised, so macOS quarantines every\n"
122-
"file inside the app when you download it. Approving the app in System\n"
123-
"Settings only clears the outer bundle, and the app will bounce in the\n"
124-
"Dock without ever opening a window.\n\n"
125-
"To fix that, once:\n\n"
126-
" 1. Drag Sortero.app wherever you want it (Applications is fine).\n"
127-
" 2. Double-click 'Sortero-first-run.command'.\n\n"
128-
"Or run this in Terminal:\n\n"
129-
" xattr -dr com.apple.quarantine /Applications/Sortero.app\n\n"
130-
"After that, open Sortero normally. You only need to do this once per\n"
131-
"download.\n")
112+
"Sortero is signed ad-hoc rather than notarised (notarising needs a paid\n"
113+
"Apple Developer account), so macOS blocks the first launch.\n\n"
114+
" 1. Drag Sortero.app wherever you want it - Applications is fine.\n"
115+
" 2. Open it once. macOS will refuse, and the icon may bounce in the\n"
116+
" Dock without a window appearing.\n"
117+
" 3. Go to System Settings > Privacy & Security, scroll to Security,\n"
118+
" and click 'Open Anyway' next to Sortero.\n"
119+
" 4. Quit the bouncing icon if it is still there, then open Sortero\n"
120+
" again. It will start normally.\n\n"
121+
"Step 4 matters: the blocked launch leaves a stuck process behind, and\n"
122+
"while it is running, opening the app again just brings it to the front\n"
123+
"instead of starting a working copy.\n\n"
124+
"You only need this once per download.\n")
132125

133126
print("==> zipping (ditto preserves the bundle)")
134127
subprocess.run(["ditto", "-c", "-k", "--sequesterRsrc", "--keepParent",

sortero/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.3.1"
1+
__version__ = "0.3.2"

0 commit comments

Comments
 (0)