jdx/mise · error
: source uses the download strategy, which mise cannot…
Error message
{}: source uses the {using:?} download strategy, which mise cannot build from (and no bottle exists for this machine) What it means
The formula declares a non-standard `using:` download strategy (e.g. :git, :homebrew_curl, :special). mise can only build from plain URL/checksum archives, and since no bottle exists for this machine it falls back to source — which it refuses early with this message.
Solutions
- Install on a platform/OS where a bottle exists so source build is not attempted
- Use a different mise backend that can handle the tool (github:, cargo:, etc.)
- Install the formula with brew directly and point mise at the brew-provided version
- Ask upstream to provide a normal URL-based stable spec or open a mise issue to support that strategy
Example fix
# before mise use brew:some-git-strategy-formula # after mise use github:some-org/some-tool
Defensive patterns
Strategy: fallback
Validate before calling
curl -s https://formulae.brew.sh/api/formula/<name>.json | jq -r '.urls.stable.using' # non-null means special strategy
Try / catch
catch the 'download strategy' message => pick an alternate backend (github:, cargo:) or a brew version with bottles
Prevention
- Inspect `.urls.stable.using` in the API before choosing brew: for a tool
- Maintain fallback backend entries in mise config
- Keep to mainstream formulas/versions with standard curl-based sources
- Test installs on your actual target platform (linux/arm64 etc.) early
When it happens
Trigger: `check_buildable` sees `src.using` set on the stable source while no bottle is available for the host tag, so `build` bails naming the strategy.
Common situations: Niche formulas that fetch via git or special strategies; installing on uncommon platforms (linux, new macOS/ARM combos) where those formulas lack bottles; formula recently switched download strategy upstream.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- : formula has no stable source URL
- : API metadata has no formula checksum
- : API metadata has no ruby_source_path
- : API metadata has no tap_git_head
- build of finished but produced no keg at
AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17).
Data as JSON: /api/errors/fc352760974bb67e.
Report an issue: GitHub.
Appendix: source
Thrown at src/system/packages/brew/source.rs:68
pub(super) fn missing_bottle_reason(formula: &Formula) -> String {
match formula.bottle_files() {
Some(files) if !files.is_empty() => {
let mut tags: Vec<String> = files.keys().cloned().collect();
tags.sort();
format!("bottles exist only for: {}", tags.join(", "))
}
_ => "source-only formula, no bottles".to_string(),
}
}
/// Reject early what the source builder cannot handle, with the reason —
/// checked before any work happens so dry-run and real runs fail alike.
pub(super) fn check_buildable(formula: &Formula) -> Result<()> {
let Some(src) = formula.stable_url() else {
bail!("{}: formula has no stable source URL", formula.name);
};
if let Some(using) = &src.using {
bail!(
"{}: source uses the {using:?} download strategy, which mise cannot build from \
(and no bottle exists for this machine)",
formula.name,
);
}
if src.checksum.is_none() {
bail!("{}: source archive has no sha256 in the API", formula.name);
}
// the formula .rb must be pinned to the API snapshot's commit and
// verifiable — evaluating a newer/unverified formula against older
// source metadata would build the wrong thing
if formula.ruby_source_path.is_none() {
bail!("{}: API metadata has no ruby_source_path", formula.name);
}
if formula.tap_git_head.is_none() {
bail!("{}: API metadata has no tap_git_head", formula.name);
}
if formulaView on GitHub (pinned to 533346cc37)