|
| 1 | +<div align="center"> |
| 2 | + |
| 3 | +<img src="src-tauri/icons/128x128@2x.png" width="96" alt="Nyx.Commander icon"> |
| 4 | + |
| 5 | +# Nyx.Commander |
| 6 | + |
| 7 | +**A pixel-art dual-pane file manager for macOS — built with Tauri and Svelte.** |
| 8 | + |
| 9 | +[](src-tauri/tauri.conf.json) |
| 10 | +[](https://tauri.app) |
| 11 | +[](https://tauri.app) |
| 12 | +[](https://svelte.dev) |
| 13 | +[](https://www.typescriptlang.org) |
| 14 | +[](https://www.rust-lang.org) |
| 15 | + |
| 16 | +</div> |
| 17 | + |
| 18 | +--- |
| 19 | + |
| 20 | +<div align="center"> |
| 21 | + |
| 22 | + |
| 23 | + |
| 24 | +</div> |
| 25 | + |
| 26 | +## Overview |
| 27 | + |
| 28 | +Nyx.Commander is a keyboard-first dual-pane file manager in the tradition of Total Commander and FAR Manager, reimagined as a native macOS app. It keeps the workflow that power users love — two panels, F-key operations, instant navigation — wrapped in a crisp dark UI with pixel-art icons and a full plugin system. |
| 29 | + |
| 30 | +No Electron. No web server. Native Rust backend with a SvelteKit frontend rendered via Tauri's WebKit layer. |
| 31 | + |
| 32 | +--- |
| 33 | + |
| 34 | +## Features |
| 35 | + |
| 36 | +### Dual-panel navigation |
| 37 | +Two independent panels, each with their own tab history. Switch with `Tab`, open a new tab with `Cmd+T`, jump to any path with `Cmd+G`, or click the path bar to edit it directly. |
| 38 | + |
| 39 | +### Archive browsing |
| 40 | +Browse ZIP, TAR, GZip, BZip2, XZ, DOCX, XLSX, and more as if they were directories — press `Enter` to walk in, `Backspace` to walk out. No extraction required. |
| 41 | + |
| 42 | +### Viewers |
| 43 | +- **Text viewer** — syntax-aware, monospace, scrollable (`Enter` on any text/code file) |
| 44 | +- **Hex viewer** — full hex dump with ASCII pane and status bar |
| 45 | +- **Diff viewer** — side-by-side colored diff between any two files |
| 46 | +- **Image viewer** — via the built-in plugin; pixel-perfect scaling for small pixel art assets |
| 47 | + |
| 48 | +### Tools |
| 49 | +- **Process explorer** — live CPU + memory table, kill any process (`F3`) |
| 50 | +- **Quick View pane** — preview the file under the cursor without opening a dialog (`Cmd+Q`) |
| 51 | +- **Go To Path** — fuzzy path input with history autocomplete (`Cmd+G`) |
| 52 | +- **Command bar** — run shell commands with the current path as `$cwd` (`` Ctrl+` ``) |
| 53 | +- **Dir sync** — compare two directories side by side, copy differences in one click (`d`) |
| 54 | +- **Multi-rename** — batch-rename selected files with pattern substitution (`Cmd+M`) |
| 55 | + |
| 56 | +### Plugin system |
| 57 | +Four plugin categories, hot-reloaded from `~/.nyx/plugins/` — no restarts needed: |
| 58 | + |
| 59 | +| Category | What it does | |
| 60 | +|----------|-------------| |
| 61 | +| **Viewer** | Renders files in a fullscreen overlay (HTML iframe, sandboxed) | |
| 62 | +| **Column** | Adds a metadata column to both panels (subprocess, any language) | |
| 63 | +| **Action** | Keyboard-triggered operation on selected files (`Ctrl+Shift+<key>`) | |
| 64 | +| **Panel** | Mounts a virtual filesystem (S3, FTP, custom protocols) | |
| 65 | + |
| 66 | +Drag a `.nyx-plugin` file onto the Plugin Manager to install. Built-in: Image Viewer, Markdown Viewer, Git Status column. |
| 67 | + |
| 68 | +### Themes & color rules |
| 69 | +Four built-in themes — Neon, Classic, Matrix, Amber — switchable at any time with `F9`. Full custom theme editor in the menu. Assign highlight colors to files by glob pattern or extension. |
| 70 | + |
| 71 | +--- |
| 72 | + |
| 73 | +## Screenshots |
| 74 | + |
| 75 | +<table> |
| 76 | +<tr> |
| 77 | +<td align="center" width="50%"> |
| 78 | + |
| 79 | +**Plugin Manager**<br> |
| 80 | +<img src="images/Screenshot%202026-04-12%20at%2022.56.56.png" alt="Plugin Manager"> |
| 81 | + |
| 82 | +</td> |
| 83 | +<td align="center" width="50%"> |
| 84 | + |
| 85 | +**Theme Picker**<br> |
| 86 | +<img src="images/Screenshot%202026-04-12%20at%2022.56.52.png" alt="Theme Picker"> |
| 87 | + |
| 88 | +</td> |
| 89 | +</tr> |
| 90 | +<tr> |
| 91 | +<td align="center" width="50%"> |
| 92 | + |
| 93 | +**Quick View — Image Preview**<br> |
| 94 | +<img src="images/Screenshot%202026-04-12%20at%2023.12.00.png" alt="Quick View with image preview"> |
| 95 | + |
| 96 | +</td> |
| 97 | +<td align="center" width="50%"> |
| 98 | + |
| 99 | +**Go To Path**<br> |
| 100 | +<img src="images/Screenshot%202026-04-12%20at%2022.58.02.png" alt="Go To Path dialog with autocomplete"> |
| 101 | + |
| 102 | +</td> |
| 103 | +</tr> |
| 104 | +<tr> |
| 105 | +<td align="center" width="50%"> |
| 106 | + |
| 107 | +**Hex Viewer**<br> |
| 108 | +<img src="images/Screenshot%202026-04-12%20at%2022.59.26.png" alt="Hex Viewer"> |
| 109 | + |
| 110 | +</td> |
| 111 | +<td align="center" width="50%"> |
| 112 | + |
| 113 | +**Process Explorer**<br> |
| 114 | +<img src="images/Screenshot%202026-04-12%20at%2022.59.08.png" alt="Process Explorer"> |
| 115 | + |
| 116 | +</td> |
| 117 | +</tr> |
| 118 | +<tr> |
| 119 | +<td align="center" width="50%"> |
| 120 | + |
| 121 | +**Diff Viewer**<br> |
| 122 | +<img src="images/Screenshot%202026-04-12%20at%2023.26.17.png" alt="Diff Viewer"> |
| 123 | + |
| 124 | +</td> |
| 125 | +<td align="center" width="50%"> |
| 126 | + |
| 127 | +**Built-in Help**<br> |
| 128 | +<img src="images/Screenshot%202026-04-12%20at%2022.57.13.png" alt="Help Viewer with search"> |
| 129 | + |
| 130 | +</td> |
| 131 | +</tr> |
| 132 | +</table> |
| 133 | + |
| 134 | +--- |
| 135 | + |
| 136 | +## Keyboard Reference |
| 137 | + |
| 138 | +| Key | Action | |
| 139 | +|-----|--------| |
| 140 | +| `Tab` | Switch active panel | |
| 141 | +| `Enter` | Enter dir / open file / browse archive | |
| 142 | +| `Cmd+Enter` | Open with system app | |
| 143 | +| `Backspace` | Go to parent | |
| 144 | +| `Alt+←` / `Alt+→` | History back / forward | |
| 145 | +| `Cmd+G` | Go to path | |
| 146 | +| `Cmd+=` | Mirror current folder to other panel | |
| 147 | +| `F1` | Help | |
| 148 | +| `F2` | Rename | |
| 149 | +| `F5` | Copy to other panel | |
| 150 | +| `F6` | Move to other panel | |
| 151 | +| `F7` | New directory | |
| 152 | +| `F8` | Delete | |
| 153 | +| `F9` | Cycle theme | |
| 154 | +| `Space` | Toggle selection | |
| 155 | +| `Cmd+A` | Select all | |
| 156 | +| `Cmd+T` / `Cmd+W` | New / close tab | |
| 157 | +| `Cmd+Q` | Quick View pane | |
| 158 | +| `` Ctrl+` `` | Command bar | |
| 159 | +| `Escape` | Open menu | |
| 160 | + |
| 161 | +Type any printable character in a panel to start a quick filter. |
| 162 | + |
| 163 | +--- |
| 164 | + |
| 165 | +## Requirements |
| 166 | + |
| 167 | +- macOS 12 Monterey or later |
| 168 | +- [Rust](https://rustup.rs) (stable toolchain) |
| 169 | +- [Node.js](https://nodejs.org) 18+ and [pnpm](https://pnpm.io) |
| 170 | + |
| 171 | +--- |
| 172 | + |
| 173 | +## Development |
| 174 | + |
| 175 | +```bash |
| 176 | +# Install dependencies |
| 177 | +pnpm install |
| 178 | + |
| 179 | +# Start dev server (hot-reload) |
| 180 | +pnpm tauri dev |
| 181 | + |
| 182 | +# Type check |
| 183 | +pnpm check |
| 184 | + |
| 185 | +# Production build |
| 186 | +pnpm tauri build |
| 187 | +``` |
| 188 | + |
| 189 | +Built-in plugins live in `plugins/` at the repo root and are bootstrapped to `~/.nyx/plugins/` on first launch. To iterate on a plugin, edit in `~/.nyx/plugins/<id>/` directly — the watcher picks up changes within a second. |
| 190 | + |
| 191 | +--- |
| 192 | + |
| 193 | +## Writing Plugins |
| 194 | + |
| 195 | +See **[docs/user/plugins/authoring.md](docs/user/plugins/authoring.md)** for the full developer guide, or press `F1` inside the app and navigate to **Plugin Dev**. |
| 196 | + |
| 197 | +Quick start — a Python column plugin: |
| 198 | + |
| 199 | +```python |
| 200 | +#!/usr/bin/env python3 |
| 201 | +import sys, json |
| 202 | + |
| 203 | +for line in sys.stdin: |
| 204 | + req = json.loads(line.strip()) |
| 205 | + if req['method'] == 'get_columns': |
| 206 | + results = [{'path': f['path'], 'value': '✓'} for f in req['params']['files']] |
| 207 | + print(json.dumps({'id': req['id'], 'result': results}), flush=True) |
| 208 | +``` |
| 209 | + |
| 210 | +Drop it in `~/.nyx/plugins/com.you.myplugin/` with a `plugin.json` manifest. Done. |
| 211 | + |
| 212 | +--- |
| 213 | + |
| 214 | +## License |
| 215 | + |
| 216 | +MIT |
0 commit comments