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.
Files changed (51) hide show
  1. {mountlet-0.2.2 → mountlet-0.3.0}/CHANGELOG.md +23 -0
  2. {mountlet-0.2.2/src/mountlet.egg-info → mountlet-0.3.0}/PKG-INFO +172 -6
  3. mountlet-0.3.0/README.md +388 -0
  4. {mountlet-0.2.2 → mountlet-0.3.0}/docs/README.md +22 -1
  5. {mountlet-0.2.2 → mountlet-0.3.0}/docs/RELEASE.md +1 -1
  6. {mountlet-0.2.2 → mountlet-0.3.0}/pyproject.toml +4 -1
  7. {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/__init__.py +1 -1
  8. {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/config_tools/setup_wizard.py +53 -27
  9. {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/config_tools/shared.py +18 -50
  10. {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/core.py +20 -117
  11. mountlet-0.3.0/src/mountlet/platform_services/__init__.py +27 -0
  12. mountlet-0.3.0/src/mountlet/platform_services/base.py +152 -0
  13. mountlet-0.3.0/src/mountlet/platform_services/console.py +35 -0
  14. mountlet-0.3.0/src/mountlet/platform_services/desktop.py +62 -0
  15. mountlet-0.3.0/src/mountlet/platform_services/file_managers.py +268 -0
  16. mountlet-0.3.0/src/mountlet/platform_services/linux.py +88 -0
  17. mountlet-0.3.0/src/mountlet/platform_services/macos.py +64 -0
  18. mountlet-0.3.0/src/mountlet/platform_services/processes.py +52 -0
  19. mountlet-0.3.0/src/mountlet/platform_services/windows.py +158 -0
  20. {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/rclone_wizard.py +6 -18
  21. {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/settings.py +20 -28
  22. {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/tray.py +286 -67
  23. {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/tui.py +12 -46
  24. {mountlet-0.2.2 → mountlet-0.3.0/src/mountlet.egg-info}/PKG-INFO +172 -6
  25. {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet.egg-info/SOURCES.txt +10 -0
  26. {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet.egg-info/requires.txt +3 -0
  27. {mountlet-0.2.2 → mountlet-0.3.0}/tests/test_cli.py +1 -1
  28. {mountlet-0.2.2 → mountlet-0.3.0}/tests/test_core.py +2 -2
  29. mountlet-0.3.0/tests/test_platform_services.py +275 -0
  30. {mountlet-0.2.2 → mountlet-0.3.0}/tests/test_settings.py +4 -0
  31. {mountlet-0.2.2 → mountlet-0.3.0}/tests/test_setup_wizard.py +33 -2
  32. {mountlet-0.2.2 → mountlet-0.3.0}/tests/test_tray.py +162 -0
  33. mountlet-0.2.2/README.md +0 -225
  34. {mountlet-0.2.2 → mountlet-0.3.0}/LICENSE +0 -0
  35. {mountlet-0.2.2 → mountlet-0.3.0}/MANIFEST.in +0 -0
  36. {mountlet-0.2.2 → mountlet-0.3.0}/SECURITY.md +0 -0
  37. {mountlet-0.2.2 → mountlet-0.3.0}/examples/rclone.conf.sample +0 -0
  38. {mountlet-0.2.2 → mountlet-0.3.0}/setup.cfg +0 -0
  39. {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/assets/icon.png +0 -0
  40. {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/cli.py +0 -0
  41. {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/config_tools/export_config.py +0 -0
  42. {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/config_tools/import_config.py +0 -0
  43. {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/config_tools/path_config.py +0 -0
  44. {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/config_tools/reconnect_config.py +0 -0
  45. {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet/config_tools/verify_config.py +0 -0
  46. {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet.egg-info/dependency_links.txt +0 -0
  47. {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet.egg-info/entry_points.txt +0 -0
  48. {mountlet-0.2.2 → mountlet-0.3.0}/src/mountlet.egg-info/top_level.txt +0 -0
  49. {mountlet-0.2.2 → mountlet-0.3.0}/tests/test_config_tools.py +0 -0
  50. {mountlet-0.2.2 → mountlet-0.3.0}/tests/test_rclone_wizard.py +0 -0
  51. {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.2.2
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
- - FUSE lets Linux show a cloud remote as if it were a normal folder on your
45
- computer.
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, which lets Linux show mounted cloud storage as folders.
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, raw app, mount, rclone, and FUSE config files, and
138
- quit.
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.
@@ -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.2.2 release documents provider status based on local remotes in
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.2.2
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