webtun 1.5.0 → 1.5.2

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
@@ -1,237 +1,140 @@
1
- # WebTun — Self-Hosted Web Terminal
2
-
3
- ![Terminal](https://img.shields.io/badge/Terminal-Web--Native-2D5B8E?style=for-the-badge)
4
- ![PWA](https://img.shields.io/badge/PWA-Installable-6BA428?style=for-the-badge)
5
- ![Cloudflare](https://img.shields.io/badge/Tunnel-Cloudflare-F38020?style=for-the-badge)
6
- ![Desktop](https://img.shields.io/badge/Desktop-Electron-47848F?style=for-the-badge)
7
- ![License](https://img.shields.io/badge/License-MIT-green?style=for-the-badge)
8
-
9
- **Access your server from any browser — no VPN, no SSH client, no installing anything.**
10
-
11
- [![Quick Start](https://img.shields.io/badge/Quick_Start-One_Command-2D5B8E?style=for-the-badge&logo=gnu-bash)](install.sh)
12
- [![Download](https://img.shields.io/github/v/release/unn-known1/webtun?style=for-the-badge&logo=github)](https://github.com/unn-known1/webtun/releases/latest)
13
-
14
- ---
15
-
16
- ## Why WebTun?
17
-
18
- | Traditional SSH | WebTun |
19
- |----------------|--------|
20
- | Need SSH client installed | Open any browser |
21
- | Configure VPN or port forwarding | Cloudflare Tunnel auto-configured |
22
- | Can't access from phone easily | PWA works on iOS/Android |
23
- | Share access requires key exchange | Web-based sharing in 1 click |
24
- | Corporate firewall blocks port 22 | Runs over HTTPS (port 443) |
25
-
26
- ---
27
-
28
- ## Features
1
+ <p align="center">
2
+ <img src="public/icon.svg" width="80" height="80" alt="WebTun">
3
+ </p>
29
4
 
30
- ### Core
31
- - **Real shell sessions** — node-pty backed, full bash/zsh support
32
- - **Multi-tab terminal** — drag tabs to reorder, side-by-side sessions like your desktop
33
- - **File explorer** — browse, upload, download, rename, delete, cut/copy/paste with conflict resolution (replace, merge, keep both, skip)
34
- - **WebSocket + xterm.js** — responsive, low-latency typing
35
- - **Bracketed paste** — Ctrl+V works correctly in TUI apps (vim, nano, htop, mc)
36
- - **Command history** — automatic capture with smart dedup, works with pasted commands
37
-
38
- ### Mobile-First UX
39
- - **Touch gestures** — swipe to close tabs, swipe from edge to open sidebar, pull-to-refresh file list
40
- - **Mobile keyboard bar** — ESC, Tab, arrow keys, Ctrl combos (Ctrl+C, Ctrl+D, etc.)
41
- - **Virtual keyboard aware** — terminal resizes when keyboard opens, no overlap
42
- - **Pinch-to-zoom** — adjust terminal font size (10–28px) with two fingers
43
- - **Selection mode** — toggle between terminal interaction and text selection
44
- - **Responsive** — optimized for phones (480px), tablets (1024px), and landscape orientation
45
-
46
- ### Settings
47
- - **Right-click menu toggle** — enable/disable custom terminal context menu (Settings > Terminal)
48
- - **Terminal scroll** — reliable mouse wheel scroll in all apps, including TUI apps with mouse tracking
5
+ <h1 align="center">WebTun</h1>
49
6
 
50
- ### File Explorer
51
- - **Multi-select** select all / deselect all, batch delete, download, zip, cut, and copy files
52
- - **Context menu on selection**right-click actions (zip, download, delete, cut, copy) operate on all selected files
53
- - **Zip / Extract** — right-click any file or folder to zip; right-click `.zip` files to extract (archiver v8)
54
- - **Folder download** — folders download as `.zip` archives automatically
55
- - **Image viewer** — click images (.png, .jpg, .gif, .svg, .webp, .bmp, .ico) to preview inline
56
- - **Cut, Copy, Paste** — multi-file support with conflict resolution dialog (replace, merge folders, keep both, skip, cancel)
57
- - **Upload with progress** — per-file progress bar via XHR
58
- - **Breadcrumb navigation** — tappable directory segments for quick navigation
59
- - **Long-press context menu** — rename, delete, download, copy on touch devices
60
- - **Text selection** — long-press file names to select and copy text on touch devices
7
+ <p align="center">
8
+ <strong>Self-hosted web terminal with file explorer, Cloudflare Tunnel, and PWA support</strong><br>
9
+ Access your server from any browser no VPN, no SSH client, no installing anything.
10
+ </p>
61
11
 
62
- ### System Stats
63
- - **CPU, Memory, Disk, Uptime** — real-time usage with progress bars
64
- - **GPU detection** — cross-platform (Linux: nvidia-smi/lspci, macOS: system_profiler, Windows: WMI)
65
- - **Multi-GPU support** — detects and displays all GPUs with VRAM, utilization, and temperature
66
- - **Top processes** — sorted by CPU usage
67
-
68
- ### Desktop App (Electron)
69
- - Cross-platform app for Linux & Windows
70
- - Runs the server as a child process — no terminal needed
71
- - Native window with system tray, copy/paste, and file dialogs
72
- - Download the latest release from [GitHub Releases](https://github.com/unn-known1/webtun/releases/latest)
73
- - Or build from source: `npm run dist:linux` / `npm run dist:win`
74
-
75
- ### PWA (Install as App)
76
- - Add to iOS/Android home screen — looks and feels like native app
77
- - Install banner prompts on first visit (Chrome) with iOS instructions fallback
78
- - Works offline (shows last session state)
79
- - Push notifications for tunnel status
80
-
81
- ### Cloudflare Tunnel (Zero-Config)
82
- - Create tunnel from UI — no CLI commands
83
- - Built-in health check warns if local server is unreachable before creating tunnel
84
- - Live/orphan status + target responsiveness indicator in tunnel list
85
- - Get public HTTPS URL instantly
86
- - Tunnels survive server restarts
87
- - Stop/kill tunnels from settings panel
12
+ <p align="center">
13
+ <a href="https://github.com/unn-known1/webtun/releases/latest"><img src="https://img.shields.io/github/v/release/unn-known1/webtun?style=flat-square&logo=github" alt="Release"></a>
14
+ <img src="https://img.shields.io/badge/Terminal-xterm.js-2D5B8E?style=flat-square" alt="Terminal">
15
+ <img src="https://img.shields.io/badge/PWA-Installable-6BA428?style=flat-square" alt="PWA">
16
+ <img src="https://img.shields.io/badge/Tunnel-Cloudflare-F38020?style=flat-square" alt="Tunnel">
17
+ <img src="https://img.shields.io/badge/Desktop-Electron-47848F?style=flat-square" alt="Electron">
18
+ <img src="https://img.shields.io/badge/License-MIT-green?style=flat-square" alt="License">
19
+ </p>
88
20
 
89
21
  ---
90
22
 
91
23
  ## Quick Start
92
24
 
93
- ### npm (Recommended)
94
25
  ```bash
95
26
  npx webtun
96
27
  ```
97
28
 
98
- Install globally:
99
- ```bash
100
- npm install -g webtun
101
- webtun
102
- ```
29
+ That's it. Open `http://localhost:3000` in your browser.
103
30
 
104
- **Options:**
105
- | Flag | Description |
106
- |------|-------------|
107
- | `--port, -p` | Port (default: 3000) |
108
- | `--host, -h` | Host (default: 0.0.0.0) |
109
- | `--pin` | Authentication PIN |
110
- | `--tunnel, -t` | Start Cloudflare Tunnel |
111
- | `--help` | Show help |
112
- | `--version` | Show version |
113
-
114
- **Environment Variables:**
115
- | Variable | Description |
116
- |----------|-------------|
117
- | `PORT` | Server port (default: 3000) |
118
- | `HOST` | Bind address (default: 0.0.0.0) |
119
- | `PIN` | Authentication PIN (empty = no auth) |
120
- | `SHELL` | Shell to use (default: PowerShell on Windows, bash/sh elsewhere) |
121
- | `WORKSPACE_ROOT` | Root directory for file operations (default: ~) |
122
- | `TRUST_PROXY` | Set to `true` if behind a reverse proxy (default: loopback only) |
123
- | `WEBTUN_SHELL` | Override shell on Windows (e.g., `/usr/bin/bash` for Git Bash) |
124
-
125
- **Examples:**
126
31
  ```bash
127
- npx webtun # Start on port 3000
128
- npx webtun --port 8080 # Custom port
129
32
  npx webtun --pin secret123 # With PIN protection
130
- npx webtun --tunnel # With Cloudflare Tunnel
131
- npx webtun -p 4000 -t # Port 4000 + tunnel
33
+ npx webtun --tunnel # With Cloudflare Tunnel (public URL)
34
+ npx webtun -p 8080 -t # Custom port + tunnel
35
+ npx webtun --help # Show all options
36
+ npx webtun --version # Show version
132
37
  ```
133
38
 
134
- **Note:** npm 12+ blocks install scripts by default. Allow them for `node-pty` (native module):
135
- ```bash
136
- # Allow scripts once during install
137
- npm install -g --allow-scripts=webtun,node-pty webtun
39
+ ### Install globally
138
40
 
139
- # Or allow globally (one-time setup)
140
- npm config set allow-scripts=webtun,node-pty --location=user
41
+ ```bash
141
42
  npm install -g webtun
43
+ webtun
142
44
  ```
143
45
 
144
- Build tools are also required (for compiling native modules):
145
- ```bash
146
- # Debian/Ubuntu
147
- sudo apt-get install -y python3 make g++
46
+ > **npm 12+ note:** Install scripts are blocked by default. Allow them for `node-pty`:
47
+ > ```bash
48
+ > npm install -g --allow-scripts=webtun,node-pty webtun
49
+ > ```
50
+ > Build tools required for native modules: `sudo apt-get install -y python3 make g++` (Debian/Ubuntu) or `xcode-select --install` (macOS).
148
51
 
149
- # macOS
150
- xcode-select --install
151
- ```
52
+ ### Other install methods
152
53
 
153
- ### One-Command Install
154
54
  ```bash
55
+ # One-command install
155
56
  bash -c "$(curl -fsSL https://raw.githubusercontent.com/unn-Known1/webtun/main/install.sh)"
156
- ```
157
57
 
158
- ### Manual Setup
159
- ```bash
160
- git clone https://github.com/unn-Known1/webtun.git
161
- cd webtun
162
- chmod +x setup.sh && ./setup.sh
163
- npm start
164
- ```
165
-
166
- ### Google Colab (Instant Terminal)
167
- ```python
168
- !rm -rf webtun && git clone https://github.com/unn-Known1/webtun.git && cd webtun && npm install --loglevel=error && node server.js > /tmp/webtun.log 2>&1 & sleep 4 && for i in 1 2 3; do curl -sf http://localhost:3000/api/auth/required >/dev/null && break; sleep 2; done && curl -s -X POST http://localhost:3000/api/tunnel -H 'Content-Type: application/json' -d '{"url":"http://localhost:3000"}' --max-time 20 | python3 -c "import sys,json; d=json.load(sys.stdin); print('🌐 WebTun ready at:', d.get('url','Error: '+d.get('error','')))"
58
+ # Manual setup
59
+ git clone https://github.com/unn-Known1/webtun.git && cd webtun && ./setup.sh && npm start
169
60
  ```
170
61
 
171
62
  ---
172
63
 
173
- ## Architecture
174
-
175
- ```
176
- ┌────────────────────────────────────────────────────────────────┐
177
- │ Your Browser │
178
- │ ┌──────────┐ ┌───────────┐ ┌─────────────┐ ┌───────────┐ │
179
- │ │ Terminal │ │ File │ │ Tunnel │ │ Settings │ │
180
- │ │ (xterm) │ │ Explorer │ │ Manager │ │ Panel │ │
181
- │ └─────┬────┘ └─────┬─────┘ └──────┬──────┘ └─────┬─────┘ │
182
- │ │ │ │ │ │
183
- └────────┼─────────────┼───────────────┼───────────────┼─────────┘
184
- │ WebSocket │ REST API │ │
185
- ▼ ▼ ▼ │
186
- ┌────────────────────────────────────────────────────────────────┐
187
- │ Node.js Server │
188
- │ ┌─────────────┐ ┌──────────────┐ ┌───────────────────────┐ │
189
- │ │ WebSocket │ │ File API │ │ Cloudflare Tunnel │ │
190
- │ │ Handler │ │ (read/write) │ │ Manager │ │
191
- │ └──────┬──────┘ └──────┬───────┘ └───────────┬───────────┘ │
192
- │ │ │ │ │
193
- │ ▼ ▼ ▼ │
194
- │ ┌──────────┐ ┌──────────────────┐ ┌──────────────────────┐ │
195
- │ │ node-pty │ │ Local Filesystem │ │ cloudflared daemon │ │
196
- │ │ (shell) │ │ (your server) │ │ (exposes to internet)│ │
197
- │ └──────────┘ └──────────────────┘ └──────────────────────┘ │
198
- └────────────────────────────────────────────────────────────────┘
199
-
200
-
201
- ┌─────────────────┐
202
- │ Internet Users │
203
- │ (HTTPS URL) │
204
- └─────────────────┘
205
- ```
64
+ ## Features
206
65
 
207
- ---
66
+ ### Terminal
67
+ - **Real shell sessions** — node-pty backed, full bash/zsh/PowerShell support
68
+ - **Multi-tab** — drag to reorder, side-by-side sessions
69
+ - **Bracketed paste** — Ctrl+V works in TUI apps (vim, nano, htop)
70
+ - **Command history** — keystroke-based capture, strips ANSI/control sequences
71
+ - **tmux sessions** — persistent sessions survive page reload
72
+ - **Keyboard Shortcuts** — reference dialog in the overflow menu (Ctrl+P/T/W/B/F, etc.)
208
73
 
209
- ## Use Cases
74
+ ### File Explorer
75
+ - Browse, upload, download, rename, delete files
76
+ - **Multi-select** — batch delete, download, zip, cut, copy
77
+ - **Zip/Extract** — right-click any file or folder
78
+ - **Image viewer** — preview inline (png, jpg, gif, svg, webp)
79
+ - **Conflict resolution** — replace, merge, keep both, skip
80
+ - **Breadcrumb navigation** — tappable directory segments
81
+
82
+ ### Mobile
83
+ - **Touch gestures** — swipe to close tabs, pull-to-refresh
84
+ - **Mobile keyboard bar** — ESC, Tab, arrows, Ctrl combos
85
+ - **Pinch-to-zoom** — adjust font size with two fingers
86
+ - **Virtual keyboard aware** — no overlap when keyboard opens
87
+ - **Selection mode** — toggle between interaction and text selection
88
+
89
+ ### Cloudflare Tunnel
90
+ - Create tunnels from the UI — zero CLI commands
91
+ - Built-in health check before tunnel creation
92
+ - Live status indicators, tunnels survive restarts
93
+ - Stop/kill tunnels from settings panel
210
94
 
211
- | Scenario | Why WebTun |
212
- |----------|------------|
213
- | **Home server access** | Access from anywhere without opening ports |
214
- | **Emergency debugging** | Phone/laptop without SSH client |
215
- | **Share terminal with friend** | No key exchange, just send URL |
216
- | **Colab power-up** | Persistent terminal alongside Python notebooks |
217
- | **Demo environment** | Spin up temp shell for presentations |
218
- | **Corporate restrictions** | HTTPS works where SSH is blocked |
95
+ ### System Stats
96
+ - CPU, Memory, Disk, Uptime — real-time with progress bars
97
+ - GPU detection (nvidia-smi, system_profiler, WMI)
98
+ - Multi-GPU support with VRAM, utilization, temperature
99
+ - Top processes sorted by CPU
100
+
101
+ ### Desktop (Electron)
102
+ - Cross-platform app for Linux, Windows, macOS
103
+ - Native window with system tray and file dialogs
104
+ - Build: `npm run dist:linux` / `npm run dist:win` / `npm run dist:mac`
105
+ - [Download latest release](https://github.com/unn-known1/webtun/releases/latest)
106
+
107
+ ### PWA
108
+ - Install to iOS/Android home screen
109
+ - Works offline with last session state
110
+ - Install banner with iOS instructions fallback
219
111
 
220
112
  ---
221
113
 
222
- ## Tunnel Manager
114
+ ## Configuration
223
115
 
224
- 1. Open **Settings** (gear icon)
225
- 2. Go to **Tunnel** section
226
- 3. Enter URL (default: `http://localhost:3000`)
227
- 4. Click **Create** — a health check pings the target first, warns if unreachable
228
- 5. Copy the public URL — share it with anyone
229
- 6. View all tunnels with live status indicators (green/orange)
116
+ ### CLI Flags
230
117
 
231
- **Note:** Tunnels created before a server restart need manual cleanup:
232
- ```bash
233
- kill $(pgrep -f 'cloudflared tunnel')
234
- ```
118
+ | Flag | Description | Default |
119
+ |------|-------------|---------|
120
+ | `--port, -p` | Server port | `3000` |
121
+ | `--host, -h` | Bind address | `0.0.0.0` |
122
+ | `--pin` | Authentication PIN | none |
123
+ | `--tunnel, -t` | Start Cloudflare Tunnel | off |
124
+ | `--help` | Show help | — |
125
+ | `--version` | Show version | — |
126
+
127
+ ### Environment Variables
128
+
129
+ | Variable | Description | Default |
130
+ |----------|-------------|---------|
131
+ | `PORT` | Server port | `3000` |
132
+ | `HOST` | Bind address | `0.0.0.0` |
133
+ | `PIN` | Auth PIN (empty = no auth) | none |
134
+ | `SHELL` | Shell to use | platform default |
135
+ | `WORKSPACE_ROOT` | File explorer root | `~` |
136
+ | `TRUST_PROXY` | Trust `X-Forwarded-For` from first proxy | `false` |
137
+ | `WEBTUN_SHELL` | Override shell on Windows | PowerShell |
235
138
 
236
139
  ---
237
140
 
@@ -239,10 +142,8 @@ kill $(pgrep -f 'cloudflared tunnel')
239
142
 
240
143
  | Layer | Technology |
241
144
  |-------|------------|
242
- | Frontend | HTML + Vanilla JS (PWA, prefers-color-scheme, visualViewport, Drag & Drop) |
243
- | Backend | Node.js + node-pty + Express |
244
- | Terminal | xterm.js + fit addon |
245
- | Protocol | WebSocket (ws) |
145
+ | Frontend | Vanilla JS, xterm.js, CodeMirror, PWA |
146
+ | Backend | Node.js, Express, node-pty |
246
147
  | Tunnel | Cloudflare Tunnel (cloudflared) |
247
148
  | Desktop | Electron + electron-builder |
248
149
  | Archives | archiver v8 + yauzl |
@@ -251,11 +152,11 @@ kill $(pgrep -f 'cloudflared tunnel')
251
152
 
252
153
  ## Security
253
154
 
254
- - **npm audit clean** 0 known vulnerabilities
255
- - **PIN authentication** optional, protects all API endpoints
256
- - **CSP headers** restricts script sources to CDN
257
- - **WebSocket origin check** prevents cross-site WebSocket hijacking
258
- - **Rate limiting**per-IP rate limits on auth and search endpoints
155
+ - PIN authentication on all API endpoints (`x-pin-token` header or `?token=` query)
156
+ - CSP headers restrict script sources to CDN
157
+ - WebSocket origin check prevents cross-site hijacking
158
+ - Per-IP rate limiting on auth and search endpoints
159
+ - npm audit clean 0 known vulnerabilities
259
160
 
260
161
  ---
261
162
 
@@ -263,31 +164,54 @@ kill $(pgrep -f 'cloudflared tunnel')
263
164
 
264
165
  | Problem | Solution |
265
166
  |---------|----------|
266
- | Tunnel URL not loading | Check Cloudflare account quota at [dash.cloudflare.com](https://dash.cloudflare.com) |
267
- | Permission denied on shell | Ensure user has shell access: `chsh -s /bin/bash` |
268
- | File upload fails | Check `public/uploads/` permissions: `chmod 755 public/uploads/` |
269
- | Port 3000 in use | Change port: `PORT=3001 npm start` |
270
- | Windows terminal opens PowerShell instead of Git Bash | Set `WEBTUN_SHELL=/usr/bin/bash` in `.env` |
271
- | Behind reverse proxy, wrong client IP | Set `TRUST_PROXY=true` in `.env` |
272
- | Tunnel persists after server restart | Tunnels are auto-managed; manual cleanup: `kill $(pgrep -f 'cloudflared tunnel')` |
273
-
274
- ---
275
-
276
- ## Contributing
277
-
278
- 1. Fork → Branch → Commit → PR
279
- 2. Follow existing code style (ES6+, no frameworks)
280
- 3. Test locally with `npm start`
281
- 4. Update this README if adding features
167
+ | Tunnel not loading | Check quota at [dash.cloudflare.com](https://dash.cloudflare.com) |
168
+ | Port 3000 in use | `PORT=3001 npm start` |
169
+ | Shell permission denied | `chsh -s /bin/bash` |
170
+ | Behind reverse proxy | Set `TRUST_PROXY=true` in `.env` |
171
+ | Windows shell wrong | Set `WEBTUN_SHELL=/usr/bin/bash` in `.env` |
172
+ | Tunnel persists after restart | `kill $(pgrep -f 'cloudflared tunnel')` |
282
173
 
283
174
  ---
284
175
 
285
- ## License
286
-
287
- MIT — do whatever you want with it.
176
+ ## Changelog
177
+
178
+ ### v1.5.2
179
+ - UI/UX audit fixes: theme-aware xterm selection color, `--fg3` across all 6 themes
180
+ - Replaced native `confirm()` with a theme-aware, focus-trapped dialog
181
+ - File explorer keyboard navigation (arrows, type-ahead, select-all) + loading state
182
+ - Mobile header overflow (more) menu; compact hostname restored on mobile
183
+ - Context menu keyboard navigation and `aria-expanded` on submenus
184
+ - SVG-ified remaining text glyphs; aria-labels on JS-generated icon buttons
185
+ - Single-line scrollable breadcrumb; tab-bar mask no longer clips new-tab
186
+ - Removed infinite keep-awake bounce; light-theme contrast bump
187
+ - `term.paste()` replaces deprecated `execCommand('insertText')`
188
+ - Pull-to-refresh indicator; tunnel rows use CSS classes
189
+ - JetBrains Mono web font + CSP `font-src`; PWA screenshots
190
+ - Fixed addon-webgl 404 (0.18.1 → 0.18.0); removed MiMo CLI default command
191
+ - Explicit Tokyo Night theme block + `color-scheme` for all 6 themes
192
+ - IBM Plex Sans UI font paired with JetBrains Mono (chrome vs code surfaces)
193
+ - Keyboard Shortcuts dialog in overflow menu; dialog `role`/`aria-modal` semantics
194
+ - Busy-spinner buttons + inline field errors (rename/new file/new folder/tunnel/save)
195
+ - Toast type icons and max 4 visible; editor unsaved-changes dot + Discard dialog
196
+ - Deferred CDN scripts for faster first paint; icon stroke-width normalized to 2
197
+ - Empty-directory quick actions; Reset settings button; skip-link + landmark roles
198
+ - Terminal connecting spinner; install banner clears mobile key bar
199
+ - Search button touch targets on coarse pointers; subtle hover on plain buttons
200
+
201
+ ### v1.5.1
202
+ - Fixed command history saving terminal garbage instead of actual commands
203
+ - Fixed history 401 errors on Cloudflare tunnel URLs
204
+ - Fixed VT/ANSI parameter sequences leaking into history
205
+ - Fixed CodeMirror `defineSimpleMode` error
206
+ - Fixed console accessibility warnings (labels, form fields)
207
+ - Added safe `localStorage` wrapper for Tracking Prevention compatibility
208
+ - New terminal icon matching in-app logo
209
+
210
+ ### v1.5.0
211
+ - Initial release
288
212
 
289
213
  ---
290
214
 
291
215
  <p align="center">
292
- <sub>Made with ❤️ by <a href="https://github.com/unn-known1">Gaurang Patel</a></sub>
216
+ <sub>Built by <a href="https://github.com/unn-known1">Gaurang Patel</a> · MIT License</sub>
293
217
  </p>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webtun",
3
- "version": "1.5.0",
3
+ "version": "1.5.2",
4
4
  "description": "Self-hosted web terminal with Cloudflare Tunnel, file explorer, and PWA support",
5
5
  "author": {
6
6
  "name": "Gaurang Patel",
@@ -1,6 +1,5 @@
1
1
  window.DEFAULT_CMDS = [
2
2
  { name: 'Install OpenCode AI', cmd: 'npm install -g opencode-ai', cat: 'AI Tools' },
3
- { name: 'Install MiMo CLI', cmd: 'npm install -g @mimo-ai/cli', cat: 'AI Tools' },
4
3
  { name: 'Install 9Router', cmd: 'npm install -g 9router', cat: 'AI Tools' },
5
4
  { name: 'GitHub TUI', cmd: 'npx github-tui', cat: 'Tools' },
6
5
  { name: 'Colab Setup', cmd: 'curl -fsSL https://raw.githubusercontent.com/unn-Known1/unn-Known1/main/colab_setup.sh | bash', cat: 'Setup' },
Binary file
Binary file
Binary file
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#c0caf5" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="20" height="16" rx="2"></rect><line x1="6" y1="8" x2="10" y2="8"></line><line x1="6" y1="12" x2="10" y2="12"></line><line x1="12" y1="8" x2="18" y2="8"></line><line x1="12" y1="12" x2="18" y2="12"></line></svg>