Skip to main content

Bulk-import preset packs into Cableguys ShaperBox 3 on macOS.

Project description

shaperbox-importer

CI Python License: PolyForm NC 1.0.0 Platform: macOS

Bulk-import preset packs into Cableguys ShaperBox 3 on macOS — without clicking through Load FXP → Save preset for every single file.

ShaperBox 3 has no built-in bulk import. This tool hosts ShaperBox via Pedalboard so the plugin itself migrates each preset to its current internal format, then writes the result directly into ShaperBox's local SQLite DB and content-addressed .dat store. After running, the presets appear in the MY PRESETS tab on next launch.

Disclaimer: Not affiliated with or endorsed by Cableguys. The internal storage format was reverse-engineered. Use at your own risk; always keep the auto-backup until you've verified your presets.

Features

  • Imports hundreds of presets in one go
  • Supports .vstpreset (VST3 preset files) and .fst (FL Studio plugin-state files)
  • Uses ShaperBox's own migration code via Pedalboard — version-correct output
  • Auto-backups your ~/Library/Cableguys/ShaperBox3/ folder before any writes
  • Refuses to run while a DAW is open (avoids DB lock)
  • Dry-run mode

Requirements

  • macOS
  • Python 3.9+
  • ShaperBox 3 installed at /Library/Audio/Plug-Ins/VST3/ShaperBox 3.vst3
  • A valid ShaperBox 3 license (the plugin must initialize for migration to work)

Install

pip install shaperbox-importer

Or from source:

git clone https://github.com/PhillipAmend/shaperbox-importer
cd shaperbox-importer
pip install .

Usage

# Dry-run first to see what would be imported
shaperbox-import /path/to/preset/folder --dry-run

# Real import (auto-backs up ShaperBox3/ first)
shaperbox-import /path/to/preset/folder

Close your DAW first. The tool refuses to run while one is open; override with --force if you really need to.

Flags

flag description
--dry-run list what would be imported, no writes
--no-backup skip the auto-backup of the Cableguys data folder
--force proceed even with a DAW open (risks DB lock)
--version print version

Example

$ shaperbox-import ~/Downloads/MyPresetPack
found 200 preset file(s) (200 .vstpreset) under /Users/me/Downloads/MyPresetPack

backing up ShaperBox data folder ...
backup: /Users/me/Library/Cableguys/ShaperBox3.backup-20260522-142425

loading ShaperBox 3 via Pedalboard ...

importing 200 preset(s):
  [   1/200] +  Bass Wobble 01  (4385 B)
  [   2/200] +  Bass Wobble 02  (4586 B)
  ...
imported 200 preset(s); 0 failed.
open ShaperBox in your DAW to see the new presets in MY PRESETS.

Restoring from backup

If something looks wrong, the script prints the backup path. To restore:

rm -rf ~/Library/Cableguys/ShaperBox3
mv ~/Library/Cableguys/ShaperBox3.backup-<timestamp> ~/Library/Cableguys/ShaperBox3

How it works

  1. ShaperBox stores user presets in ~/Library/Cableguys/ShaperBox3/:
    • presets.db — SQLite with presets, queue, packs, pack_positions, files1, info tables.
    • Per-preset .dat files in a CAS layout (<hash[0]>/<hash[1]>/<hash>.dat), each containing #zip#\0 + zlib-compressed JUCE ValueTree.
  2. The current state schema (version 75 in ShaperBox 3.6.x) differs from older saved presets — dropping older .fxp/.vstpreset bytes in directly doesn't work because internal modules (LimiterState, PitchState, etc.) have evolved.
  3. Hosting ShaperBox via Pedalboard and calling load_preset() triggers the plugin's own migration code, which gives us a bit-correct current-format chunk back.
  4. The chunk is written as a .dat and matching rows are inserted into presets + queue. author must be empty for the entry to appear in MY PRESETS.

For .fst files, the embedded #zip# chunk is extracted from FL Studio's container, re-wrapped as a synthetic .vstpreset, and fed through the same pipeline.

FAQ

Will this work on Windows or Linux? No. The Cableguys data folder, plugin path, and DAW-detection heuristics are macOS-specific. PRs welcome.

Will it break in the next ShaperBox release? Possibly. The schema is bumped occasionally. If imports stop showing up, the CURRENT_DB_VERSION constant in cli.py likely needs to be raised; the rest of the format has been stable for several major versions.

Does it work for HalfTime / FilterShaper Core / other Cableguys plugins? Not today. The data folder layout is similar, but each plugin has its own state schema and MY PRESETS flow.

Can I assign presets to a specific pack instead of MY PRESETS? Not yet. PRs welcome — see pack_positions in the DB.

Does it sync to my Cableguys cloud account? The imported presets land in the local sync queue (state=0). What Cableguys' server does with them on next sync isn't documented; we observed that they display correctly locally regardless.

Acknowledgments

This project was built in collaboration with Claude (Anthropic). The format reverse-engineering, code, tests, and documentation were paired with AI assistance.

License

PolyForm Noncommercial License 1.0.0.

In plain English: anyone can use, copy, fork, modify, and redistribute this tool freely for personal, hobby, educational, research, charity, or government use. You may not use this tool, or any work derived from it, as part of a product or service that you sell or otherwise commercialize. If that's restrictive for your use case, open an issue and we can talk.

Note: PolyForm Noncommercial is "source-available" / "fair-source" — it is not an OSI-approved open source license because of the commercial-use restriction.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

shaperbox_importer-0.1.0.tar.gz (13.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

shaperbox_importer-0.1.0-py3-none-any.whl (13.1 kB view details)

Uploaded Python 3

File details

Details for the file shaperbox_importer-0.1.0.tar.gz.

File metadata

  • Download URL: shaperbox_importer-0.1.0.tar.gz
  • Upload date:
  • Size: 13.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for shaperbox_importer-0.1.0.tar.gz
Algorithm Hash digest
SHA256 5b12875806c0efc455c0661d19027264ae603717514304843df8049907d275bf
MD5 03874678759949224eeaf39873edf067
BLAKE2b-256 c4b272ef05ed95641c55774e1f8e71a8cbd239f547a728b4c10b0a40ed5c97b9

See more details on using hashes here.

Provenance

The following attestation bundles were made for shaperbox_importer-0.1.0.tar.gz:

Publisher: release.yml on PhillipAmend/shaperbox-importer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file shaperbox_importer-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for shaperbox_importer-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d11394f700446527a18f3ee19ad6969ad9a504656365e62eccefe7da50892006
MD5 00824145a71db368342a7b241f07de93
BLAKE2b-256 5937bc4f6352bfbb1f13b2b47387309dafa18f5c88bbb63296f99c37b1228e20

See more details on using hashes here.

Provenance

The following attestation bundles were made for shaperbox_importer-0.1.0-py3-none-any.whl:

Publisher: release.yml on PhillipAmend/shaperbox-importer

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page