diff --git a/packages/cli/src/commands/handlers/serve.ts b/packages/cli/src/commands/handlers/serve.ts index 8a365a89641..d4ecfed9745 100644 --- a/packages/cli/src/commands/handlers/serve.ts +++ b/packages/cli/src/commands/handlers/serve.ts @@ -27,9 +27,11 @@ export default Runtime.handler( function listen(hostname: string, port: Option.Option, password: string) { if (Option.isSome(port)) return bind(hostname, port.value, password) - // Preserve the familiar default when available, but let the OS choose a free - // port when another local server already owns 4096. - return bind(hostname, 4096, password).pipe(Effect.catch(() => bind(hostname, 0, password))) + const next = (port: number): ReturnType => + bind(hostname, port, password).pipe( + Effect.catch((error) => (port === 65_535 ? Effect.fail(error) : next(port + 1))), + ) + return next(4096) } function bind(hostname: string, port: number, password: string) {