denoland/deno · error
could not find ' ' backend binary inside
Error message
could not find '{backend}' backend binary inside {} What it means
After ensure_downloaded() succeeds (archive fetched, SHA-256 verified against the lock, extracted into the cache), locate_backend_binary() walks the extracted tree to find the backend executable — and finds nothing. The download itself is trusted, so this means the archive's internal layout does not match what the locator expects, not a network or checksum problem.
Solutions
- Inspect the cache dir named in the error (tar tf / unzip -l on the cached archive) to see where the binary actually landed.
- Delete that cache dir and re-run to rule out a truncated extraction (disk-full, interrupted run).
- Update deno to a build whose locator matches the pinned laufey release layout — the pair is meant to move together.
- If the layout genuinely changed upstream, file an issue with the archive listing so the locator gets updated.
Example fix
# before deno desktop # error: could not find 'wry' backend binary inside ~/.cache/deno/desktop/laufey/v1.2.3-... # after: inspect, then clear and re-download unzip -l ~/.cache/deno/desktop/laufey/v1.2.3-x86_64-pc-windows-msvc/*.zip | less rm -rf ~/.cache/deno/desktop/laufey/v1.2.3-x86_64-pc-windows-msvc deno desktop
Defensive patterns
Strategy: retry
Validate before calling
# After a failed run, inspect the extracted tree to see if the binary exists at all
find "$(deno info | awk '/Cache directory/{print $3}')/desktop/laufey" -maxdepth 3 -type f 2>/dev/null
# or simply list the cached archive:
# unzip -l ~/.cache/deno/desktop/laufey/<ver-target>/*.zip Try / catch
Catch the error, print the cache dir from the message, list its contents for the user, delete the dir, and retry once — a fresh verified extraction fixes truncated-output cases; if the pristine archive still lacks the binary, escalate as an upstream layout change instead of retrying again.
Prevention
- Check free disk space before builds — extraction onto a full disk is a classic silent truncator.
- Keep deno updated so its locator matches the pinned laufey release layout (they are versioned together).
- When pinning laufey manually, sanity-open one archive of each backend/target to confirm the expected binary path.
When it happens
Trigger: A laufey release whose archive puts the backend binary at a new/unexpected path or names it differently; extraction silently dropped files (disk full, permissions); the backend genuinely contains no binary for this platform and the archive is a stub.
Common situations: The laufey project restructured its release archives (new top-level dir, renamed binary) while the deno pin still references the old version-compatible expectations; the cache dir was extracted onto a full disk; version skew between the pinned LAUFEY_VERSION archive layout and this deno build's locator.
Related errors
- could not find ' ' .app bundle inside (backend may not ship…
- unsupported archive format
- checksum mismatch for
- could not find ' ' backend binary under (set via )
- LAUFEY backend executable not found at
AI-assisted analysis of denoland/deno@f7822238ca (2026-08-20).
Data as JSON: /api/errors/13ebf06c795bd3ec.
Report an issue: GitHub.
Appendix: source
Thrown at cli/tools/desktop.rs:2115
// id — same fix as the download path, applied every launch
// because a fresh `cargo build` of laufey restores the linker's
// default `Identifier=laufey`. The harmonize call is idempotent:
// already-correct binaries are skipped.
#[cfg(target_os = "macos")]
if let Some(laufey_app) = laufey_app_for_binary(&binary)
&& let Err(e) = harmonize_laufey_app_identifiers(&laufey_app)
{
log::warn!(
"[desktop] could not re-sign dev laufey backend: {e} \
(notifications may not work in HMR mode)"
);
}
return Ok(binary);
}
let dir = self.ensure_downloaded(backend, target).await?;
locate_backend_binary(&dir, backend, target).ok_or_else(|| {
deno_core::anyhow::anyhow!(
"could not find '{backend}' backend binary inside {}",
dir.display()
)
})
}
/// Locate the LAUFEY `.app` bundle for `backend` on a macOS `target`.
async fn find_app_bundle(
&self,
backend: &str,
target: &str,
) -> Result<PathBuf, AnyError> {
if let Some(dev_dir) = laufey_dev_dir() {
return locate_dev_app_bundle(&dev_dir, backend).ok_or_else(|| {
deno_core::anyhow::anyhow!(
"could not find '{backend}' .app bundle under {} (set via {})",
dev_dir.display(),
LAUFEY_DEV_DIR_ENVView on GitHub (pinned to f7822238ca)