Port collisions
Another project, stale server, or container grabs the port first. Now startup depends on local cleanup rituals.
Portless
Portless starts processes, containers, databases, and frontends together, assigns safe ports behind the scenes, and gives every service a stable .localhost URL your team can remember.
$ portless up
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
Another project, stale server, or container grabs the port first. Now startup depends on local cleanup rituals.
APIs, frontends, and admin tools drift across random numbers that nobody wants in screenshots or docs.
Every repo grows its own startup lore: which command first, which port changed, which terminal tab matters.
Before and after
Ports stay flexible internally. Developers open the same clean URLs every time.
How it works
Find apps, Docker Compose services, frameworks, commands, and likely ports in the repo.
Start dependencies in order, allocate open ports, and wire routing for browser-facing services.
Use names like api.sensx.localhost while Portless handles the moving pieces.
Built for real workspaces
Keep app defaults. Portless finds safe loopback ports at runtime.
Use stable .localhost names instead of sharing port trivia.
Run shell commands, containers, databases, and frontends together.
Bring up backing services before the apps that depend on them.
Route local HTTP traffic through a proven proxy instead of custom glue.
Run similar repos side by side without fighting over 3000 or 8080.
Scan a repo and get a useful portless.yaml starting point.
Inspect service output by name instead of hunting terminal tabs.
Configuration
Commands, dependencies, routes, and expected ports live with the repo instead of in stale onboarding notes.
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 reads common framework, Compose, and Dev Container signals, resolves overlaps, and writes a starter config when you are ready.
$ portless project scan
Discovered:
✓ api Gradle Spring Boot high
✓ web Vite high
✓ postgres Docker Compose high
✓ redis Docker Compose high
Run "portless project scan --explain" to see why each service was selected
Run "portless project scan --write" to generate portless.yaml
Install
Generate a config, start the stack, open services by name, and shut it all down cleanly.
brew install portless-run/tap/portless
portless project scan --write
portless up
portless ps
portless logs api
portless open web
portless down