jdx/mise · error · eyre::Report
No lockfile URL found for {} on platform {} (--locked mode)
Error message
No lockfile URL found for {} on platform {} (--locked mode)
hint: Run `mise lock` to generate lockfile URLs, or disable locked mode What it means
In locked mode, for every non-stub tool whose backend supports URL locking, mise requires the lockfile to already contain a download URL for the current platform key. If tv.lock_platforms has no url for get_platform_key(), the install would have to hit the network and resolve dynamically — exactly what --locked forbids — so it bails with a hint to run `mise lock`.
Source
Thrown at src/backend/mod.rs:3229
// Exempt tool stubs from lockfile requirements since they are ephemeral
// Also exempt backends that don't support URL locking (e.g., Rust uses rustup)
// This must run before the dry-run check so that --locked --dry-run still validates
let settings = Settings::get();
if (ctx.locked || settings.locked) && settings.lockfile == Some(false) {
bail!(
"locked mode requires lockfile to be enabled\n\
hint: Remove `lockfile = false` or set `lockfile = true`, or disable locked mode"
);
}
if ctx.locked && !tv.request.source().is_tool_stub() && self.supports_lockfile_url() {
let platform_key = self.get_platform_key();
let has_lockfile_url = tv
.lock_platforms
.get(&platform_key)
.and_then(|p| p.url.as_ref())
.is_some();
if !has_lockfile_url {
bail!(
"No lockfile URL found for {} on platform {} (--locked mode)\n\
hint: Run `mise lock` to generate lockfile URLs, or disable locked mode",
tv.style(),
platform_key
);
}
}
// A rolling release (e.g. a `nightly` tag) keeps the same version string,
// so its install dir already existing does NOT mean it's up-to-date.
let rolling_reinstall = !ctx.force
&& self.is_version_installed(&ctx.config, &tv, true)
&& self.is_rolling_version_outdated(&ctx.config, &tv).await;
// Handle dry-run mode early to avoid plugin installation
if ctx.dry_run {
use crate::ui::progress_report::ProgressIcon;
let satisfied = !ctx.forceView on GitHub (pinned to 6f52dcdf99)
Solutions
- Run `mise lock` (on the failing platform) to generate the missing URL entries, commit mise.lock, and retry
- If the lockfile exists but lacks the platform: run `mise lock` on that OS/arch (platform keys differ) and commit both
- Disable locked mode for this install (drop --locked / settings.locked) when dynamic resolution is acceptable
Example fix
# before mise install --locked # No lockfile URL found for node 22 on linux-x64 # after mise lock && mise install --locked
Defensive patterns
Strategy: validation
Validate before calling
# CI ordering: always lock before a locked install mise lock && mise install --locked
Try / catch
mise install --locked || mise lock && mise install --locked
Prevention
- Treat any mise.toml tool change as requiring a `mise lock` commit in the same PR
- Run `mise lock` on every OS in the build matrix and commit the merged mise.lock
- CI: never allow `--locked` on a fresh clone without the lock step first
When it happens
Trigger: `mise install --locked` (or settings.locked) for a tool where mise.lock lacks a platform entry: a new tool added to mise.toml without re-locking; mise.lock generated on linux but installing on macos (different platform key); lockfile deleted or pruned.
Common situations: CI with --locked after a teammate adds a tool but forgets to commit an updated mise.lock; cross-platform repos where the lockfile must be regenerated per-OS; fresh clones before anyone ran `mise lock` on the new platform.
Related errors
- No matching complete lockfile artifact list found for {} on
- locked mode requires lockfile to be enabled hint: Remove `lo
- {}@{} is not in the lockfile hint: {hint}
- Invalid checksum: {checksum}
- Size mismatch for {}: expected {}, got {}
AI-assisted analysis of jdx/mise@6f52dcdf99 (2026-08-22).
Data as JSON: /api/errors/f03c77b0f9ee5236.
Report an issue: GitHub.