Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Releases: carlashley/loopdown

v2.0.3.RC4-swift

30 May 08:46
b138b9b

Choose a tag to compare

v2.0.3.RC4-swift Pre-release
Pre-release

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-After headers for a period of up to five minutes; falls back to a default retry delay time
  • Speed up legacy package install checks by caching pkginfo results
  • Ensure the Logic Pro Library.bundle directory in /Users/Shared gets consistent and recursive root:wheel ownership (only applies when Logic Pro Library.bundle is installed to /Users/Shared and remains readable for all users; when the bundle is installed to other locations you will need to chown -R user:group the bundle as a separate step with the desired user:group)

Bug fixes:

  • Correctly return all packages for consideration when in download mode (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

28 May 07:51
1e1d081

Choose a tag to compare

v2.0.3.RC3-swift Pre-release
Pre-release

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 download mode 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

24 May 04:21
269f756

Choose a tag to compare

v2.0.3.RC2-swift Pre-release
Pre-release

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

16 Apr 10:25
69008b4

Choose a tag to compare

v2.0.3.b4-swift Pre-release
Pre-release

New features:

  • Added --legacy-only and --modern-only arguments to facilitate targeting only legacy or modern apps in deploy mode; 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-run and/or --log-level arguments can be provided at the command line for loopdown 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 download and deploy modes 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

14 Apr 08:49
7c2b70e

Choose a tag to compare

v2.0.3.b3-swift Pre-release
Pre-release

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/Shared but this can be changed by specifying a new parent directory with -b/--library-dest. The bundle itself will always be called Logic Pro Library.bundle.

Fixes:

  • behaviour change: -b/--library-dest no longer creates a bundle with that name, it is now the parent directory. A Logic Pro Library.bundle is created in this directory.
  • Corrects the usage string for package selection flag requirements per #16
  • Renames -f/--force-deploy to -f/--force for argument parity with the Python version

Full Changelog: v2.0.3.b2-swift...v2.0.3.b3-swift

v2.0.3.b2-swift

13 Apr 03:42
a0517ed

Choose a tag to compare

v2.0.3.b2-swift Pre-release
Pre-release

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+
  • --managed flag that can be used if an MDM profile is deployed for the com.github.carlashley.loopdown preferences domain (in theory using DDM to push a property list to /Library/Managed Preferences/com.github.carlashley.loopdown.plist should 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/--req or -/--opt, the flags have been modified and expanded:
    • -e/--essential essential 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/--core this replaces the -r/--req flag 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/--optional replaces -o/--opt for 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

13 Apr 01:09
2ba200d

Choose a tag to compare

v2.0.3.b2 Pre-release
Pre-release

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/--req or -/--opt, the flags have been modified and expanded:
    • -e/--esn essential 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/--core this replaces the -r/--req flag 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/--opt this 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

03 Jun 06:49
b79fe9a

Choose a tag to compare

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/Shared but configured with -b/--library-dest
    • Can target legacy only or modern only apps with --legacy-only or --modern-only; default is to target all installed apps
  • Supports configuring loopdown runs 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-bandwidth and several other download related settings
  • 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
  • loopdown binary has an ad-hoc code signature and uses com.github.carlashley.loopdown as 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

27 Mar 11:40
8da12b9

Choose a tag to compare

v2.0.20260327 Pre-release
Pre-release

Fixes:

  • Cache server failed to be detected correctly
  • Add support for --noproxy '*' in curl sub-process via the --no-proxy argument
  • 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

20 Jan 20:46
b922a2b

Choose a tag to compare

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 zipapp build should install the two requirements when ./build.sh is 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 of system_profiler data.
  • 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

  1. In your preferred directory: git clone https://github.com/carlashley/loopdown
  2. cd loopdown/loopdown
  3. ./build.sh -h
  4. ./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'
Morty Proxy This is a proxified and sanitized view of the page, visit original site.