mountlet 0.2.2__tar.gz → 0.3.0__tar.gz
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.
- {mountlet-0.2.2 → mountlet-0.3.0}/CHANGELOG.md +23 -0
- {mountlet-0.2.2/src/mountlet.egg-info → mountlet-0.3.0}/PKG-INFO +172 -6
- mountlet-0.3.0/README.md +388 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/docs/README.md +22 -1
- {mountlet-0.2.2 → mountlet-0.3.0}/docs/RELEASE.md +1 -1
- {mountlet-0.2.2 → mountlet-0.3.0}/pyproject.toml +4 -1
- {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/__init__.py +1 -1
- {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/config_tools/setup_wizard.py +53 -27
- {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/config_tools/shared.py +18 -50
- {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/core.py +20 -117
- mountlet-0.3.0/src/mountlet/platform_services/__init__.py +27 -0
- mountlet-0.3.0/src/mountlet/platform_services/base.py +152 -0
- mountlet-0.3.0/src/mountlet/platform_services/console.py +35 -0
- mountlet-0.3.0/src/mountlet/platform_services/desktop.py +62 -0
- mountlet-0.3.0/src/mountlet/platform_services/file_managers.py +268 -0
- mountlet-0.3.0/src/mountlet/platform_services/linux.py +88 -0
- mountlet-0.3.0/src/mountlet/platform_services/macos.py +64 -0
- mountlet-0.3.0/src/mountlet/platform_services/processes.py +52 -0
- mountlet-0.3.0/src/mountlet/platform_services/windows.py +158 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/rclone_wizard.py +6 -18
- {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/settings.py +20 -28
- {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/tray.py +286 -67
- {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/tui.py +12 -46
- {mountlet-0.2.2 → mountlet-0.3.0/src/mountlet.egg-info}/PKG-INFO +172 -6
- {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet.egg-info/SOURCES.txt +10 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet.egg-info/requires.txt +3 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/tests/test_cli.py +1 -1
- {mountlet-0.2.2 → mountlet-0.3.0}/tests/test_core.py +2 -2
- mountlet-0.3.0/tests/test_platform_services.py +275 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/tests/test_settings.py +4 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/tests/test_setup_wizard.py +33 -2
- {mountlet-0.2.2 → mountlet-0.3.0}/tests/test_tray.py +162 -0
- mountlet-0.2.2/README.md +0 -225
- {mountlet-0.2.2 → mountlet-0.3.0}/LICENSE +0 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/MANIFEST.in +0 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/SECURITY.md +0 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/examples/rclone.conf.sample +0 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/setup.cfg +0 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/assets/icon.png +0 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/cli.py +0 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/config_tools/export_config.py +0 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/config_tools/import_config.py +0 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/config_tools/path_config.py +0 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/config_tools/reconnect_config.py +0 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/config_tools/verify_config.py +0 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet.egg-info/dependency_links.txt +0 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet.egg-info/entry_points.txt +0 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet.egg-info/top_level.txt +0 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/tests/test_config_tools.py +0 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/tests/test_rclone_wizard.py +0 -0
- {mountlet-0.2.2 → mountlet-0.3.0}/tests/test_tui.py +0 -0
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.0 - 2026-06-20
|
|
4
|
+
|
|
5
|
+
- Refactored paths, prerequisites, mount lifecycle, process handling,
|
|
6
|
+
start-at-login registration, and desktop integration behind Linux, Windows,
|
|
7
|
+
macOS, and generic Qt platform services.
|
|
8
|
+
- Kept Dolphin and Plasma X11 behavior as optional Linux enhancements while
|
|
9
|
+
providing default file-manager and window fallbacks for other environments.
|
|
10
|
+
- Added platform adapter tests and Windows-specific directory mountpoint
|
|
11
|
+
preparation. Source-installed tray and mount flows have now been exercised
|
|
12
|
+
on Linux, Windows, and macOS; Windows and macOS remain experimental until
|
|
13
|
+
native packages are available.
|
|
14
|
+
- Added cross-platform file-manager discovery and an app-specific selector,
|
|
15
|
+
with platform defaults and automatic fallback when a selected manager is no
|
|
16
|
+
longer installed.
|
|
17
|
+
- Opening App settings from the tray now positions and focuses the main window
|
|
18
|
+
at the tray before showing the settings dialog.
|
|
19
|
+
- Child dialogs, including Add Remote, now establish their positioned main
|
|
20
|
+
window before appearing when launched directly from the tray.
|
|
21
|
+
- Added Windows prerequisite discovery for rclone and WinFsp, PowerShell-safe
|
|
22
|
+
setup guidance, and File Explorer integration.
|
|
23
|
+
- Added macOS prerequisite guidance for rclone and macFUSE, Finder integration,
|
|
24
|
+
menu-bar-only operation, native tray click handling, and keep-above behavior.
|
|
25
|
+
|
|
3
26
|
## 0.2.2 - 2026-06-19
|
|
4
27
|
|
|
5
28
|
- Added a guided new-remote wizard for major cloud providers, with browser and
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mountlet
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: CLI and tray tools for mounting rclone remotes
|
|
5
5
|
Author: Eric Holt
|
|
6
6
|
License-Expression: MIT
|
|
@@ -10,6 +10,8 @@ Keywords: rclone,mount,cloud-storage,tui,fuse
|
|
|
10
10
|
Classifier: Development Status :: 4 - Beta
|
|
11
11
|
Classifier: Environment :: Console
|
|
12
12
|
Classifier: Intended Audience :: End Users/Desktop
|
|
13
|
+
Classifier: Operating System :: MacOS
|
|
14
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
13
15
|
Classifier: Operating System :: POSIX :: Linux
|
|
14
16
|
Classifier: Programming Language :: Python :: 3
|
|
15
17
|
Classifier: Programming Language :: Python :: 3.10
|
|
@@ -22,6 +24,7 @@ Description-Content-Type: text/markdown
|
|
|
22
24
|
License-File: LICENSE
|
|
23
25
|
Provides-Extra: tray
|
|
24
26
|
Requires-Dist: PySide6>=6.7; extra == "tray"
|
|
27
|
+
Requires-Dist: pyobjc-framework-Cocoa>=10.3; sys_platform == "darwin" and extra == "tray"
|
|
25
28
|
Provides-Extra: dev
|
|
26
29
|
Requires-Dist: build>=1.2; extra == "dev"
|
|
27
30
|
Requires-Dist: pytest>=8; extra == "dev"
|
|
@@ -41,8 +44,8 @@ Mountlet is a friendly control panel for two standard tools:
|
|
|
41
44
|
|
|
42
45
|
- `rclone` connects to cloud storage providers such as Google Drive, Dropbox,
|
|
43
46
|
S3-compatible storage, and WebDAV.
|
|
44
|
-
-
|
|
45
|
-
|
|
47
|
+
- A filesystem driver lets the operating system show a cloud remote as if it
|
|
48
|
+
were a normal folder: FUSE on Linux, WinFsp on Windows, or macFUSE on macOS.
|
|
46
49
|
|
|
47
50
|
This app reads your `rclone` remotes, creates local mount folders, and starts or
|
|
48
51
|
stops `rclone mount` for you.
|
|
@@ -51,7 +54,8 @@ stops `rclone mount` for you.
|
|
|
51
54
|
|
|
52
55
|
- Python 3.10 or newer.
|
|
53
56
|
- `rclone`, which connects to your cloud storage.
|
|
54
|
-
- FUSE
|
|
57
|
+
- A compatible filesystem driver: FUSE on Linux, WinFsp on Windows, or macFUSE
|
|
58
|
+
on macOS.
|
|
55
59
|
|
|
56
60
|
On Ubuntu, install the system tools with:
|
|
57
61
|
|
|
@@ -79,6 +83,161 @@ For a local checkout:
|
|
|
79
83
|
python -m pip install .
|
|
80
84
|
```
|
|
81
85
|
|
|
86
|
+
## Install a GitHub Preview
|
|
87
|
+
|
|
88
|
+
GitHub previews are source snapshots from the `wip` branch, not signed native
|
|
89
|
+
installers. They may be unstable and can change without notice. Linux is the
|
|
90
|
+
primary supported platform. Source-installed Windows and macOS tray and mount
|
|
91
|
+
flows are available as experimental support while native packaging is developed.
|
|
92
|
+
|
|
93
|
+
Each section starts with the system prerequisites and installs Mountlet in an
|
|
94
|
+
isolated environment, so a GitHub preview does not replace a stable PyPI
|
|
95
|
+
installation.
|
|
96
|
+
|
|
97
|
+
Use only the subsection for your operating system. Linux and macOS use shell
|
|
98
|
+
commands; Windows uses PowerShell. Their syntax is not interchangeable.
|
|
99
|
+
|
|
100
|
+
### Linux
|
|
101
|
+
|
|
102
|
+
Install FUSE 3 through your distribution. On Ubuntu or Debian:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
sudo apt update
|
|
106
|
+
sudo apt install rclone fuse3 python3-venv
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Install and start the preview:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
PREVIEW="$HOME/.local/share/mountlet-preview"
|
|
113
|
+
python3 -m venv "$PREVIEW"
|
|
114
|
+
"$PREVIEW/bin/python" -m pip install --upgrade pip
|
|
115
|
+
"$PREVIEW/bin/python" -m pip install --upgrade --force-reinstall \
|
|
116
|
+
"mountlet[tray] @ https://github.com/eric-holt/mountlet/archive/refs/heads/wip.zip"
|
|
117
|
+
"$PREVIEW/bin/mountlet" tray
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Windows (Experimental)
|
|
121
|
+
|
|
122
|
+
Install Python 3.12 and rclone with WinGet:
|
|
123
|
+
|
|
124
|
+
```powershell
|
|
125
|
+
winget install --id Python.Python.3.12 --exact
|
|
126
|
+
winget install --id Rclone.Rclone --exact
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Install [`WinFsp`](https://winfsp.dev/rel/) using its Windows installer, then
|
|
130
|
+
close and reopen PowerShell so Python and rclone are available.
|
|
131
|
+
|
|
132
|
+
If you downloaded the portable `rclone.exe` instead, place it in a permanent
|
|
133
|
+
folder and tell Mountlet where it is. Replace the example path as needed:
|
|
134
|
+
|
|
135
|
+
```powershell
|
|
136
|
+
$env:RCLONE_PATH = "C:\Tools\rclone\rclone.exe"
|
|
137
|
+
[Environment]::SetEnvironmentVariable("RCLONE_PATH", $env:RCLONE_PATH, "User")
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Mountlet also checks `PATH` and common WinGet, Chocolatey, Scoop, and manual
|
|
141
|
+
installation folders. Confirm that rclone is available before continuing:
|
|
142
|
+
|
|
143
|
+
```powershell
|
|
144
|
+
& $env:RCLONE_PATH version
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
If you used WinGet and did not set `RCLONE_PATH`, use `rclone version` instead.
|
|
148
|
+
|
|
149
|
+
Install `pipx` and add its application directory to your user `PATH`:
|
|
150
|
+
|
|
151
|
+
```powershell
|
|
152
|
+
py -3.12 -m pip install --user --upgrade pipx
|
|
153
|
+
py -3.12 -m pipx ensurepath
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Close and reopen PowerShell so the updated `PATH` is loaded. Then install and
|
|
157
|
+
start Mountlet. `pipx` keeps the preview isolated while making the `mountlet`
|
|
158
|
+
command available to your user account:
|
|
159
|
+
|
|
160
|
+
```powershell
|
|
161
|
+
pipx install --force "mountlet[tray] @ https://github.com/eric-holt/mountlet/archive/refs/heads/wip.zip"
|
|
162
|
+
mountlet tray
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### macOS (Experimental)
|
|
166
|
+
|
|
167
|
+
Install Apple's Command Line Tools first. A system dialog opens; finish that
|
|
168
|
+
installation before continuing:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
xcode-select --install
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Install [Homebrew](https://brew.sh/) and activate it in the current shell. The
|
|
175
|
+
path check supports both Apple Silicon and Intel Macs:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
|
179
|
+
BREW=/opt/homebrew/bin/brew
|
|
180
|
+
[ -x "$BREW" ] || BREW=/usr/local/bin/brew
|
|
181
|
+
printf 'eval "$(%s shellenv)"\n' "$BREW" >> "$HOME/.zprofile"
|
|
182
|
+
eval "$("$BREW" shellenv)"
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Install Python, `pipx`, and macFUSE:
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
brew install python@3.12 pipx
|
|
189
|
+
brew install --cask macfuse
|
|
190
|
+
pipx ensurepath
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Before macFUSE can mount anything, macOS may block its kernel extension. Follow
|
|
194
|
+
the prompts shown when you first try to mount a remote:
|
|
195
|
+
|
|
196
|
+
1. Choose **Open System Settings**, then open **Privacy & Security**.
|
|
197
|
+
2. If an **Allow** button appears for system software from developer Benjamin
|
|
198
|
+
Fleischer, select it, authenticate, and restart the Mac.
|
|
199
|
+
3. On an Apple Silicon Mac, macOS may first show **Enable System Extensions**.
|
|
200
|
+
Select it and shut down when prompted. Hold the power button to enter
|
|
201
|
+
Recovery, open **Startup Security Utility**, select the macOS volume, and
|
|
202
|
+
choose **Security Policy**.
|
|
203
|
+
4. Select **Reduced Security**, enable **Allow user management of kernel
|
|
204
|
+
extensions from identified developers**, and restart.
|
|
205
|
+
5. Try mounting again, return to **Privacy & Security**, select **Allow** for
|
|
206
|
+
macFUSE if requested, and restart once more.
|
|
207
|
+
|
|
208
|
+
These security changes are required by macFUSE's kernel backend, not by
|
|
209
|
+
Mountlet. See the official
|
|
210
|
+
[macFUSE setup guide](https://github.com/macfuse/macfuse/wiki/Getting-Started)
|
|
211
|
+
for screenshots and troubleshooting.
|
|
212
|
+
|
|
213
|
+
Install rclone using its official script. Do not use `brew install rclone` for
|
|
214
|
+
Mountlet: that macOS build does not include mount support.
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
sudo -v
|
|
218
|
+
curl https://rclone.org/install.sh | sudo bash
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Finally, install Mountlet with the Homebrew Python:
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
PYTHON="$(brew --prefix python@3.12)/bin/python3.12"
|
|
225
|
+
"$PYTHON" --version
|
|
226
|
+
pipx install --force --python "$PYTHON" \
|
|
227
|
+
"mountlet[tray] @ https://github.com/eric-holt/mountlet/archive/refs/heads/wip.zip"
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
The version check must report Python 3.10 or newer. Close and reopen the
|
|
231
|
+
terminal after `pipx ensurepath`, then start the preview:
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
mountlet tray
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
Run the same install command again to update an existing preview. To test a
|
|
238
|
+
specific tagged pre-release instead, replace `refs/heads/wip.zip` with
|
|
239
|
+
`refs/tags/vX.Y.Z.zip`.
|
|
240
|
+
|
|
82
241
|
## Use
|
|
83
242
|
|
|
84
243
|
Open Mountlet:
|
|
@@ -134,8 +293,11 @@ The tray app uses the tray icon this way:
|
|
|
134
293
|
window, the first click brings it forward. On Plasma X11, opening it from a
|
|
135
294
|
different desktop moves it to the current desktop.
|
|
136
295
|
- Right-click shows app-level actions such as mount all, unmount all, update
|
|
137
|
-
status, app settings,
|
|
138
|
-
|
|
296
|
+
status, app settings, available configuration files, and quit.
|
|
297
|
+
|
|
298
|
+
On macOS, Mountlet runs as a menu-bar utility without a separate Dock icon.
|
|
299
|
+
Left-click opens or closes the Mountlet window, and right-click opens the app
|
|
300
|
+
menu, matching the other supported desktops.
|
|
139
301
|
|
|
140
302
|
The Mountlet window provides:
|
|
141
303
|
|
|
@@ -146,6 +308,10 @@ The Mountlet window provides:
|
|
|
146
308
|
remaining space, with manual move controls for final adjustments.
|
|
147
309
|
- A pin control that keeps the window above other windows without tying it to
|
|
148
310
|
one desktop.
|
|
311
|
+
- A file-manager selector in App settings. Mountlet follows the Linux desktop
|
|
312
|
+
default, uses File Explorer by default on Windows, and Finder on macOS; other
|
|
313
|
+
detected managers can be selected without changing the operating-system
|
|
314
|
+
default.
|
|
149
315
|
|
|
150
316
|
If your desktop session does not expose a system tray, use the terminal menu
|
|
151
317
|
instead.
|
mountlet-0.3.0/README.md
ADDED
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
# Mountlet
|
|
2
|
+
|
|
3
|
+
Mountlet is a desktop tray and terminal tool for mounting and unmounting
|
|
4
|
+
`rclone` remotes. It uses your existing `rclone` configuration and does not
|
|
5
|
+
store cloud credentials inside the application install directory.
|
|
6
|
+
|
|
7
|
+
## How It Works
|
|
8
|
+
|
|
9
|
+
Mountlet is a friendly control panel for two standard tools:
|
|
10
|
+
|
|
11
|
+
- `rclone` connects to cloud storage providers such as Google Drive, Dropbox,
|
|
12
|
+
S3-compatible storage, and WebDAV.
|
|
13
|
+
- A filesystem driver lets the operating system show a cloud remote as if it
|
|
14
|
+
were a normal folder: FUSE on Linux, WinFsp on Windows, or macFUSE on macOS.
|
|
15
|
+
|
|
16
|
+
This app reads your `rclone` remotes, creates local mount folders, and starts or
|
|
17
|
+
stops `rclone mount` for you.
|
|
18
|
+
|
|
19
|
+
## Requirements
|
|
20
|
+
|
|
21
|
+
- Python 3.10 or newer.
|
|
22
|
+
- `rclone`, which connects to your cloud storage.
|
|
23
|
+
- A compatible filesystem driver: FUSE on Linux, WinFsp on Windows, or macFUSE
|
|
24
|
+
on macOS.
|
|
25
|
+
|
|
26
|
+
On Ubuntu, install the system tools with:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
sudo apt install rclone fuse3
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Install
|
|
33
|
+
|
|
34
|
+
For isolated CLI use:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
pipx install mountlet
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
For the desktop tray preview:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
pipx install "mountlet[tray]"
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
For a local checkout:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
python -m pip install .
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Install a GitHub Preview
|
|
53
|
+
|
|
54
|
+
GitHub previews are source snapshots from the `wip` branch, not signed native
|
|
55
|
+
installers. They may be unstable and can change without notice. Linux is the
|
|
56
|
+
primary supported platform. Source-installed Windows and macOS tray and mount
|
|
57
|
+
flows are available as experimental support while native packaging is developed.
|
|
58
|
+
|
|
59
|
+
Each section starts with the system prerequisites and installs Mountlet in an
|
|
60
|
+
isolated environment, so a GitHub preview does not replace a stable PyPI
|
|
61
|
+
installation.
|
|
62
|
+
|
|
63
|
+
Use only the subsection for your operating system. Linux and macOS use shell
|
|
64
|
+
commands; Windows uses PowerShell. Their syntax is not interchangeable.
|
|
65
|
+
|
|
66
|
+
### Linux
|
|
67
|
+
|
|
68
|
+
Install FUSE 3 through your distribution. On Ubuntu or Debian:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
sudo apt update
|
|
72
|
+
sudo apt install rclone fuse3 python3-venv
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Install and start the preview:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
PREVIEW="$HOME/.local/share/mountlet-preview"
|
|
79
|
+
python3 -m venv "$PREVIEW"
|
|
80
|
+
"$PREVIEW/bin/python" -m pip install --upgrade pip
|
|
81
|
+
"$PREVIEW/bin/python" -m pip install --upgrade --force-reinstall \
|
|
82
|
+
"mountlet[tray] @ https://github.com/eric-holt/mountlet/archive/refs/heads/wip.zip"
|
|
83
|
+
"$PREVIEW/bin/mountlet" tray
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Windows (Experimental)
|
|
87
|
+
|
|
88
|
+
Install Python 3.12 and rclone with WinGet:
|
|
89
|
+
|
|
90
|
+
```powershell
|
|
91
|
+
winget install --id Python.Python.3.12 --exact
|
|
92
|
+
winget install --id Rclone.Rclone --exact
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Install [`WinFsp`](https://winfsp.dev/rel/) using its Windows installer, then
|
|
96
|
+
close and reopen PowerShell so Python and rclone are available.
|
|
97
|
+
|
|
98
|
+
If you downloaded the portable `rclone.exe` instead, place it in a permanent
|
|
99
|
+
folder and tell Mountlet where it is. Replace the example path as needed:
|
|
100
|
+
|
|
101
|
+
```powershell
|
|
102
|
+
$env:RCLONE_PATH = "C:\Tools\rclone\rclone.exe"
|
|
103
|
+
[Environment]::SetEnvironmentVariable("RCLONE_PATH", $env:RCLONE_PATH, "User")
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Mountlet also checks `PATH` and common WinGet, Chocolatey, Scoop, and manual
|
|
107
|
+
installation folders. Confirm that rclone is available before continuing:
|
|
108
|
+
|
|
109
|
+
```powershell
|
|
110
|
+
& $env:RCLONE_PATH version
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
If you used WinGet and did not set `RCLONE_PATH`, use `rclone version` instead.
|
|
114
|
+
|
|
115
|
+
Install `pipx` and add its application directory to your user `PATH`:
|
|
116
|
+
|
|
117
|
+
```powershell
|
|
118
|
+
py -3.12 -m pip install --user --upgrade pipx
|
|
119
|
+
py -3.12 -m pipx ensurepath
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Close and reopen PowerShell so the updated `PATH` is loaded. Then install and
|
|
123
|
+
start Mountlet. `pipx` keeps the preview isolated while making the `mountlet`
|
|
124
|
+
command available to your user account:
|
|
125
|
+
|
|
126
|
+
```powershell
|
|
127
|
+
pipx install --force "mountlet[tray] @ https://github.com/eric-holt/mountlet/archive/refs/heads/wip.zip"
|
|
128
|
+
mountlet tray
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### macOS (Experimental)
|
|
132
|
+
|
|
133
|
+
Install Apple's Command Line Tools first. A system dialog opens; finish that
|
|
134
|
+
installation before continuing:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
xcode-select --install
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Install [Homebrew](https://brew.sh/) and activate it in the current shell. The
|
|
141
|
+
path check supports both Apple Silicon and Intel Macs:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
|
145
|
+
BREW=/opt/homebrew/bin/brew
|
|
146
|
+
[ -x "$BREW" ] || BREW=/usr/local/bin/brew
|
|
147
|
+
printf 'eval "$(%s shellenv)"\n' "$BREW" >> "$HOME/.zprofile"
|
|
148
|
+
eval "$("$BREW" shellenv)"
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Install Python, `pipx`, and macFUSE:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
brew install python@3.12 pipx
|
|
155
|
+
brew install --cask macfuse
|
|
156
|
+
pipx ensurepath
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Before macFUSE can mount anything, macOS may block its kernel extension. Follow
|
|
160
|
+
the prompts shown when you first try to mount a remote:
|
|
161
|
+
|
|
162
|
+
1. Choose **Open System Settings**, then open **Privacy & Security**.
|
|
163
|
+
2. If an **Allow** button appears for system software from developer Benjamin
|
|
164
|
+
Fleischer, select it, authenticate, and restart the Mac.
|
|
165
|
+
3. On an Apple Silicon Mac, macOS may first show **Enable System Extensions**.
|
|
166
|
+
Select it and shut down when prompted. Hold the power button to enter
|
|
167
|
+
Recovery, open **Startup Security Utility**, select the macOS volume, and
|
|
168
|
+
choose **Security Policy**.
|
|
169
|
+
4. Select **Reduced Security**, enable **Allow user management of kernel
|
|
170
|
+
extensions from identified developers**, and restart.
|
|
171
|
+
5. Try mounting again, return to **Privacy & Security**, select **Allow** for
|
|
172
|
+
macFUSE if requested, and restart once more.
|
|
173
|
+
|
|
174
|
+
These security changes are required by macFUSE's kernel backend, not by
|
|
175
|
+
Mountlet. See the official
|
|
176
|
+
[macFUSE setup guide](https://github.com/macfuse/macfuse/wiki/Getting-Started)
|
|
177
|
+
for screenshots and troubleshooting.
|
|
178
|
+
|
|
179
|
+
Install rclone using its official script. Do not use `brew install rclone` for
|
|
180
|
+
Mountlet: that macOS build does not include mount support.
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
sudo -v
|
|
184
|
+
curl https://rclone.org/install.sh | sudo bash
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Finally, install Mountlet with the Homebrew Python:
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
PYTHON="$(brew --prefix python@3.12)/bin/python3.12"
|
|
191
|
+
"$PYTHON" --version
|
|
192
|
+
pipx install --force --python "$PYTHON" \
|
|
193
|
+
"mountlet[tray] @ https://github.com/eric-holt/mountlet/archive/refs/heads/wip.zip"
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
The version check must report Python 3.10 or newer. Close and reopen the
|
|
197
|
+
terminal after `pipx ensurepath`, then start the preview:
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
mountlet tray
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Run the same install command again to update an existing preview. To test a
|
|
204
|
+
specific tagged pre-release instead, replace `refs/heads/wip.zip` with
|
|
205
|
+
`refs/tags/vX.Y.Z.zip`.
|
|
206
|
+
|
|
207
|
+
## Use
|
|
208
|
+
|
|
209
|
+
Open Mountlet:
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
mountlet
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
The app checks whether your computer is ready before it opens the menu. If
|
|
216
|
+
something is missing, it prints the next step instead of dropping you into an
|
|
217
|
+
empty screen.
|
|
218
|
+
|
|
219
|
+
For a guided setup check:
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
mountlet setup
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
If you have not added any cloud storage to `rclone` yet, let setup open
|
|
226
|
+
`rclone`'s connection flow:
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
mountlet setup --configure-rclone
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
Normal use is:
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
mountlet
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Quitting the menu leaves mounted remotes connected. Use `u` in the menu to
|
|
239
|
+
unmount everything.
|
|
240
|
+
|
|
241
|
+
## Desktop Tray Preview
|
|
242
|
+
|
|
243
|
+
The tray app is optional and uses PySide6. Start it with:
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
mountlet tray
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
If you installed the CLI without tray support, add PySide6 with:
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
pipx inject mountlet PySide6
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
The tray app uses the tray icon this way:
|
|
256
|
+
|
|
257
|
+
- Hover shows a short mounted/unmounted summary.
|
|
258
|
+
- Left-click opens or closes the Mountlet window. If it is behind another
|
|
259
|
+
window, the first click brings it forward. On Plasma X11, opening it from a
|
|
260
|
+
different desktop moves it to the current desktop.
|
|
261
|
+
- Right-click shows app-level actions such as mount all, unmount all, update
|
|
262
|
+
status, app settings, available configuration files, and quit.
|
|
263
|
+
|
|
264
|
+
On macOS, Mountlet runs as a menu-bar utility without a separate Dock icon.
|
|
265
|
+
Left-click opens or closes the Mountlet window, and right-click opens the app
|
|
266
|
+
menu, matching the other supported desktops.
|
|
267
|
+
|
|
268
|
+
The Mountlet window provides:
|
|
269
|
+
|
|
270
|
+
- Compact remote strips with storage usage and mount-state toggles.
|
|
271
|
+
- Click-to-open folders, provider website shortcuts, and per-remote settings.
|
|
272
|
+
- A guided `+` flow for adding supported cloud remotes through rclone.
|
|
273
|
+
- Sorting by registration time, name, provider, total size, used space, or
|
|
274
|
+
remaining space, with manual move controls for final adjustments.
|
|
275
|
+
- A pin control that keeps the window above other windows without tying it to
|
|
276
|
+
one desktop.
|
|
277
|
+
- A file-manager selector in App settings. Mountlet follows the Linux desktop
|
|
278
|
+
default, uses File Explorer by default on Windows, and Finder on macOS; other
|
|
279
|
+
detected managers can be selected without changing the operating-system
|
|
280
|
+
default.
|
|
281
|
+
|
|
282
|
+
If your desktop session does not expose a system tray, use the terminal menu
|
|
283
|
+
instead.
|
|
284
|
+
|
|
285
|
+
## Provider Support
|
|
286
|
+
|
|
287
|
+
Mountlet uses `rclone` under the hood, so provider support depends on both
|
|
288
|
+
Mountlet's setup UI and rclone's backend behavior.
|
|
289
|
+
|
|
290
|
+
Locally tested with the current GUI flow and/or active local remotes:
|
|
291
|
+
|
|
292
|
+
- Google Drive
|
|
293
|
+
- Dropbox
|
|
294
|
+
- Microsoft OneDrive
|
|
295
|
+
- Box
|
|
296
|
+
- pCloud
|
|
297
|
+
- Cloudflare R2 through the S3-compatible wizard
|
|
298
|
+
- Koofr through rclone's dedicated Koofr backend
|
|
299
|
+
|
|
300
|
+
Available but not yet locally tested:
|
|
301
|
+
|
|
302
|
+
- Amazon S3
|
|
303
|
+
- MinIO and other S3-compatible providers
|
|
304
|
+
- Wasabi
|
|
305
|
+
- WebDAV providers such as Nextcloud, ownCloud, SharePoint, and Fastmail Files
|
|
306
|
+
|
|
307
|
+
In the setup window, tested options are shown in white and untested options in
|
|
308
|
+
yellow. Untested providers may work through rclone, but expect rough edges until
|
|
309
|
+
the wizard path is tested with a real account.
|
|
310
|
+
|
|
311
|
+
## Extra Commands
|
|
312
|
+
|
|
313
|
+
These are useful for backup, troubleshooting, or moving to another computer:
|
|
314
|
+
|
|
315
|
+
```bash
|
|
316
|
+
mountlet path
|
|
317
|
+
mountlet verify
|
|
318
|
+
mountlet verify --auto-reconnect
|
|
319
|
+
mountlet reconnect --remote MyRemote
|
|
320
|
+
mountlet export ~/mountlet-backup
|
|
321
|
+
mountlet import --config ~/mountlet-backup/rclone.conf
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
## File Locations
|
|
325
|
+
|
|
326
|
+
Mountlet keeps application data in user-specific locations and leaves
|
|
327
|
+
`rclone` credentials in the standard `rclone` location.
|
|
328
|
+
|
|
329
|
+
On Linux:
|
|
330
|
+
|
|
331
|
+
- `~/.config/rclone/rclone.conf`: rclone remotes and credentials.
|
|
332
|
+
- `~/.config/mountlet/config.toml`: Mountlet preferences.
|
|
333
|
+
- `~/.config/mountlet/mounts.toml`: per-remote mount preferences.
|
|
334
|
+
- `~/.local/state/mountlet/`: runtime state.
|
|
335
|
+
- `~/.cache/mountlet/`: cache files.
|
|
336
|
+
- `~/cloud_mounts/`: default mount root.
|
|
337
|
+
|
|
338
|
+
Print the paths for your system:
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
mountlet path
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
Create the Mountlet user folders:
|
|
345
|
+
|
|
346
|
+
```bash
|
|
347
|
+
mountlet path --ensure
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
That command also creates starter `config.toml` and `mounts.toml` files if they
|
|
351
|
+
do not exist yet.
|
|
352
|
+
|
|
353
|
+
Override the mount root for a shell session:
|
|
354
|
+
|
|
355
|
+
```bash
|
|
356
|
+
export MOUNTLET_MOUNT_BASE=/path/to/mounts
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
### App Settings
|
|
360
|
+
|
|
361
|
+
In the tray app, use `Config` > `App settings` to edit app-wide behavior. Use
|
|
362
|
+
the gear button on a remote strip to edit only that mount. The settings
|
|
363
|
+
windows show the available fields with text boxes, checkboxes, and dropdowns,
|
|
364
|
+
then write `config.toml` and `mounts.toml` for you.
|
|
365
|
+
|
|
366
|
+
Technical users can still open the raw text files from the app-level config
|
|
367
|
+
menu.
|
|
368
|
+
|
|
369
|
+
Keep cloud account details in `rclone.conf`; Mountlet settings only control
|
|
370
|
+
local app and mount behavior.
|
|
371
|
+
|
|
372
|
+
## Credentials
|
|
373
|
+
|
|
374
|
+
`rclone.conf` can contain OAuth tokens and provider credentials. Treat exported
|
|
375
|
+
bundles as sensitive files.
|
|
376
|
+
|
|
377
|
+
- Do not share real `rclone.conf` files.
|
|
378
|
+
- Do not share `client_secret*.json` files.
|
|
379
|
+
- Store backups outside application install directories.
|
|
380
|
+
- Review exported bundles before copying them to another machine.
|
|
381
|
+
|
|
382
|
+
## Status
|
|
383
|
+
|
|
384
|
+
The current public target is Linux CLI and desktop tray use. The tray is still
|
|
385
|
+
early, but it is the main direction for the app.
|
|
386
|
+
|
|
387
|
+
See the [changelog](https://github.com/eric-holt/mountlet/blob/main/CHANGELOG.md)
|
|
388
|
+
for version history.
|
|
@@ -5,6 +5,27 @@ user-facing document used for package publication.
|
|
|
5
5
|
|
|
6
6
|
## Development
|
|
7
7
|
|
|
8
|
+
### Platform architecture
|
|
9
|
+
|
|
10
|
+
Operating-system behavior belongs in `src/mountlet/platform_services/`. Application
|
|
11
|
+
modules use the platform contract for:
|
|
12
|
+
|
|
13
|
+
- user config, state, cache, and mount paths;
|
|
14
|
+
- rclone discovery and filesystem-driver readiness;
|
|
15
|
+
- mount process creation, status checks, and unmounting;
|
|
16
|
+
- start-at-login registration and process-tree shutdown;
|
|
17
|
+
- desktop file opening, workspace movement, and keep-above capabilities.
|
|
18
|
+
|
|
19
|
+
`LinuxPlatformServices`, `WindowsPlatformServices`, and
|
|
20
|
+
`MacOSPlatformServices` provide the OS layer. `DesktopServices` supplies Qt
|
|
21
|
+
fallbacks and accepts optional desktop adapters. KDE/Dolphin/X11 behavior is an
|
|
22
|
+
enhancement on Linux; it must not be required for mounting or opening folders.
|
|
23
|
+
|
|
24
|
+
The adapters establish implementation boundaries and testable conventions.
|
|
25
|
+
Source-installed tray and mount flows have been exercised on Linux, Windows,
|
|
26
|
+
and macOS. Windows and macOS remain experimental until native packaging and
|
|
27
|
+
broader end-to-end testing are complete.
|
|
28
|
+
|
|
8
29
|
Install from a local checkout:
|
|
9
30
|
|
|
10
31
|
```bash
|
|
@@ -58,7 +79,7 @@ ignored by git and must not be part of the installed-user workflow.
|
|
|
58
79
|
|
|
59
80
|
## Provider Test Status
|
|
60
81
|
|
|
61
|
-
The 0.
|
|
82
|
+
The 0.3.0 release documents provider status based on local remotes in
|
|
62
83
|
`~/.config/rclone/rclone.conf` and recent GUI setup work.
|
|
63
84
|
|
|
64
85
|
Locally tested:
|
|
@@ -17,7 +17,7 @@ Create release branches only if a maintained older line needs fixes while
|
|
|
17
17
|
Run these from `wip` first:
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
|
-
VERSION=0.
|
|
20
|
+
VERSION=0.3.0
|
|
21
21
|
python -m unittest discover -s tests
|
|
22
22
|
python -m compileall -q src tests
|
|
23
23
|
python -m pip wheel . -w /tmp/mountlet-release --no-deps --no-build-isolation
|