jdx/mise · error

daemon requests @ , conflicting with another daemon; use…

Error message

daemon {} requests {tool}@{version}, conflicting with another daemon; use one version per tool

What it means

mise daemons each declare tool requests; when two daemons in the same tool-request set request different versions of the same tool and both requests come from mise.toml daemon sources, mise refuses to start because one version per tool is supported. This check runs in add_tool_requests while merging each daemon's requested tools into the shared set.

Solutions

  1. Pick one version and make every daemon request that same tool version
  2. Remove the duplicate/conflicting tool request from one of the daemons
  3. If different versions are genuinely needed, split them across separate configs that are not used together

Example fix

// before
[daemons.db]
preset = "postgres"
tools = { postgres = "16" }
[daemons.db-old]
preset = "postgres"
tools = { postgres = "17" }
// after
[daemons.db]
preset = "postgres"
tools = { postgres = "16" }
Defensive patterns

Strategy: validation

Validate before calling

# shell: ensure all daemons request the same version per tool
grep -A3 'daemons' mise.toml | grep -E 'postgres|redis' # eyeball versions match

Prevention

When it happens

Trigger: Starting (or rendering) daemons where two daemon definitions request the same tool at different versions, e.g. daemon A requests postgres@16 and daemon B requests postgres@17, and both requests originate from mise.toml daemon source.

Common situations: Copying an existing daemon block in mise.toml and changing its version without removing the old one; a project and an environment-specific mise.toml each declaring the same tool for daemons at different versions.

Understand the failure class

Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.

Related errors


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/2a165e3194480eb8. Report an issue: GitHub.

Appendix: source

Thrown at src/daemons/mod.rs:159

                .map(str::to_string)
                .ok_or_else(|| eyre::eyre!("daemon {key} must be a string"))
        })
        .transpose()
}

impl DaemonSet {
    pub(crate) fn add_tool_requests(&self, trs: &mut ToolRequestSet) -> Result<()> {
        for daemon in self.daemons.values() {
            let Some((tool, version)) = &daemon.tool else {
                continue;
            };
            let ba = crate::cli::args::BackendArg::from(tool.as_str());
            if let Some(existing) = trs.tools.get(&ba) {
                // Explicit declarations are validated against backend resolution before starting.
                if existing.iter().all(|tr| tr.source().is_mise_toml_daemon())
                    && existing.iter().any(|tr| tr.version() != *version)
                {
                    bail!(
                        "daemon {} requests {tool}@{version}, conflicting with another daemon; use one version per tool",
                        daemon.name
                    );
                }
                continue;
            }
            let source = ToolSource::MiseTomlDaemon(daemon.source.clone());
            let request = ToolRequest::new(ba.into(), version, source.clone())?;
            trs.add_version(request, &source);
        }
        Ok(())
    }

    pub(crate) fn env_entries(&self) -> Vec<(EnvDirective, PathBuf)> {
        self.daemons
            .values()
            .flat_map(|daemon| {
                daemon.exports.iter().map(|(k, v)| {

View on GitHub (pinned to 533346cc37)