@hamedb89/localghost 0.1.10 → 0.1.13

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
@@ -9,7 +9,7 @@ Buh. Friendly local hostnames for app repos.
9
9
  [![CI](https://github.com/hamedb89/localghost/actions/workflows/ci.yml/badge.svg)](https://github.com/hamedb89/localghost/actions/workflows/ci.yml)
10
10
  [![GitHub Pages](https://github.com/hamedb89/localghost/actions/workflows/pages.yml/badge.svg)](https://github.com/hamedb89/localghost/actions/workflows/pages.yml)
11
11
  [![Publish npm](https://github.com/hamedb89/localghost/actions/workflows/publish-npm.yml/badge.svg)](https://github.com/hamedb89/localghost/actions/workflows/publish-npm.yml)
12
- [![npm version](https://img.shields.io/badge/npm-v0.1.10-CB3837?logo=npm)](https://www.npmjs.com/package/@hamedb89/localghost)
12
+ [![npm version](https://img.shields.io/npm/v/@hamedb89/localghost?logo=npm)](https://www.npmjs.com/package/@hamedb89/localghost)
13
13
 
14
14
  Localghost is a tiny Node.js CLI for clean local app domains. Add it as a dev dependency, keep running the command your team already knows, and use `http://app.localhost/` instead of remembering which port belongs to which process.
15
15
 
@@ -17,10 +17,17 @@ Localghost is a tiny Node.js CLI for clean local app domains. Add it as a dev de
17
17
 
18
18
  ## Quick Start
19
19
 
20
+ Install it as a dev dependency:
21
+
20
22
  ```sh
23
+ npm install -D @hamedb89/localghost
24
+ pnpm add -D @hamedb89/localghost
21
25
  yarn add -D @hamedb89/localghost
26
+ bun add -d @hamedb89/localghost
22
27
  ```
23
28
 
29
+ Use the command for your package manager; you only need one of the four lines above.
30
+
24
31
  For Vite apps, add the plugin once:
25
32
 
26
33
  ```ts
@@ -35,7 +42,7 @@ export default defineConfig({
35
42
  Then keep using the command your repo already expects:
36
43
 
37
44
  ```sh
38
- yarn dev
45
+ npm exec localghost
39
46
  ```
40
47
 
41
48
  On the first interactive run, Localghost can create `.localghost`, explain the `/etc/hosts` change, write `ops/local/Caddyfile`, and print the browser-facing URL:
@@ -52,82 +59,543 @@ For non-Vite apps, wrap your raw dev command:
52
59
  ```json
53
60
  {
54
61
  "scripts": {
55
- "dev": "localghost run -- yarn dev:raw",
62
+ "dev": "localghost run -- next dev",
56
63
  "dev:raw": "next dev"
57
64
  }
58
65
  }
59
66
  ```
60
67
 
61
- ## What It Does
68
+ ## The Simple Stuff
62
69
 
63
- - Reads `.localghost` from your app repo and turns hostnames into local routes.
64
- - Updates only a managed Localghost block in `/etc/hosts` during explicit setup.
65
- - Generates `ops/local/Caddyfile` for local reverse proxying.
66
- - Keeps HTTP as the default; HTTPS is explicit with `--https`, `--ssl`, or config.
67
- - Checks whether Caddy is installed, but never installs Homebrew packages for you.
68
- - Gives Vite explicit `server.allowedHosts` entries without using `allowedHosts: true`.
69
- - Exposes CLI, config, state, and route output for scripts and agent workflows.
70
+ Start the detected development server with Localghost:
70
71
 
71
- ## Common Commands
72
+ ```sh
73
+ npm exec localghost
74
+ ```
75
+
76
+ Localghost detects the package manager, prefers a non-recursive `dev:raw` script, falls back to `dev`, repairs stale setup when needed, then starts Caddy and the server. Preview the decision without starting anything:
77
+
78
+ ```sh
79
+ npm exec localghost -- --dry-run
80
+ ```
81
+
82
+ Create the repo-local hostname contract:
72
83
 
73
84
  ```sh
74
85
  localghost init --write-scripts
86
+ ```
87
+
88
+ Check whether the machine is ready:
89
+
90
+ ```sh
75
91
  localghost doctor
92
+ ```
93
+
94
+ Prepare `/etc/hosts` and the local Caddyfile:
95
+
96
+ ```sh
76
97
  localghost setup
98
+ ```
99
+
100
+ Check setup readiness:
101
+
102
+ ```sh
77
103
  localghost status --ready
104
+ ```
105
+
106
+ Repair stale hosts, Caddy configuration, or setup state:
107
+
108
+ ```sh
109
+ localghost repair
110
+ ```
111
+
112
+ Run only the local proxy:
113
+
114
+ ```sh
78
115
  localghost dev
116
+ ```
117
+
118
+ Wrap an app server:
119
+
120
+ ```sh
79
121
  localghost run -- vite
122
+ ```
123
+
124
+ See the domain layer:
125
+
126
+ ```sh
127
+ localghost routes
128
+ ```
129
+
130
+ ```txt
80
131
  localghost routes
132
+ http://app.localhost/ -> http://127.0.0.1:5173
133
+ http://api.app.localhost/ -> http://127.0.0.1:8787
134
+ ```
135
+
136
+ See active Localghost sessions:
137
+
138
+ ```sh
81
139
  localghost ps
82
- localghost reset
83
- localghost teardown
140
+ localghost ps --json
141
+ ```
142
+
143
+ Check for updates:
144
+
145
+ ```sh
84
146
  localghost update
85
147
  ```
86
148
 
87
149
  Prefer `.localhost` names. `.local` is supported, but Localghost warns because `.local` can collide with mDNS/Bonjour.
88
150
 
89
- ## Configuration
151
+ ## What It Changes
152
+
153
+ Localghost is intentionally small and explicit:
154
+
155
+ - Reads `.localghost` from your app repo and turns hostnames into local routes.
156
+ - Updates only a managed Localghost block in `/etc/hosts` during explicit setup.
157
+ - Generates `ops/local/Caddyfile` for local reverse proxying.
158
+ - Records setup state in `ops/local/localghost-state.json`.
159
+ - Keeps HTTP as the default; HTTPS is explicit with `--https`, `--ssl`, or config.
160
+ - Checks whether Caddy is installed, but never installs Homebrew packages for you.
161
+ - Gives Vite explicit `server.allowedHosts` entries without using `allowedHosts: true`.
162
+ - Never opens browser tabs by default.
163
+
164
+ `setup`, `dev`, and `teardown` refuse to run in production-like environments such as `NODE_ENV=production`, `VERCEL_ENV=production`, or `LOCALGHOST_ENV=production`.
165
+
166
+ ## Configuration By Use Case
90
167
 
91
- Most apps only need a `.localghost` file when they want explicit hostnames or multiple services:
168
+ ### One App Domain
169
+
170
+ Use a `.localghost` file when you want one stable local domain:
92
171
 
93
172
  ```txt
94
- # Format: <host> <port>
173
+ # .localghost
174
+ app.localhost 5173
175
+ ```
176
+
177
+ Then run:
178
+
179
+ ```sh
180
+ localghost setup
181
+ localghost run -- vite
182
+ ```
183
+
184
+ ### Multiple Local Services
185
+
186
+ Map each browser-facing host to the upstream port:
187
+
188
+ ```txt
189
+ # .localghost
95
190
  app.localhost 5173
96
191
  www.app.localhost 5173
97
192
  api.app.localhost 8787
193
+ admin.app.localhost 5174
98
194
  ```
99
195
 
100
- Most repos do not need `localghost.config.mjs`. Add it only for decisions like HTTPS, dynamic-port behavior, `www.` aliases, custom config files, or `ghostTunnel` preview domains.
196
+ `localghost routes` prints the same `domain -> upstream` map that `setup` and `dev` use.
101
197
 
102
- ## Trust
198
+ ### Add Package Scripts
103
199
 
104
- - CI runs typecheck, build, site build, and npm package dry-run on Node 20 and 22.
105
- - GitHub Pages is deployed by Actions from the checked-in `site/`, `docs/`, and `assets/` sources.
106
- - Preview the exact Pages artifact locally with `npm run site:serve`, then open `http://127.0.0.1:4173/`.
107
- - npm publish is guarded by `prepublishOnly` and the release workflow publishes with npm provenance.
108
- - Runtime dependencies are intentionally small: `commander` and `execa`. Vite is an optional peer dependency.
109
- - No postinstall scripts, hidden Homebrew installs, surprise browser tabs, or broad hosts-file rewrites.
110
- - Update checks are best-effort, cached for 24 hours, and can be disabled with `LOCALGHOST_NO_UPDATE_CHECK=1` or `--no-update-check`.
200
+ `localghost init --write-scripts` adds missing scripts without replacing your existing ones:
201
+
202
+ ```json
203
+ {
204
+ "scripts": {
205
+ "localghost:setup": "localghost setup",
206
+ "localghost:proxy": "localghost dev",
207
+ "localghost:proxy:https": "localghost dev --https",
208
+ "localghost:run": "localghost run --",
209
+ "localghost:ready": "localghost status --ready",
210
+ "localghost:repair": "localghost repair",
211
+ "localghost:trust": "localghost trust",
212
+ "localghost:ps": "localghost ps",
213
+ "localghost:print": "localghost print",
214
+ "localghost:routes": "localghost routes",
215
+ "localghost:status": "localghost status",
216
+ "localghost:reset": "localghost reset",
217
+ "localghost:teardown": "localghost teardown",
218
+ "localghost:doctor": "localghost doctor",
219
+ "localghost:update": "localghost update",
220
+ "caddy:setup": "localghost setup",
221
+ "caddy:dev": "localghost dev"
222
+ }
223
+ }
224
+ ```
225
+
226
+ ### Keep Your Existing Dev Command
227
+
228
+ Wrap the raw app server so teammates keep typing the normal command:
229
+
230
+ ```json
231
+ {
232
+ "scripts": {
233
+ "dev": "localghost run -- vite",
234
+ "dev:raw": "vite"
235
+ }
236
+ }
237
+ ```
238
+
239
+ For Turborepo, wrap the dev runner and keep dev uncached:
240
+
241
+ ```json
242
+ {
243
+ "scripts": {
244
+ "dev": "localghost run -- turbo dev",
245
+ "dev:raw": "turbo dev"
246
+ }
247
+ }
248
+ ```
249
+
250
+ ```json
251
+ {
252
+ "tasks": {
253
+ "dev": { "cache": false, "persistent": true }
254
+ }
255
+ }
256
+ ```
257
+
258
+ `localghost run` starts Caddy, handles optional HTTPS trust, starts the child command, passes `LOCALGHOST_PORT` and `VITE_PORT`, and stops Caddy when the child exits.
259
+
260
+ ### Vite Plugin
261
+
262
+ Use the plugin when you want Vite to bind to `127.0.0.1`, use the selected Localghost port, set strict `allowedHosts`, and print the browser-facing domain:
263
+
264
+ ```ts
265
+ import { defineConfig } from "vite";
266
+ import { localGhostPlugin } from "@hamedb89/localghost/vite";
267
+
268
+ export default defineConfig({
269
+ plugins: [
270
+ localGhostPlugin({
271
+ port: 5173,
272
+ configFiles: [".localghost.private", ".localghost"]
273
+ })
274
+ ]
275
+ });
276
+ ```
277
+
278
+ The plugin runs only during local `vite serve`; production/build mode does not configure Vite dev-server hosting. If `ghostTunnel` is configured, the build hook can still print the production URL shape for visibility.
279
+
280
+ ### Custom Config Files
281
+
282
+ By default, Localghost reads `.localghost`. Repos that need another file name can be explicit:
283
+
284
+ ```sh
285
+ localghost print --config .localghost.preview
286
+ localghost setup --config .localghost.preview
287
+ ```
288
+
289
+ You can pass `--config` more than once. Localghost uses the first file that exists:
111
290
 
112
- ## Docs
291
+ ```sh
292
+ localghost print --config .localghost.private --config .localghost
293
+ ```
294
+
295
+ You can also search project-root filenames with a regular expression:
113
296
 
114
- The full docs are served on GitHub Pages:
297
+ ```sh
298
+ localghost print --config-pattern '^\.localghost\.(private|preview)$'
299
+ ```
115
300
 
116
- - [User flows](https://hamedb89.github.io/localghost/docs/flows/)
117
- - [CLI reference](https://hamedb89.github.io/localghost/docs/localghost.1/)
118
- - [Ghost Tunnel guide](https://hamedb89.github.io/localghost/docs/ghost-tunnel/)
119
- - [macOS widget notes](https://hamedb89.github.io/localghost/docs/macos-widget/)
120
- - [Brand guidelines](https://hamedb89.github.io/localghost/docs/brand/)
121
- - [All docs](https://hamedb89.github.io/localghost/docs/)
301
+ The Vite plugin accepts the same idea through `fileName`, `configFiles`, or `configPattern`.
302
+
303
+ ### Shared Project Defaults
304
+
305
+ Most repos do not need `localghost.config.mjs`. Add it when you want shared defaults for CLI and Vite:
306
+
307
+ ```js
308
+ import { defineLocalghostConfig } from "@hamedb89/localghost";
309
+
310
+ export default defineLocalghostConfig({
311
+ project: "app",
312
+ port: 5173,
313
+ dynamicPort: true,
314
+ autoRepair: true,
315
+ wwwAlias: true
316
+ });
317
+ ```
318
+
319
+ Localghost derives `project` from `package.json`, defaults to port `5173`, keeps HTTP as the default, enables dynamic ports and setup repair by default, and adds `www.` aliases by default. `run`, `dev`, and the Vite plugin perform a read-only readiness check first and repair only when the managed hosts block or setup state is stale.
320
+
321
+ With no subcommand, `command` takes precedence. Otherwise Localghost detects npm, pnpm, Yarn, or Bun and runs `dev:raw` or `dev`. Scripts that invoke Localghost are skipped to prevent recursion.
322
+
323
+ ### Multiple Apps
324
+
325
+ For a monorepo where one root command already starts every app, keep using `command` and list the routes in `.localghost`.
326
+
327
+ When Localghost should own each process, configure explicit services:
328
+
329
+ ```js
330
+ export default defineLocalghostConfig({
331
+ services: [
332
+ {
333
+ name: "web",
334
+ cwd: "apps/web",
335
+ host: "xyz.localhost",
336
+ port: 5173
337
+ },
338
+ {
339
+ name: "api",
340
+ cwd: "apps/api",
341
+ host: "api.xyz.localhost",
342
+ port: 8787
343
+ }
344
+ ]
345
+ });
346
+ ```
347
+
348
+ Then bare `localghost` starts one Caddy instance and both services. Each command runs in its own `cwd` and receives its own `LOCALGHOST_PORT`, `VITE_PORT`, and `LOCALGHOST_SERVICE`. Dynamic-port selection and setup repair apply to every service. When Caddy or any service exits, Localghost stops the remaining processes.
349
+
350
+ Omit a service `command` to detect `dev:raw` or `dev` from that service directory. Service directories must stay inside the project root, and names and hosts must be unique.
351
+
352
+ Caddy startup and validation logs are quiet after success; configuration errors remain visible. Set `LOCALGHOST_CADDY_VERBOSE=1` when debugging Caddy itself. Once all service ports are listening, Localghost prints the final hostname-to-upstream map beneath the service startup logs.
353
+
354
+ Try the runnable Node example in [`examples/multi-service`](./examples/multi-service).
355
+
356
+ Disable automatic repair when you want strict failure behavior:
357
+
358
+ ```sh
359
+ localghost run --auto-repair=no -- vite
360
+ ```
361
+
362
+ Or set `autoRepair: false` in `localghost.config.mjs`. HTTPS certificate trust remains explicit.
363
+
364
+ ### Fixed Ports
365
+
366
+ Dynamic ports are on by default. Localghost starts at the configured port, checks `127.0.0.1:<port>`, and walks upward until it finds a free port.
367
+
368
+ Use strict fixed-port behavior when you want startup to fail instead:
369
+
370
+ ```sh
371
+ localghost run --dynamic-port=no -- vite
372
+ ```
373
+
374
+ Or in config:
375
+
376
+ ```js
377
+ export default defineLocalghostConfig({
378
+ dynamicPort: false
379
+ });
380
+ ```
381
+
382
+ ### Local HTTPS
383
+
384
+ HTTP is the default. Use HTTPS only when you explicitly want Caddy local certificates:
385
+
386
+ ```sh
387
+ localghost setup --https
388
+ localghost dev --https
389
+ ```
390
+
391
+ Trust Caddy's local HTTPS CA when you want browsers to stop showing local certificate warnings:
392
+
393
+ ```sh
394
+ localghost trust
395
+ localghost run --trust -- vite
396
+ ```
397
+
398
+ macOS may ask for your password so Caddy can add its local CA to Keychain. Localghost records the trust result in `ops/local/localghost-state.json`.
399
+
400
+ You can also make HTTPS the repo default:
401
+
402
+ ```js
403
+ export default defineLocalghostConfig({
404
+ https: true
405
+ });
406
+ ```
407
+
408
+ ### Disable `www.` Aliases
409
+
410
+ By default, `app.localhost 5173` also creates `www.app.localhost`.
411
+
412
+ Disable that when the repo wants only exact hosts:
413
+
414
+ ```js
415
+ export default defineLocalghostConfig({
416
+ wwwAlias: false
417
+ });
418
+ ```
419
+
420
+ ### Public Ghost Tunnel
421
+
422
+ `ghostTunnel` is an opt-in production URL shape for deployed wildcard endpoints. It does not change local Caddy or `/etc/hosts` setup.
423
+
424
+ Use public mode when the deployed app should react to whatever route arrives:
425
+
426
+ ```js
427
+ import { defineLocalghostConfig } from "@hamedb89/localghost";
428
+
429
+ export default defineLocalghostConfig({
430
+ ghostTunnel: {
431
+ mode: "public",
432
+ domains: "copper-comet.example"
433
+ }
434
+ });
435
+ ```
436
+
437
+ Build output stays flexible instead of filling slots from the build machine:
438
+
439
+ ```txt
440
+ localghost ghost tunnel
441
+ mode: public
442
+ configured: https://<route>-<project>-<owner>.ghost.copper-comet.example/
443
+ ```
444
+
445
+ Production code can parse and validate the incoming wildcard host:
446
+
447
+ ```ts
448
+ import {
449
+ assertSecureGhostTunnelRequest,
450
+ readLocalghostProjectConfig
451
+ } from "@hamedb89/localghost";
452
+
453
+ const { config } = await readLocalghostProjectConfig();
454
+
455
+ const route = assertSecureGhostTunnelRequest({
456
+ host: request.headers.get("host") ?? "",
457
+ domain: "copper-comet.example",
458
+ protocol: "https",
459
+ authenticated: Boolean(session),
460
+ ghostTunnel: config.ghostTunnel
461
+ });
462
+ ```
463
+
464
+ By default, secure requests require HTTPS and app-authenticated access.
465
+
466
+ ### Concrete Ghost Tunnel Preview
467
+
468
+ Use `preview` only when you want one concrete URL in logs or menus:
469
+
470
+ ```js
471
+ export default defineLocalghostConfig({
472
+ ghostTunnel: {
473
+ mode: "public",
474
+ domains: "copper-comet.example",
475
+ preview: {
476
+ route: "decisionlayer",
477
+ project: "decision-layer",
478
+ owner: "hamedbahrami"
479
+ }
480
+ }
481
+ });
482
+ ```
483
+
484
+ That prints:
485
+
486
+ ```txt
487
+ localghost ghost tunnel
488
+ mode: public
489
+ configured: https://decisionlayer-decision-layer-hamedbahrami.ghost.copper-comet.example/
490
+ ```
491
+
492
+ ### Manual Ghost Tunnel
493
+
494
+ Manual mode is the default. It is useful for private or operator-mediated sharing flows:
495
+
496
+ ```js
497
+ export default defineLocalghostConfig({
498
+ ghostTunnel: {
499
+ mode: "manual",
500
+ domains: "moonlit-otter.example"
501
+ }
502
+ });
503
+ ```
504
+
505
+ Manual relay helpers are private by default: registration requires a local-agent bearer token plus an exact signed route claim, targets must be explicit local host/port objects, dangerous ports are blocked, sensitive headers/logs are redacted, and offline agents get a safe 503 page.
506
+
507
+ ### Script And Agent Output
508
+
509
+ Use JSON when scripts, menu bar tools, or agents need stable output:
510
+
511
+ ```sh
512
+ localghost print
513
+ localghost status --json
514
+ localghost ps --json
515
+ localghost update --json
516
+ ```
517
+
518
+ `print` parses the selected config file. `status` reports the project-local setup state. `ps` reports active sessions across projects and whether each upstream port is listening.
519
+
520
+ ### Reset Or Remove Localghost
521
+
522
+ Reconcile the managed hosts block, regenerate and validate the Caddyfile, and refresh setup state:
523
+
524
+ ```sh
525
+ localghost repair
526
+ ```
527
+
528
+ For HTTPS certificate trust problems, explicitly re-run Caddy's trust step:
529
+
530
+ ```sh
531
+ localghost repair --https --trust
532
+ ```
533
+
534
+ If a running Caddy process exits, `localghost run` exits with it; starting the normal development command again launches a fresh Caddy process.
535
+
536
+ Retest setup without deleting `.localghost`:
537
+
538
+ ```sh
539
+ localghost reset
540
+ localghost setup
541
+ ```
542
+
543
+ Remove only the managed hosts block for this project:
544
+
545
+ ```sh
546
+ localghost teardown
547
+ ```
548
+
549
+ Remove the generated Caddyfile too:
550
+
551
+ ```sh
552
+ localghost teardown --remove-caddyfile
553
+ ```
554
+
555
+ ### macOS Widget
556
+
557
+ Localghost includes a tiny native macOS widget under `apps/macos-widget`. It reads the shared activity file and shows known setup/running instances.
558
+
559
+ Build it from source:
560
+
561
+ ```sh
562
+ npm run build
563
+ npm run macos:widget:build
564
+ ```
565
+
566
+ The app bundle is written to `dist/LocalghostWidget.app`.
567
+
568
+ ## CLI Reference
569
+
570
+ ```sh
571
+ localghost [--cwd path] [--dry-run]
572
+ localghost init [--write-scripts] [--config file] [--host host] [--port port]
573
+ localghost doctor
574
+ localghost setup [--project name] [--config file] [--config-pattern regex] [--https|--ssl]
575
+ localghost repair [--project name] [--config file] [--config-pattern regex] [--https|--ssl] [--trust]
576
+ localghost trust [--project name] [--config file] [--config-pattern regex] [--https|--ssl]
577
+ localghost reset [--project name]
578
+ localghost teardown [--project name] [--remove-caddyfile]
579
+ localghost status [--ready] [--json]
580
+ localghost ps [--json]
581
+ localghost update [--json]
582
+ localghost dev [--config file] [--config-pattern regex] [--https|--ssl] [--auto-repair yes|no] [--trust]
583
+ localghost run [--config file] [--config-pattern regex] [--https|--ssl] [--auto-repair yes|no] [--trust] [--dynamic-port] -- command
584
+ localghost routes [--https|--ssl]
585
+ localghost print [--config file] [--config-pattern regex]
586
+ ```
122
587
 
123
588
  ## API
124
589
 
125
590
  ```ts
126
591
  import {
592
+ assertSecureGhostTunnelRequest,
593
+ constructGhostTunnelUrl,
127
594
  getConfigFileCandidates,
128
595
  initLocalghost,
129
596
  readDevHosts,
130
597
  readLocalghostState,
598
+ readLocalghostProjectConfig,
131
599
  removeSystemHosts,
132
600
  renderCaddyfile,
133
601
  renderHostsBlock,
@@ -138,6 +606,28 @@ import {
138
606
  import { localGhostPlugin } from "@hamedb89/localghost/vite";
139
607
  ```
140
608
 
609
+ `localHostsPlugin` is also exported as a compatibility alias for the Vite helper.
610
+
611
+ ## Trust
612
+
613
+ - CI runs typecheck, build, site build, and npm package dry-run on Node 20 and 22.
614
+ - GitHub Pages is deployed by Actions from the checked-in `site/`, `docs/`, and `assets/` sources.
615
+ - Preview the exact Pages artifact locally with `npm run site:serve`, then open `http://127.0.0.1:4173/`.
616
+ - npm publish is guarded by `prepublishOnly` and the release workflow publishes with npm provenance.
617
+ - Runtime dependencies are intentionally small: `commander` and `execa`. Vite is an optional peer dependency.
618
+ - No postinstall scripts, hidden Homebrew installs, surprise browser tabs, or broad hosts-file rewrites.
619
+ - Update checks are best-effort, cached for 24 hours, and can be disabled with `LOCALGHOST_NO_UPDATE_CHECK=1` or `--no-update-check`.
620
+
621
+ ## More Docs
622
+
623
+ - [Website](https://hamedb89.github.io/localghost/)
624
+ - [Rendered docs](https://hamedb89.github.io/localghost/docs/)
625
+ - [User flows](./docs/flows.md)
626
+ - [CLI reference](./docs/localghost.1.md)
627
+ - [Ghost Tunnel guide](./docs/ghost-tunnel.md)
628
+ - [macOS widget notes](./docs/macos-widget.md)
629
+ - [Brand guidelines](./docs/brand.md)
630
+
141
631
  ## License
142
632
 
143
633
  MIT