portless 0.10.3 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -38,8 +38,112 @@ When auto-starting, portless reuses the configuration (port, TLS, TLD) from the
38
38
 
39
39
  In non-interactive environments (no TTY, or `CI=1`), portless exits with a descriptive error instead of prompting, so task runners like turborepo and CI scripts fail early with a clear message.
40
40
 
41
+ ## Configuration
42
+
43
+ Bare `portless` works out of the box. It runs the `"dev"` script from `package.json` through the proxy, inferring the app name from the package name, git root, or directory:
44
+
45
+ ```bash
46
+ portless # -> runs "dev" script, https://<project>.localhost
47
+ ```
48
+
49
+ Use an optional `portless.json` to override defaults:
50
+
51
+ ```json
52
+ { "name": "myapp" }
53
+ ```
54
+
55
+ ```bash
56
+ portless # -> runs "dev" script, https://myapp.localhost
57
+ ```
58
+
59
+ The script defaults to `"dev"`. The name is inferred from `package.json` if not set in config.
60
+
61
+ ### Monorepo
62
+
63
+ One `portless.json` at the repo root covers all workspace packages. Portless discovers packages from `pnpm-workspace.yaml`, or the `"workspaces"` field in `package.json` (npm, yarn, bun):
64
+
65
+ ```json
66
+ {
67
+ "apps": {
68
+ "apps/web": { "name": "myapp" },
69
+ "apps/api": { "name": "api.myapp" }
70
+ }
71
+ }
72
+ ```
73
+
74
+ ```bash
75
+ portless # from repo root: starts all workspace packages with a "dev" script
76
+ cd apps/web && portless # start just one package
77
+ ```
78
+
79
+ The `apps` map is optional and only needed for name overrides. Packages not listed still auto-discover with names inferred from their `package.json`.
80
+
81
+ Without an `apps` map, hostnames follow the `<package>.<project>.localhost` convention. The project name comes from the most common npm scope across workspace packages (e.g. `@myorg/web` and `@myorg/api` produce `myorg`), falling back to the workspace root directory name. If a package's short name matches the project name, it gets the bare `<project>.localhost` without duplication.
82
+
83
+ ### Config fields
84
+
85
+ | Field | Type | Default | Description |
86
+ | --------- | ------- | -------- | --------------------------------------------------------- |
87
+ | `name` | string | inferred | Base app name. Worktree prefix still applies. |
88
+ | `script` | string | `"dev"` | Name of a `package.json` script to run. |
89
+ | `appPort` | number | auto | Fixed port for the child process. |
90
+ | `proxy` | boolean | auto | Whether to route through the proxy. Auto-detected. |
91
+ | `apps` | object | | Overrides for workspace packages, keyed by relative path. |
92
+ | `turbo` | boolean | `true` | Set `false` to use direct spawning instead of turborepo. |
93
+
94
+ ### package.json "portless" key
95
+
96
+ Instead of a separate `portless.json`, you can add a `"portless"` key to your `package.json`. A string value is shorthand for setting the name:
97
+
98
+ ```json
99
+ {
100
+ "name": "@myorg/web",
101
+ "portless": "myapp"
102
+ }
103
+ ```
104
+
105
+ An object supports all per-app fields (`name`, `script`, `appPort`, `proxy`):
106
+
107
+ ```json
108
+ {
109
+ "name": "@myorg/web",
110
+ "portless": { "name": "myapp", "script": "dev:app" }
111
+ }
112
+ ```
113
+
114
+ The `package.json` `"portless"` key takes precedence over `portless.json` app entries but is overridden by CLI flags.
115
+
116
+ ### --script flag
117
+
118
+ Override the default script for a single invocation:
119
+
120
+ ```bash
121
+ portless --script start # run "start" instead of "dev"
122
+ portless --script test # run "test" instead of "dev"
123
+ ```
124
+
125
+ ### Turborepo
126
+
127
+ To use portless with turborepo, put `portless` as the `dev` script and the real command in a separate script:
128
+
129
+ ```json
130
+ {
131
+ "scripts": {
132
+ "dev": "portless",
133
+ "dev:app": "next dev"
134
+ },
135
+ "portless": { "name": "myapp", "script": "dev:app" }
136
+ }
137
+ ```
138
+
139
+ Turbo runs each package's `dev` script, which invokes portless. Portless reads the config, detects the package manager, and runs `pnpm run dev:app` (or yarn/bun/npm) through the proxy. No changes to `turbo.json` are needed.
140
+
141
+ `pnpm dev` at the root works through turbo as usual. People without portless can run `pnpm run dev:app` directly.
142
+
41
143
  ## Use in package.json
42
144
 
145
+ You can still use portless in `package.json` scripts:
146
+
43
147
  ```json
44
148
  {
45
149
  "scripts": {
@@ -48,6 +152,18 @@ In non-interactive environments (no TTY, or `CI=1`), portless exits with a descr
48
152
  }
49
153
  ```
50
154
 
155
+ With a `portless.json`, you can simplify to:
156
+
157
+ ```json
158
+ {
159
+ "scripts": {
160
+ "dev": "next dev"
161
+ }
162
+ }
163
+ ```
164
+
165
+ Then run `portless` or `portless run` to go through the proxy.
166
+
51
167
  ## Subdomains
52
168
 
53
169
  Organize services with subdomains:
@@ -163,7 +279,9 @@ LAN mode depends on the system mDNS tools that portless already spawns: macOS sh
163
279
  ## Commands
164
280
 
165
281
  ```bash
166
- portless run [--name <name>] <cmd> [args...] # Infer name (or override with --name), run through proxy
282
+ portless # Run dev script through proxy
283
+ portless # From monorepo root: run all workspace packages
284
+ portless run [--name <name>] [cmd] [args...] # Infer name, run through proxy
167
285
  portless <name> <cmd> [args...] # Run app at https://<name>.localhost
168
286
  portless alias <name> <port> # Register a static route (e.g. for Docker)
169
287
  portless alias <name> <port> --force # Overwrite an existing route
@@ -171,6 +289,7 @@ portless alias --remove <name> # Remove a static route
171
289
  portless list # Show active routes
172
290
  portless trust # Add local CA to system trust store
173
291
  portless clean # Remove state, CA trust entry, and hosts block
292
+ portless prune # Kill orphaned dev servers from crashed sessions
174
293
  portless hosts sync # Add routes to /etc/hosts (fixes Safari)
175
294
  portless hosts clean # Remove portless entries from /etc/hosts
176
295
 
@@ -200,6 +319,7 @@ portless proxy stop # Stop the proxy
200
319
  --foreground Run proxy in foreground instead of daemon
201
320
  --tld <tld> Use a custom TLD instead of .localhost (e.g. test)
202
321
  --wildcard Allow unregistered subdomains to fall back to parent route
322
+ --script <name> Run a specific package.json script (default: dev)
203
323
  --app-port <number> Use a fixed port for the app (skip auto-assignment)
204
324
  --force Kill the existing process and take over its route
205
325
  --name <name> Use <name> as the app name
@@ -225,7 +345,7 @@ PORTLESS_URL Public URL (e.g. https://myapp.localhost)
225
345
  NODE_EXTRA_CA_CERTS Path to the portless CA (when HTTPS is active)
226
346
  ```
227
347
 
228
- > **Reserved names:** `run`, `get`, `alias`, `hosts`, `list`, `trust`, `clean`, and `proxy` are subcommands and cannot be used as app names directly. Use `portless run <cmd>` to infer the name from your project, or `portless --name <name> <cmd>` to force any name including reserved ones.
348
+ > **Reserved names:** `run`, `get`, `alias`, `hosts`, `list`, `trust`, `clean`, `prune`, and `proxy` are subcommands and cannot be used as app names directly. Use `portless run <cmd>` to infer the name from your project, or `portless --name <name> <cmd>` to force any name including reserved ones.
229
349
 
230
350
  ## Uninstall / reset
231
351
 
@@ -280,7 +400,7 @@ devServer: {
280
400
  }
281
401
  ```
282
402
 
283
- Portless automatically sets `NODE_EXTRA_CA_CERTS` in child processes so Node.js trusts the portless CA. If you run a separate Node.js process outside portless, point it at the CA manually: `NODE_EXTRA_CA_CERTS=/tmp/portless/ca.pem` (or `~/.portless/ca.pem` when the proxy runs on a non-privileged port like 1355). Alternatively, use `--no-tls` for plain HTTP.
403
+ Portless automatically sets `NODE_EXTRA_CA_CERTS` in child processes so Node.js trusts the portless CA. If you run a separate Node.js process outside portless, point it at the CA manually: `NODE_EXTRA_CA_CERTS=~/.portless/ca.pem`. Alternatively, use `--no-tls` for plain HTTP.
284
404
 
285
405
  Portless detects this misconfiguration and responds with `508 Loop Detected` along with a message pointing to this fix.
286
406