jdx/mise · error · eyre::Report
{}: formula has no stable source URL
Error message
{}: formula has no stable source URL What it means
When no bottle exists for the host and mise would build a formula from source, check_buildable first validates the formula's API metadata so dry-run and real runs fail identically before any work. A formula with no stable source URL — head-only formulae — cannot be built, so it is rejected with this error.
Source
Thrown at src/system/packages/brew/source.rs:64
}
/// why `has_bottle` is false, for log/dry-run output
pub 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 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() {View on GitHub (pinned to 9dcfcaa0dc)
Solutions
- Install the tool with native Homebrew, which supports head-only formulae (`brew install --HEAD`)
- Pick an alternative formula or version that ships stable sources or a bottle for your platform
- Build and install the tool manually outside mise if you need exactly that head version
Defensive patterns
Strategy: validation
Validate before calling
# check the formula shape before relying on a source build mise exec -- brew info <formula> 2>/dev/null | grep -q 'stable' || echo "head-only formula — mise cannot build it; use native brew or another formula"
Prevention
- Prefer formulae that ship stable sources or bottles for your platform
- Head-only or platform-skipped formulae must be installed with native Homebrew
- Read the sibling hint in mise's output — it lists which tags do have bottles
When it happens
Trigger: check_buildable runs on a formula whose stable_url() returns None; this path is reached because the host tag had no matching bottle (see the sibling hint listing which tags do have bottles).
Common situations: Installing niche head-only formulae; formulae whose bottles exist only for other platforms/architectures; deprecated formulae whose stable spec was dropped upstream.
Related errors
- {}: API metadata has no ruby_source_path
- {}: API metadata has no tap_git_head
- {}: API metadata has no formula checksum
- {}: source uses the {using:?} download strategy, which mise
- {}: source archive has no sha256 in the API
AI-assisted analysis of jdx/mise@9dcfcaa0dc (2026-08-17).
Data as JSON: /api/errors/9412306b7ed076d2.
Report an issue: GitHub.