Releases: carlashley/loopdown
v2.0.3.RC4-swift
This will be the last RC before the final release. For the final release the Python version will be moved to a separate branch and will no longer be maintained. The Swift version will become the main branch; any future releases will be Swift only.
New features:
- Honor HTTP 429 status and some 5xx statuses
- Honor
Retry-Afterheaders for a period of up to five minutes; falls back to a default retry delay time - Speed up legacy package install checks by caching
pkginforesults - Ensure the
Logic Pro Library.bundledirectory in/Users/Sharedgets consistent and recursiveroot:wheelownership (only applies whenLogic Pro Library.bundleis installed to/Users/Sharedand remains readable for all users; when the bundle is installed to other locations you will need tochown -R user:groupthe bundle as a separate step with the desireduser:group)
Bug fixes:
- Correctly return all packages for consideration when in
downloadmode (fix for issue #20) - Fixed an issue that would cause managed dry-runs to terminate early because user is not root
A pre-compiled Universal2 binary is attached in the loopdown.zip file. The SHA-256 for the binary is:
0c428f3b29a54bddb55858fb7e05f6f9e32f24e82e2bfe4e071b9594f4b87ea2
Full Changelog: v2.0.3.RC3-swift...v2.0.3.RC4-swift
v2.0.3.RC3-swift
New features:
- Adds support for package delta updates for GarageBand and older versions of Logic Pro X and MainStage 3
Bug fixes:
- Fixes an issue where
downloadmode would check if a package was installed and exclude it from the download if it was
A pre-compiled Universal2 binary is attached in the loopdown.zip file. The SHA-256 for the binary is:
0c44d87ce376ea2cf6933b259fecd3233d0967515ef0c3cfcdf1e74117bbcac0
Full Changelog: v2.0.3.RC2-swift...v2.0.3.RC3-swift
v2.0.3.RC2-swift
New features:
- Added support for content database delta updates; this should ensure any content released subsequently to an app being released is detected and included in downloading/deploying modes (examples of this type of content are the Step Reflex Modern Garage Pack and Eko Soul Afrobeats Pack)
Full Changelog: v2.0.3.b4-swift...v2.0.3.RC2-swift
A pre-compiled Universal2 binary is attached in the loopdown.zip file.
v2.0.3.b4-swift
New features:
- Added
--legacy-onlyand--modern-onlyarguments to facilitate targeting only legacy or modern apps indeploymode; both arguments are exclusive, when neither are present both legacy and modern apps are targeted - Logging is no longer stored in
/Users/Shared/loopdown; it is now in: -
~/Library/Logs/com.github.carlashley.loopdown/for all modes except when deploying content without-n/--dry-run
-
/Library/Logs/com.github.carlashley.loopdown/for deploy runs without-n/--dry-run
- Only
-n/--dry-runand/or--log-levelarguments can be provided at the command line forloopdown deploy --managed; all other arguments must be provided via managed configuration (where the argument can be managed) - Tracks the outcome of all deployment runs where content is stored; this is for future use cases; this is stored in
/Library/Application Support/com.github.carlashley.loopdown - If a package fails to download (and/or install), both
downloadanddeploymodes will continue with the remaining packages, then loop back over any failed downloads/installs and try once again before logging failures - A minimum bandwidth threshold can be applied, where if the download speed over a rolling window of n seconds dips below the threshold, the download is aborted and the next is attempted
- Download/deploy runs can be aborted after a minimum of two or a maximum of five minimum bandwidth related failures occur
Fixes:
- Improved handling of transient network issues
Full Changelog: v2.0.3.b3-swift...v2.0.3.b4-swift
v2.0.3.b3-swift
New features:
- The modern content packs are deployed to a proper bundle file that has an internal bookmark that points to itself. Logic Pro and MainStage will use that on first launch. Copying an existing bookmark is no longer required. The default bundle parent directory is
/Users/Sharedbut this can be changed by specifying a new parent directory with-b/--library-dest. The bundle itself will always be calledLogic Pro Library.bundle.
Fixes:
- behaviour change:
-b/--library-destno longer creates a bundle with that name, it is now the parent directory. ALogic Pro Library.bundleis created in this directory. - Corrects the usage string for package selection flag requirements per #16
- Renames
-f/--force-deployto-f/--forcefor argument parity with the Python version
Full Changelog: v2.0.3.b2-swift...v2.0.3.b3-swift
v2.0.3.b2-swift
This is the Swift beta release of loopdown.
Feature parity should be the same as the current Python v2.0.3.b2 release, however arguments may differ, please use the help arguments for more information.
New features:
- supports deploying content packs for Logic Pro 12+ and MainStage 4+
--managedflag that can be used if an MDM profile is deployed for thecom.github.carlashley.loopdownpreferences domain (in theory using DDM to push a property list to/Library/Managed Preferences/com.github.carlashley.loopdown.plistshould also work)- ad-hoc code signature with identifier
Changes:
- The package selection flags have been modified to reflect the new essential, core, and optional content pack types; instead of using either/both
-r/--reqor-/--opt, the flags have been modified and expanded: -
-e/--essentialessential content packs (applies only to Logic Pro 12+ and MainStage 4+, this flag is ignored for all "legacy" versions of these apps, including GarageBand)
-
-r/--corethis replaces the-r/--reqflag for all "legacy" versions of these apps, including GarageBand; if this flag is used when deploying Logic Pro 12+ and/or MainStage 4+, this will cause it deploy the "legacy" required content packs that appear in the apps as available content
-
-o/--optionalreplaces-o/--optfor all other optional content packs
Known issues:
- Currently cannot determine if a content pack for either Logic Pro 12+ or MainStage 4+ is newer than the existing installed content pack.
General usage:
./loopdown -h
OVERVIEW: Manage additional content for Apple's audio applications, GarageBand, Logic Pro, and/or MainStage.
These arguments are supported in both 'deploy' and 'download' commands:
-n, --dry-run Perform a dry run.
-a, --app <app> Install content for an app (default: all supported apps).
-e, --essential Select essential content (Logic Pro 12+ and MainStage 4+ only).
-r, --core Select core content (equivalent to old -r, --req for Legacy apps).
-o, --optional Select optional content.
COMMENTS:
-e, --essential / -r, --core / -o, --optional one or more are required.
-a, --app is not required; omitting this will trigger content processing for all applicable apps installed.
USAGE: loopdown <subcommand>
OPTIONS:
--version Show the version.
-h, --help Show help information.
SUBCOMMANDS:
deploy Install content for selected apps; requires root level privilege.
download Download content for selected apps.
See 'loopdown help <subcommand>' for detailed help.
Deploy usage:
./loopdown deploy -h
OVERVIEW: Install content for selected apps; requires root level privilege.
By default, content for all installed applications is processed. Provide the '-a/--app' argument to only target specific applications.
Root privileges are required unless '-n/--dry-run' is specified.
Use '--managed' to drive all arguments from the com.github.carlashley.loopdown preferences domain (e.g. via MDM). Only '--dry-run' and cache discovery options may be combined with
'--managed'.
If you need to download content for a local mirror, use the 'download' command instead.
See 'loopdown download --help' for more information.
USAGE: loopdown deploy <options>
OPTIONS:
-n, --dry-run Perform a dry run.
-q, --quiet-run Suppress all console output.
--log-level <log-level> (values: trace, debug, info, notice, warning, error, critical; default: info)
-a, --app <app> Install content for an app (default: all supported apps).
(values: garageband, logicpro, mainstage)
-e, --essential Include essential audio packages (Logic Pro 12+ and MainStage 4+ only).
-r, --core Include core audio packages (equivalent to -r, --req for legacy applications).
-o, --optional Include optional content.
-f, --force-deploy Force install content packages regardless of existing install state.
-c, --cache-server <cache-server>
Caching server to use; 'auto' or http://host:port
-m, --mirror-server <mirror-server>
Mirror server base URL
--cache-auto-retries <n>
Maximum number of attempts when auto-discovering a caching server (default: 3). (default: 3)
--cache-retry-delay <seconds>
Seconds to wait between caching server auto-discovery attempts (default: 1). (default: 1)
--skip-signature-check Skip the pkgutil signature check on downloaded packages (legacy content only).
--managed Run using managed preferences from the com.github.carlashley.loopdown preferences domain.
When --managed is active, all deploy arguments are read from the com.github.carlashley.loopdown CFPreferences domain. Only --dry-run and
--cache-auto-retries/--cache-retry-delay may be combined with --managed; all other flags are ignored and their values must be set via the preferences domain.
Sane defaults are applied for any key absent from the domain:
apps all installed apps
essential true (when essential, core, and optional are all absent)
core true (when essential, core, and optional are all absent)
optional false
forceDeploy false
skipSignatureCheck false
logLevel info
cacheServer auto (when no server key is present)
dryRun false
libraryDest /Users/Shared/Logic Pro Library.bundle
-b, --library-dest <dir>
Destination directory for modern Logic Pro 12+ and MainStage 4+ content. (default: /Users/Shared/Logic Pro Library.bundle)
Used as the extraction target for modern content packages (.aar archives) and as the root under which receipt plists are read to determine install state. Default:
/Users/Shared/Logic Pro Library.bundle
--version Show the version.
-h, --help Show help information.
Download usage:
./loopdown download -h
OVERVIEW: Download content for selected apps.
By default, content for all installed applications is processed. Provide the '-a/--app` argument to only target specific applications.
Downloaded content is stored in /tmp/loopdown; use '-d/--dest <dir>' to override. The directory will be created if it does not exist.
Note: a local mirror must be served over HTTPS and the content must be uploaded to the server with the exact folder structure that this
creates.
USAGE: loopdown download <options>
OPTIONS:
-n, --dry-run Perform a dry run.
-q, --quiet-run Suppress all console output.
--log-level <log-level> (values: trace, debug, info, notice, warning, error, critical; default: info)
-a, --app <app> Install content for an app (default: all supported apps).
(values: garageband, logicpro, mainstage)
-e, --essential Include essential audio packages (Logic Pro 12+ and MainStage 4+ only).
-r, --core Include core audio packages (equivalent to -r, --req for legacy applications).
-o, --optional Include optional content.
-d, --dest <dir> Destination directory for downloading content. (default: /tmp/loopdown)
-c, --cache-server <cache-server>
Caching server to use; 'auto' or http://host:port
-m, --mirror-server <mirror-server>
Mirror server base URL
--cache-auto-retries <n>
Maximum number of attempts when auto-discovering a caching server (default: 3). (default: 3)
--cache-retry-delay <seconds>
Seconds to wait between caching server auto-discovery attempts (default: 1). (default: 1)
--skip-signature-check Skip the pkgutil signature check on downloaded packages (legacy content only).
--version Show the version.
-h, --help Show help information.
Full Changelog: v1.0.20240525...v2.0.3.b2-swift
v2.0.3.b2
Fixes:
- Correctly resolves essential content packs, core content packs, and optional content packs for Logic Pro 12+ and MainStage 4+
- Cache servers and mirror servers will now work correctly with Logic Pro 12+ and MainStage 4+
Changes:
- The package selection flags have been modified to reflect the new essential, core, and optional content pack types; instead of using either/both
-r/--reqor-/--opt, the flags have been modified and expanded: -
-e/--esnessential content packs (applies only to Logic Pro 12+ and MainStage 4+, this flag is ignored for all "legacy" versions of these apps, including GarageBand)
-
-r/--corethis replaces the-r/--reqflag for all "legacy" versions of these apps, including GarageBand; if this flag is used when deploying Logic Pro 12+ and/or MainStage 4+, this will cause it deploy the "legacy" required content packs that appear in the apps as available content
-
-o/--optthis is unchanged
To deploy Logic Pro 12+ or MainStage 4+ with the content packs that either of these apps will prompt to install:
loopdown deploy --esn
To deploy all content packs regardless of application and whether it's a legacy app or modern app (this may lead to duplication of content):
loopdown deploy --esn --core --opt
v2.0.3
This is the first release of loopdown in Swift and marks the deprecation of the Python implementation. Release from this point on will only be provided as Swift binaries.
Minimum Requirements:
- macOS 14.0+
- Intel/Apple Silicon CPU
Supported apps:
- GarageBand
- Logic Pro (legacy pre v12.0+ and modern post v12.0+)
- MainStage (legacy pre v4.0+ and modern post v4.0+)
Features:
- Download content packages for local use or for mirroring to your own web server for deployments
-
- Download essential (modern apps), core (GarageBand + legacy apps), and/or optional (GarageBand + legacy apps)
- Deploying content package from Apple, a local Apple Cache server, or from a mirrored web server
-
- Modern apps content can be deployed to a centralised location; default is
/Users/Sharedbut configured with-b/--library-dest
- Modern apps content can be deployed to a centralised location; default is
-
- Can target legacy only or modern only apps with
--legacy-onlyor--modern-only; default is to target all installed apps
- Can target legacy only or modern only apps with
- Supports configuring
loopdownruns with an MDM profile or profile installed at/Library/Managed Preferences -
- See the README for further details and some notes about deploying content for the modern apps
- Cache server auto detection with
-c/--cache-server auto - Downloads are retried on transient network errors (minimum of 1 attempt, maximum of 10)
-
- Can specify minimum bandwidth before failing a download with
--minimum-bandwidthand several other download related settings
- Can specify minimum bandwidth before failing a download with
- Installation during deployments are retried up to three times (with the download retry cycling in each download+install attempt)
-
- Any failed installs are retried at the end of a deployment run if missed
- Merges delta updates from Apple into the local content metadata, ensuring the most recent released content is also considered for download and/or deployment
loopdownbinary has an ad-hoc code signature and usescom.github.carlashley.loopdownas the identifier
Notes:
- Currently the pre-built binary will ship as a Universal binary, however after the release of macOS 27 this will change to an ARM64 binary only
The SHA256 of the binary in the loopdown.zip file is:
e89e7ff42ff6af175c5297c0dc549662adff4ba95e5a2fdc7144150673b40c25
v2.0.20260327
Fixes:
- Cache server failed to be detected correctly
- Add support for
--noproxy '*'incurlsub-process via the--no-proxyargument - Significant refactor/restructure per 5dae481
- Changed to deterministic ordering of apps to ensure package download/install size data was consistently calculated (matching Swift implementation behaviour)
- Corrected byte size for human readability to better align with Apple's own calculations
- Add deprecation warning
- Improved logic for processing packages where content hasn't been installed
- Improved handling of signature checks (command line argument renamed)
Full change log: v2.0.20260120...v2.0.20260327
v2.0.20260120
About
This is the last version of the Python implementation of loopdown. Future releases will be Swift implementations and will only support macOS 14+.
Notes
- This has been tested on Python 3.13, it should work for Python 3.10+ but no testing has been done for older Python releases.
- The
zipappbuild should install the two requirements when./build.shis run. -
- See Build help below for usage.
- This is intended to be the last release of a Python version of this tool, future releases will be implemented in Swift.
-
- New features will be sparingly added to the Swift release as the intention is to create a very basic tool to handle downloading and installing content packages.
-
- There is no guarantee that there will be regular releases of the Swift implementation.
- This version no longer relies on applications existing in
/Applications. Application installation paths are determined from the output ofsystem_profilerdata. - Downloads do not rely on
curl -C -for partial file resumption, in fact there are no attempts made at resuming incomplete downloads. -
- There are no plans to implement any partial download resumption in this release.
- Please take note of the new argument syntax as noted in the Usage section below.
Building
- In your preferred directory:
git clone https://github.com/carlashley/loopdown cd loopdown/loopdown./build.sh -h./build.sh [your chosen options]
Build help
./build.sh -h
Usage: ./build.sh [options]
Options:
--build-python=... Python to use for building (pip + zipapp). If omitted, uses python3 on PATH.
Examples:
--build-python=/opt/python/bin/python3
--build-python=/usr/local/bin/python3
--interpreter=... Interpreter string embedded in the zipapp shebang (default: /usr/bin/env python3)
Examples:
--interpreter=/usr/local/bin/python3
--interpreter="/usr/bin/env python3"
--main=... Zipapp entrypoint (default: loopdown.__main__:main)
-h, --help Show help
Usage
Primary help
python3 -m loopdown -h
usage: loopdown [-h] [-v] [-l [level]] [-q] [deploy,download] ...
Process additional content for installed audio applications, GarageBand, Logic Pro, and/or MainStage.
positional arguments:
[deploy,download] use [deploy,download] -h for further help
deploy deploy audio content packages locally (requires elevated permission when not performing dry-run)
download download audio content packages locally
options:
-h, --help show this help message and exit
-v, --version show program's version number and exit
-l, --log-level [level]
override the log level; default is 'info', choices are 'critical', 'error', 'warning', 'info', 'debug', 'notset'
-q, --quiet all console output (stdout/stderr) is suppressed; events logged to file only
loopdown v2.0.20260120. Copyright © 2026 Carl Ashley. All rights reserved. Apache License Version 2.0 - http://www.apache.org/licenses/
Download help
python3 -m loopdown download -h
usage: loopdown download [-h] [-n] [-a [app ...]] [-r] [-o] [-f] [-d [dir]]
Download audio content packages locally
options:
-h, --help show this help message and exit
-n, --dry-run perform a dry run; no mutating action taken
-a, --apps [app ...] override the default 'garageband', 'logicpro', 'mainstage' set of apps that audio content will be processed for;
choices are 'garageband', 'logicpro', 'mainstage'
-r, --req include the required audio packages
-o, --opt include the optional audio packages
-f, --force force the specified action
-d, --dest [dir] override the download directory path when '--download-only' used; default is '/tmp/loopdown'
Deploy help
python3 -m loopdown deploy -h
usage: loopdown deploy [-h] [-n] [-a [app ...]] [-r] [-o] [-f] [-c [url]] [-m [[url]]]
Deploy audio content packages locally (requires elevated permission when not performing dry-run)
options:
-h, --help show this help message and exit
-n, --dry-run perform a dry run; no mutating action taken
-a, --apps [app ...] override the default 'garageband', 'logicpro', 'mainstage' set of apps that audio content will be processed for;
choices are 'garageband', 'logicpro', 'mainstage'
-r, --req include the required audio packages
-o, --opt include the optional audio packages
-f, --force force the specified action
-c, --cache-server [url]
use a caching server; when no server is specified, attempts to auto detect; expected format is 'http://ipaddr:port'
-m, --mirror-server [[url]]
local mirror server to use; expected format is 'https://example.org'