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.
Files changed (2) hide show
  1. package/README.md +42 -146
  2. 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
- **Video conferencing that lives where you live — the terminal.**
13
-
14
- [![npm](https://img.shields.io/npm/v/termeet)](https://www.npmjs.com/package/termeet)
15
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
10
+ **Meetings, but make them monospace and mildly chaotic.**
16
11
 
17
- Your face → pixels → ASCII → WebSocket → their terminal. No browser. No Electron. Just characters.
12
+ [npm](https://www.npmjs.com/package/termeet)
13
+ [License: MIT](LICENSE)
18
14
 
19
- `npm install -g termeet`
15
+ **Web [termeet.app](https://termeet.app)**
20
16
 
21
17
  ---
22
18
 
23
- </div>
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
- Termeet is a real-time video conferencing app that turns your camera into live ASCII art — right in the terminal. Built with [OpenTUI](https://opentui.com), powered by [Bun](https://bun.sh), and stitched together with ffmpeg and WebSockets. No browser required.
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
- **`npm install -g termeet`:** no Bun; ffmpeg is bundled next to the binary (optional **ffplay** for playback install ffmpeg fully or copy `ffplay` beside `termeet`).
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
- ```bash
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
- # Install ffmpeg (Ubuntu/Debian)
76
- sudo apt install ffmpeg
77
- ```
45
+ ## Jump in (CLI)
78
46
 
79
- On **macOS**, grant **Camera** and **Microphone** to your terminal (Terminal.app, iTerm, etc.) under **System Settings → Privacy & Security**, or capture will stay on “No signal”.
80
-
81
- ## Quick Start
47
+ No install commitment issues? Use `npx`:
82
48
 
83
49
  ```bash
84
- # Install dependencies
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
- Or run both together:
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 --help
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
- Each `dist/<platform-arch>/bin/` contains `termeet`, downloaded `ffmpeg` (see [eugeneware/ffmpeg-static](https://github.com/eugeneware/ffmpeg-static)), and optionally `ffplay`. You can zip a single `dist/<slug>/` folder for sidecar distribution.
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
- Use `FFMPEG_PATH`, `FFPLAY_PATH`, or `TERMEET_BIN_PATH` when needed.
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
- ## Usage
64
+ ## Hack on this repo
128
65
 
129
- ### Server
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
- # Start with default port (3483)
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
- ### Controls
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
- | Key | Action |
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
- ## How It Works
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
- 1. **Camera Capture**: ffmpeg captures raw RGB frames from your camera (or a test pattern if capture fails).
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
- ## Project Structure
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.4",
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.4",
25
- "termeet-cli-darwin-x64": "0.1.4",
26
- "termeet-cli-linux-arm64": "0.1.4",
27
- "termeet-cli-linux-x64": "0.1.4",
28
- "termeet-cli-windows-arm64": "0.1.4",
29
- "termeet-cli-windows-x64": "0.1.4"
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",