Maestral is an open-source Dropbox client written in Python.

Overview

PyPi Release Pyversions Documentation Status codecov

Maestral

A light-weight and open-source Dropbox client for macOS and Linux.

About

Maestral is an open-source Dropbox client written in Python. The project's main goal is to provide a client for platforms and file systems that are no longer directly supported by Dropbox.

Maestral currently does not support Dropbox Paper, the management of Dropbox teams, and the management of shared folder settings. If you need any of this functionality, please use the Dropbox website or the official client. Maestral does support syncing multiple Dropbox accounts and excluding local files from sync with a ".mignore" file.

The focus on "simple" file syncing does come with advantages: on macOS, the Maestral App bundle is significantly smaller than the official Dropbox app and uses less memory. The exact memory usage will depend on the size of your synced Dropbox folder and can be further reduced when running Maestral without a GUI.

Maestral uses the public Dropbox API which, unlike the official client, does not support transferring only those parts of a file which changed ("binary diff"). Maestral may therefore use more bandwidth that the official client. However, it will avoid uploading or downloading a file if it already exists with the same content locally or in the cloud.

Warning

  • Never sync a local folder with both the official Dropbox client and Maestral at the same time.
  • Network drives and some external hard drives are not supported as locations for the Dropbox folder.

Installation

An app bundle is provided for macOS High Sierra and higher and can be downloaded from the Releases tab. This app Bundle is also package as a Homebrew cask.

On other platforms, you can download and install Maestral as a Python package from PyPI or as a Docker image from Docker Hub.

For more detailed information on the installation, setup and system requirements, please check the documentation.

Homebrew

The official Maestral releases are also available as Homebrew casks. If you have Homebrew on your system, you can install using:

$ brew install maestral

Python package using PyPI

Please download and install the Python package from PyPI:

$ python3 -m pip install --upgrade maestral

If you intend to use the graphical user interface, you also need to specify the GUI option during installation or upgrade. This will install the maestral-qt frontend and PyQt5 on Linux and maestral-cocoa on macOS:

$ python3 -m pip install --upgrade maestral[gui]

Docker image

A Docker image is available for x86, arm/v7 (32bit) and arm64 platforms and can be installed with:

$ docker pull maestraldbx/maestral

Usage

Run maestral gui in the command line (or open the Maestral app on macOS) to start Maestral with a graphical user interface. On its first run, Maestral will guide you through linking and configuring your Dropbox and will then start syncing.

screenshot macOS

screenshot Fedora

Command line usage

After installation, Maestral will be available as a command line script by typing maestral in the command prompt. Type maestral --help to get a full list of available commands. The most important are:

  • maestral gui: Starts the Maestral GUI. Creates a sync daemon if not already running.
  • maestral start|stop: Starts or stops the Maestral sync daemon.
  • maestral pause|resume: Pauses or resumes syncing.
  • maestral autostart -Y|-N: Sets the daemon to start on log in.
  • maestral status: Gets the current status of Maestral.
  • maestral filestatus LOCAL_PATH: Gets the sync status of an individual file or folder.
  • maestral excluded add|remove|list: Command group to manage excluded folders.
  • maestral ls DROPBOX_PATH: Lists the contents of a directory on Dropbox.
  • maestral notify snooze N: Snoozes desktop notifications for N minutes.

Maestral supports syncing multiple Dropbox accounts by running multiple instances with different configuration files. This needs to be configured from the command line by passing the option --config-name to maestral start or maestral gui. Maestral will then select an existing config with the given name or create a new one. For example:

$ maestral start --config-name="personal"
$ maestral start --config-name="work"

This will start two instances of Maestral, syncing a private and a work account, respectively. Configs will be automatically cleared when unlinking an account. You can list all currently linked accounts with maestral config-files. The above setup for example will return the following on macOS:

$ maestral config-files

Config name  Account          Path
maestral     [email protected]   ~/Library/Application Support/maestral/maestral.ini
private      [email protected]  ~/Library/Application Support/maestral/private.ini

By default, the Dropbox folder names will contain the capitalised config-name in braces. In the above case, this will be "Dropbox (Personal)" and "Dropbox (Work)".

A full documentation of the CLI is available on the website.

Contribute

There are multiple topics that could use your help. Some of them are easy, such as adding new CLI commands, others require more experience, such as packaging for non-macOS platforms. Look out for issues marked with "good first issue" or "help wanted". Pull requests should be made against the develop branch.

Relevant resources are:

CONTRIBUTING.md contains detailed information on the expected code style and test format.

If you are using the macOS app bundle, please consider sponsoring the project with £1 per month to offset the cost of an Apple Developer account to sign and notarize the bundle.

System requirements

Comments
  • `v1_retired` API error

    `v1_retired` API error

    Describe the bug An alert dialogue from Maestral and a system toast notification both appeared with the same {"error": "v1_retired"} message, then Maestral's status icon showed as paused (⏸).

    To Reproduce No specific actions, Maestral was running in the background. I had not made any recent changes within the synced root dir.

    Expected behaviour Use the current API, I guess.

    System:

    • Maestral version: 1.6.2
    • Python version: 3.9.7
    • OS: Kubuntu
    • Desktop environment: KDE
    • PyQt version (for Linux GUI): 5.15.4

    Additional context Log:

    2022-05-24 11:17:53 manager ERROR: Bad input to API call
    Traceback (most recent call last):
      File "/home/roy/.local/lib/python3.9/site-packages/maestral/errorhandling.py", line 94, in convert_api_errors
        yield
      File "/home/roy/.local/lib/python3.9/site-packages/maestral/client.py", line 1333, in wait_for_remote_changes
        res = self.dbx.files_list_folder_longpoll(last_cursor, timeout=timeout)
      File "/home/roy/.local/lib/python3.9/site-packages/dropbox/base.py", line 2282, in files_list_folder_longpoll
        r = self.request(
      File "/home/roy/.local/lib/python3.9/site-packages/dropbox/dropbox_client.py", line 301, in request
        self.check_and_refresh_access_token()
      File "/home/roy/.local/lib/python3.9/site-packages/dropbox/dropbox_client.py", line 369, in check_and_refresh_access_token
        self.refresh_access_token(scope=self._scope)
      File "/home/roy/.local/lib/python3.9/site-packages/dropbox/dropbox_client.py", line 403, in refresh_access_token
        self.raise_dropbox_error_for_resp(res)
      File "/home/roy/.local/lib/python3.9/site-packages/dropbox/dropbox_client.py", line 627, in raise_dropbox_error_for_resp
        raise BadInputError(request_id, res.text)
    dropbox.exceptions.BadInputError: BadInputError('<REDACTED 32-char hex>', '{"error": "v1_retired"}')
    
    The above exception was the direct cause of the following exception:
    
    Traceback (most recent call last):
      File "/home/roy/.local/lib/python3.9/site-packages/maestral/manager.py", line 843, in _handle_sync_thread_errors
        yield
      File "/home/roy/.local/lib/python3.9/site-packages/maestral/manager.py", line 670, in download_worker
        has_changes = self.sync.wait_for_remote_changes(
      File "/home/roy/.local/lib/python3.9/site-packages/maestral/sync.py", line 2854, in wait_for_remote_changes
        has_changes = client.wait_for_remote_changes(last_cursor, timeout=timeout)
      File "/home/roy/.local/lib/python3.9/site-packages/maestral/client.py", line 1333, in wait_for_remote_changes
        res = self.dbx.files_list_folder_longpoll(last_cursor, timeout=timeout)
      File "/usr/lib/python3.9/contextlib.py", line 137, in __exit__
        self.gen.throw(typ, value, traceback)
      File "/home/roy/.local/lib/python3.9/site-packages/maestral/errorhandling.py", line 96, in convert_api_errors
        raise dropbox_to_maestral_error(exc, dbx_path, local_path)
    maestral.exceptions.BadInputError: Bad input to API call. {"error": "v1_retired"}
    2022-05-24 11:17:53 manager INFO: Shutting down threads...
    2022-05-24 11:17:53 sync INFO: Sync aborted
    2022-05-24 11:17:53 manager INFO: Paused
    2022-05-24 11:19:43 sync INFO: Sync aborted
    2022-05-24 11:19:43 manager INFO: Paused
    
    bug 
    opened by Roy-Orbison 73
  • Add snap support

    Add snap support

    This PR adds a working confined snap. For now it needs to be connected to the kde content snap, but a request for autoconnection can be opened on the snapcraft forum.

    opened by LyzardKing 48
  • [BUG] Application icon is missing from tray

    [BUG] Application icon is missing from tray

    Describe the bug When running the GUI (which works), there is no icon for the Maestral entry in tray.

    To Reproduce Launch maestral gui.

    Expected behaviour The standard logo to show.

    System (please complete the following information):

    • Maestral version: 0.3.1
    • OS: NixOS unstable
    • Desktop environment: KDE Plasma 5.15.5
    • Qt version: 5.12

    Screenshot_20190816_102918

    bug 
    opened by peterhoeg 45
  • Maestral is not starting as a service on Mac OS X

    Maestral is not starting as a service on Mac OS X

    Not starting the GUI client, nor syncing on start up

    To Reproduce

    Expected behaviour

    System:

    • Maestral version: v1.5.1
    • Python version: Python 3.8.5
    • OS: 10.14
    • Desktop environment: [e.g. Gnome 3.32]
    • PyQt version (for Linux GUI):

    Additional context

    bug 
    opened by josep11 27
  • `UnicodeEncodeError` when attempting to sync paths that contain surrogates escapes

    `UnicodeEncodeError` when attempting to sync paths that contain surrogates escapes

    Daemon os starting but stops syncing due to unexpected error:

    Traceback (most recent call last): File "/home/adrien/.local/lib/python3.8/site-packages/maestral/sync.py", line 3864, in startup_worker sync.upload_local_changes_while_inactive() File "/home/adrien/.local/lib/python3.8/site-packages/maestral/sync.py", line 1782, in upload_local_changes_while_inactive events, local_cursor = self._get_local_changes_while_inactive()

    File "/home/adrien/.local/lib/python3.8/site-packages/maestral/sync.py", line 1819, in _get_local_changes_while_inactive ctime_check = now > stats.st_ctime > self.get_last_sync(dbx_path_lower) File "/home/adrien/.local/lib/python3.8/site-packages/maestral/sync.py", line 1102, in get_last_sync res = self._db_session.query(IndexEntry).get(dbx_path.lower()) File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/query.py", line 1018, in get return self._get_impl(ident, loading.load_on_pk_identity) File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/query.py", line 1135, in _get_impl return db_load_fn(self, primary_key_identity) File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 286, in load_on_pk_identity return q.one() File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/query.py", line 3490, in one ret = self.one_or_none() File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/query.py", line 3459, in one_or_none ret = list(self) File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/query.py", line 3535, in iter return self._execute_and_instances(context) File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/query.py", line 3560, in _execute_and_instances result = conn.execute(querycontext.statement, self._params) File "/usr/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1011, in execute return meth(self, multiparams, params) File "/usr/lib/python3.8/site-packages/sqlalchemy/sql/elements.py", line 298, in _execute_on_connection return connection._execute_clauseelement(self, multiparams, params) File "/usr/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1124, in _execute_clauseelement ret = self._execute_context( File "/usr/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1316, in _execute_context self.handle_dbapi_exception( File "/usr/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1514, in handle_dbapi_exception util.raise(exc_info[1], with_traceback=exc_info[2]) File "/usr/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 182, in raise raise exception File "/usr/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1276, in _execute_context self.dialect.do_execute( File "/usr/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 593, in do_execute cursor.execute(statement, parameters) UnicodeEncodeError: 'utf-8' codec can't encode character '\udce4' in position 192: surrogates not allowed

    bug daemon 
    opened by adrienlourdin 26
  • error attempting to install to linux mint 18.3

    error attempting to install to linux mint 18.3

    unable to install to linux mint 18.3

    python3 -m pip install --upgrade maestral[gui]

    expected successful install, instead got following error:

    Complete output from command python setup.py egg_info: Traceback (most recent call last): File "", line 1, in File "/usr/lib/python3.5/tokenize.py", line 454, in open buffer = _builtin_open(filename, 'rb') FileNotFoundError: [Errno 2] No such file or directory: '/tmp/pip-build-trbqdsma/PyQt5/setup.py'

    ----------------------------------------
    

    Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-trbqdsma/PyQt5/ You are using pip version 8.1.1, however version 20.1.1 is available. You should consider upgrading via the 'pip install --upgrade pip' command. dhdurgee@Z560 ~ $

    • Maestral version: assumed current, install failed
    • OS: linux mint 18.3
    • Desktop environment: cinnamon
    • Qt version: unknown

    I want t see if I can replace the dropbox client which does not want to work on my filesystem maestral.log

    opened by dhdurgee 23
  • [BUG] Maestral doesn't resume sync if it is interrupted, but rather restart from the start

    [BUG] Maestral doesn't resume sync if it is interrupted, but rather restart from the start

    Describe the bug Maestral shows me the syncing icon. When I click on it, it is syncing.

    However every folder of my Dropbox seems up to date:

    $ for d in ./*/ ; do (maestral file-status "$d"); done
    up to date
    up to date
    up to date
    up to date
    up to date
    up to date
    up to date
    up to date
    up to date
    up to date
    up to date
    up to date
    up to date
    up to date
    up to date
    

    To Reproduce Just start Maestral and it will start to sync

    Expected behaviour If everything is up-to-date, there should be nothing to sync System (please complete the following information):

    • Maestral version: GUI v. 1.3.1, daemon v. 1.3.1
    • OS: [e.g. Ubuntu] Ubuntu 20.10
    • Desktop environment: [e.g. Gnome 3.32] GNOME 3.38.1
    • Qt version:
    $ qmake --version
    QMake version 3.1
    Using Qt version 5.14.2 in /usr/lib/x86_64-linux-gnu
    
    bug daemon 
    opened by raffaem 22
  • Is a directory .dropbox

    Is a directory .dropbox

    Currently I can not start maestral-gui

    [idnovic@id-lappy ~]1$ maestral-gui 
    Warning: Ignoring XDG_SESSION_TYPE=wayland on Gnome. Use QT_QPA_PLATFORM=wayland to run on Wayland anyway.
    QSocketNotifier: Can only be used with threads started with QThread
     > Loading access token...
     [OK]
     > Loading access token...
     [OK]
     > MaestralClient is ready.
    Traceback (most recent call last):
      File "/home/idnovic/.local/bin/maestral", line 11, in <module>
        load_entry_point('maestral==0.1.3.dev1', 'console_scripts', 'maestral')()
      File "/home/idnovic/.local/lib/python3.7/site-packages/click/core.py", line 764, in __call__
        return self.main(*args, **kwargs)
      File "/home/idnovic/.local/lib/python3.7/site-packages/click/core.py", line 717, in main
        rv = self.invoke(ctx)
      File "/home/idnovic/.local/lib/python3.7/site-packages/click/core.py", line 1137, in invoke
        return _process_result(sub_ctx.command.invoke(sub_ctx))
      File "/home/idnovic/.local/lib/python3.7/site-packages/click/core.py", line 956, in invoke
        return ctx.invoke(self.callback, **ctx.params)
      File "/home/idnovic/.local/lib/python3.7/site-packages/click/core.py", line 555, in invoke
        return callback(*args, **kwargs)
      File "/home/idnovic/.local/lib/python3.7/site-packages/maestral/console_script.py", line 31, in gui
        run()
      File "/home/idnovic/.local/lib/python3.7/site-packages/maestral/gui/main.py", line 197, in run
        maestral = FirstSyncDialog.configureMaestral()  # returns None if aborted
      File "/home/idnovic/.local/lib/python3.7/site-packages/maestral/gui/first_sync_dialog.py", line 281, in configureMaestral
        fsd = FirstSyncDialog(parent)
      File "/home/idnovic/.local/lib/python3.7/site-packages/maestral/gui/first_sync_dialog.py", line 134, in __init__
        self.mdbx = Maestral(run=False)
      File "/home/idnovic/.local/lib/python3.7/site-packages/maestral/main.py", line 128, in __init__
        self.client = MaestralClient()
      File "/home/idnovic/.local/lib/python3.7/site-packages/maestral/client.py", line 284, in __init__
        with open(self.rev_file, "rb") as f:
    IsADirectoryError: [Errno 21] Ist ein Verzeichnis: '.dropbox'
    
    opened by idnovic 22
  • Compare revs with new command: maestral diff (WIP)

    Compare revs with new command: maestral diff (WIP)

    This pr implements a new maestral diff command to compare versions of a file.

    Usage: maestral diff DBX_PATH OLD_REV [NEW_REV] If NEW_REV is omitted, it will compare it to the current version.

    To compare the files, it will download them for now into to a temporary file. To do this, maestral calls the .files_download_to_file.

    TODO:

    • [ ] Diffs for other non-text file types like word docs ?
    • [x] Better and more exceptions
    • [x] At least handle non-text formats (error msg)
    • [x] Add colors to diff
    • [x] Implement the new select thingies
    • [x] Implement real temporary files
    • [x] Is the diff type okay?
    opened by OrangeFran 20
  • [BUG] Maestral doesn't compleatly quit using the GUI quit option

    [BUG] Maestral doesn't compleatly quit using the GUI quit option

    Describe the bug When I start the sync, it loops "uploading 1/{total files}" and "indexing local changes" on the notification right click. No file is actually uploaded and sync issues says no issues. Only folder is created.

    To Reproduce Start the sync on raspberry pi

    Expected behaviour Upload the files

    System (please complete the following information):

    • Maestral version: latest
    • OS: Raspbian
    • Desktop environment: doesnt matter
    • Qt version: doesnt matter

    Additional context It loops between these two Screenshot_Solid_Explorer_20200404-175253 Screenshot_VNC_Viewer_20200404-174837

    opened by 1nikolas 20
  • maestral daemon cannot be started after upgrading to 1.4.3

    maestral daemon cannot be started after upgrading to 1.4.3

    Maestral daemon cannot be started by the terminal command.

    maestral start error message: ! Cannot load keyring keyring.backends.SecretService.Keyring. Please relink Maestral to get a new access token.

    To Reproduce just enter the command maestral start (or maestral gui)

    The expected behavior is obvious. It is desired to start the daemon to synchronize the local files with their cloud counterparts.

    System:

    • Maestral version: 1.4.3 (with the previous version all were OK)
    • OS: Ubuntu 20.04
    bug 
    opened by mkhachay 19
  • Bump sphinx from 5.3.0 to 6.1.1

    Bump sphinx from 5.3.0 to 6.1.1

    Bumps sphinx from 5.3.0 to 6.1.1.

    Release notes

    Sourced from sphinx's releases.

    v6.1.1

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v6.1.0

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v6.0.1

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v6.0.0

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v6.0.0b2

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v6.0.0b1

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    Changelog

    Sourced from sphinx's changelog.

    Release 6.1.1 (released Jan 05, 2023)

    Bugs fixed

    • #11091: Fix util.nodes.apply_source_workaround for literal_block nodes with no source information in the node or the node's parents.

    Release 6.1.0 (released Jan 05, 2023)

    Dependencies

    Incompatible changes

    • #10979: gettext: Removed support for pluralisation in get_translation. This was unused and complicated other changes to sphinx.locale.

    Deprecated

    • sphinx.util functions:

      • Renamed sphinx.util.typing.stringify() to sphinx.util.typing.stringify_annotation()
      • Moved sphinx.util.xmlname_checker() to sphinx.builders.epub3._XML_NAME_PATTERN

      Moved to sphinx.util.display:

      • sphinx.util.status_iterator
      • sphinx.util.display_chunk
      • sphinx.util.SkipProgressMessage
      • sphinx.util.progress_message

      Moved to sphinx.util.http_date:

      • sphinx.util.epoch_to_rfc1123
      • sphinx.util.rfc1123_to_epoch

      Moved to sphinx.util.exceptions:

      • sphinx.util.save_traceback

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 0
  • notifications are on but not received

    notifications are on but not received

    Describe the bug Unfortunately, I am not receiving notifications of any kind, even though the settings in maestral are set to on. Meanwhile, the Mac settings do not show maestral under notifications and therefore are not on - maestral is not asking for permissions within the Mac environment on my end.

    To Reproduce (firstly, I installed maestral via homebrew, then removed it completely with an ending reboot) downloaded maestral via GitHub, signed in and authenticated the app to get the token, sync is in progress and notifications in app settings are on while in Mac settings no app permission was requested. App settings for notification have been turned off and on again, no change.

    Expected behaviour Notifications would be delivered upon turning settings on + app would be listed within Mac notifications settings.

    System:

    • Maestral version: GUI v1.6.4, daemon v1.6.4
    • OS: macOS Ventura 13.1
    bug 
    opened by knstntnb 0
  • Cannot load keyring keyring.backends.SecretService.Keyring

    Cannot load keyring keyring.backends.SecretService.Keyring

    Describe the bug I did install and maestral auth link successfully on NixOS 22.11. When I call maestral start I get this error message:

    Cannot load keyring keyring.backends.SecretService.Keyring. Please relink Maestral to get a new access token.
    

    Maestral does not start nor sync files.

    To Reproduce

    nix-env -iA nixos.maestral
    maestral auth link
    maestral start
    

    Expected behaviour No error.

    System:

    • Maestral version: 1.5.1
    • OS: NixOS 22.11 (x86_64-linux)
    • Python version: 3.9.6
    • Desktop environment: --
    • PyQt version (for Linux GUI): --

    Additional context

    It's strange, on a different laptop also with NixOS 22.11 it works.

    Can anyone reproduce or provide an idea to get it running? @peterhoeg

    bug 
    opened by schoettl 8
  • Error when trying to update 1.6.3 (64) to 1.6.3 (65) on macOS High Sierra

    Error when trying to update 1.6.3 (64) to 1.6.3 (65) on macOS High Sierra

    I am running 1.6.3 (64) on High Sierra. When I check for updates, it offers build 65.

    When I choose to install, it downloads the update, but then says:

    Update Error!
    An error occurred while extracting ...
    

    I believe it's not about the extraction but about the fact that the new build may require 10.15 when it should still work on 10.13.

    I'd expect that as long as the version remains the same, that bug fixes keep working on the same macOS version. (I know that 1.6.4 does not work on H.S.)

    As a general rule: When you change the fundamental behavior of a program, including new requirements, the version number should be increased at a higher level than the bugfix (x.x.bugfix) level. Ideally, the top level should be incremented, but at least turn a 1.6.3 into a 1.7 for that next time.

    bug 
    opened by tempelmann 1
  • CLI throwing error; says can't find anything at given path, even when dragging file in from Finder window

    CLI throwing error; says can't find anything at given path, even when dragging file in from Finder window

    I've been using Maestral for about 6 months, and not had any issues. I'd written two shortcuts which wrapped around applescripts to get the dropbox share link when right-clicking, and the dropbox file history. These were working perfectly.

    I just went to use the first shortcut, and the command line is throwing the error "! Could not create shared link. There is nothing at the given path"; this is weird because the script used to work.

    I went into Terminal, and used the sharelink command, dropping the file into the terminal command by dragging it from Finder, and it throws the same error.

    Am using Ventura and Maestral 1.6.3

    bug 
    opened by theboyler 5
  • Crash on launch of gui

    Crash on launch of gui

    Describe the bug

    Installed maestral, OK installed gui ?

    pip install maestral[gui]

    To Reproduce

    ran

    maestral gui

    Expected behaviour

    Expected gui to open

    Instead

    maestral gui & [1] 5525 ~ 10:45 > QImage::pixel: coordinate (0,0) out of range QImage::pixel: coordinate (0,0) out of range QImage::pixel: coordinate (0,0) out of range ..... libva error: vaGetDriverNameByIndex() failed with unknown libva error, driver_name = (null) Opening in existing browser session.

    System:

    5.15.6

    • Maestral version:

    1.6.3

    • Python version: Python 3.11.0

    • OS: [e.g. Ubuntu]

    Fedora 37

    • Desktop environment: [e.g. Gnome 3.32] GNOME 43.1

    • PyQt version (for Linux GUI):

    ??? How to find it please

    Additional context

    First use of maestral after failure of Dropbox on Fedora 37.

    Link to dropbox seemed to work well.

    bug 
    opened by dpawson 0
Releases(v1.6.4)
  • v1.6.4(Dec 4, 2022)

    Changed:

    • Drops support for macOS 10.13 and 10.14. macOS 10.15 or later is now required, reflecting the support status from Apple. In the future, we will drop support for macOS versions once they no longer receive security updates.
    • Improved status messages: the sync count is now updated as items are uploaded or downloaded instead of with a delay.
    • maestral activity now shows animating progress bars to view upload and download progress.
    • maestral sharelink list now outputs plain urls, separated by new lines. Use the --long | -l option if you would like a pretty-printed table with additional information about each link.
    • maestral history now shows where the listed changes occurred (local vs remote).
    • When multiple GUIs are installed (for example Qt and Cocoa), ask the user to choose when running maestral gui instead of selecting a default.

    Fixed:

    • Fixes an error which would prevent running Maestral on Python 3.7.
    • Fixes a regression where the CLI command maestral activity would fail when run from a macOS app bundle.
    • Fixes an issue where reauthorizing Maestral's Dropbox access could hang indefinitely.
    • Fixes an issue on macOS where changing the casing of two local file names in the same folder in quick succession could result in the second file being deleted during sync.

    Dependencies:

    • Introduced rich dependency.
    • Removed sdnotify dependency.
    Source code(tar.gz)
    Source code(zip)
    Maestral-1.6.4.dmg(20.86 MB)
  • v1.6.3(Jun 4, 2022)

    Changed:

    • The macOS app bundle now uses Python 3.10 instead of 3.9. This comes with some performance improvements.

    Fixed:

    • Work around transitory server-side errors when refreshing access tokens by retrying the refresh up to five times.
    • Fixed a segfault on startup for a small number of macOS users.
    • Fixed an issue where files which contain decomposed unicode characters could be deleted after renaming them locally on some versions of macOS.
    • Fixes an issue where the maestral gui command would fail for macOS app bundles.
    Source code(tar.gz)
    Source code(zip)
    Maestral-1.6.3-macOS_10_12_build.dmg(17.27 MB)
    Maestral-1.6.3.dmg(17.28 MB)
  • v1.6.2(Apr 20, 2022)

    Changed:

    • Improved error message for file names with incompatible characters that are rejected by Dropbox servers, e.g., emoji or slashes at the end of a file name.
    • Capture Dropbox SDK logs in Maestral's log output. This will log which API endpoints are called and any retries on errors or rate limiting.

    Fixed:

    • Fixes intermittent failures to show a file associated with a sync issue in the Linux GUI.
    • Fixes an issue where the macOS app bundle would use a system-wide installation of the Sparkle framework if available instead of the one bundled with Maestral. This could lead to unexpected issues if the system-wide installation would have an incompatible version.
    • Fixes an issue where the access level of shared links may be incorrectly reported.
    • Resume interrupted downloads after a shutdown when including new items with selective sync.
    • Fixes occasional conflicting copies of folders during initial sync due to a race condition when a child item is synced before its parent folder.
    • Fixes the display of timestamps in the CLI from maestral ls and maestral history commands. The former would show times in UTC instead of the device's timezone and the latter would show Unix timestamps instead of formatted output.
    Source code(tar.gz)
    Source code(zip)
    Maestral-1.6.2.dmg(16.76 MB)
  • v1.6.1(Mar 23, 2022)

  • v1.6.0(Mar 20, 2022)

    This release fixes several crashes of the GUI when running on Apple Silicon. It also refactors the handling of sync errors, resulting in more reliable clearing of sync errors after a file was successfully synced, features some performance improvements when indexing local changes and further decouples the sync logic from specifics of the Dropbox API.

    Changed:

    • Sync errors are now stored in a SQlite database table instead of a config file.
    • The CLI command maestral filestatus will now return error if there is a sync error for any child of the given path.
    • Re-enabled updating from versions older than 1.5.0.
    • Improved file integrity checks after upload or download.
    • Better parallelize CPU intensive work when indexing local changes. This improves performance on multicore CPUs.
    • Migrate the Linux GUI from PyQt5 to PyQt6.

    Fixed:

    • Fixes an issue where upload sync errors could continue to be reported after the local file was deleted if the deletion occurred while sync was not running.
    • Fixes an issue with the Linux Qt GUI where aborting the setup dialog after linking but before choosing a local Dropbox folder would result in an inconsistent state.
    • Fixes an issue when storing 64-bit inode numbers in our database.
    • Fixes occasional crashes of the macOS GUI when running on Apple Silicon.
    Source code(tar.gz)
    Source code(zip)
    Maestral-1.6.0.dmg(16.59 MB)
  • v1.5.3(Jan 29, 2022)

    This release changes how symlinks are handled when syncing: when a symlink is created in the local Dropbox, it will no longer be followed but will trigger a sync issue instead. This is because the public Dropbox API does not currently support creating symlinks on the server. Symlinks which are already present on the server will however now be correctly recreated locally instead of being synced as an empty file. Other changes focus mainly on bog fixes with some bugs specific to the macOS app bundle.

    Changed:

    • The Dock icon no longer appears while the app is launching in macOS.
    • The Dock icon no longer appears when clicking on a desktop notification on macOS.
    • Clicking on a desktop notification will now show the file or folder which triggered the notification. Previously, only clicking on the "Show" button of the notification would open the file browser.
    • Removed update notifications by the CLI.
    • Proper symlink handling: Remote items which are symlinks will now be synced as symlinks instead of empty files. Local symlinks will no longer be followed during indexing or silently ignored when syncing. Instead, attempting to upload a symlink will raise an error because uploading symlinks is not currently supported by the public Dropbox API.

    Fixed:

    • Fixes a crash of the maestral activity CLI command when run from the macOS App Bundle due to a missing packaged library.
    • Fixes an issue which prevented the maestral gui command from working with the macOS app bundle.
    • Fixes an issue where moving a local file to overwrite another file, for example with mv in the terminal, could generate an incorrect conflicting copy during upload sync.
    • Properly handle when the local Dropbox directory is renamed by changing the casing only on case-insensitive file systems such as APFS on macOS.
    • Fixes an issue which could result in sync errors not being cleared after the successful sync of an item under some circumstances.
    • Relative paths passed to maestral move-dir are now interpreted relative to the working directory where the command is run instead of the working directory of the sync daemon.
    Source code(tar.gz)
    Source code(zip)
    Maestral-1.5.3.dmg(16.87 MB)
  • v1.5.2(Jan 13, 2022)

    Changed:

    • Improved dialog flow on Linux when the local Dropbox folder is missing.
    • Improved error handling when determining the change time (ctime) of a local file fails.

    Fixed:

    • Fixes an issue where the output of CLI commands would get truncated to 80 characters when piped to another command and not attached to an interactive stream such as a terminal.
    • Fixes Python 3.10 compatibility of Linux (Qt) GUI, thanks to @raffaem.
    • Fixes an issue where the CLI fails to install on Apple Silicon Macs.
    • Fixes a startup loop of the Linux GUI when the local Dropbox folder is missing.
    Source code(tar.gz)
    Source code(zip)
    Maestral-1.5.2.dmg(17.11 MB)
  • v1.5.1(Oct 21, 2021)

    This release focuses on bug fixes.

    Changed:

    • Handle Dropbox server errors in the same way as connection errors by retrying the sync job.

    Fixed:

    • Fixes an issue when trying to abort the CLI setup dialog with ctrl+C.
    • Fixes an issue which could under some circumstances result in deleted folder content after performing the initial indexing and download. This would mostly occur for shared folders.
    • Fixes an issue where launchd or systemd might start the sync daemon with a non-UTF-8 encoding set in the environment, leading to an error message on startup.
    • Fixes an issue where deleting the local Dropbox folder during startup indexing may result in some files being deleted from the remote Dropbox.
    Source code(tar.gz)
    Source code(zip)
    Maestral-1.5.1.dmg(16.87 MB)
  • v1.5.0(Oct 2, 2021)

    Added:

    • Added support for Dropbox Business accounts with a Team Space. Shared folders in a Team Space will now be synced at the top level, next to the user's personal folder.

    Changed:

    • Reorganised config file sections.
    • Brought back support for macOS High Sierra in the macOS app bundle.

    Fixed:

    • Fixed a crash when running the CLI command maestral config-file --clean.
    Source code(tar.gz)
    Source code(zip)
    Maestral-1.5.0.dmg(16.86 MB)
  • v1.4.8(Aug 22, 2021)

    This update provides some performance improvements to syncing, several bug fixes, and improved error handling. From this release onward, the macOS app bundle can update itself using Sparkle.

    Added:

    • Added automatic updates with Sparkle for the macOS app bundle.

    Changed:

    • Improved performance when processing local file events.
    • Improved error messages when the system keyring cannot be accessed despite being unlocked, for example because the executable (app bundle or Python) has an invalid signature.
    • Improved error messages on startup for the macOS app bundle.
    • Improved error message in the CLI when setting a config value fails because the new value has the wrong type.
    • Improved handling of more exotic file system or device related errors when opening local files.

    Fixed:

    • Fixed a crash on startup of the daemon when the log level is set to WARNING.
    • Fixed an issue which could result in an unresponsive daemon during startup on macOS.
    • Fixed an issue which could result in the CLI or GUI to stall indefinitely if the daemon process is unresponsive.
    • Fixed an issue in the macOS GUI where passing the "missing Dropbox folder" flow by selecting a new location would lead to duplicate menu entries in the status bar menu.
    • Fixed an issue where the Linux / Qt GUI would hang indefinitely after unlinking.
    • Fixed an issue where moving / removing the local Dropbox folder during a download could lead to unhandled exceptions instead of useful error messages.
    • Fixed handling of 503 and other raw HTTP errors from the Dropbox SDK, for instance when Dropbox servers have temporary outages or are undergoing planned maintenance.
    • Fixed periodic connection checking for connections over proxy using http_proxy environment variable.
    • Fixed an issue where some uploaded items would not register as synced after aborting or pausing during an upload sync.
    • Fixed a compatibility issue with watchdog v2.1.4 and higher.

    Removed:

    • Removed an unneeded prompt when revoking a shared link.
    Source code(tar.gz)
    Source code(zip)
    Maestral-1.4.8.dmg(16.56 MB)
  • v1.4.6(Jul 3, 2021)

  • v1.4.5(Jun 29, 2021)

    Added:

    • Support CMD+Q keyboard shortcut to quit app on macOS.

    Changed:

    • Clarified the "merge local folder" option in the GUI's setup dialog.

    Fixed:

    • Fixed an issue where erroneous file conflicts could occur when a file name contains decomposed unicode characters such as "é" represented by "e" + "́" instead of a single character.
    • Fixed an issue where center-aligned text would appear right-aligned on Apple Silicon computers.

    Dependencies:

    • Bumped desktop-notifier to v3.3.0. This fixes a segfault for non-framework distributions of Python such as Anaconda Python.
    Source code(tar.gz)
    Source code(zip)
    Maestral-1.4.5.dmg(16.26 MB)
  • v1.4.4(Jun 8, 2021)

    Edit: Updated App bundle for macOS, the previous bundle was built with the wrong version of the toga GUI toolkit.

    This release introduces support for tab-completion in the shell, allows you to choose the actual Dropbox folder instead of its parent folder / location from the GUI, and further reduces memory usage during startup indexing. As usual, several bugs have been squashed.

    The website has also moved to its own domain at maestral.app. The source still lives in the website branch of the GitHub repo and contributions are welcome.

    Added:

    • Added support for shell completion. Completion is available for the commands themselves and for several arguments, notably paths relative to the Dropbox folder and choices from a set of fixed options. Use the command maestral completion to generate shell completion scripts for bash, zsh or fish. See maestral completion --help for instructions on enabling shell completion.

    Changed:

    • Improved error messages when inotify limits are reached on Linux.
    • GUI dialogs to select a local Dropbox folder now ask for the actual folder name instead of the location only.
    • Local indexing on startup is now carried out without loading the entire folder tree into memory. This further reduces peak memory usage and fragmentation.
    • Permission errors when scanning the contents of a local folder during startup indexing are now treated as fatal errors instead of skipping its content. This prevents items from being deleted on the server when they are still present locally but inaccessible.
    • Improved logging during daemon startup: Logging is now initialised immediately after the main imports and therefore captures potential errors early during the startup process.
    • Loggers are scoped per configuration instead of globally. This enables separating logs for Maestral instances for different configs which are running in the same process.
    • Improved performance and appearance of the selective sync dialog. Folder content is no longer pre-fetched but will be loaded on-demand when expanding a folder.

    Fixed:

    • Fixes a rare issue where throttling of sync threads would be disabled if the "max_cpu_percent" config value would be set to 100% divided by the number of CPU cores (e.g, 25% on a 4-core CPU).
    • Fixes an issue where a local permission error would be treated as a fatal error instead of as a sync issue.
    • Moving the Dropbox folder between partitions no longer triggers a full resync.
    • Fixes an error when running the diff CLI command and selecting the local file as the base version.
    • Fixes download links in the update dialog.
    • Fixes an unexpected error which may occur when creating a conflicting copy.

    Dependencies:

    • Bumped click to >= v8.0.0 to support shell completion.
    • Bumped survey to >= v3.4.3 for Python 3.6 support.
    Source code(tar.gz)
    Source code(zip)
    Maestral-1.4.4.dmg(16.28 MB)
  • v1.4.3(Mar 13, 2021)

    This release improves performance and memory usage by switching from sqlalchamey to our own database interaction layer. It is also the first release with an app bundle that runs natively on Apple Silicon.

    Maestral now also has a website with a detailed documentation of the command line interface, released with GitHub pages at https://samschott.github.io/maestral.

    Changed:

    • We now use our own ORM layer instead of sqlalchemy. This improves both baseline memory usage and peak memory usage during startup and indexing.
    • Use a new network session for each thread and clean up network resources before the thread stops.
    • The macOS GUI will now show a dock icon if there is an open window.
    • The CLI will print full tracebacks to the console in case of unexpected errors.

    Fixed:

    • Fixed detecting local changes when saving an MS Office on macOS with recent versions of the Office suite.

    Dependencies:

    • Bumped desktop-notifier to >=3.2.2
    • Bumped watchdog to >=2.0.1
    • Removed sqlalchemy
    • Removed alembic
    Source code(tar.gz)
    Source code(zip)
    Maestral-1.4.3.dmg(16.18 MB)
  • v1.4.2(Feb 15, 2021)

  • v1.4.1(Feb 15, 2021)

  • v1.4.0(Feb 14, 2021)

    This release brings significant extensions to the command line interface: It introduces commands to create and manage shared links, to compare older version of a file and print the diff output to the terminal, and commands for direct access to config values (note the warning below). It also adds optional one-way syncing, for instance to keep a mirror of a remote Dropbox folder while ignoring local changes.

    Several bugs have been fixed which could occur when resuming the sync activity after the connection had been lost while indexing a remote folder.

    Finally, this release removes automatic error reporting via Bugsnag. Please file any bug reports as issues on GitHub where it is possible to follow up.

    Added:

    • Added a command maestral diff to compare different versions of a text file. The resulting diff is printed to the console. Credit goes to @OrangeFran.
    • Resurrected the command maestral revs to list previous versions (revisions) of a file.
    • Added a command group maestral sharelink to create and manage shared links. Subcommands are create to create a shared link for a file or folder, list to list shared links, either for a specific file or folder or for all items in your Dropbox, and revoke to revoke a shared link.
    • Added a command group maestral config to provide direct access to config values. Subcommands are get and set to read and write config values, respectively. This provides access to previously inaccessible config values such as reindex_interval or max_cpu_percent. Please refer to a Wiki for an overview of all config values. Use the set command with caution: setting some config values may leave the daemon in an inconsistent state (e.g., changing the location of the Dropbox folder). Always use the equivalent command from the Settings group (e.g., maestral move-dir).
    • Added the ability to disable a single sync direction, for instance to enable download syncs only. This can be useful when you want to mirror a remote folder while ignoring local changes or when syncing to a file system which does not support inotify. To use this, set the respective config values for upload or download to False. Note that conflict resolution remains unaffected. For instance, when an unsynced local change would be overwritten by a remote change, the local file will be moved to a "conflicting copy" first. However, the conflicting copy will not be uploaded.

    Changed:

    Changes to daemon:

    • Avoid scanning of objects matching an .mignore pattern (file watches will still be added however). This results in performance improvements during startup and resume. A resulting behavioral change is that maestral will remove files matching an ignore pattern from Dropbox. After this change it will be immaterial if an .mignore pattern is added before or after having matching files in Dropbox.
    • If Maestral is quit or interrupted during indexing, for instance due to connection problems, it will later resume from the same position instead of restarting from the beginning.
    • Indexing will no longer skip excluded folders. This is necessary for the above change.
    • Defer periodic reindexing, typically carried out weekly, if the device is not connected to an AC power supply. This prevents draining the battery when hashing file contents.
    • Improved the error message when the user is running out of inotify watches: Recommend default values of max_user_watches = 524288 and max_user_instances = 1024 or double the current values, whichever is higher. Advise to apply the changes with sysctl -p.

    Changes to CLI:

    • Moved linking and unlinking to a new command group maestral auth with subcommands link, unlink and status.
    • Renamed the command file-status to filestatus.
    • Added a --yes, -Y flag to the unlink to command to skip the confirmation prompt.
    • Renamed the configs command to list config files to config-files.
    • Added an option --clean to config-files to remove all stale config files (those without a linked Dropbox account).

    Fixed:

    • Fixes an issue with the CLI on Python 3.6 where commands that print dates to the console would raise an exception.
    • Properly handle a rare OSError "[Errno 41] Protocol wrong type for socket" on macOS, see https://bugs.python.org/issue33450.
    • Allow creating local files even if we cannot set their permissions, for instances on some mounted NTFS drives.
    • Fixes an issue with the selective sync dialog in the Qt / Linux GUI where the "Update" button could be incorrectly enabled or disabled.
    • Fixes an issue where a lost internet connection while starting the sync could lead to a stuck sync thread or an endless indexing cycle.
    • Fixes an issue where a lost internet connection during the download of a folder newly included in selective sync could result in the download never being completed.
    • Fixes an issue where pausing the sync during the download of a folder newly included in selective sync could result in the download never being completed. Credit goes to @andrewsali.

    Removed:

    • Removed automatic error reporting via bugsnag.
    • Removed the CLI command maestral restart. Use stop and start instead.
    • Removed the CLI command maestral account-info. Use maestral auth status instead.
    • Removed the public API methods Maestral.resume_sync and Maestral.pause_sync. Use Maestral.start_sync and Maestral.stop_sync instead.

    Dependencies:

    • Bumped survey to version >=3.2.2,<4.0.
    • Bumped keyring to version >=22.
    • Bumped watchdog to version >= 2.0.
    • Added desktop-notifier dependency. This is spin-off project from Maestral, built on the code previously in the notify module.
    • Removed the bugsnag dependency.
    Source code(tar.gz)
    Source code(zip)
    Maestral-1.4.0.dmg(13.10 MB)
  • v1.3.1(Dec 6, 2020)

  • v1.3.0(Dec 6, 2020)

    This release features an overhaul of the command line interface: commands are grouped by sections in the help output, dialogs and output formatting have been improved and many commands have become significantly faster.

    This release also significantly reduces the CPU usage when idle and provides a whole series of bug fixes for GUI and daemon.

    Added:

    • Desktop notifications for sync errors are now clickable and will show the related file or folder either on Dropbox or locally.
    • Desktop notifications now have a "Show" button to show a recently changed file.
    • Added a public API Maetral.status_change_longpoll for frontends to wait for status changes without frequent polling. status_change_longpoll blocks until there is a change in status and then returns True. The default timeout is 60 sec.

    Changed:

    • Significant improvements to the command line interface:
      • Overhauled all CLI dialogs with nicer formatting and more interactive prompts using the survey package.
      • Improved output of many CLI commands, including ls, activity, and restore.
      • Increased speed of many CLI commands by importing only necessary modules.
      • Shortened help texts for CLI commands.
      • Group help output by function.
    • Reduced the CPU usage of daemon and GUIs in the idle state:
      • Increased timeouts for all event queues.
      • Decreased the frequency of daemon housekeeping tasks.
      • GUIs now use longpoll APIs to wait for state changes instead of frequent polling.
    • Improved performance when syncing a large number of remote deletions.
    • The Maestral.include_item() API now accepts paths which lie inside an excluded folder. When called with such a path, all immediate parents will be included as well.
    • The Maestral.excluded_items property is no longer read-only.
    • Some refactoring of the cli module to prepare for shell completion support.

    Fixes:

    • Fixes an issue where all newly downloaded files would be created with 755 permissions. They are now created with the user's default permissions for new files instead.
    • Fixes an unexpected crash when the list of pending_downloads or download_errors would contain an invalid path, i.e., a Dropbox path for which we cannot get any current or deleted metadata.
    • Fixes an error when a local file name contains bytes which cannot be decoded by the reported file system encoding. This now raises a sync error instead of crashing. All log handlers have also been updated to deal with the resulting surrogate escapes.
    • Fixes possible loss of data when excluding an item from syncing while it is being downloaded. This is no longer possible and will raise a BusyError instead.
    • Fixes an issue where maestral ls would fail when run with the -l, --long flag.
    • Fixes an occasional IndexError during a download sync when trying to query past versions of a deleted item.
    • Fixes an issue which could cause a segfault of the selective sync dialog on macOS.
    • Fixes an issue where the selective sync dialog on Linux would not load the contents of more than 10 folders.
    • Fixes a regression with the autostart functionality of the Linux GUI. Autostart entries created with v1.2.2 will need be reset by toggling the checkbox "start on login" off and on.
    • Fixes an issue where two configs linked to the same Dropbox account would both be unlinked when trying to unlink only one of them.
    • Fixes an import error with v11.0 of the Dropbox SDK.

    Removed:

    • Removed the maestral rev command to list old file revisions. Instead maestral restore will list possible revisions to restore.

    Deprecated:

    • Deprecated the Maestral.set_excluded_items API. Use the setter for Maestral.excluded_items instead.

    Development:

    • Updated tests and migrated fully to pytest.
    • Improved API documentation, including sections on the sync logic and on logging.
    • Added contributing guidelines.

    Dependencies:

    • Require watchdog<=10.3 because of an unresolved issue in watchdog 0.10.4 on macOS.
    • Pin dropbox<12.0 to avoid bad surprises in case of breaking changes.
    • Add survey for an interactive CLI.
    Source code(tar.gz)
    Source code(zip)
    Maestral-1.3.0.dmg(13.03 MB)
  • v1.2.2(Nov 10, 2020)

    This release focuses on bug fixes and performance improvements. In particular, memory usage has been improved when syncing a Dropbox folder with a large number of items. It also fixes an issue with running the app bundle on macOS High Sierra.

    Changes:

    • maestral file-status now accepts relative paths.
    • Runs the daemon in a Python interpreter with -OO flags. This strips docstrings and saves a few MB of memory.
    • Moves from pkg_resources to locate entry points and other metadata to the faster and more light-weight importlib.metadata.
    • Update scripts are no longer run after a fresh install or for a new config.
    • Significantly reduces memory usage during the initial sync of a Dropbox folder with many (> 10,000) items and when downloading a large set of changes. To achieve this, new APIs have been added to SyncEngine and DropboxClient that return iterators over remote changes. Dropbox servers are queried on every iteration and memory is freed after applying each batch of remote changes.
    • Maestral.get_history now returns only the last 100 sync events by default. This can be increased by setting the limit argument manually.
    • The total sync history kept in out database is limited to the last 1,000 events.
    • Switch from PyInstaller to briefcase for packaging on macOS.

    Fixes:

    • Fixes an issue which would prevent the daemon from starting on macOS when running with Python 3.6.
    • Fixes a segfault of the GUI on macOS High Sierra.
    • Fixes an issue with the macOS GUI becoming unresponsive when opening the selective sync dialog if one of the displayed folders contains a large number (> 2k) of immediate children.
    • Fixes an issue with the Qt GUI crashing when opening the selective sync dialog if one of the folders contains a large number (> 2k) of immediate children.
    • Fixes an issue where Mastral.excluded_status would return "included" for items inside an excluded folder.
    Source code(tar.gz)
    Source code(zip)
    Maestral-1.2.2.dmg(10.82 MB)
  • v1.2.1(Oct 8, 2020)

    This update provides bug fixes and some improvements to error handling. Major changes don't regard Maestral itself but its distribution: a Docker image is now available, thanks to @aries1980, and the macOS app bundle has been rebuilt with the macOS 11 SDK, providing full compatibility from macOS 10.14 Mojave to macOS 11.0 Big Sur.

    Added:

    • Added a Docker image. The docker image is based on Linux and does not currently include a GUI.
    • Added -V, --version option to the command line interface to show the version and exit.

    Changed:

    • Improves handling of database related errors such as database integrity, missing read / write permissions for the database file, etc.
    • Improves handling of errors when the keyring cannot be unlocked to delete credentials during an unlink.
    • Improves handling of errors when the keyring where Dropbox credentials are stored becomes unavailable, e.g., has been uninstalled.
    • Never start a subprocess when maestral is run with the -f, --foreground option. Previously, any required setup such as linking, etc, would still be performed in a subprocess.
    • Minor tweaks and improvements to the macOS GUI.
    • Allow sending desktop notifications in Linux before the daemon's event loop has started. This is useful for error messages which occur early during the initialization.
    • Improves log messages when the connection to Dropbox is lost.
    • Performance improvements to maestral activity in case of very large sync queues.

    Fixes:

    • Fixes a database integrity error due to an unfulfilled unique constraint.
    • Fixes an issue when the daemon is launched with systemd where systemd would unexpectedly receive notifications from a subprocess instead of the main process.
    • Fixes an issue which would prevent syncing from automatically resuming after moving the local Dropbox directory with maestral move-dir or through the GUI.
    • Fixes a green background for sync issue views in the macOS GUI.
    • Fixes an issue where the system tray icon in KDE Plasma could fall back to the regular app icon or not show up at all,
    • Fixes an issue where the user may be asked to unlock or grant access to the system keyring twice on startup if access denied the first time.

    Dependencies:

    • Adds alembic dependency for database migrations.
    Source code(tar.gz)
    Source code(zip)
    Maestral-1.2.1.dmg(14.96 MB)
  • v1.2.0(Sep 16, 2020)

    The local file index and sync history are now stored in a SQLite database. After the update, Maestral will reindex your Dropbox to populate the new index. This may take a few minutes, depending on the number of files in your Dropbox.

    This change enables several improvements to the command line interface and GUI: The command maestral activity now shows the progress of individual uploads or downloads. maestral history has been added to list recent sync events. In the GUI, the recent changes menu now has been replaced by a "Activity" window which shows all sync events of the past week.

    This release also introduces clickable desktop notifications, performance improvements to indexing of local file changes, and bug fixes and smaller changes listed below.

    Finally, this release introduces support for macOS 11 (Big Sur).

    Added:

    • Added an option --external/-e to maestral log show to open the log in the platform's default program instead of showing it in the console.
    • Added a CLI command history to show all sync events of the past week.
    • Added a "Activity" window to show all sync events of the past week.
    • Desktop notifications are now clickable: for a single file change, clicking the notification will show the file in the platform's file manager. For a deletion, the Dropbox website is opened to provide options for restoring the file or folder.
    • Use entry points to discover GUI frontends. 3rd party GUIs can register a maestral_gui entry point to be launched with the maestral gui CLI command. If installed, maestral gui will default to the 1st party maestral-cocoa or maestral-qt GUIs on macOS and Linux, respectively.

    Changed:

    • Transition to short-lived auth tokens for newly linked accounts.
    • Transition to OAuth scopes for app permissions.
    • Save all sync history and local index in SQLite database.
    • Reduce unnecessary path conversions during indexing of local changes.
    • Improved performance on case-sensitive file systems.
    • Sync remote changes in filename even if they are only a change in casing. Those changes where previously ignored.
    • Attempt to preserve local file permissions when syncing unless the file id has changed. Dropbox servers do store file permissions but don't make them available through the public API. We therefore cannot sync file permissions and instead choose not to overwrite locally set permissions on every download.
    • Changed return type of Maestral.get_activity from namedtuple to dict for better consistency throughout the API. Every uploading or downloading item will have 'size' and 'completed' entries to monitor the progress of syncing individual items.
    • The CLI command maestral activity now shows the progress of uploads and downloads for individual files.
    • Introduced type annotations throughout and fixed a few type-related bugs.
    • Added a field "Sync threads" to the output of the CLI command maestral status.
    • The output of maestral ls is now printed in a grid, similar to the ls command included with most platforms.
    • The macOS app bundle now uses Python 3.8, leading to some performance improvements when moving or copying file system trees.
    • Prepared the GUI for changes in macOS Big Sur: use native alerts and dialogs wherever possible and refactor loading of libraries.
    • Use an asyncio event loop instead of Pyro's event loop to run the daemon. This enables integration with the Cocoa run loop and callbacks when clicking notifications.

    Fixed:

    • Fixes a bug where throttling of sync threads would raise an error when we cannot determine the CPU count.
    • Fixes a bug where sending SIGTERM to the daemon process would raise an error when we cannot determine its PID. Now, Stop.Failed is returned instead.
    • Fixes a bug which would result in incorrect systemd unit files for non-default config file names. Please disable and re-enable autostart with maestral autostart -Y|-N to replace old unit files.
    • Fixes a possible race condition when creating the cache directory.
    • Fixes error handling when a file is changed while uploading.

    Removed:

    • Support for config names with spaces. Spaces could cause issues with autostart entries on some platforms.
    • The ability to run the daemon in a separate thread. The daemon must now always be run inits own process.

    Dependencies:

    • Replaced jeepney dependency on Linux with dbus-next.
    Source code(tar.gz)
    Source code(zip)
    Maestral.dmg(11.90 MB)
  • v1.1.0(Jun 15, 2020)

    This release expands the CLI functionality and improves the handling of file modification times during upload and download (used for display purposes only). It also fixes bugs with the "start on login" functionality of the macOS app bundle. After updating, please toggle "start on login" in the GUI or maestral autostart in the CLI to replace any old login items on macOS.

    Added:

    • Added --include-deleted | -d option to maestral ls.
    • Added --long | -l option to maestral ls to include metadata in listing.
    • Added maestral revs command to list revisions of a file.
    • Added maestral restore command to restore an old revision of a file.

    Changed:

    • Always create config directory if it does not yet exist.
    • Improved performance of converting Dropbox paths to correctly cased local paths.
    • Renamed macOS executable inside app bundle from "main" to "Maestral". This results in more informative process names.
    • Local files are now created with the "last modified" time provided by Dropbox servers. This only applies to new downloads. To update existing modified times, you will need to delete and redownload your Dropbox folder.

    Fixed:

    • Fixes a thread-safety issue with desktop notifications.
    • Fixes a thread-safety issue when two frontends try to start or stop syncing at the same time.
    • Fixes an issue where Maestral could incorrectly identify a file system as case sensitive if the Dropbox folder and temporary directory are on partitions with different file systems.
    • Fixes incorrect file modification times uploaded to Dropbox for timezones outside of UTC. Those times are used for display purposes only.
    • Fixes an issue where the maestral autostart -Y CLI command would start the GUI on login in case of the macOS app bundle.
    Source code(tar.gz)
    Source code(zip)
    Maestral.dmg(9.93 MB)
  • v1.0.3(May 21, 2020)

    Thanks to generous Github sponsors, the macOS app bundle is now properly signed and notarized.

    Edit: The previous macOS app bundle had the wrong version number. This has been corrected now.

    Changed:

    • Both "-h" and "--help" can now be used to print help output for a command.
    • Show both the daemon and GUI version in the GUI settings window.
    • The command line tool bundled with the macOS app now provides proper help output.
    • Significantly reduced CPU usage of the GUI on macOS.
    • The macOS app now uses a hardened runtime and is properly signed and notarized.

    Fixed:

    • Fixes an issue which could lead to the local Dropbox folder being moved before syncing has been paused.
    • Fixes an issue where download errors would show a rev number instead of the Dropbox path.
    • Fixes a race condition when two processes try to start a sync daemon at the same time.
    • Fixes an issue in the macOS GUI where updating the displayed sync issues could fail.
    • Fixes truncated text in the macOS setup dialog.
    • Fixes an issue on fresh macOS installs where creating autostart entries could fail if /Library/LaunchAgents does not yet exist.
    • Fixes an issue in the macOS app bundle where installing the command line could tool would fail if /usr/local/bin is owned by root (as is default on a fresh install). Now, the user is asked for permission instead.

    Dependencies:

    • Removed lockfile dependency.
    • Added fasteners dependency.
    Source code(tar.gz)
    Source code(zip)
    Maestral.dmg(10.63 MB)
  • v1.0.3.beta1(May 14, 2020)

    Changed:

    • Significantly reduced CPU usage of the GUI on macOS.
    • Show both the daemon and GUI version in the GUI settings window.

    Fixed:

    • Fixes an issue which could lead to the local Dropbox folder being moved before syncing has been paused.
    • Fixes an issue where download errors would show a rev number instead of the Dropbox path.
    • Fixes a race condition when two processes try to start a sync daemon at the same time.
    • Fixes an issue in the macOS GUI where updating the displayed sync issues could fail.

    Dependencies:

    • Removed lockfile dependency.
    • Added fasteners dependency.
    Source code(tar.gz)
    Source code(zip)
    Maestral.dmg(10.25 MB)
  • v1.0.2(May 8, 2020)

    This release fixes bugs in the command line interface.

    Fixed:

    • Fixes a crash of the CLI when an update is available due to incorrect formatting of the update message.
    • Fixes an error when listing the contents of an empty directory with maestral ls.
    Source code(tar.gz)
    Source code(zip)
    Maestral.app.zip(10.51 MB)
  • v1.0.0(May 6, 2020)

    This is the first stable release of Maestral. There have been numerous bug fixes to error handling and platform integration as well as a few bug fixes to syncing itself. There are also a few outward facing changes: Pausing Maestral now cancels all pending sync jobs instead of waiting for them to complete. The macOS GUI switches from Qt to using a native Cocoa interface and the macOS app bundle finally includes a full command line interface which can be installed from the settings window.

    Added:

    • Command line tools are now bundled with the macOS app bundle and can be installed from the settings window.
    • Added support for config names with spaces.
    • Switch from Qt to a native Cocoa GUI on macOS. This reduces the size of the app bundle from 50 MB to 20 MB.
    • Expanded test suite to include sync tests.

    Changed:

    • Added '.dropbox' and '.dropbox.cache' to always excluded paths.
    • Pausing sync now cancels all pending uploads and downloads.
    • Quicker detection of connection problems.
    • Faster sync of local deletions.
    • The GUI now always launches a separate daemon process instead of an in-process daemon.
    • Temporary files during a download are now stored inside the Dropbox directory at '.maestral.cache'. This guarantees that temporary files always reside on the same partition as the Dropbox folder itself.
    • System tray icons are no longer installed in the platform theme in Linux. This is part of a workaround for a Qt issue on Linux desktops which causes unnecessarily large pixmap transfers over dBus when HiDPI support is enabled. Manually installed icons will still be respected.
    • Switch from implicit grant to PKCE OAuth2 flow.
    • Added public API to link a Dropbox account: Maestral.get_auth_url and Maestral.link. Frontends no longer need to import maestral.oauth.
    • Moved all command line dialogs from the main API to the CLI module.
    • Bumped watchdog requirement to >= 10.0.0 for more consistent error handling.
    • Added explicit jeepny dependency for Linux. This is a dependency of keyring but we use it by itself as well.
    • Improved the reliability of ignoring file system events caused by Maestral itself.

    Fixed:

    • Fixes an issue where a dropped internet connection during startup could result in continuous retries until the connection is finally established.
    • Fixes an issue where downloads of newly included folders would not resume after being interrupted.
    • Fixes an issue which could lead to false conflicting copies of folders in some cases.
    • Fixes the handling of inofify limit and permission errors when starting a file system watch.
    • Fixes handling of errors from too long file names.
    • Handle errors due to file names which are not allowed on the local file system.
    • Fixes handling of some uncaught insufficient disk space errors.
    • Fixes incorrect autostart entries on macOS.
    • Fixes a crash when running Maestral as a systemd service without python-systemd installed.
    • Fixes an issue when checking for updates if the list of releases from Github includes dev releases.
    • Fixes an issue where only remote changes would be listed in 'Recent changes' in the GUI.
    • Fixes the alignment of comboboxes in the Qt GUI on macOS.
    • Fixes a crash on macOS when no notification center is available, for instance in a headless session or on Github test runners.
    • Fixes a crash on Linux when the command line tool notify-send is not available.
    • Fixes an issue where sync errors would have incomplete path information.
    • Resolves an issue where indexing a large Dropbox folder with > 100,000 items would continuously timeout and restart in some cases.

    Removed:

    • Removed migration code for versions < 0.6.3. If you want to update to v1.0.0, please make sure to upgrade to at least version 0.6.3 first or unlink your Dropbox before updating to v1.0.0.
    • Removed u-msgpack dependency.
    Source code(tar.gz)
    Source code(zip)
    Maestral.app.zip(10.50 MB)
  • v0.6.4(Apr 3, 2020)

    The release provides bug fixes and minor improvements to the command line and graphical user interfaces. Importantly, it fixes an issue where some files could accidentally become un-indexed, resulting in incorrect conflict resolution.

    Added:

    • Config option to set the keyring backend. This defaults to 'automatic' but can be used to specify a preferred backend such as keyrings.backends.kwallet.DBusKeyring. You will need to migrate your credentials manually to the new keyring if you change this setting.
    • Added a --verbose flag to maestral start and maestral restart commands to print log output to stdout.
    • Added an API documentation for developers, available on Read the Docs.

    Changed:

    • During initial CLI setup, give the option to sync the entire Dropbox without paginating through individual folders to exclude.
    • Limit the number of notifications to keep in the notification center. This will only work for some desktop environments.
    • Fall back to plain text credential storage if neither Gnome Keyring, KWallet or any other storage implementing the Secret Service API can be found. A warning is shown when plain text storage is used.
    • Settings and setup windows are no longer always kept on top in Linux.
    • maestral start --foreground no longer prints log messages to stdout by default.

    Fixed:

    • Properly handle errors when moving files, for instance for sync conflicts.
    • Fixes an issue where some files could accidentally become un-indexed, resulting in incorrect conflict resolution.
    • Fixes an issue with macOS app bundles where the migration of configuration files was omitted after an update. This would result in a failure to start the daemon.
    • Correctly specify the required version of six to work around an upstream issue in Dropbox.
    • Fixes an issue where stdout would end up in the systemd journal in addition to the structured log messages.
    • Fixed a bug where XDG_DATA_HOME was ignored.
    Source code(tar.gz)
    Source code(zip)
    Maestral.app.zip(20.18 MB)
  • v0.6.3(Mar 21, 2020)

    This release fixes a critical error introduced when updating to v9.5 of the Dropbox Python SDK which prevented any remote changes from being downloaded.

    Changed:

    • Show release notes from all releases since last update in update dialog.
    • Use our own method instead of the psuitl package to determine the CPU usage. This eliminates the psuitl dependency which can be difficult to install on some systems.

    Fixed:

    • Fixes an issue with downloads failing because Dropbox Metadata is longer hashable from v9.5 of the Dropbox Python SDK.
    • Fixed a StopIteration exception on startup when the location of the maestral CLI script cannot be found in the package metadata.
    • Fixes an error when restarting the daemon with the "foreground" option.
    • Fixed incorrect button labels in the setup dialog when choosing whether to replace or keep an old Dropbox folder. The labels "Replace" and "Cancel" where switched.
    • Fixes a bug where the option "Unlink & Quit" in the "Revoked Access" error dialog would unlink but not quit Maestral.
    Source code(tar.gz)
    Source code(zip)
    Maestral.app.zip(20.89 MB)
  • v0.6.2(Mar 19, 2020)

    This release enables excluding individual files from syncing and fixes an issue which led to continuously retrying failed downloads. It also contains significant performance improvements to indexing, reduces the CPU usage when syncing a large number of files and introduces weekly re-indexing.

    This release also introduces support for an ".mignore" file with the same syntax as gitignore. This feature is considered 'alpha' and may change in the future. Feedback is welcome.

    Added:

    • Support excluding files from sync. This uses the same 'selective sync' interface as excluding folders. Excluded files will be removed from the local Dropbox folder.
    • Introduces an ".mignore" file to specify files that Maestral should ignore. The ".mignore" file must be saved in the local Dropbox folder. When excluding files or folders with selective sync (maestral exclude), they will be removed from the local folder and kept in the cloud only. The ".mignore" file enables the reverse: files or folders which exist locally will not be uploaded to Dropbox. It uses the same syntax as gitignore files and, similar to gitignore, files which are already tracked by Maestral will not be affected. More details are given in the Wiki.
    • Added a config option "max_cpu_percent" to adjust the target maximum CPU usage per CPU core. This defaults to 20%, i.e., 80% total for a quad core CPU. Maestral will aim to remain below that percentage but this is not guaranteed.

    Changed:

    • Replaced the excluded_files and excluded_folders settings from the config file with a unified excluded_items setting. Entries from excluded_folders will be migrated to the excluded_items setting.
    • Renamed methods which exclude / include folders to exclude_item etc.
    • Speed up creation of local folders.
    • When trying to create a file or folder with the same path as an item excluded by selective sync, the new item is now renamed by appending "selective sync conflict" instead of raising a sync issue. This is closer the behaviour of the official client.
    • Significant performance improvements to indexing and file event processing. Indexing a remote Dropbox with 20,000 to 30,000 files and comparing it a local folder now takes ~ 5 min, depending on on the average file size.
    • Introduced periodic reindexing every week. This has been made possible by the above performance improvements.

    Fixed:

    • Don't immediately retry when a download fails. Instead, save failed downloads and retry only on pause / resume or restart.
    • Fixes missing cursor and resulting unexpected ValidationError during sync startup.
    • Wait until all sync activity has stopped before moving the Dropbox folder. This avoids errors when trying to convert local to dropbox paths and vice versa during the move.
    • Fixes an issue which would prevent some conflicting copies created by Dropbox from being downloaded.
    • Correctly handle when a local item is renamed to an always excluded file name such as ".DS_STORE": the item is now deleted from Dropbox.
    • Fixes an issue where sharing an existing folder from the Dropbox website would result in the folder being deleted locally. This is because Dropbox actually removes the shared folder from the user's Dropbox and then re-mounts it as a shared drive / file system. We handle this correctly now by leaving the local folder alone or deleting and re-downloading it, depending on the time elapsed between removal and re-mounting.
    • Improves conflict resolution when a folder has been been replaced with a file or vice versa and both the local and remote item have un-synced changes.
    • Fixes an issue where maestral stop would block until all pending syncs have completed. This could potentially take a very long time for large downloads. Instead, any interrupted downloads will be restarted on next launch.
    Source code(tar.gz)
    Source code(zip)
    Maestral.app.zip(20.17 MB)
Freqtrade is a free and open source crypto trading bot written in Python.

Freqtrade is a free and open source crypto trading bot written in Python. It is designed to support all major exchanges and be controlled via Telegram. It contains backtesting, plotting and money management tools as well as strategy optimization by machine learning.

Kazune Takeda 5 Dec 30, 2021
Dns-Client-Server - Dns Client Server For Python

Dns-client-server DNS Server: supporting all types of queries and replies. Shoul

Nishant Badgujar 1 Feb 15, 2022
Raphtory-client - The python client for the Raphtory project

Raphtory Client This is the python client for the Raphtory project Install via p

Raphtory 5 Apr 28, 2022
Ethone-Selfbot - Open Source Discord Self-Bot, written in discord.py

Ethone SB Table of contents Newest open-source Discord SelfBot with useful commands and easy documentation on how to add your own and change the exist

Ethone 3 Jan 8, 2022
Drcom-pt-client - Drcom Pt version client with refresh timer

drcom-pt-client Drcom Pt version client with refresh timer Dr.com Pt版本客户端 可用于网页认

null 4 Nov 16, 2022
Clubhouse API written in Python. Standalone client included. For reference and education purposes only.

clubhouse-py is originally developed for the sake of interoperability. Standalone client is also created with very basic features, including but not limited to the audio-chat

null 1.7k Jan 5, 2023
Telegram client written in GTK & Python

Meowgram GTK Telegram Client ?? Why Meogram? Meowgram = Meow + Gram :D Meow - Talking cats sound. It's a symbol of unique and user friendly UI of clie

Artem Prokop 71 May 4, 2022
A GETTR API client written in Python.

GUTTR A GETTR client library written in Python. I rushed to get this out so it's a bit janky. Open an issue if something is broken or missing. Getting

Roger Johnston 13 Nov 23, 2022
A discord webhook client written in Python.

DiscordWebhook A discord webhook client written in Python. Installation pip install webhook-client Example from webhook_client import WebhookClient, E

Elijah 4 Nov 28, 2022
Discord-Lite - A light weight discord client written in Python, for developers, by developers.

Discord-Lite - A light weight discord client written in Python, for developers, by developers.

Sachit 142 Jan 7, 2023
Modern Desktop Jellyfin Client written in Python and Vue for the UI [WIP]

JellyPlayer Modern Jellyfin Client Installation Install Requirements: Install Python 3 Install dependencies Install node deps for frontend, go to Jell

Prayag Prajapati 57 Dec 12, 2022
Python client for the Socrata Open Data API

sodapy sodapy is a python client for the Socrata Open Data API. Installation You can install with pip install sodapy. If you want to install from sour

Cristina 368 Dec 9, 2022
Upbit(업비트) Cryptocurrency Exchange OPEN API Client for Python

Base Repository Python Upbit Client Repository Upbit OPEN API Client @Author: uJhin @GitHub: https://github.com/uJhin/upbit-client/ @Officia

Yu Jhin 37 Nov 6, 2022
Python: Asynchronous client for the Open-Meteo API.

Python: Asynchronous client for the Open-Meteo API. Asynchronous client for the Open-Meteo API. About Open-Meteo offers free weather forecast APIs for

Franck Nijhof 11 Dec 21, 2022
McTrade is a bot exploiting Binance API, open source! built in python !

Open Source Crypto Trading Bot using Binance API Report Bug · Request Feature Table of Contents About The Project Built With Getting Started Prerequis

Raphael Cohen 5 Jul 17, 2022
PepeSniper is an open-source Discord Nitro auto claimer/redeemer made in python.

PepeSniper is an open-source Discord Nitro auto claimer made in python. It sure as hell is not the fastest sniper out there but it gets the job done in a timely and stable manner. It also supports hosting on heroku for 24/7 sniping without your PC

Unknown User 1 Dec 22, 2021
Leakvertise is a Python open-source project which aims to bypass these fucking annoying captchas and ads from linkvertise, easily

Leakvertise Leakvertise is a Python open-source project which aims to bypass these fucking annoying captchas and ads from linkvertise, easily. You can

Quatrecentquatre 9 Oct 6, 2022
A minimal open source mtg-like tcg game made in python that can be played on a terminal emulator using a keyboard.

TCG-TERM Project state: ?? ?? ?? ?? Incomplete, In development ?? ?? ?? ?? (Keep in mind that at the moment, This project is currently undone, and wil

Amos 3 Aug 29, 2021
DevSecOps pipeline for Python based web app using Jenkins, Ansible, AWS, and open-source security tools and checks.

DevSecOps pipeline for Python Web App A Jenkins end-to-end DevSecOps pipeline for Python web application, hosted on AWS Ubuntu 20.04 Note: This projec

Devanshu Vashishtha 4 Aug 15, 2022