README.md

# DevPortAllocator

Allocate development ports dynamically, while still honoring explicit env vars
like `PORT`.

Useful for Phoenix apps where port `4000` may already be taken.

## Production Warning

`DevPortAllocator` is for local development servers only.
It must not be used in production.
Use explicit, deterministic production port configuration instead.

## Installation

Add `dev_port_allocator` to your dependencies:

```elixir
def deps do
  [
    {:dev_port_allocator, git: "https://github.com/tillitio/dev_port_allocator.git", tag: "v0.1.0"}
  ]
end
```

## Usage

These examples are for development configuration only (for example in
`config/dev.exs` or `config/runtime.exs` guarded to dev).

### Single endpoint

```elixir
port_result = DevPortAllocator.resolve_port()

if port_result.source == :fallback do
  IO.puts("Default dev port 4000 is in use. Using #{port_result.port} instead.")
end

config :my_app, MyAppWeb.Endpoint, http: [port: port_result.port]
```

### Multi-endpoint contiguous block

```elixir
result =
  DevPortAllocator.resolve_block(System.get_env(),
    env_vars: ["PORT", "PORT_2", "PORT_3"],
    default_port: 4000,
    block_size: 3
  )

[primary_port, second_port, third_port] = result.ports
```

`env_vars` accepts any env var names.
If `PORT`/`PORT_2`/`PORT_3` are set, those explicit values are used.
Otherwise the allocator probes for the first available contiguous block.