Port collisions
Services fail because another project, stale process, or container is already bound to the port your app expects.
Portless
Start processes, containers, databases, and web apps with one command. Portless automatically avoids collisions and exposes services through stable local URLs.
$ portless up
Portless workspace: sensx
✓ postgres running localhost:49231
✓ redis running localhost:49232
✓ api running api.sensx.localhost
✓ web running web.sensx.localhost
Done.
The local dev tax
Services fail because another project, stale process, or container is already bound to the port your app expects.
Developers bounce between localhost numbers instead of opening stable names that map to the service they need.
Setup docs drift as projects add services, change commands, and rely on tribal knowledge to get everything running.
Before and after
Portless keeps ports flexible internally while your browser and team docs use stable local hostnames.
How it works
Detect apps, Docker Compose services, common frameworks, and likely ports in the workspace.
Start services in dependency order, assign open ports, and wire local routing for web endpoints.
Use service hostnames like api.sensx.localhost while Portless handles the port details.
Built for real workspaces
Avoid collisions without rewriting project defaults.
Open predictable URLs for every routed service.
Run local commands and containers together.
Bring up databases before APIs and APIs before frontends.
Use a proven local proxy for clean service routes.
Run conflicting projects side by side with separate hostnames.
Scan a workspace and write a useful starting config.
Inspect service output by name when something needs attention.
Configuration
Portless config keeps service commands, dependencies, ports, and routes close to the project instead of scattered across shell notes and README updates.
workspace:
name: sensx
services:
postgres:
type: docker
image: postgres:17
internalPort: 5432
api:
type: process
command: ./gradlew :api:bootRun
port: 8080
portEnv: SERVER_PORT
dependsOn:
- postgres
route:
host: api
web:
type: process
workingDir: web
command: npm run dev
port: 5173
route:
host: web
Project isolation
Scan first
Portless can inspect common project signals, rank confidence, and create a starter config with one write flag.
$ portless scan
Discovered:
✓ api Gradle Spring Boot high
✓ web Vite high
✓ postgres Docker Compose high
✓ redis Docker Compose high
Run "portless scan --write" to create portless.yaml
Install
Start with Homebrew, generate a config, and run the local stack through stable service names.
brew install portless-run/tap/portless
portless scan --write
portless up
portless ps
portless logs api
portless open web
portless down