Port 80 or 443 already in use

The ForgeKit router listens on port 80 (HTTP) and 443 (HTTPS) so your .test domains and localhost work without typing a port number. If something else on your machine is already using one of those ports, ForgeKit can't bind it, and your sites won't load.

When this happens, ForgeKit shows a persistent warning next to the Agent status, naming the exact process and PID holding the port:

Port 80 is in use by Skype.exe (PID 4521)
Sites won't load over HTTP until it's free.

This warning stays visible until the port is actually free again - it isn't a toast that disappears on its own.


What ForgeKit does automatically

ForgeKit doesn't just fail silently. When a bind attempt fails:

  1. It retries a few times over about 1.5 seconds, in case something briefly held the port during startup.
  2. If it's still blocked, it keeps retrying quietly every 5 seconds in the background.
  3. The moment the port frees up, ForgeKit binds it and the warning clears - no restart, and no need to toggle any setting.

So in most cases, closing whatever's using the port is all you need to do. ForgeKit picks it back up on its own.


Common causes

  • Another local dev tool (Laragon, XAMPP, WAMP, IIS/World Wide Web Publishing Service) already bound to port 80 or 443.
  • Skype, Teams, or another app that historically grabs port 80 or 443.
  • A previous ForgeKit agent process that didn't fully close (for example after a crash or a sleep/resume cycle) and is still holding the port.

How to find and close the blocking process

If ForgeKit's warning doesn't already tell you enough, open PowerShell and run:

Get-NetTCPConnection -State Listen | Where-Object LocalPort -In 80,443 |
    ForEach-Object {
        $p = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
        [PSCustomObject]@{ Port = $_.LocalPort; Process = $p.ProcessName; PID = $_.OwningProcess }
    }

Close the offending application, or end the process from Task Manager. ForgeKit will bind the port automatically within a few seconds.


Where this gets logged

Every bind attempt and failure is written to:

ForgeKit/logs/agent/agent.log

Useful if the warning disappeared before you got a chance to read it, or if you want to see how often a conflict has been happening.


See also → Vhosts and Routing · SSL and HTTPS · Where are logs stored?