termeet 0.1.4 → 0.1.6
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 +42 -146
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
<div align="center">
|
|
2
|
-
|
|
3
1
|
```
|
|
4
2
|
████████╗███████╗██████╗ ███╗ ███╗███████╗███████╗████████╗
|
|
5
3
|
╚══██╔══╝██╔════╝██╔══██╗████╗ ████║██╔════╝██╔════╝╚══██╔══╝
|
|
@@ -9,18 +7,18 @@
|
|
|
9
7
|
╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚══════╝ ╚═╝
|
|
10
8
|
```
|
|
11
9
|
|
|
12
|
-
**
|
|
13
|
-
|
|
14
|
-
[](https://www.npmjs.com/package/termeet)
|
|
15
|
-
[](LICENSE)
|
|
10
|
+
**Meetings, but make them monospace and mildly chaotic.**
|
|
16
11
|
|
|
17
|
-
|
|
12
|
+
[npm](https://www.npmjs.com/package/termeet)
|
|
13
|
+
[License: MIT](LICENSE)
|
|
18
14
|
|
|
19
|
-
|
|
15
|
+
**Web → [termeet.app](https://termeet.app)**
|
|
20
16
|
|
|
21
17
|
---
|
|
22
18
|
|
|
23
|
-
|
|
19
|
+
Someone decided video calls needed more **grit**, fewer tabs, and at least 300% more `#`. Termeet is what fell out: your camera becomes a living mosaic of `@` and `#`, your voice still gets through, and the whole thing runs where serious tools belong — **the terminal** (or the browser, if you prefer pixels with a glow-up).
|
|
20
|
+
|
|
21
|
+
No slick UI chrome. No “you’re on mute” in corporate pastel. Just you, your peers, and a grid of tiny ASCII faces doing their honest best.
|
|
24
22
|
|
|
25
23
|
```
|
|
26
24
|
┌──────────────────────────────────────────────────────┐
|
|
@@ -35,168 +33,66 @@ Your face → pixels → ASCII → WebSocket → their terminal. No browser. No
|
|
|
35
33
|
└──────────────────────────────────────────────────────┘
|
|
36
34
|
```
|
|
37
35
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
## Features
|
|
41
|
-
|
|
42
|
-
- **ASCII Video** — Camera streams rendered as real-time ASCII art
|
|
43
|
-
- **Multi-participant** — Grid layout adapts to number of participants
|
|
44
|
-
- **Live Chat** — In-meeting text chat with timestamps
|
|
45
|
-
- **Audio Streaming** — Microphone capture and playback via ffmpeg
|
|
46
|
-
- **Room Management** — Create or join rooms with shareable room IDs
|
|
47
|
-
- **Controls** — Mute/unmute, camera toggle, chat toggle
|
|
48
|
-
- **Test Pattern** — Animated gradient pattern when no camera is available
|
|
49
|
-
|
|
50
|
-
**Tech Stack:**
|
|
51
|
-
|
|
52
|
-
- **Runtime**: [Bun](https://bun.sh)
|
|
53
|
-
- **Terminal UI**: [@opentui/react](https://opentui.com) (Zig-powered, React renderer)
|
|
54
|
-
- **Camera/Audio**: ffmpeg subprocess (cross-platform)
|
|
55
|
-
- **ASCII Rendering**: p5.js-inspired brightness mapping with edge detection
|
|
56
|
-
- **Networking**: WebSocket with JSON protocol
|
|
57
|
-
- **Server**: Bun built-in HTTP/WebSocket server
|
|
58
|
-
|
|
59
|
-
## Prerequisites
|
|
60
|
-
|
|
61
|
-
**From this repo (development):**
|
|
62
|
-
|
|
63
|
-
- [Bun](https://bun.sh) (v1.0+)
|
|
64
|
-
- [ffmpeg](https://ffmpeg.org) (and **ffplay** if you want to hear remote audio — often the same package as ffmpeg)
|
|
36
|
+
## The pitch
|
|
65
37
|
|
|
66
|
-
|
|
38
|
+
- **See each other** — as ASCII, in real time. It is way more expressive than it has any right to be.
|
|
39
|
+
- **Hear each other** — when ffmpeg and your OS agree to cooperate; bring **ffplay** if you want sound out of your speakers.
|
|
40
|
+
- **Talk in text** — side chat for links, jokes, and the ancient “can you hear me?” incantation.
|
|
41
|
+
- **Rooms with codes** — spin up a space, share the id, vanish when you are done.
|
|
67
42
|
|
|
68
|
-
|
|
69
|
-
# Install Bun
|
|
70
|
-
curl -fsSL https://bun.sh/install | bash
|
|
71
|
-
|
|
72
|
-
# Install ffmpeg (macOS)
|
|
73
|
-
brew install ffmpeg
|
|
43
|
+
There’s also a **web client** at **[termeet.app](https://termeet.app)** — same rooms, same vibe, friendlier for guests who don’t live in `tmux`. Room links look like `https://termeet.app/r/<room-id>` so you can reload or share a meeting.
|
|
74
44
|
|
|
75
|
-
|
|
76
|
-
sudo apt install ffmpeg
|
|
77
|
-
```
|
|
45
|
+
## Jump in (CLI)
|
|
78
46
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
## Quick Start
|
|
47
|
+
No install commitment issues? Use `npx`:
|
|
82
48
|
|
|
83
49
|
```bash
|
|
84
|
-
|
|
85
|
-
bun install
|
|
86
|
-
|
|
87
|
-
# Terminal 1: Start the server
|
|
88
|
-
bun run server
|
|
89
|
-
|
|
90
|
-
# Terminal 2: Start the client
|
|
91
|
-
bun run dev
|
|
50
|
+
npx termeet
|
|
92
51
|
```
|
|
93
52
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
```bash
|
|
97
|
-
bun run start
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
## Standalone CLI (no Bun or ffmpeg in PATH)
|
|
101
|
-
|
|
102
|
-
### npm (same pattern as multiplayer-debugger)
|
|
103
|
-
|
|
104
|
-
The published **`termeet` command is client-only** — it connects to your signaling server via `TERMEET_HOST` / `TERMEET_PORT`. Host the WebSocket server separately (`bun run server` from this repo on a VPS, etc.).
|
|
105
|
-
|
|
106
|
-
A small **Node wrapper** (`bin/termeet.js`) plus **optional** packages `termeet-cli-<platform>-<arch>` that ship the compiled Bun binary and bundled ffmpeg.
|
|
53
|
+
Want it always available:
|
|
107
54
|
|
|
108
55
|
```bash
|
|
109
56
|
npm install -g termeet
|
|
110
|
-
termeet
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
Ensure `package.json` → `repository.url` matches this GitHub repo (needed for **provenance** on publish). Add a repo secret **`NPM_TOKEN`** (npm publish token). Trigger **Publish Packages** by pushing a tag `v1.2.3` or via **Actions → Publish Packages → Run workflow** (see `.github/workflows/publish-packages.yml`).
|
|
114
|
-
|
|
115
|
-
### Maintainer builds
|
|
116
|
-
|
|
117
|
-
```bash
|
|
118
|
-
bun install
|
|
119
|
-
bun run build:cli # this machine only (+ ffplay if on PATH)
|
|
120
|
-
bun run build:cli:all # all platforms (CI)
|
|
57
|
+
termeet
|
|
121
58
|
```
|
|
122
59
|
|
|
123
|
-
|
|
60
|
+
By default the CLI talks to the shared signal behind **[termeet.app](https://termeet.app)** (`wss://termeet.app/ws`). Self-hosting? Point the client at your own server with `TERMEET_WS_URL`, or `TERMEET_HOST` / `TERMEET_PORT` for a plain `ws://` box on your network.
|
|
124
61
|
|
|
125
|
-
|
|
62
|
+
The published npm package ships a **standalone binary** (Bun + bundled ffmpeg where we can). Optional **ffplay** is on you if your OS does not bundle it — full ffmpeg installs usually include it.
|
|
126
63
|
|
|
127
|
-
##
|
|
64
|
+
## Hack on this repo
|
|
128
65
|
|
|
129
|
-
|
|
66
|
+
Grab **[Bun](https://bun.sh)** (one-liner on their site), **[ffmpeg](https://ffmpeg.org)** from your package manager, and optionally **ffplay** if you care about hearing remote audio.
|
|
130
67
|
|
|
131
68
|
```bash
|
|
132
|
-
|
|
133
|
-
bun run server
|
|
134
|
-
|
|
135
|
-
# Custom port
|
|
136
|
-
TERMEET_PORT=8080 bun run server
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
### Client
|
|
140
|
-
|
|
141
|
-
```bash
|
|
142
|
-
# Connect to local server
|
|
143
|
-
bun run dev
|
|
144
|
-
|
|
145
|
-
# Connect to remote server
|
|
146
|
-
TERMEET_HOST=192.168.1.100 TERMEET_PORT=3483 bun run dev
|
|
69
|
+
bun install
|
|
70
|
+
bun run start # server + terminal client, together
|
|
71
|
+
# or: bun run server and bun run dev in two terminals
|
|
147
72
|
```
|
|
148
73
|
|
|
149
|
-
|
|
74
|
+
**macOS:** give your terminal app **Camera** and **Microphone** in _System Settings → Privacy & Security_, or you’ll stare at “No signal” forever.
|
|
150
75
|
|
|
151
|
-
|
|
152
|
-
| -------- | ------------------------------------------------------------------- |
|
|
153
|
-
| `M` | Toggle microphone mute |
|
|
154
|
-
| `V` | Toggle camera |
|
|
155
|
-
| `T` | Toggle chat panel |
|
|
156
|
-
| `I` | Copy room ID (or use **Room** in the bar) |
|
|
157
|
-
| `Tab` | Focus chat / cycle fields (lobby create & join forms) |
|
|
158
|
-
| `Esc` | Lobby: quit on main menu, else back to menu · Meeting: unfocus chat |
|
|
159
|
-
| `Q` | Lobby: quit · Meeting: leave room |
|
|
160
|
-
| `Ctrl+Q` | Meeting only: quit app |
|
|
161
|
-
| `P` | Meeting: clear pinned participant |
|
|
76
|
+
## Keys (terminal client)
|
|
162
77
|
|
|
163
|
-
|
|
78
|
+
| Key | What it does |
|
|
79
|
+
| -------- | ------------------------------------ |
|
|
80
|
+
| `M` | Mute / unmute |
|
|
81
|
+
| `V` | Camera on / off |
|
|
82
|
+
| `T` | Chat panel |
|
|
83
|
+
| `I` | Copy room id |
|
|
84
|
+
| `Tab` | Hop between fields (lobby) |
|
|
85
|
+
| `Esc` | Back out / unfocus chat |
|
|
86
|
+
| `Q` | Leave room (meeting) or quit (lobby) |
|
|
87
|
+
| `Ctrl+Q` | Quit the app from a meeting |
|
|
88
|
+
| `P` | Clear pinned participant |
|
|
164
89
|
|
|
165
|
-
|
|
166
|
-
2. **ASCII Rendering**: Each frame is processed with a p5.js–style pipeline (luminance, contrast/brightness, optional **Sobel** edges — the engine supports edges; the default app config keeps them off).
|
|
167
|
-
3. **Video over WebSocket**: Downsampled **raw RGB (base64)** is sent to peers; each client runs its own ASCII renderer for its terminal size. (So the wire format is pixels, not pre-rendered ASCII text.)
|
|
168
|
-
4. **Audio**: PCM chunks (base64) over the same WebSocket; ffmpeg/ffplay for capture and playback where available.
|
|
169
|
-
5. **Display**: OpenTUI lays out lobby, grid, chat, and controls.
|
|
90
|
+
## Under the hood (short version)
|
|
170
91
|
|
|
171
|
-
|
|
92
|
+
Camera frames take a scenic route through ffmpeg, get turned into something your font can love, and ride **WebSockets** to everyone else. Audio tags along as PCM when the stars align. The terminal UI is **[OpenTUI](https://opentui.com)** — React in the place you’d least expect.
|
|
172
93
|
|
|
173
|
-
|
|
174
|
-
src/
|
|
175
|
-
├── index.tsx # Client CLI entry (connects to signaling server)
|
|
176
|
-
├── app.tsx # Main App component (state management)
|
|
177
|
-
├── protocol.ts # Shared types and message definitions
|
|
178
|
-
├── lib/
|
|
179
|
-
│ ├── media-binaries.ts # Resolve bundled ffmpeg/ffplay next to executable
|
|
180
|
-
│ └── clipboard.ts # Room ID copy helper
|
|
181
|
-
├── ui/
|
|
182
|
-
│ ├── lobby.tsx # Create/join room screen
|
|
183
|
-
│ ├── meeting-room.tsx # Main meeting view with video grid
|
|
184
|
-
│ ├── video-panel.tsx # Individual ASCII video panel
|
|
185
|
-
│ ├── chat-panel.tsx # Chat sidebar with message input
|
|
186
|
-
│ ├── controls-bar.tsx # Bottom controls bar
|
|
187
|
-
│ └── participants-bar.tsx # Participant status bar
|
|
188
|
-
├── media/
|
|
189
|
-
│ ├── camera.ts # Camera capture via ffmpeg
|
|
190
|
-
│ ├── ascii-renderer.ts # Frame-to-ASCII conversion engine
|
|
191
|
-
│ └── audio.ts # Audio capture and playback
|
|
192
|
-
├── network/
|
|
193
|
-
│ └── client.ts # WebSocket client with event system
|
|
194
|
-
└── server/
|
|
195
|
-
├── index.ts # Server entry point
|
|
196
|
-
├── room-manager.ts # Room lifecycle and participant tracking
|
|
197
|
-
└── ws-handler.ts # WebSocket message handling and broadcast
|
|
198
|
-
```
|
|
94
|
+
If you are packaging, publishing, or building the CLI for every platform, see `bun run build:cli` / `bun run build:cli:all`, env vars like `FFMPEG_PATH`, and the workflow in `.github/workflows/publish-packages.yml`. The rest is ordinary TypeScript under `src/` — server, client, and shared protocol living in one tree.
|
|
199
95
|
|
|
200
96
|
## License
|
|
201
97
|
|
|
202
|
-
MIT
|
|
98
|
+
MIT — use it, break it, fork it, turn your standup into ASCII theatre.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "termeet",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "Termeet - Video conferencing with ASCII art",
|
|
5
5
|
"module": "src/index.tsx",
|
|
6
6
|
"type": "module",
|
|
@@ -21,12 +21,12 @@
|
|
|
21
21
|
"bin"
|
|
22
22
|
],
|
|
23
23
|
"optionalDependencies": {
|
|
24
|
-
"termeet-cli-darwin-arm64": "0.1.
|
|
25
|
-
"termeet-cli-darwin-x64": "0.1.
|
|
26
|
-
"termeet-cli-linux-arm64": "0.1.
|
|
27
|
-
"termeet-cli-linux-x64": "0.1.
|
|
28
|
-
"termeet-cli-windows-arm64": "0.1.
|
|
29
|
-
"termeet-cli-windows-x64": "0.1.
|
|
24
|
+
"termeet-cli-darwin-arm64": "0.1.6",
|
|
25
|
+
"termeet-cli-darwin-x64": "0.1.6",
|
|
26
|
+
"termeet-cli-linux-arm64": "0.1.6",
|
|
27
|
+
"termeet-cli-linux-x64": "0.1.6",
|
|
28
|
+
"termeet-cli-windows-arm64": "0.1.6",
|
|
29
|
+
"termeet-cli-windows-x64": "0.1.6"
|
|
30
30
|
},
|
|
31
31
|
"repository": {
|
|
32
32
|
"type": "git",
|