## TL;DR
Errno 99 means Jupyter tried to bind to an IP address this machine does not have, usually because a config file hardcodes an old IP or a container passes the host's address. Find the configured IP in `jupyter_server_config.py` or the `--ip` flag. Change it to the all-interfaces address so the server binds to every local interface, or set it to an address the machine actually holds.

```text
OSError: [Errno 99] Cannot assign requested address
```

## Use this when
- The server fails during startup with Errno 99 before serving anything.
- A config file or launch script passes `--ip` with a specific address.
- The machine's IP changed (new network, moved container, DHCP renewal).

## Not for this skill when
- The error is Errno 98 / address already in use. That is a port conflict.
- The server starts but browsers cannot connect. That is firewall or proxy.

## Steps
1. Find the configured IP: `grep -rn "c.ServerApp.ip" ~/.jupyter/` and check your launch command for `--ip`. Verify: you know which address it wants.
2. List the machine's addresses: `ip addr show` (or `ifconfig`). Verify: the configured IP is absent from the list.
3. Change the config to the all-interfaces address, or to one of the listed addresses. Verify: the config file or flag now names a valid target.
4. Start the server. Verify: the startup log shows it listening without Errno 99.
5. If a container orchestrator injects the IP, fix the injection (env var or entrypoint) rather than the config file. Verify: a fresh container starts cleanly.

## Variant phrasings
### errno 99 jupyter cannot assign requested address
Short form. The IP is not local.

### jupyter server won't start errno 99
Symptom phrasing. Check the bind address.

### cannot assign requested address notebook server
General phrasing. Same bind-address fix.

Compatibility: All jupyter_server versions. The bind semantics come from the OS socket layer, not Jupyter.

## Why it happens
Binding a socket to a specific IP requires that IP to be assigned to a local interface. Configs copied between machines, containers that hardcode the host's IP, and laptops that changed networks all produce the same failure: Jupyter asks the OS for an address the OS has never heard of, and the OS refuses with Errno 99 before Jupyter prints anything useful.

## Edge cases / pitfalls
- Binding to the all-interfaces address exposes the server on every network interface. Set a token or password; do not rely on obscurity.
- VPN connect/disconnect cycles add and remove interface addresses. A config that worked pre-VPN can Errno-99 post-VPN.
- In Docker, the container never has the host's IP. Bind to the all-interfaces address inside the container and publish the port.
- IPv6 vs IPv4 matters: an IPv4 literal on an IPv6-only interface also raises Errno 99. Match the address family.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_HUzL-MlN1JYkpM-WYP-uSw
