A tiny native macOS app that uploads audio files to SoundCloud when you drop
them on the dock icon. First-run onboarding handles SoundCloud sign-in,
public/private default, and whether to use the original filename or generate a
random adjective-noun-NNNN track name.
-
Register a SoundCloud API app at https://developers.soundcloud.com/ and wait for approval. Set the redirect URI to exactly:
scdrop://oauth/callback -
Install XcodeGen (used to generate the Xcode project from
project.yml):brew install xcodegen
-
Create a local secrets file from the template and fill in the values from your SoundCloud app:
cp Secrets.example.xcconfig Secrets.xcconfig
Then edit
Secrets.xcconfigand set:SC_CLIENT_IDSC_CLIENT_SECRET
Leave
SC_REDIRECT_SCHEMEandSC_REDIRECT_HOST_PATHat their defaults unless you registered a different redirect URI. -
Generate the Xcode project:
xcodegen
-
Open and run:
open "SC Drop.xcodeproj"Build & run the
ScDropscheme. On first launch you'll be walked through sign-in and your defaults.
- Drag any audio file onto the SC Drop dock icon. SC Drop will upload it with your saved sharing and naming defaults and post a notification. Clicking the notification opens the track on SoundCloud.
- You can also drop files directly into the open SC Drop window.
- Sharing and naming defaults can be changed any time from the main window.
- "Sign out" in the footer wipes tokens and re-runs onboarding.
Finder drop on dock icon
-> AppDelegate.application(_:open:)
-> UploadCoordinator.enqueue
-> SoundCloudUploader (multipart POST /tracks, auto-refresh on 401)
-> UNUserNotification with the resulting track URL
OAuth uses the standard SoundCloud OAuth 2.1 + PKCE authorization code flow
via ASWebAuthenticationSession, which presents the sign-in page in a system
Safari-managed window. This means popups for federated providers (Apple,
Google, etc.) work, and the user's existing SoundCloud cookies are reused.
The window size is controlled by the OS and cannot be customised. Access and
refresh tokens are stored in the macOS Keychain.
- project.yml — XcodeGen spec (project name
SC Drop, target nameScDrop) - Secrets.example.xcconfig — credential template
- ScDrop/Info.plist — declares audio document types and the
scdrop://URL scheme - ScDrop/App/ —
@main,AppDelegate, root routing,UploadCoordinator - ScDrop/Auth/ — OAuth flow (ASWebAuthenticationSession), Keychain
- ScDrop/Upload/ — multipart upload to
/tracks - ScDrop/Naming/ — random name generator + word list
- ScDrop/Settings/ —
@AppStorage-backed preferences - ScDrop/Notifications/ —
UNUserNotificationCenterwrapper - ScDrop/Resources/ — bundled assets (welcome animation)
- ScDrop/Views/ — Onboarding and main window UI
The on-disk source folder stays named ScDrop/ because the bundle identifier
(com.scdrop.ScDrop), Swift class names, and URL scheme (scdrop://) all need
to be space-free identifiers. Anything user-visible — display name, window
title, prose — uses "SC Drop".
Building a notarized .app colleagues can launch without Gatekeeper warnings:
-
Developer ID Application certificate must be in your login keychain. Create it via Xcode -> Settings -> Accounts -> your Apple ID -> Manage Certificates -> + -> "Developer ID Application".
-
App-specific password for notarization: https://appleid.apple.com -> Sign-In and Security -> App-Specific Passwords.
-
Store the notary credentials in the keychain so the script never asks you for the password again:
xcrun notarytool store-credentials scdrop-notary \ --apple-id "you@example.com" \ --team-id YOUR_TEAM_ID \ --password "abcd-efgh-ijkl-mnop"
YOUR_TEAM_IDis the same 10-character value you put inSecrets.xcconfigasDEVELOPMENT_TEAM. -
Build, sign, notarize, staple, zip in one shot:
./scripts/dist.sh
This produces
build/SC Drop.zip. Hand that to a colleague: they unzip, dragSC Drop.appto /Applications, and double-click. No Gatekeeper warning.
The script preflights both the certificate and the keychain profile, so if
either is missing it tells you what to fix before doing any work. Override
the profile name with NOTARY_PROFILE=other-name ./scripts/dist.sh if you
already use a different one.
- Distribution is not configured. The app builds with ad-hoc signing and the Hardened Runtime / App Sandbox are off, which keeps Finder drag-on-icon and network access trivially working for personal use. Add the Hardened Runtime, signing, and notarization before sharing builds outside your machine.
Secrets.xcconfigis gitignored and must never be committed.