jdx/mise · error

daemon port must be an integer from 1 to 65535

Error message

daemon port must be an integer from 1 to 65535

What it means

The optional `port` key of a `[daemons.<name>]` entry must be a TOML integer between 1 and 65535. If it parses as an integer but falls outside that range, mise bails during load. (A non-integer `port` value silently skips this check instead — only out-of-range integers trigger this error.)

Solutions

  1. Set `port` to an integer between 1 and 65535.
  2. If you want an arbitrary port, remove the `port` key entirely.
  3. Check templated values: compute and clamp the port number before it lands in mise.toml.

Example fix

# before
[daemons.api]
run = "./serve"
port = 0

# after
[daemons.api]
run = "./serve"
port = 8080
Defensive patterns

Strategy: validation

Validate before calling

# shell: check ports are integers 1-65535
grep -E '^port\s*=' mise.toml | awk -F= '{p=$2+0; if (p<1||p>65535) print "bad port", p}'

Prevention

When it happens

Trigger: Setting `port = 0`, `port = -1`, `port = 70000`, or any integer outside 1..=65535 in a daemon declaration; port comes from an interpolated/templated number that overflowed.

Common situations: Using 0 to mean 'any port'; pasting a PID or container ID into port; template arithmetic producing a negative or >65535 value.

Understand the failure class

Background: "value must be between 0 and 1" / "out of range" / "must not be negative" errors: fixing range-validation failures across open-source libraries — this error's family across 42 libraries.

Related errors


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

Appendix: source

Thrown at src/daemons/mod.rs:105

                let preset = take_string(&mut table, "preset")?;
                let version = take_string(&mut table, "version")?;
                (preset, version, table)
            }
        };
        let daemon = if let Some(preset) = preset {
            let version = version
                .ok_or_else(|| eyre::eyre!("[daemons.{name}] requires version with preset"))?;
            presets::expand(&name, &preset, &version, table, &source, &root)?
        } else {
            if version.is_some() || table.contains_key("options") {
                bail!("[daemons.{name}] requires preset when specifying version or options");
            }
            if table.get("run").and_then(toml::Value::as_str).is_none() {
                bail!("[daemons.{name}] requires run or preset");
            }
            if let Some(port) = table.get("port").and_then(toml::Value::as_integer) {
                if !(1..=65535).contains(&port) {
                    bail!("daemon port must be an integer from 1 to 65535");
                }
                table.insert(
                    "port".into(),
                    toml::Value::Table(toml::Table::from_iter([
                        (
                            "expect".into(),
                            toml::Value::Array(vec![toml::Value::Integer(port)]),
                        ),
                        ("bump".into(), toml::Value::Boolean(false)),
                    ])),
                );
            }
            table
                .entry("mise".to_string())
                .or_insert(toml::Value::Boolean(true));
            Daemon {
                name: name.clone(),
                source,

View on GitHub (pinned to 533346cc37)