overmux 0.0.1 → 0.0.3
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/CHANGELOG.md +27 -0
- package/README.md +7 -0
- package/dist/auth/.vite/manifest.json +11 -0
- package/dist/auth/assets/index-Bx8JhwVi.css +1 -0
- package/dist/auth/assets/index-CHIE7qYj.js +72 -0
- package/dist/auth/index.html +14 -0
- package/dist/bin.js +4863 -7897
- package/dist/bin.js.map +1 -0
- package/dist/docs/000-index.md +21 -0
- package/dist/docs/100-introduction/100-what-is-overmux.md +7 -0
- package/dist/docs/100-introduction/200-how-overmux-works.md +7 -0
- package/dist/docs/100-introduction/300-why-overmux.md +22 -0
- package/dist/docs/200-getting-started/100-install-and-run-overmux.md +50 -0
- package/dist/docs/200-getting-started/200-install-overmux-desktop.md +41 -0
- package/dist/docs/200-getting-started/300-install-overmux-pwa.mdx +92 -0
- package/dist/docs/200-getting-started/400-secure-with-https/100-choose-an-https-setup.md +14 -0
- package/dist/docs/200-getting-started/400-secure-with-https/200-tailscale-serve.md +44 -0
- package/dist/docs/200-getting-started/400-secure-with-https/300-cloudflare-tunnel.md +59 -0
- package/dist/docs/200-getting-started/400-secure-with-https/400-self-hosted-reverse-proxy.md +32 -0
- package/dist/docs/300-fundamentals/100-project-structure.md +23 -0
- package/dist/docs/300-fundamentals/200-configuration.md +3 -0
- package/dist/docs/300-fundamentals/300-theming.md +3 -0
- package/dist/docs/300-fundamentals/400-server.md +3 -0
- package/dist/docs/300-fundamentals/500-client.md +3 -0
- package/dist/docs/300-fundamentals/600-operations.md +3 -0
- package/dist/docs/300-fundamentals/700-resources.md +3 -0
- package/dist/docs/300-fundamentals/800-streams.md +3 -0
- package/dist/docs/300-fundamentals/900-authentication-and-security.md +3 -0
- package/dist/docs/400-reference/100-configuration.md +3 -0
- package/dist/docs/400-reference/200-server-api.md +3 -0
- package/dist/docs/400-reference/300-client-api.md +20 -0
- package/dist/docs/400-reference/400-cli/050-init.md +17 -0
- package/dist/docs/400-reference/400-cli/100-serve.md +33 -0
- package/dist/docs/400-reference/400-cli/200-auth.md +52 -0
- package/dist/docs/400-reference/400-cli/300-call.md +28 -0
- package/dist/docs/400-reference/400-cli/400-check.md +20 -0
- package/dist/docs/400-reference/400-cli/500-ai-context.md +102 -0
- package/dist/docs/400-reference/400-cli/600-docs.md +23 -0
- package/dist/docs/400-reference/400-cli/700-desktop.md +35 -0
- package/dist/docs/500-hosted-pages.md +31 -0
- package/dist/exports/client.d.ts +254 -0
- package/dist/exports/client.d.ts.map +1 -0
- package/dist/exports/client.js +1665 -0
- package/dist/exports/client.js.map +1 -0
- package/dist/exports/index-D3_Dpy_T.d.ts +155 -0
- package/dist/exports/index-D3_Dpy_T.d.ts.map +1 -0
- package/dist/exports/index.d.ts +2 -0
- package/dist/exports/index.js +49 -0
- package/dist/exports/index.js.map +1 -0
- package/dist/exports/notifications-kDp16bU_.js +56 -0
- package/dist/exports/notifications-kDp16bU_.js.map +1 -0
- package/dist/exports/server.d.ts +63 -0
- package/dist/exports/server.d.ts.map +1 -0
- package/dist/exports/server.js +1120 -0
- package/dist/exports/server.js.map +1 -0
- package/dist/exports/style.css +368 -0
- package/dist/internal/server/coordinator/server-child.d.ts +1 -0
- package/dist/internal/server/coordinator/server-child.js +3299 -0
- package/dist/internal/server/coordinator/server-child.js.map +1 -0
- package/docs/000-index.md +21 -0
- package/docs/100-introduction/100-what-is-overmux.md +7 -0
- package/docs/100-introduction/200-how-overmux-works.md +7 -0
- package/docs/100-introduction/300-why-overmux.md +22 -0
- package/docs/200-getting-started/100-install-and-run-overmux.md +50 -0
- package/docs/200-getting-started/200-install-overmux-desktop.md +41 -0
- package/docs/200-getting-started/300-install-overmux-pwa.mdx +92 -0
- package/docs/200-getting-started/400-secure-with-https/100-choose-an-https-setup.md +14 -0
- package/docs/200-getting-started/400-secure-with-https/200-tailscale-serve.md +44 -0
- package/docs/200-getting-started/400-secure-with-https/300-cloudflare-tunnel.md +59 -0
- package/docs/200-getting-started/400-secure-with-https/400-self-hosted-reverse-proxy.md +32 -0
- package/docs/300-fundamentals/100-project-structure.md +23 -0
- package/docs/300-fundamentals/200-configuration.md +3 -0
- package/docs/300-fundamentals/300-theming.md +3 -0
- package/docs/300-fundamentals/400-server.md +3 -0
- package/docs/300-fundamentals/500-client.md +3 -0
- package/docs/300-fundamentals/600-operations.md +3 -0
- package/docs/300-fundamentals/700-resources.md +3 -0
- package/docs/300-fundamentals/800-streams.md +3 -0
- package/docs/300-fundamentals/900-authentication-and-security.md +3 -0
- package/docs/400-reference/100-configuration.md +3 -0
- package/docs/400-reference/200-server-api.md +3 -0
- package/docs/400-reference/300-client-api.md +20 -0
- package/docs/400-reference/400-cli/050-init.md +17 -0
- package/docs/400-reference/400-cli/100-serve.md +33 -0
- package/docs/400-reference/400-cli/200-auth.md +52 -0
- package/docs/400-reference/400-cli/300-call.md +28 -0
- package/docs/400-reference/400-cli/400-check.md +20 -0
- package/docs/400-reference/400-cli/500-ai-context.md +102 -0
- package/docs/400-reference/400-cli/600-docs.md +23 -0
- package/docs/400-reference/400-cli/700-desktop.md +35 -0
- package/docs/500-hosted-pages.md +31 -0
- package/package.json +59 -18
- package/src/internal/cli/app.ts +76 -0
- package/src/internal/cli/bin.ts +3 -0
- package/src/internal/cli/commands/ai.ts +44 -0
- package/src/internal/cli/commands/auth.ts +195 -0
- package/src/internal/cli/commands/call.ts +128 -0
- package/src/internal/cli/commands/check.ts +48 -0
- package/src/internal/cli/commands/desktop-installer.ts +446 -0
- package/src/internal/cli/commands/desktop-release.ts +190 -0
- package/src/internal/cli/commands/desktop.ts +47 -0
- package/src/internal/cli/commands/docs.ts +34 -0
- package/src/internal/cli/commands/init-template.ts +146 -0
- package/src/internal/cli/commands/init.ts +267 -0
- package/src/internal/cli/commands/integration.ts +15 -0
- package/src/internal/cli/commands/serve.ts +322 -0
- package/src/internal/cli/commands/zellij-install.ts +96 -0
- package/src/internal/cli/environment.ts +54 -0
- package/src/internal/cli/login.ts +46 -0
- package/src/internal/cli/managed-vite.ts +267 -0
- package/src/internal/cli/parse-port.ts +8 -0
- package/src/internal/client/auth/auth-api.ts +53 -0
- package/src/internal/client/auth/auth-shell.css +74 -0
- package/src/internal/client/auth/auth-shell.tsx +167 -0
- package/src/internal/client/auth/entry.tsx +26 -0
- package/src/internal/client/auth/index.html +13 -0
- package/src/internal/client/background-notifications.ts +194 -0
- package/src/internal/client/browser-api.ts +97 -0
- package/src/internal/client/client-definition.ts +184 -0
- package/src/internal/client/clipboard.ts +22 -0
- package/src/internal/client/commands.tsx +260 -0
- package/src/internal/client/host/browser-log-forwarding.ts +149 -0
- package/src/internal/client/host/desktop-host.ts +12 -0
- package/src/internal/client/host/hosted-pages/browser-notification-settings.tsx +118 -0
- package/src/internal/client/host/hosted-pages/hosted-page.css +87 -0
- package/src/internal/client/host/hosted-pages/hosted-page.tsx +9 -0
- package/src/internal/client/host/hosted-pages/logout-page.tsx +75 -0
- package/src/internal/client/host/hosted-pages/settings-page.tsx +45 -0
- package/src/internal/client/host/notification-forwarding.ts +13 -0
- package/src/internal/client/host/overmux-host.tsx +200 -0
- package/src/internal/client/host/recovery-screen.css +75 -0
- package/src/internal/client/host/recovery-screen.tsx +17 -0
- package/src/internal/client/host/update-popover.css +82 -0
- package/src/internal/client/host/update-popover.tsx +166 -0
- package/src/internal/client/index.ts +45 -0
- package/src/internal/client/overmux-react.ts +283 -0
- package/src/internal/client/shortcuts.tsx +373 -0
- package/src/internal/client/theme-scope.css +114 -0
- package/src/internal/client/theme-scope.tsx +107 -0
- package/src/internal/client/transport.ts +69 -0
- package/src/internal/client/websocket.ts +449 -0
- package/src/internal/server/auth/auth-http.ts +414 -0
- package/src/internal/server/auth/auth-service.ts +627 -0
- package/src/internal/server/auth/auth-shell-http.ts +90 -0
- package/src/internal/server/auth/instance-control.ts +381 -0
- package/src/internal/server/check-overmux.ts +364 -0
- package/src/internal/server/coordinator/ipc-protocol.ts +44 -0
- package/src/internal/server/coordinator/server-child.ts +108 -0
- package/src/internal/server/coordinator/server-coordinator.ts +262 -0
- package/src/internal/server/coordinator/update-watcher.ts +54 -0
- package/src/internal/server/http/authenticated-http-app-test-helper.ts +45 -0
- package/src/internal/server/http/background-notification-handlers.ts +83 -0
- package/src/internal/server/http/control-handlers.ts +44 -0
- package/src/internal/server/http/create-http-app.ts +53 -0
- package/src/internal/server/http/development-web-backend.ts +83 -0
- package/src/internal/server/http/operation-handler.ts +93 -0
- package/src/internal/server/http/request-logging.ts +34 -0
- package/src/internal/server/http/routes.ts +241 -0
- package/src/internal/server/http/runtime-manifest-handler.ts +12 -0
- package/src/internal/server/index.ts +16 -0
- package/src/internal/server/notifications/background-notification-payload.ts +74 -0
- package/src/internal/server/notifications/background-notification-service.ts +139 -0
- package/src/internal/server/notifications/background-notification-store.ts +162 -0
- package/src/internal/server/notifications/notification-service.ts +70 -0
- package/src/internal/server/notifications/private-json-file.ts +84 -0
- package/src/internal/server/paths.ts +13 -0
- package/src/internal/server/rate-limiter.ts +58 -0
- package/src/internal/server/runtime/create-runtime.ts +87 -0
- package/src/internal/server/runtime/resource-dependency-graph.ts +128 -0
- package/src/internal/server/runtime/runtime-lifecycle.ts +95 -0
- package/src/internal/server/runtime/runtime-operations.ts +78 -0
- package/src/internal/server/runtime/runtime-resources.ts +201 -0
- package/src/internal/server/runtime/runtime-streams.ts +130 -0
- package/src/internal/server/server-logger.ts +110 -0
- package/src/internal/server/server-startup-options.ts +51 -0
- package/src/internal/server/start-application-server.ts +412 -0
- package/src/internal/server/start-overmux-server.ts +26 -0
- package/src/internal/server/test-port.ts +23 -0
- package/src/internal/server/vite-websocket-proxy.ts +201 -0
- package/src/internal/server/websocket-connection.ts +586 -0
- package/src/internal/server/websocket-limits.ts +2 -0
- package/src/internal/server/websocket-server.ts +311 -0
- package/src/internal/shared/background-notifications.ts +37 -0
- package/src/internal/shared/index.ts +2 -0
- package/src/internal/shared/protocol.ts +317 -0
- package/src/internal/shared/routes.ts +3 -0
- package/src/public/ai-context.ts +44 -0
- package/src/public/client.ts +57 -0
- package/src/public/config.ts +287 -0
- package/src/public/contracts.ts +55 -0
- package/src/public/index.ts +57 -0
- package/src/public/notifications.ts +10 -0
- package/src/public/server.ts +16 -0
- package/dist/public/core.ts +0 -119
- package/dist/public/protocol.ts +0 -51
- package/dist/public/terminal.ts +0 -23
- package/dist/web/assets/index-DC___IUw.css +0 -2
- package/dist/web/assets/index-DF9Cptse.js +0 -74
- package/dist/web/assets/terminal-component-BrP-ENHg.css +0 -1
- package/dist/web/assets/terminal-component-DyLEbMrx.js +0 -36
- package/dist/web/index.html +0 -14
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Overmux documentation
|
|
3
|
+
description: Build and understand an Overmux application.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Overmux documentation
|
|
7
|
+
|
|
8
|
+
Overmux is a local or self-hosted web UI for tmux sessions, Pi agents, and Git workspaces.
|
|
9
|
+
|
|
10
|
+
- [What is Overmux?](./100-introduction/100-what-is-overmux.md)
|
|
11
|
+
- [How Overmux Works](./100-introduction/200-how-overmux-works.md)
|
|
12
|
+
- [Why Overmux?](./100-introduction/300-why-overmux.md)
|
|
13
|
+
- [Install and Run Overmux](./200-getting-started/100-install-and-run-overmux.md)
|
|
14
|
+
- [Install Overmux Desktop](./200-getting-started/200-install-overmux-desktop.md)
|
|
15
|
+
- [Install Overmux PWA](./200-getting-started/300-install-overmux-pwa.mdx)
|
|
16
|
+
- [Choose an HTTPS Setup](./200-getting-started/400-secure-with-https/100-choose-an-https-setup.md)
|
|
17
|
+
- [Tailscale Serve](./200-getting-started/400-secure-with-https/200-tailscale-serve.md)
|
|
18
|
+
- [Cloudflare Tunnel](./200-getting-started/400-secure-with-https/300-cloudflare-tunnel.md)
|
|
19
|
+
- [Self-hosted Reverse Proxy](./200-getting-started/400-secure-with-https/400-self-hosted-reverse-proxy.md)
|
|
20
|
+
|
|
21
|
+
Run `overmux docs` to print the absolute path to this installed documentation directory.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Why Overmux?
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
As AI coding agents have improved my time has shifted from:
|
|
6
|
+
|
|
7
|
+
- Writing code in an IDE
|
|
8
|
+
- Running commands manually
|
|
9
|
+
|
|
10
|
+
To:
|
|
11
|
+
|
|
12
|
+
- Talking to agents
|
|
13
|
+
- Reviewing code produced by agents
|
|
14
|
+
- Trying to "orient" myself in codebases and keep in touch with how things work
|
|
15
|
+
- Spawning and keeping track of agents
|
|
16
|
+
- Coding on my phone
|
|
17
|
+
|
|
18
|
+
I lived in a customized tmux setup. But kept noticing that that the terminal, for all it's glory, might not be the best place to build the experiences needed, especially for code review and mobile.
|
|
19
|
+
|
|
20
|
+
[Herdr](https://github.com/herdrdev/herdr) (a TUI) and [Orca](https://github.com/stablyai/orca) (web based) offer a decent default experience. But they lack the customizability I love with the terminal and neovim. They use their own muxer implementations and dictate workflows.
|
|
21
|
+
|
|
22
|
+
This future filled me with existential dread, so I built Overmux to embed my terminal in a Desktop webapp and build my own experience with a mix of tmux terminals + custom web uis.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Install and Run Overmux
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
First you need to install the `overmux` CLI.
|
|
6
|
+
|
|
7
|
+
### Recommended: Install with Mise
|
|
8
|
+
|
|
9
|
+
[Mise](https://mise.jdx.dev) installs and manages developer tools and their versions.
|
|
10
|
+
|
|
11
|
+
1. [Install Mise](https://mise.jdx.dev/getting-started.html).
|
|
12
|
+
|
|
13
|
+
2. Install Overmux globally:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
mise use --global npm:overmux
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Alternatively: Install with pnpm
|
|
20
|
+
|
|
21
|
+
Prerequisites:
|
|
22
|
+
|
|
23
|
+
- [Node.js 22](https://nodejs.org/en/download) or newer
|
|
24
|
+
- [pnpm 10](https://pnpm.io/installation) or newer
|
|
25
|
+
|
|
26
|
+
Install Overmux globally:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pnpm add --global overmux
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Initialize Overmux
|
|
33
|
+
|
|
34
|
+
Once the CLI is installed, create your Overmux setup:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
overmux init
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
This validates your toolchain, creates a minimal application in `$XDG_CONFIG_HOME/overmux`, installs its dependencies, and checks the result. Existing scaffold files are left unchanged. Read more in the [`overmux init` reference](../400-reference/400-cli/050-init.md) and [project structure](../300-fundamentals/100-project-structure.md).
|
|
41
|
+
|
|
42
|
+
## Start the server
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
overmux serve
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Open Overmux in your browser to confirm it works.
|
|
49
|
+
|
|
50
|
+
To configure hosts and ports, see [Configuration](../300-fundamentals/200-configuration.md).
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Install Overmux Desktop
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Overmux Desktop makes your already-running Overmux web server feel like a native app, with notifications.
|
|
6
|
+
|
|
7
|
+
## macOS
|
|
8
|
+
|
|
9
|
+
### Install using the CLI
|
|
10
|
+
|
|
11
|
+
After installing the Overmux CLI:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
overmux desktop install
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Overmux Desktop is installed in `~/Applications/Overmux.app`.
|
|
18
|
+
|
|
19
|
+
### Install from GitHub
|
|
20
|
+
|
|
21
|
+
Download the ZIP for your Mac from the [Overmux releases](https://github.com/richardgill/overmux/releases), extract it, then move `Overmux.app` to `~/Applications`.
|
|
22
|
+
|
|
23
|
+
Overmux is not currently signed or notarized. Follow [Apple's instructions for opening an app from an unidentified developer](https://support.apple.com/en-us/102445) to allow it to run.
|
|
24
|
+
|
|
25
|
+
## Linux
|
|
26
|
+
|
|
27
|
+
Download the AppImage or Debian package from the [Overmux releases](https://github.com/richardgill/overmux/releases).
|
|
28
|
+
|
|
29
|
+
For the AppImage:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
chmod +x Overmux-Desktop-<version>-linux-x64.AppImage
|
|
33
|
+
./Overmux-Desktop-<version>-linux-x64.AppImage
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
For Debian-based distributions:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
sudo apt install ./overmux-desktop_<version>_amd64.deb
|
|
40
|
+
overmux-desktop
|
|
41
|
+
```
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Install Overmux PWA
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Overmux is a [progressive web app (PWA)](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps), so you can install it on a mobile device. The installed app gets its own home screen icon and opens in a standalone window.
|
|
6
|
+
|
|
7
|
+
<Callout type="warning">
|
|
8
|
+
PWAs must be hosted on HTTPS. See [Choose an HTTPS setup](./400-secure-with-https/100-choose-an-https-setup.md).
|
|
9
|
+
</Callout>
|
|
10
|
+
|
|
11
|
+
## Chrome on Android
|
|
12
|
+
|
|
13
|
+
Open your Overmux URL and either select the **Add to Home Screen** banner or open the browser menu and select **Install app**. Confirm by selecting **Install**. You can then open Overmux from your home screen or app drawer.
|
|
14
|
+
|
|
15
|
+
<div style={{ display: "flex", flexWrap: "wrap", gap: "1rem" }}>
|
|
16
|
+
<ImageZoom
|
|
17
|
+
alt="The Add to Home Screen banner in Chrome on Android"
|
|
18
|
+
height={533}
|
|
19
|
+
src="https://docs.ntfy.sh/static/img/pwa-install-chrome-android.jpg"
|
|
20
|
+
width={240}
|
|
21
|
+
/>
|
|
22
|
+
<ImageZoom
|
|
23
|
+
alt="The Install app menu action in Chrome on Android"
|
|
24
|
+
height={533}
|
|
25
|
+
src="https://docs.ntfy.sh/static/img/pwa-install-chrome-android-menu.jpg"
|
|
26
|
+
width={240}
|
|
27
|
+
/>
|
|
28
|
+
<ImageZoom
|
|
29
|
+
alt="The PWA installation confirmation on Android"
|
|
30
|
+
height={533}
|
|
31
|
+
src="https://docs.ntfy.sh/static/img/pwa-install-chrome-android-popup.jpg"
|
|
32
|
+
width={240}
|
|
33
|
+
/>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<p style={{ textAlign: "center" }}>
|
|
37
|
+
<em>Imagine it says overmux, not ntfy, thx</em>
|
|
38
|
+
</p>
|
|
39
|
+
|
|
40
|
+
## Firefox on Android
|
|
41
|
+
|
|
42
|
+
Open your Overmux URL, open the browser menu, and select **Install**. Select **Add** to place Overmux on your home screen.
|
|
43
|
+
|
|
44
|
+
<div style={{ display: "flex", flexWrap: "wrap", gap: "1rem" }}>
|
|
45
|
+
<ImageZoom
|
|
46
|
+
alt="The Install menu action in Firefox on Android"
|
|
47
|
+
height={533}
|
|
48
|
+
src="https://docs.ntfy.sh/static/img/pwa-install-firefox-android-menu.jpg"
|
|
49
|
+
width={240}
|
|
50
|
+
/>
|
|
51
|
+
<ImageZoom
|
|
52
|
+
alt="The Add to Home Screen confirmation in Firefox"
|
|
53
|
+
height={533}
|
|
54
|
+
src="https://docs.ntfy.sh/static/img/pwa-install-firefox-android-popup.jpg"
|
|
55
|
+
width={240}
|
|
56
|
+
/>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
<p style={{ textAlign: "center" }}>
|
|
60
|
+
<em>Imagine it says overmux, not ntfy, thx</em>
|
|
61
|
+
</p>
|
|
62
|
+
|
|
63
|
+
## Safari on iOS
|
|
64
|
+
|
|
65
|
+
Open your Overmux URL in Safari, select **Share**, and then select **Add to Home Screen**.
|
|
66
|
+
|
|
67
|
+
<div style={{ display: "flex", flexWrap: "wrap", gap: "1rem" }}>
|
|
68
|
+
<ImageZoom
|
|
69
|
+
alt="The Share button in Safari on iOS"
|
|
70
|
+
height={520}
|
|
71
|
+
src="https://docs.ntfy.sh/static/img/pwa-install-safari-ios-button.jpg"
|
|
72
|
+
width={240}
|
|
73
|
+
/>
|
|
74
|
+
<ImageZoom
|
|
75
|
+
alt="The Add to Home Screen action in Safari on iOS"
|
|
76
|
+
height={520}
|
|
77
|
+
src="https://docs.ntfy.sh/static/img/pwa-install-safari-ios-menu.jpg"
|
|
78
|
+
width={240}
|
|
79
|
+
/>
|
|
80
|
+
<ImageZoom
|
|
81
|
+
alt="The Add to Home Screen confirmation on iOS"
|
|
82
|
+
height={520}
|
|
83
|
+
src="https://docs.ntfy.sh/static/img/pwa-install-safari-ios-add-icon.jpg"
|
|
84
|
+
width={240}
|
|
85
|
+
/>
|
|
86
|
+
</div>
|
|
87
|
+
|
|
88
|
+
<p style={{ textAlign: "center" }}>
|
|
89
|
+
<em>Imagine it says overmux, not ntfy, thx</em>
|
|
90
|
+
</p>
|
|
91
|
+
|
|
92
|
+
Screenshots adapted from the [ntfy PWA installation guide](https://docs.ntfy.sh/subscribe/pwa/).
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Choose an HTTPS Setup
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Your Overmux could expose sensitive information or access to your system. If you're exposing overmux anywhere other than localhost, it's a good idea to configure it with HTTPS. HTTPS protects login credentials and session traffic, and browsers require it to install Overmux as a PWA.
|
|
6
|
+
|
|
7
|
+
Choose a setup that matches how you want to access Overmux:
|
|
8
|
+
|
|
9
|
+
| Setup | How it works |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| [Tailscale Serve](./200-tailscale-serve.md) | Connect through a private Tailscale VPN so only devices connected to the VPN can access Overmux. |
|
|
12
|
+
| [Cloudflare Tunnel](./300-cloudflare-tunnel.md) | Connect through a public Cloudflare hostname, optionally protected by Cloudflare Access login. |
|
|
13
|
+
| [Self-hosted reverse proxy](./400-self-hosted-reverse-proxy.md) | Run your own reverse proxy and TLS certificates to securely forward requests to Overmux. |
|
|
14
|
+
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Tailscale Serve
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
[Tailscale Serve](https://tailscale.com/docs/features/tailscale-serve) gives Overmux a private HTTPS URL available to devices in your tailnet. Tailscale manages the certificate and forwards requests to Overmux over loopback.
|
|
6
|
+
|
|
7
|
+
## Configure Overmux
|
|
8
|
+
|
|
9
|
+
Set the first authentication origin to your machine's Tailscale HTTPS URL. Keep the server bound to the same loopback address and port that Tailscale Serve will target:
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
export default defineOvermuxConfig({
|
|
13
|
+
auth: {
|
|
14
|
+
mode: "cli-login",
|
|
15
|
+
origins: ["https://your-machine.your-tailnet.ts.net"],
|
|
16
|
+
trustedProxyPeer: "127.0.0.1",
|
|
17
|
+
},
|
|
18
|
+
host: "127.0.0.1",
|
|
19
|
+
port: 4200,
|
|
20
|
+
// ...
|
|
21
|
+
});
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Replace the example origin with the hostname Tailscale assigns to your machine.
|
|
25
|
+
|
|
26
|
+
## Start Overmux and Tailscale Serve
|
|
27
|
+
|
|
28
|
+
Start Overmux:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
overmux serve
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
In another terminal, publish its loopback listener through Tailscale Serve:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
tailscale serve --bg http://127.0.0.1:4200
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Open the HTTPS URL printed by Tailscale on another device in your tailnet. Run `overmux auth login` to create a login link if authentication is enabled.
|
|
41
|
+
|
|
42
|
+
Do not expose port 4200 directly or change `trustedProxyPeer` to a non-loopback address. Overmux trusts forwarded HTTPS and host information only from this immediate proxy peer.
|
|
43
|
+
|
|
44
|
+
See Tailscale's [Serve documentation](https://tailscale.com/docs/features/tailscale-serve) for installation, tailnet access controls, and command reference.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Cloudflare Tunnel
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
[Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/) publishes Overmux through a Cloudflare-managed hostname without opening an inbound port on your network. You need a domain managed by Cloudflare.
|
|
6
|
+
|
|
7
|
+
## Create the tunnel
|
|
8
|
+
|
|
9
|
+
[Install `cloudflared`](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/downloads/), authenticate it, and create a tunnel:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
cloudflared tunnel login
|
|
13
|
+
cloudflared tunnel create overmux
|
|
14
|
+
cloudflared tunnel route dns overmux overmux.example.com
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Create `~/.cloudflared/config.yml` using the tunnel ID and credentials path printed by `cloudflared tunnel create`:
|
|
18
|
+
|
|
19
|
+
```yaml
|
|
20
|
+
tunnel: <tunnel-id>
|
|
21
|
+
credentials-file: /home/you/.cloudflared/<tunnel-id>.json
|
|
22
|
+
|
|
23
|
+
ingress:
|
|
24
|
+
- hostname: overmux.example.com
|
|
25
|
+
service: http://127.0.0.1:4200
|
|
26
|
+
- service: http_status:404
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Configure Overmux
|
|
30
|
+
|
|
31
|
+
Use the public HTTPS hostname as the authentication origin and trust only the local tunnel process:
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
export default defineOvermuxConfig({
|
|
35
|
+
auth: {
|
|
36
|
+
mode: "cli-login",
|
|
37
|
+
origins: ["https://overmux.example.com"],
|
|
38
|
+
trustedProxyPeer: "127.0.0.1",
|
|
39
|
+
},
|
|
40
|
+
host: "127.0.0.1",
|
|
41
|
+
port: 4200,
|
|
42
|
+
// ...
|
|
43
|
+
});
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Start Overmux and the tunnel
|
|
47
|
+
|
|
48
|
+
Start both processes:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
overmux serve
|
|
52
|
+
cloudflared tunnel run overmux
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Open `https://overmux.example.com`. Run `overmux auth login` to create a login link if authentication is enabled.
|
|
56
|
+
|
|
57
|
+
The hostname is publicly reachable unless you restrict it. Use [Cloudflare Access](https://developers.cloudflare.com/cloudflare-one/access-controls/) when you want an additional identity check before requests reach Overmux.
|
|
58
|
+
|
|
59
|
+
See Cloudflare's [tunnel setup guide](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/) for service installation and production operation.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Self-hosted Reverse Proxy
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Use this option when you already operate a domain, TLS certificates, and a reverse proxy such as Caddy, Nginx, or HAProxy.
|
|
6
|
+
|
|
7
|
+
Configure the proxy to:
|
|
8
|
+
|
|
9
|
+
- Terminate HTTPS for your public hostname.
|
|
10
|
+
- Forward HTTP and WebSocket requests to an Overmux loopback listener.
|
|
11
|
+
- Preserve the request host and send single-valued `X-Forwarded-Host` and `X-Forwarded-Proto: https` headers.
|
|
12
|
+
|
|
13
|
+
Configure Overmux with the exact public origin, loopback listener, and immediate proxy peer:
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
export default defineOvermuxConfig({
|
|
17
|
+
auth: {
|
|
18
|
+
mode: "cli-login",
|
|
19
|
+
origins: ["https://overmux.example.com"],
|
|
20
|
+
trustedProxyPeer: "127.0.0.1",
|
|
21
|
+
},
|
|
22
|
+
host: "127.0.0.1",
|
|
23
|
+
port: 4200,
|
|
24
|
+
// ...
|
|
25
|
+
});
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Do not expose the loopback backend directly or configure a non-loopback address as `trustedProxyPeer`.
|
|
29
|
+
|
|
30
|
+
For complete proxy-specific walkthroughs and example configurations, see Open WebUI's [HTTPS and reverse proxy guide](https://docs.openwebui.com/reference/https/). Adapt the upstream address and port to `http://127.0.0.1:4200`, and retain Overmux's origin and trusted-proxy configuration above.
|
|
31
|
+
|
|
32
|
+
You can also consult the official documentation for [Caddy](https://caddyserver.com/docs/quick-starts/reverse-proxy), [Nginx](https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/), or [HAProxy](https://www.haproxy.com/documentation/haproxy-configuration-tutorials/proxying-essentials/).
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Project Structure
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
`overmux init` creates this minimal userland application:
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
.gitignore
|
|
9
|
+
mise.toml Mise installations only
|
|
10
|
+
package.json
|
|
11
|
+
pnpm-lock.yaml
|
|
12
|
+
overmux.config.ts authentication, server, Vite, and production settings
|
|
13
|
+
src/server/index.ts trusted resources, streams, and operations
|
|
14
|
+
src/ui/app.tsx browser application definition
|
|
15
|
+
src/ui/index.html browser document
|
|
16
|
+
src/ui/main.tsx React and Overmux host entry point
|
|
17
|
+
src/ui/styles.css application styles
|
|
18
|
+
vite.config.ts browser development and production build configuration
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
The server and UI are separate trust boundaries. `src/server/index.ts` runs as trusted Node.js code. Files under `src/ui` run in the browser and communicate with the server through Overmux's public APIs.
|
|
22
|
+
|
|
23
|
+
The generated application has no shared directory. Add browser-safe shared schemas only when both sides need them.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Client API
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Clipboard
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import { readClipboardText, writeClipboardText } from "overmux/client";
|
|
9
|
+
|
|
10
|
+
await writeClipboardText("Text to copy");
|
|
11
|
+
const text = await readClipboardText();
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
`readClipboardText(): Promise<string>` reads the system clipboard through `navigator.clipboard.readText()`. It never reads through the desktop bridge.
|
|
15
|
+
|
|
16
|
+
`writeClipboardText(text: string): Promise<void>` uses Overmux's version-1 desktop write bridge when present, otherwise `navigator.clipboard.writeText()`. Desktop writes are fire-and-forget: resolution confirms dispatch, not completion or acceptance by the host. Existing host origin and active-frame checks still apply.
|
|
17
|
+
|
|
18
|
+
Both reject on unavailable browser APIs, browser permission failures, or synchronous desktop dispatch failures. Browser secure-context, focus, permissions, and user-activation restrictions still apply. These APIs target the system clipboard, not the X11 primary selection. Only read clipboard data you need and trust the source of text you write.
|
|
19
|
+
|
|
20
|
+
For terminal-program access via OSC 52, use the opt-in factories from `@overmux/xterm/client` rather than wiring platform bridges in application code.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "overmux init"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# `overmux init`
|
|
6
|
+
|
|
7
|
+
Create a minimal, runnable Overmux application without prompting.
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
overmux init
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
The application is created in `$XDG_CONFIG_HOME/overmux`.
|
|
14
|
+
|
|
15
|
+
The command validates the toolchain before writing files. When Mise is installed, it must be [activated in the shell](https://mise.jdx.dev/getting-started.html#activate-mise); the generated `mise.toml` pins Node 22, pnpm 10, and the latest published Overmux version. Without Mise, pnpm 10 or newer must already be available and `mise.toml` is omitted.
|
|
16
|
+
|
|
17
|
+
The initializer pins the exact latest published `overmux` version in `package.json`, installs dependencies, generates `pnpm-lock.yaml`, and runs `overmux check`. Existing scaffold files cause the command to fail without changing them. Unrelated files are preserved.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "overmux serve"
|
|
3
|
+
description: "Serve the Overmux web UI"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `overmux serve`
|
|
7
|
+
|
|
8
|
+
Serve the authenticated Overmux web UI. Development starts private Vite behind the public Overmux gateway. Production builds with Vite and serves static assets without running Vite.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
```text
|
|
13
|
+
overmux serve [--config path] [--host host] [--port port] [--login | --no-login]
|
|
14
|
+
overmux serve --production [--no-build] [--config path] [--host host] [--port port] [--login | --no-login]
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Options
|
|
18
|
+
|
|
19
|
+
| Flag | Description | Default |
|
|
20
|
+
| --- | --- | --- |
|
|
21
|
+
| `--config <path>, -c <path>` | Configuration file | `$XDG_CONFIG_HOME/overmux/overmux.config.ts` |
|
|
22
|
+
| `--host <host>` | Override the public listener host | Configured host |
|
|
23
|
+
| `--port <port>` | Override the public listener port | Configured port |
|
|
24
|
+
| `--login` | Create and print a browser login grant after startup | Human terminal sessions |
|
|
25
|
+
| `--no-login` | Do not create a grant and print the `overmux auth login` command | Agent, CI, and non-interactive sessions |
|
|
26
|
+
| `--production` | Build and serve `productionWebAssetsDir` | |
|
|
27
|
+
| `--no-build` | With `--production`, serve existing assets after checking `index.html` exists | |
|
|
28
|
+
|
|
29
|
+
`--login` and `--no-login` are mutually exclusive. By default, a human terminal session receives a single-use login grant after the server is ready. Agent, CI, and non-interactive sessions receive `overmux auth login --port <resolved-port>` instead. The explicit flags override this environment-based default.
|
|
30
|
+
|
|
31
|
+
A grant prints one server-issued URL for every authenticated browser origin. Redeeming its code or any URL consumes the grant and authenticates only that origin; create another grant for another origin. The output identifies the browser login page, expiry, and command for creating another grant.
|
|
32
|
+
|
|
33
|
+
`--no-build` without `--production` is invalid. Vite's build output cleanup follows its `build.emptyOutDir` setting.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "overmux auth"
|
|
3
|
+
description: "Manage CLI-issued browser authentication"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `overmux auth`
|
|
7
|
+
|
|
8
|
+
Manage browser login grants and sessions for a running local Overmux server.
|
|
9
|
+
|
|
10
|
+
Authentication administration uses the private same-user control socket. When multiple local servers are running, use `--port` to select one.
|
|
11
|
+
|
|
12
|
+
## Create a login grant
|
|
13
|
+
|
|
14
|
+
```text
|
|
15
|
+
overmux auth login [--code] [--json] [--port value] [--url]
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
| Flag | Description |
|
|
19
|
+
| --- | --- |
|
|
20
|
+
| `--code` | Print only the login code |
|
|
21
|
+
| `--json` | Print machine-readable JSON |
|
|
22
|
+
| `--port <value>` | Running local server port |
|
|
23
|
+
| `--url` | Print only the primary origin's login URL |
|
|
24
|
+
|
|
25
|
+
Set at most one of `--code`, `--url`, and `--json`. Default output prints the code, every server-issued URL in order, the exact expiry, and the command for creating another grant. `--url` prints only the primary origin's URL, `--code` prints only the code, and JSON output contains the grant metadata with its ordered `urls` array. Every URL embeds the same secret ticket; the code and ticket belong to one single-use grant. Redeeming any one of them consumes the whole grant and authenticates only that origin, so create another grant to log in at another origin.
|
|
26
|
+
|
|
27
|
+
## List sessions
|
|
28
|
+
|
|
29
|
+
```text
|
|
30
|
+
overmux auth list [--json] [--port value]
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
| Flag | Description |
|
|
34
|
+
| --- | --- |
|
|
35
|
+
| `--json` | Print machine-readable JSON |
|
|
36
|
+
| `--port <value>` | Running local server port |
|
|
37
|
+
|
|
38
|
+
Session output contains non-secret metadata only, including the browser origin that issued each session. Non-expiring sessions report their expiry as `never`.
|
|
39
|
+
|
|
40
|
+
## Revoke sessions
|
|
41
|
+
|
|
42
|
+
```text
|
|
43
|
+
overmux auth revoke [--all] [--json] [--port value] [<id>]
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
| Flag | Description |
|
|
47
|
+
| --- | --- |
|
|
48
|
+
| `--all` | Revoke every active session |
|
|
49
|
+
| `--json` | Print machine-readable JSON |
|
|
50
|
+
| `--port <value>` | Running local server port |
|
|
51
|
+
|
|
52
|
+
Specify exactly one session ID or `--all`. Revocation immediately invalidates the selected browser sessions.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "overmux call"
|
|
3
|
+
description: "Invoke an operation on a running Overmux server"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `overmux call`
|
|
7
|
+
|
|
8
|
+
Invoke an operation on a running local Overmux server.
|
|
9
|
+
|
|
10
|
+
The CLI discovers the local instance and obtains a short-lived bearer credential through its private same-user control socket. Use `--port` to select an instance when multiple local servers are running.
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
|
|
14
|
+
```text
|
|
15
|
+
overmux call [--input value] [--port value] <operation-name>
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Arguments
|
|
19
|
+
|
|
20
|
+
| Argument | Description | Required |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| `operation-name` | Operation name | Yes |
|
|
23
|
+
## Options
|
|
24
|
+
|
|
25
|
+
| Flag | Description | Default |
|
|
26
|
+
| --- | --- | --- |
|
|
27
|
+
| `--input <value>, -i <value>` | Operation input as JSON | |
|
|
28
|
+
| `--port <value>, -p <value>` | Running local server port | |
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "overmux check"
|
|
3
|
+
description: "Validate an Overmux configuration"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# `overmux check`
|
|
7
|
+
|
|
8
|
+
Validate an Overmux configuration.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
```text
|
|
13
|
+
overmux check [--config path]
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Options
|
|
17
|
+
|
|
18
|
+
| Flag | Description | Default |
|
|
19
|
+
| --- | --- | --- |
|
|
20
|
+
| `--config <path>, -c <path>` | Configuration file | `$XDG_CONFIG_HOME/overmux/overmux.config.ts` |
|