|
1 | | -# Whale Cabinet |
| 1 | +<p align="center"><img src="docs/logo.png" width="128" alt="Whale Cabinet logo"></p> |
2 | 2 |
|
3 | | -A native Linux file manager with a flat filing-cabinet look (Tauri 2: Rust backend + TypeScript/Vite frontend). |
4 | | -Window class / Wayland app id: `whale-cabinet`. |
| 3 | +# Whale Cabinet |
5 | 4 |
|
| 5 | +A Linux file manager with a flat filing-cabinet look: folders are drawers you pull out, files are paper. |
| 6 | +Built with Tauri 2 (Rust + TypeScript), made for Wayland/Hyprland and DankMaterialShell, and a drop-in |
| 7 | +replacement for Dolphin (same places, tags and ratings). Window class / Wayland app id: `whale-cabinet`. |
6 | 8 |
|
| 9 | +**Highlights:** tabs and split view · fuzzy quick open (Ctrl+P) and zoxide jumps (Ctrl+J) · a command palette |
| 10 | +(Ctrl+Shift+P) · git badges and actions · network locations (SFTP, SMB, WebDAV, NFS) · a built-in viewer for |
| 11 | +pictures, PDFs, video, code and Markdown · tags, colours and ratings shared with Dolphin · duplicate finder and |
| 12 | +disk-usage map · encryption · administrator actions through polkit · live theming from DMS and Hyprland · |
| 13 | +**plugins** (Nextcloud, Immich and Bitwarden included). |
7 | 14 |
|
8 | 15 | ## Install |
9 | 16 |
|
| 17 | +Download the AppImage or the .deb from [Releases](https://github.com/PluginMike/whale-cabinet/releases) |
| 18 | +(plus the plugins archive, unpacked into `~/.local/share/whale-cabinet/`), or build it yourself: |
| 19 | + |
10 | 20 | ```sh |
11 | 21 | scripts/install.sh # build + install to ~/.local/bin (Dolphin stays the default) |
12 | 22 | scripts/install.sh --default # …and take over from Dolphin: default for folders + "Show in folder" (D-Bus) |
@@ -86,7 +96,7 @@ fish users with a user-local rustup: `fish_add_path ~/.cargo/bin`. |
86 | 96 | ## Tests |
87 | 97 |
|
88 | 98 | ```sh |
89 | | -(cd src-tauri && cargo test) # 68 Rust unit tests: file ops, tags/xattrs, theme parsing (dank-colors.css, |
| 99 | +(cd src-tauri && cargo test) # 69 Rust unit tests: file ops, tags/xattrs, theme parsing (dank-colors.css, |
90 | 100 | # dms-colors.json, hyprctl JSON), .desktop/mimeapps/globs, thumbnails, xbel, search, pty, |
91 | 101 | # fuzzy ranking, git porcelain, recently-used.xbel, gio prompts, admin helper, duplicates, plugins… |
92 | 102 | (cd src-tauri && cargo test real_system -- --ignored --nocapture) # Open With / icons against this machine |
@@ -166,6 +176,16 @@ file), asking for the password — or, for key-encrypted files, gpg's own pinent |
166 | 176 |
|
167 | 177 | ### Plugins |
168 | 178 |
|
| 179 | +Settings → **Plugins** (also Tools → *Plugins…* in the sidebar) lists the installed plugins with their settings |
| 180 | +and instructions. Included: |
| 181 | + |
| 182 | +- [**Nextcloud**](plugins/nextcloud/README.md): sync-status badges from the desktop client, Share… / Copy Public |
| 183 | + Link / Open in Browser |
| 184 | +- [**Immich**](plugins/immich/README.md): your photo library as folders, smart search, upload and delete |
| 185 | +- [**Bitwarden**](plugins/bitwarden/README.md): search your vault from the palette, copy passwords and TOTP codes |
| 186 | + |
| 187 | +#### Writing a plugin |
| 188 | + |
169 | 189 | A plugin is a folder in `~/.local/share/whale-cabinet/plugins/<name>/` with a `plugin.json` and an executable in |
170 | 190 | any language. Whale Cabinet starts it once (it runs as you, so the first time it asks whether to allow it; Settings |
171 | 191 | → Plugins turns it off again) and keeps it running, talking JSON lines over stdin/stdout. |
@@ -211,37 +231,6 @@ in any order (so a plugin can work on several at once). Unasked messages `{"even |
211 | 231 | An entry is `{name, path, dir?, size?, mtime? (ms), score? (sort order, highest first), thumb? (true), count? |
212 | 232 | (a folder's "12 photos"), where?, info?: [[label, value]…]}`; its `path` is a location of the plugin's scheme. |
213 | 233 |
|
214 | | -#### Nextcloud (bundled) |
215 | | - |
216 | | -With the Nextcloud desktop client running, items in your synced folders (from `~/.config/Nextcloud/nextcloud.cfg`) |
217 | | -get its sync state as a badge — **✓** synced (blue when shared), **↻** syncing, **!** a problem, **⊘** excluded — |
218 | | -updated live as the client syncs (it's the client's local socket, the one Dolphin's overlays use). |
219 | | -Right-click → Nextcloud: *Share…* (the client's share dialog), *Copy Public Link* (reuses the item's public link |
220 | | -or creates one; needs an app password from Nextcloud → Settings → Security in Settings → Plugins, kept in your |
221 | | -keyring), *Open in Browser* (the item in the web UI). Check: `python3 plugins/nextcloud/test_nextcloud.py`. |
222 | | - |
223 | | -#### Immich (bundled) |
224 | | - |
225 | | -Settings → Plugins → Immich: your server's URL and an API key (Immich → Account Settings → API Keys; the key goes |
226 | | -to your keyring). The sidebar's Immich section opens **Timeline** (a folder per month), **Albums** and |
227 | | -**Favorites** as thumbnail folders, with EXIF in the info panel and Quick Look (Space) on the preview image. |
228 | | -Opening a photo downloads the original (kept in `~/.cache/whale-cabinet/plugins/immich/`) and opens it with your |
229 | | -app; Ctrl+C, *Copy To…* and dragging out copy the originals. **Ctrl+F** in Immich (or "Immich: search…" in |
230 | | -Ctrl+Shift+P) is smart search: type what's in the picture; Enter opens a result, Shift+Enter shows all of them. |
231 | | -Paste or drop files onto an Immich location to upload them (into an album: added to it; into Favorites: marked), |
232 | | -or right-click local photos → Immich → *Upload to Immich*; Del moves photos to Immich's trash (it asks first). |
233 | | -Reading needs asset.read/view/download, album.read, timeline.read; changing needs asset.upload, albumAsset.create, |
234 | | -asset.update and asset.delete. |
235 | | - |
236 | | -#### Bitwarden (bundled) |
237 | | - |
238 | | -Needs [rbw](https://github.com/doy/rbw) (`sudo pacman -S rbw`). Settings → Plugins → Bitwarden: your server (empty |
239 | | -for bitwarden.com; a self-hosted Bitwarden or Vaultwarden URL otherwise) and email. Ctrl+Shift+P → *Bitwarden: |
240 | | -search…*: type part of a name, username or folder; **Enter** copies the password, **Shift+Enter** the username, |
241 | | -**Ctrl+Enter** the TOTP code. rbw's agent asks for your master password (pinentry) and keeps the vault unlocked |
242 | | -for its `lock_timeout`; the plugin never sees it. Passwords and codes are copied marked sensitive and cleared |
243 | | -after 30 s (unless you copied something else). Check: `python3 plugins/bitwarden/test_bitwarden.py`. |
244 | | - |
245 | 234 | ### Recent files |
246 | 235 |
|
247 | 236 | Recent (sidebar) lists what you opened lately, grouped Today / Yesterday / This week / … with bigger rows and |
@@ -444,3 +433,13 @@ windowrulev2 = opacity 0.95 0.9, class:^(whale-cabinet)$ |
444 | 433 | windowrulev2 = float, class:^(whale-cabinet-dialog)$ |
445 | 434 | windowrulev2 = center, class:^(whale-cabinet-dialog)$ |
446 | 435 | ``` |
| 436 | + |
| 437 | +## Contributing |
| 438 | + |
| 439 | +Issues and pull requests are welcome. `cargo test` (in `src-tauri`) and `npx tsc --noEmit` should pass; |
| 440 | +`WC_SUITES=browse,ops,plugins scripts/smoke.sh` runs the app end to end. Releases are built by GitHub Actions |
| 441 | +when a `v*` tag is pushed. |
| 442 | + |
| 443 | +## License |
| 444 | + |
| 445 | +[GPL-3.0-or-later](LICENSE) |
0 commit comments