truce.toml reference

Every field cargo truce reads from your project's truce.toml, grouped by table. The file lives at the project root alongside Cargo.toml and is tracked in git — it carries project-level facts only.

Per-developer credentials and machine-specific paths (signing identities, AAX SDK location, notarization Apple ID / team ID, Authenticode certs) live in .cargo/config.toml's [env] table or shell env vars instead. See cargo-config for that surface.

#[vendor] — required

Field Type Required Notes
name string yes Human company name. Shows in DAWs, installers, Apps & Features.
id string yes Reverse-DNS prefix (com.mycompany). Used for AU/VST3/CLAP IDs and Windows installer AppId.
url string no Vendor website. Surfaced in the Windows installer "Publisher URL" field.
au_manufacturer string yes Exactly 4 ASCII characters. AU manufacturer code — must be unique per vendor.

#[[plugin]] — one per plugin, at least one required

Field Type Required Notes
name string yes Human name. Used for bundle filenames and DAW display names.
bundle_id string yes Short lowercase, no-dash identifier. Used internally for bundle / extension reverse-DNS IDs (com.{vendor}.{bundle_id}.au), install plist filenames, and scratch paths. Not used at the CLI.
crate string yes Cargo package name. CLI uses this for -p <crate>. Hyphens become underscores in built .dll/.dylib.
category string yes "effect" / "instrument" / "midi". Drives AU/VST3/CLAP category metadata.
midi_input bool no Whether the host routes MIDI into the plugin. Defaults to true for instruments and note effects ("midi"); set true on an effect that reacts to MIDI (e.g. CC-controlled), or false to suppress. On AU, true on an effect promotes it to the aumf MusicEffect type so the host actually routes MIDI to it; false on an instrument is a no-op (an aumu receives MIDI by type).
midi_output bool no Whether the plugin emits MIDI to the host. Defaults to true for note effects ("midi") only; set true on an instrument or effect that also emits MIDI so the host declares the MIDI output port/bus.
fourcc string yes† Exactly 4 ASCII chars. AU subtype + cross-format unique ID.
au_type string no Override AU type. Defaults: "aumu" for instruments, "aumi" for midi / note-effects, "aumf" for an effect with midi_input = true, else "aufx".
au_subtype string no Synonym for fourcc. fourcc wins if both are set.
au3_subtype string no 4-char subtype for AU v3 only. Set if v2/v3 must differ.
au_tag string no AU category tag. Defaults to "Effects". Common: "Synthesizer", "Dynamics", "EQ", "MIDI".
aax_category string no AAX category string (e.g. "Delay", "Reverb", "EQ"). Maps to AAX_ePlugInCategory in the AAX SDK.
vst3_subcategory string no VST3 "Plugin Type Categories" secondary token. Without this, hosts like Cubase bucket the plugin under "Other". Values from the VST3 SDK list: "Delay", "Distortion", "Dynamics", "EQ", "Filter", "Mastering", "Modulation", "Pitch Shift", "Restoration", "Reverb", "Surround", "Analyzer", "Tools". Wrapper emits Fx|<sub> for effects, Instrument|<sub> for instruments.
{format}_name string no Per-format display-name override: clap_name, vst3_name, vst2_name, au_name, au3_name, aax_name, lv2_name.
windows_icon string no Path to .ico (workspace-root-relative). Embedded as RT_GROUP_ICON in the standalone .exe. Distinct from [windows.packaging] installer_icon — that one's the Inno-wizard chrome; this one's the per-product app icon.
macos_icon string no Path to .icns (workspace-root-relative). Copied into the standalone .app's Contents/Resources/ and referenced via CFBundleIconFile. Generate one with iconutil -c icns <iconset> from a directory of 16/32/128/256/512px (and @2x) PNGs.

† One of fourcc / au_subtype is required.

Category to format-metadata mapping:

category CLAP features VST3 category AU type
"effect" audio-effect Fx aufx
"instrument" instrument Instrument|Synth aumu
"midi" note-effect Fx|Event aumi

{format}_name overrides the display name surfaced to hosts while leaving bundle filenames, IDs, and install paths derived from name. One exception: au3_name also overrides the /Applications/{au3_name}.app install path so two AU v3 builds (e.g. release and beta) can coexist.

#[plugin.presets] — optional, per plugin

Factory-preset settings (guide chapter). Without this table, a presets/ directory next to the crate is picked up automatically; add it only to change the defaults.

Field Type Required Notes
factory_dir string no Directory of authored .preset TOML files, relative to the plugin's crate directory. Default presets.
user_dir string no Replaces the truce/<vendor>/<plugin> subpath of the user-scope preset root (where user presets and packs live). Relative segments only; .. is rejected at install. Pick once, before first release - changing it later orphans previously saved user presets.

Where the user-scope root resolves per OS:

OS default with user_dir = "Acme/MySynth"
macOS ~/Library/Audio/Presets/truce/<vendor>/<plugin>/ ~/Library/Audio/Presets/Acme/MySynth/
Windows %APPDATA%\truce\<vendor>\<plugin>\presets\ %APPDATA%\Acme\MySynth\
Linux $XDG_DATA_HOME/truce/<vendor>/<plugin>/presets/ $XDG_DATA_HOME/truce/Acme/MySynth/

($XDG_DATA_HOME falls back to ~/.local/share when unset.) The override replaces the whole default subpath with no implicit presets suffix.

#[[suite]] — optional, repeatable

Each entry produces one suite installer per platform that bundles multiple [[plugin]] entries together. Per-plugin installers still ship in parallel; use --no-per-plugin to drop them, or --no-suite to drop the suite output.

Field Required Notes
name yes Display name shown in the installer.
bundle_id yes Short identifier for the suite.
plugins no List of plugin crate or bundle_id strings to include. Omit for "all [[plugin]] entries". Mutually exclusive with exclude_plugins.
exclude_plugins no List of plugins to exclude from the otherwise-implicit "all". Mutually exclusive with plugins.
formats no Per-suite format restriction (intersected with each plugin's enabled formats). Omit for the union.
version no Suite-level version. Defaults to [workspace.package].version.
description no Display blurb in the installer welcome page (where supported).

#[macos.packaging] — optional, macOS only

Field Default Notes
notarize false true → submit to Apple notary and staple. --no-notarize on the CLI skips it. The credentials it uses come from env (see cargo-config).
welcome_html Path to HTML shown on the productbuild wizard's welcome page.
license_html Path to HTML shown on the wizard's license page.

There is no [macos.signing] table — signing identities are per-developer and live in env. See cargo-config.md § macOS code signing.

#[windows.packaging] — optional, Windows only

Project-level installer appearance. Per-developer Authenticode credentials live in env (see cargo-config).

Field Default Notes
publisher [vendor].name "Publisher" in installer and Apps & Features.
publisher_url [vendor].url Publisher URL in the installer.
installer_icon Path to a .ico for the installer + uninstaller.
welcome_bmp Path to a 164×314 .bmp for welcome/finish pages.
license_rtf Path to .rtf or .txt license.
app_id {vendor.id}.{plugin.bundle_id} Inno Setup stable identifier. Only change on rename.

#[packaging] — cross-platform

Field Default Notes
formats plugin's default features Formats to include when packaging. Valid: clap, vst3, vst2, lv2, au2, au3, aax, standalone. --formats on the CLI overrides. macOS .pkg and Windows Inno Setup both honour this; Linux's tarball pipeline ships every default-feature format unconditionally.
preferred_scope "ask" Project-wide default for cargo truce package. "user", "system", or "ask". CLI flags (--user / --system / --ask) override. cargo truce install has no toml override — pass --user / --system per invocation.

Welcome/license screens are OS-specific (macOS uses HTML, Windows uses BMP + RTF) and live under their per-platform [macos.packaging] / [windows.packaging] tables.

#[automation] — optional

Tunes the sample-accurate parameter chunking layer (see parameters § Sample-accurate automation). Omit the whole table to accept defaults.

Field Default Notes
min_subblock_samples 32 Smallest sub-block size in samples. Events that would produce a shorter sub-block are coalesced (smoother target lands at block_start instead of the event sample). 1 for strict sample-accuracy. A value above the host's max block size disables splitting (smoothers behave as they did pre-0.52).
[automation]
min_subblock_samples = 32

#Full example

[vendor]
name = "Acme Audio"
id = "com.acmeaudio"
url = "https://acmeaudio.example"
au_manufacturer = "Acme"

[macos.packaging]
notarize = true
welcome_html = "branding/welcome.html"
license_html = "branding/license.html"

[windows.packaging]
publisher = "Acme Audio, LLC"
installer_icon = "branding/installer.ico"
welcome_bmp = "branding/welcome.bmp"
license_rtf = "branding/license.rtf"

[packaging]
formats = ["clap", "vst3", "aax"]
preferred_scope = "ask"

[[plugin]]
name = "Acme Gain"
bundle_id = "gain"
crate = "acme-gain"
category = "effect"
fourcc = "AGn1"
au_tag = "Dynamics"

[[plugin]]
name = "Acme Synth"
bundle_id = "synth"
crate = "acme-synth"
category = "instrument"
fourcc = "ASy1"
au_tag = "Synthesizer"

[[suite]]
name = "Acme Studio"
bundle_id = "acme-studio"
description = "Gain and Synth in one installer."