mountlet 0.2.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.0/CHANGELOG.md +30 -0
- mountlet-0.2.0/LICENSE +21 -0
- mountlet-0.2.0/MANIFEST.in +4 -0
- mountlet-0.2.0/PKG-INFO +231 -0
- mountlet-0.2.0/README.md +200 -0
- mountlet-0.2.0/SECURITY.md +26 -0
- mountlet-0.2.0/docs/README.md +91 -0
- mountlet-0.2.0/docs/RELEASE.md +83 -0
- mountlet-0.2.0/examples/rclone.conf.sample +7 -0
- mountlet-0.2.0/pyproject.toml +52 -0
- mountlet-0.2.0/setup.cfg +4 -0
- mountlet-0.2.0/src/mountlet/__init__.py +5 -0
- mountlet-0.2.0/src/mountlet/cli.py +116 -0
- mountlet-0.2.0/src/mountlet/config_tools/export_config.py +98 -0
- mountlet-0.2.0/src/mountlet/config_tools/import_config.py +164 -0
- mountlet-0.2.0/src/mountlet/config_tools/path_config.py +69 -0
- mountlet-0.2.0/src/mountlet/config_tools/reconnect_config.py +66 -0
- mountlet-0.2.0/src/mountlet/config_tools/setup_wizard.py +225 -0
- mountlet-0.2.0/src/mountlet/config_tools/shared.py +289 -0
- mountlet-0.2.0/src/mountlet/config_tools/verify_config.py +91 -0
- mountlet-0.2.0/src/mountlet/core.py +532 -0
- mountlet-0.2.0/src/mountlet/settings.py +237 -0
- mountlet-0.2.0/src/mountlet/tray.py +732 -0
- mountlet-0.2.0/src/mountlet/tui.py +200 -0
- mountlet-0.2.0/src/mountlet.egg-info/PKG-INFO +231 -0
- mountlet-0.2.0/src/mountlet.egg-info/SOURCES.txt +35 -0
- mountlet-0.2.0/src/mountlet.egg-info/dependency_links.txt +1 -0
- mountlet-0.2.0/src/mountlet.egg-info/entry_points.txt +2 -0
- mountlet-0.2.0/src/mountlet.egg-info/requires.txt +9 -0
- mountlet-0.2.0/src/mountlet.egg-info/top_level.txt +1 -0
- mountlet-0.2.0/tests/test_cli.py +82 -0
- mountlet-0.2.0/tests/test_config_tools.py +95 -0
- mountlet-0.2.0/tests/test_core.py +163 -0
- mountlet-0.2.0/tests/test_settings.py +103 -0
- mountlet-0.2.0/tests/test_setup_wizard.py +125 -0
- mountlet-0.2.0/tests/test_tray.py +579 -0
- mountlet-0.2.0/tests/test_tui.py +39 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## Unreleased
|
|
4
|
+
|
|
5
|
+
- Renamed the project, import package, installed command, and user config directory to Mountlet.
|
|
6
|
+
- Added an optional PySide6 desktop tray preview with mount, unmount, restart-mount, and open-folder actions.
|
|
7
|
+
- Split tray interactions between hover status, left-click remote actions, and right-click app actions.
|
|
8
|
+
- Added app-level and per-remote Mountlet config files.
|
|
9
|
+
- Open-folder actions can use current-desktop Dolphin windows on X11 when available, with fallback open strategies elsewhere.
|
|
10
|
+
|
|
11
|
+
## 0.1.1 - 2026-05-31
|
|
12
|
+
|
|
13
|
+
- Improved setup guidance when `rclone` is not installed yet.
|
|
14
|
+
- Honored `RCLONE_CONFIG` consistently in setup and config helper commands.
|
|
15
|
+
|
|
16
|
+
## 0.1.0 - 2026-05-31
|
|
17
|
+
|
|
18
|
+
Initial public CLI release.
|
|
19
|
+
|
|
20
|
+
- Single public command: `mountlet`.
|
|
21
|
+
- Fast readiness check before opening the menu.
|
|
22
|
+
- Guided setup flow with `mountlet setup`.
|
|
23
|
+
- Optional rclone connection flow with `mountlet setup --configure-rclone`.
|
|
24
|
+
- Interactive menu for mounting, unmounting, refreshing, and verifying remotes.
|
|
25
|
+
- Subcommands for setup, path inspection, verification, reconnect, import, and export.
|
|
26
|
+
- User-specific app directories for config, state, and cache.
|
|
27
|
+
- Import/export helpers for rclone configuration bundles.
|
|
28
|
+
- `--version` / `-V` version output.
|
|
29
|
+
- CI workflow for tests and package build.
|
|
30
|
+
- Exported bundles are documented as sensitive credential backups.
|
mountlet-0.2.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Eric Holt
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
mountlet-0.2.0/PKG-INFO
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: mountlet
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: CLI and tray tools for mounting rclone remotes
|
|
5
|
+
Author: Eric Holt
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/eric-holt/mountlet
|
|
8
|
+
Project-URL: Issues, https://github.com/eric-holt/mountlet/issues
|
|
9
|
+
Keywords: rclone,mount,cloud-storage,tui,fuse
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: Environment :: Console
|
|
12
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
13
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Topic :: System :: Filesystems
|
|
19
|
+
Classifier: Topic :: Utilities
|
|
20
|
+
Requires-Python: >=3.10
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Provides-Extra: tray
|
|
24
|
+
Requires-Dist: PySide6>=6.7; extra == "tray"
|
|
25
|
+
Provides-Extra: dev
|
|
26
|
+
Requires-Dist: build>=1.2; extra == "dev"
|
|
27
|
+
Requires-Dist: pytest>=8; extra == "dev"
|
|
28
|
+
Requires-Dist: ruff>=0.4; extra == "dev"
|
|
29
|
+
Requires-Dist: twine>=6; extra == "dev"
|
|
30
|
+
Dynamic: license-file
|
|
31
|
+
|
|
32
|
+
# Mountlet
|
|
33
|
+
|
|
34
|
+
Mountlet is a terminal app for mounting and unmounting `rclone`
|
|
35
|
+
remotes from a simple menu. It uses your existing `rclone` configuration and
|
|
36
|
+
does not store cloud credentials inside the application install directory.
|
|
37
|
+
|
|
38
|
+
## How It Works
|
|
39
|
+
|
|
40
|
+
Mountlet is a friendly control panel for two standard tools:
|
|
41
|
+
|
|
42
|
+
- `rclone` connects to cloud storage providers such as Google Drive, Dropbox,
|
|
43
|
+
S3-compatible storage, and WebDAV.
|
|
44
|
+
- FUSE lets Linux show a cloud remote as if it were a normal folder on your
|
|
45
|
+
computer.
|
|
46
|
+
|
|
47
|
+
This app reads your `rclone` remotes, creates local mount folders, and starts or
|
|
48
|
+
stops `rclone mount` for you.
|
|
49
|
+
|
|
50
|
+
## Requirements
|
|
51
|
+
|
|
52
|
+
- Python 3.10 or newer.
|
|
53
|
+
- `rclone`, which connects to your cloud storage.
|
|
54
|
+
- FUSE, which lets Linux show mounted cloud storage as folders.
|
|
55
|
+
|
|
56
|
+
On Ubuntu, install the system tools with:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
sudo apt install rclone fuse3
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Install
|
|
63
|
+
|
|
64
|
+
For isolated CLI use:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
pipx install mountlet
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
For the desktop tray preview:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
pipx install "mountlet[tray]"
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
For a local checkout:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
python -m pip install .
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Use
|
|
83
|
+
|
|
84
|
+
Open Mountlet:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
mountlet
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
The app checks whether your computer is ready before it opens the menu. If
|
|
91
|
+
something is missing, it prints the next step instead of dropping you into an
|
|
92
|
+
empty screen.
|
|
93
|
+
|
|
94
|
+
For a guided setup check:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
mountlet setup
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
If you have not added any cloud storage to `rclone` yet, let setup open
|
|
101
|
+
`rclone`'s connection flow:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
mountlet setup --configure-rclone
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Normal use is:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
mountlet
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Quitting the menu leaves mounted remotes connected. Use `u` in the menu to
|
|
114
|
+
unmount everything.
|
|
115
|
+
|
|
116
|
+
## Desktop Tray Preview
|
|
117
|
+
|
|
118
|
+
The tray app is optional and uses PySide6. Start it with:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
mountlet tray
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
If you installed the CLI without tray support, add PySide6 with:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
pipx inject mountlet PySide6
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
The tray app uses the tray icon this way:
|
|
131
|
+
|
|
132
|
+
- Hover shows a short mounted/unmounted summary.
|
|
133
|
+
- Left-click shows each remote with mount, unmount, restart-mount, and open-folder actions.
|
|
134
|
+
- Right-click shows app-level actions such as mount all, unmount all, update status, and quit.
|
|
135
|
+
|
|
136
|
+
If your desktop session does not expose a system tray, use the terminal menu
|
|
137
|
+
instead.
|
|
138
|
+
|
|
139
|
+
## Extra Commands
|
|
140
|
+
|
|
141
|
+
These are useful for backup, troubleshooting, or moving to another computer:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
mountlet path
|
|
145
|
+
mountlet verify
|
|
146
|
+
mountlet verify --auto-reconnect
|
|
147
|
+
mountlet reconnect --remote MyRemote
|
|
148
|
+
mountlet export ~/mountlet-backup
|
|
149
|
+
mountlet import --config ~/mountlet-backup/rclone.conf
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## File Locations
|
|
153
|
+
|
|
154
|
+
Mountlet keeps application data in user-specific locations and leaves
|
|
155
|
+
`rclone` credentials in the standard `rclone` location.
|
|
156
|
+
|
|
157
|
+
On Linux:
|
|
158
|
+
|
|
159
|
+
- `~/.config/rclone/rclone.conf`: rclone remotes and credentials.
|
|
160
|
+
- `~/.config/mountlet/config.toml`: Mountlet preferences.
|
|
161
|
+
- `~/.config/mountlet/mounts.toml`: per-remote mount preferences.
|
|
162
|
+
- `~/.local/state/mountlet/`: runtime state.
|
|
163
|
+
- `~/.cache/mountlet/`: cache files.
|
|
164
|
+
- `~/cloud_mounts/`: default mount root.
|
|
165
|
+
|
|
166
|
+
Print the paths for your system:
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
mountlet path
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Create the Mountlet user folders:
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
mountlet path --ensure
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
That command also creates starter `config.toml` and `mounts.toml` files if they
|
|
179
|
+
do not exist yet.
|
|
180
|
+
|
|
181
|
+
Override the mount root for a shell session:
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
export MOUNTLET_MOUNT_BASE=/path/to/mounts
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### App Settings
|
|
188
|
+
|
|
189
|
+
Use `config.toml` for app-wide behavior:
|
|
190
|
+
|
|
191
|
+
```toml
|
|
192
|
+
[app]
|
|
193
|
+
mount_base = ""
|
|
194
|
+
auto_mount = false
|
|
195
|
+
auto_mount_delay = 2.0
|
|
196
|
+
|
|
197
|
+
[tray]
|
|
198
|
+
open_folder_behavior = "current_desktop"
|
|
199
|
+
focus_file_manager = true
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Use `mounts.toml` for per-remote behavior. Remote names must match the names in
|
|
203
|
+
`rclone`.
|
|
204
|
+
|
|
205
|
+
```toml
|
|
206
|
+
[remotes."Work__Drive"]
|
|
207
|
+
auto_mount = true
|
|
208
|
+
mount_path = "~/cloud_mounts/drive/Work"
|
|
209
|
+
mount_flags = "--read-only --dir-cache-time 10m"
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Keep cloud account details in `rclone.conf`; use these files only for Mountlet
|
|
213
|
+
behavior.
|
|
214
|
+
|
|
215
|
+
## Credentials
|
|
216
|
+
|
|
217
|
+
`rclone.conf` can contain OAuth tokens and provider credentials. Treat exported
|
|
218
|
+
bundles as sensitive files.
|
|
219
|
+
|
|
220
|
+
- Do not share real `rclone.conf` files.
|
|
221
|
+
- Do not share `client_secret*.json` files.
|
|
222
|
+
- Store backups outside application install directories.
|
|
223
|
+
- Review exported bundles before copying them to another machine.
|
|
224
|
+
|
|
225
|
+
## Status
|
|
226
|
+
|
|
227
|
+
The current public target is Linux CLI use. The desktop tray is an early preview
|
|
228
|
+
for the next product layer.
|
|
229
|
+
|
|
230
|
+
See the [changelog](https://github.com/eric-holt/mountlet/blob/main/CHANGELOG.md)
|
|
231
|
+
for version history.
|
mountlet-0.2.0/README.md
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# Mountlet
|
|
2
|
+
|
|
3
|
+
Mountlet is a terminal app for mounting and unmounting `rclone`
|
|
4
|
+
remotes from a simple menu. It uses your existing `rclone` configuration and
|
|
5
|
+
does not 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
|
+
- FUSE lets Linux show a cloud remote as if it were a normal folder on your
|
|
14
|
+
computer.
|
|
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
|
+
- FUSE, which lets Linux show mounted cloud storage as folders.
|
|
24
|
+
|
|
25
|
+
On Ubuntu, install the system tools with:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
sudo apt install rclone fuse3
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Install
|
|
32
|
+
|
|
33
|
+
For isolated CLI use:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
pipx install mountlet
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
For the desktop tray preview:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
pipx install "mountlet[tray]"
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
For a local checkout:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
python -m pip install .
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Use
|
|
52
|
+
|
|
53
|
+
Open Mountlet:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
mountlet
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
The app checks whether your computer is ready before it opens the menu. If
|
|
60
|
+
something is missing, it prints the next step instead of dropping you into an
|
|
61
|
+
empty screen.
|
|
62
|
+
|
|
63
|
+
For a guided setup check:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
mountlet setup
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
If you have not added any cloud storage to `rclone` yet, let setup open
|
|
70
|
+
`rclone`'s connection flow:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
mountlet setup --configure-rclone
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Normal use is:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
mountlet
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Quitting the menu leaves mounted remotes connected. Use `u` in the menu to
|
|
83
|
+
unmount everything.
|
|
84
|
+
|
|
85
|
+
## Desktop Tray Preview
|
|
86
|
+
|
|
87
|
+
The tray app is optional and uses PySide6. Start it with:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
mountlet tray
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
If you installed the CLI without tray support, add PySide6 with:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
pipx inject mountlet PySide6
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
The tray app uses the tray icon this way:
|
|
100
|
+
|
|
101
|
+
- Hover shows a short mounted/unmounted summary.
|
|
102
|
+
- Left-click shows each remote with mount, unmount, restart-mount, and open-folder actions.
|
|
103
|
+
- Right-click shows app-level actions such as mount all, unmount all, update status, and quit.
|
|
104
|
+
|
|
105
|
+
If your desktop session does not expose a system tray, use the terminal menu
|
|
106
|
+
instead.
|
|
107
|
+
|
|
108
|
+
## Extra Commands
|
|
109
|
+
|
|
110
|
+
These are useful for backup, troubleshooting, or moving to another computer:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
mountlet path
|
|
114
|
+
mountlet verify
|
|
115
|
+
mountlet verify --auto-reconnect
|
|
116
|
+
mountlet reconnect --remote MyRemote
|
|
117
|
+
mountlet export ~/mountlet-backup
|
|
118
|
+
mountlet import --config ~/mountlet-backup/rclone.conf
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## File Locations
|
|
122
|
+
|
|
123
|
+
Mountlet keeps application data in user-specific locations and leaves
|
|
124
|
+
`rclone` credentials in the standard `rclone` location.
|
|
125
|
+
|
|
126
|
+
On Linux:
|
|
127
|
+
|
|
128
|
+
- `~/.config/rclone/rclone.conf`: rclone remotes and credentials.
|
|
129
|
+
- `~/.config/mountlet/config.toml`: Mountlet preferences.
|
|
130
|
+
- `~/.config/mountlet/mounts.toml`: per-remote mount preferences.
|
|
131
|
+
- `~/.local/state/mountlet/`: runtime state.
|
|
132
|
+
- `~/.cache/mountlet/`: cache files.
|
|
133
|
+
- `~/cloud_mounts/`: default mount root.
|
|
134
|
+
|
|
135
|
+
Print the paths for your system:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
mountlet path
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Create the Mountlet user folders:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
mountlet path --ensure
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
That command also creates starter `config.toml` and `mounts.toml` files if they
|
|
148
|
+
do not exist yet.
|
|
149
|
+
|
|
150
|
+
Override the mount root for a shell session:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
export MOUNTLET_MOUNT_BASE=/path/to/mounts
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### App Settings
|
|
157
|
+
|
|
158
|
+
Use `config.toml` for app-wide behavior:
|
|
159
|
+
|
|
160
|
+
```toml
|
|
161
|
+
[app]
|
|
162
|
+
mount_base = ""
|
|
163
|
+
auto_mount = false
|
|
164
|
+
auto_mount_delay = 2.0
|
|
165
|
+
|
|
166
|
+
[tray]
|
|
167
|
+
open_folder_behavior = "current_desktop"
|
|
168
|
+
focus_file_manager = true
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Use `mounts.toml` for per-remote behavior. Remote names must match the names in
|
|
172
|
+
`rclone`.
|
|
173
|
+
|
|
174
|
+
```toml
|
|
175
|
+
[remotes."Work__Drive"]
|
|
176
|
+
auto_mount = true
|
|
177
|
+
mount_path = "~/cloud_mounts/drive/Work"
|
|
178
|
+
mount_flags = "--read-only --dir-cache-time 10m"
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Keep cloud account details in `rclone.conf`; use these files only for Mountlet
|
|
182
|
+
behavior.
|
|
183
|
+
|
|
184
|
+
## Credentials
|
|
185
|
+
|
|
186
|
+
`rclone.conf` can contain OAuth tokens and provider credentials. Treat exported
|
|
187
|
+
bundles as sensitive files.
|
|
188
|
+
|
|
189
|
+
- Do not share real `rclone.conf` files.
|
|
190
|
+
- Do not share `client_secret*.json` files.
|
|
191
|
+
- Store backups outside application install directories.
|
|
192
|
+
- Review exported bundles before copying them to another machine.
|
|
193
|
+
|
|
194
|
+
## Status
|
|
195
|
+
|
|
196
|
+
The current public target is Linux CLI use. The desktop tray is an early preview
|
|
197
|
+
for the next product layer.
|
|
198
|
+
|
|
199
|
+
See the [changelog](https://github.com/eric-holt/mountlet/blob/main/CHANGELOG.md)
|
|
200
|
+
for version history.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Security
|
|
2
|
+
|
|
3
|
+
Mountlet works with `rclone` configuration files. Those files may
|
|
4
|
+
contain OAuth tokens, refresh tokens, client secrets, provider credentials, and
|
|
5
|
+
remote paths that identify private infrastructure.
|
|
6
|
+
|
|
7
|
+
## Reporting Issues
|
|
8
|
+
|
|
9
|
+
This repository does not have a public security contact configured yet. Before
|
|
10
|
+
public release, enable GitHub private vulnerability reporting or add a dedicated
|
|
11
|
+
security contact.
|
|
12
|
+
|
|
13
|
+
## Handling Local Secrets
|
|
14
|
+
|
|
15
|
+
- Keep real `rclone.conf` files out of version control.
|
|
16
|
+
- Keep `client_secret*.json` files out of version control.
|
|
17
|
+
- Treat exported bundles as credentials.
|
|
18
|
+
- Prefer private backup locations outside this repository and outside package
|
|
19
|
+
install directories.
|
|
20
|
+
- Keep installed-user configuration in user config directories such as
|
|
21
|
+
`~/.config/rclone/` and `~/.config/mountlet/`.
|
|
22
|
+
- Rotate provider credentials if a real config bundle is shared accidentally.
|
|
23
|
+
|
|
24
|
+
## Supported Versions
|
|
25
|
+
|
|
26
|
+
No public stable version is supported yet.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Development Notes
|
|
2
|
+
|
|
3
|
+
This directory contains maintainer-facing notes. The root `README.md` is the
|
|
4
|
+
user-facing document used for package publication.
|
|
5
|
+
|
|
6
|
+
## Development
|
|
7
|
+
|
|
8
|
+
Install from a local checkout:
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
python -m pip install -e .
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Run the stdlib test suite:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
python -m unittest discover -s tests
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Run a syntax check:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
python -m compileall -q src tests
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Optional development tools are declared in the `dev` extra:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
python -m pip install -e ".[dev]"
|
|
30
|
+
python -m pytest
|
|
31
|
+
python -m build
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Install the optional tray dependencies when working on the desktop preview:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
python -m pip install -e ".[dev,tray]"
|
|
38
|
+
mountlet tray
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
The repository-level `secrets/` directory is for local development only. It is
|
|
42
|
+
ignored by git and must not be part of the installed-user workflow.
|
|
43
|
+
|
|
44
|
+
## Release Checklist
|
|
45
|
+
|
|
46
|
+
- Confirm support contact.
|
|
47
|
+
- Add screenshots or terminal recordings for the package page.
|
|
48
|
+
- Publish PyPI/pipx CLI installation instructions.
|
|
49
|
+
- Publish `.deb` installation instructions for the later desktop package.
|
|
50
|
+
- Run CI on every pull request.
|
|
51
|
+
- Build a wheel and install it in a clean virtual environment.
|
|
52
|
+
- Test on a fresh Ubuntu installation with `rclone` and `fuse3`.
|
|
53
|
+
- Verify import/export flows with non-sensitive sample configs.
|
|
54
|
+
- Confirm the built wheel and source distribution do not include local secrets.
|
|
55
|
+
- Follow [RELEASE.md](RELEASE.md) when merging `wip` to `main`, tagging, and publishing.
|
|
56
|
+
|
|
57
|
+
## Release Strategy
|
|
58
|
+
|
|
59
|
+
- Keep the CLI/TUI core MIT licensed.
|
|
60
|
+
- Publish CLI builds to PyPI for lightweight `pipx` installation.
|
|
61
|
+
- Publish the first user-facing desktop package as a native Ubuntu `.deb` from
|
|
62
|
+
GitHub Releases.
|
|
63
|
+
- Build the desktop tray app as the first commercial product layer.
|
|
64
|
+
- Keep Snap and AppImage as later distribution options after the mount and tray
|
|
65
|
+
flows are proven in the `.deb`.
|
|
66
|
+
|
|
67
|
+
## Monetization Direction
|
|
68
|
+
|
|
69
|
+
The free package should remain useful as a local CLI/TUI. Paid value should be
|
|
70
|
+
centered on reliability, convenience, support, and managed configuration.
|
|
71
|
+
|
|
72
|
+
The first paid product direction is a desktop tray app.
|
|
73
|
+
|
|
74
|
+
Initial desktop tray scope:
|
|
75
|
+
|
|
76
|
+
- Basic mount, unmount, restart-mount, and open-folder actions.
|
|
77
|
+
- Auto-mount at login.
|
|
78
|
+
- Remote health checks and notifications.
|
|
79
|
+
- One-click credential reconnect flows.
|
|
80
|
+
- Per-remote mount policies.
|
|
81
|
+
- Commercial support.
|
|
82
|
+
|
|
83
|
+
Later paid candidates:
|
|
84
|
+
|
|
85
|
+
- Encrypted local config vault.
|
|
86
|
+
- Team configuration templates.
|
|
87
|
+
|
|
88
|
+
Open questions:
|
|
89
|
+
|
|
90
|
+
- What support channel should paid users receive?
|
|
91
|
+
- What platforms are included in the first paid release?
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Release Process
|
|
2
|
+
|
|
3
|
+
This project uses `wip` for active work and `main` for release-ready code.
|
|
4
|
+
Released versions are marked with git tags, not long-lived version branches.
|
|
5
|
+
|
|
6
|
+
## Branches
|
|
7
|
+
|
|
8
|
+
- `wip`: active development and automatic pushes.
|
|
9
|
+
- `main`: stable branch used for public releases.
|
|
10
|
+
- `vX.Y.Z` tags: immutable release points.
|
|
11
|
+
|
|
12
|
+
Create release branches only if a maintained older line needs fixes while
|
|
13
|
+
`main` has moved ahead. That is not expected for `0.1.x`.
|
|
14
|
+
|
|
15
|
+
## Release Checklist
|
|
16
|
+
|
|
17
|
+
Run these from `wip` first:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
VERSION=0.2.0
|
|
21
|
+
python -m unittest discover -s tests
|
|
22
|
+
python -m compileall -q src tests
|
|
23
|
+
python -m pip wheel . -w /tmp/mountlet-release --no-deps --no-build-isolation
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Confirm:
|
|
27
|
+
|
|
28
|
+
- `README.md` describes the user flow.
|
|
29
|
+
- `CHANGELOG.md` has a section for the version being released.
|
|
30
|
+
- `pyproject.toml` and `src/mountlet/__init__.py` have the same version.
|
|
31
|
+
- `SECURITY.md` has an active security reporting path or GitHub private vulnerability reporting is enabled.
|
|
32
|
+
- Built distributions do not include `secrets/`, `rclone.conf`, or `client_secret*.json`.
|
|
33
|
+
- The package exposes only the `mountlet` console command.
|
|
34
|
+
|
|
35
|
+
## Merge To Main
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
git checkout main
|
|
39
|
+
git pull origin main
|
|
40
|
+
git merge --squash wip
|
|
41
|
+
git commit -m "Release v$VERSION"
|
|
42
|
+
python -m unittest discover -s tests
|
|
43
|
+
python -m compileall -q src tests
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Build from `main`:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
python -m build
|
|
50
|
+
python -m twine check dist/*
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Tag
|
|
54
|
+
|
|
55
|
+
After the final release commit is on `main`:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
git tag -a "v$VERSION" -m "Release v$VERSION"
|
|
59
|
+
git push origin main --tags
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Publish
|
|
63
|
+
|
|
64
|
+
Publish from the tagged `main` commit, not from `wip`.
|
|
65
|
+
|
|
66
|
+
Publishing is handled by GitHub Actions through PyPI trusted publishing.
|
|
67
|
+
The PyPI publisher must match:
|
|
68
|
+
|
|
69
|
+
- Repository: `eric-holt/mountlet`
|
|
70
|
+
- Workflow: `python-publish.yml`
|
|
71
|
+
- Environment: `pypi`
|
|
72
|
+
|
|
73
|
+
Pushing a release tag starts the publish workflow:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
git push origin main --tags
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Manual PyPI uploads are only a fallback:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
python -m twine upload dist/*
|
|
83
|
+
```
|