gitbutlerapp/gitbutler · error · anyhow::Error
No download URL for platform {} in release {}
Error message
No download URL for platform {} in release {} What it means
Thrown by download_and_install_app in crates/but-installer/src/install_linux.rs when the PlatformInfo resolved for this system has url == None. The release metadata returned by the GitButler API (release.platforms keyed by config.platform) contains an entry for the platform, but that entry carries no AppImage download URL, so there is nothing to download and install.
Source
Thrown at crates/but-installer/src/install_linux.rs:22
use anyhow::{Context, Result, anyhow, bail};
use crate::{
config::{Channel, InstallerConfig},
download::{download_file, download_to_string},
install::{but_binary_path, validate_installed_binary, verify_signature},
release::{PlatformInfo, Release, validate_download_url},
ui::{info, warn},
};
pub(crate) fn download_and_install_app(
config: &InstallerConfig,
platform_info: &PlatformInfo,
release: &Release,
channel: Option<Channel>,
) -> Result<()> {
let appimage_download_url = platform_info.url.as_deref().ok_or_else(|| {
anyhow::anyhow!(
"No download URL for platform {} in release {}",
config.platform,
release.version
)
})?;
// Note: For now we find the CLI and signature by convention on Linux, but we should update the
// API (or create a new one) to contain this information.
let filename = "but";
let base_download_url = appimage_download_url
.rsplit_once('/')
.map(|(base, _)| base.to_string())
.ok_or_else(|| anyhow::anyhow!("Failed to construct but cli URL"))?;
let download_url = format!("{base_download_url}/{filename}");
let signature_url = format!("{download_url}.sig");
validate_download_url(&signature_url)?;
validate_download_url(&download_url)?;View on GitHub (pinned to caf1f223d3)
Solutions
- Install the latest release instead of the pinned version (the latest release always carries a Linux AppImage URL).
- Inspect the release JSON from the API and confirm the platform key (config.platform) maps to an entry with a non-null url; adjust platform detection if the key mismatches.
- Try the nightly channel, which publishes fresh artifacts including the Linux AppImage.
- If the API genuinely lacks the artifact for that version, report it to GitButler — nothing client-side can fabricate the URL.
Example fix
// before: assume the platform entry has a URL
let url = platform_info.url.as_deref().ok_or_else(|| {
anyhow::anyhow!("No download URL for platform {} in release {}", config.platform, release.version)
})?;
// after (installer caller): pre-check and pick a newer release
if platform_info.url.is_none() {
warn(&format!(
"Release {} has no Linux artifact; falling back to latest",
release.version
));
let release = fetch_release(&VersionRequest::Release)?;
// re-resolve platform_info from the new release before installing
} Defensive patterns
Strategy: validation
Validate before calling
// Before calling download_and_install_app on Linux
use but_installer::release::PlatformInfo;
fn linux_artifact_available(platform_info: &PlatformInfo) -> bool {
platform_info.url.is_some()
}
if !linux_artifact_available(platform_info) {
eprintln!("release {} has no Linux AppImage; try latest", release.version);
return Ok(());
} Type guard
fn has_download_url(p: &PlatformInfo) -> bool {
p.url.as_deref().map(|u| !u.is_empty()).unwrap_or(false)
} Try / catch
match download_and_install_app(&config, platform_info, &release, channel) {
Ok(()) => {},
Err(e) if e.to_string().contains("No download URL for platform") => {
// fall back to the latest release and retry once
},
Err(e) => return Err(e),
} Prevention
- Prefer VersionRequest::Release (latest) for automated installs; pinned old versions are the main source of missing AppImage URLs.
- Validate release.platforms[platform].url is non-null before starting the download.
- Log release.version whenever an install fails so missing-artifact reports are actionable.
When it happens
Trigger: Calling the Linux installer with a release whose platforms entry for config.platform (e.g. "linux") exists but has a null/missing url field; requesting an old release version that predates AppImage publishing; an API response shape change that stops populating PlatformInfo.url.
Common situations: Installing a pinned old version (VersionRequest::Specific) whose artifacts were incomplete; running on an architecture/variant the release pipeline did not publish an AppImage for; the releases API returning a partially-filled platform entry.
Related errors
- No download URL for platform {} in release {}
- Failed to determine home directory
- Failed to get signature for but, requested version may be to
- Platform {} not found in release
- Final installation verification failed
AI-assisted analysis of gitbutlerapp/gitbutler@caf1f223d3 (2026-08-20).
Data as JSON: /api/errors/5b799627ad64bfe4.
Report an issue: GitHub.