Open-source project
anishathalye/git-remote-dropbox avatar
anishathalye/git-remote-dropbox

git-remote-dropbox: Using a Dropbox Folder as a Real Git Remote

A transparent bridge between Git and Dropbox - use a Dropbox (shared) folder as a Git remote! 🎁

3,137 stars154 forksPythonMIT

At a glance

What is it?
git-remote-dropbox is a Git remote helper that talks to the Dropbox API directly, so a Dropbox or shared folder behaves like a normal remote. It is aimed at small teams who want a private remote without running a server, and it comes with real constraints: no shallow clones, and a strict rule against touching the repository with the Dropbox client.
Who is it for?
Adopt git-remote-dropbox if you want a private Git remote for a small group and are willing to install the helper on every machine and keep the Dropbox desktop client away from the repository folder. Do not adopt it if you need shallow clones or a hosted web interface.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 141 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • anishathalye/git-remote-dropbox3,137 ★ · +0
Star history
Repository2026-09-242026-11-14
anishathalye/git-remote-dropbox3.1k3.1k

0 Stars in the last 51 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

The problem git-remote-dropbox solves, and for whom

Small teams keep running into the same wall. They want a shared Git remote, but they do not want to run a server, rent a host, or push private code to a public forge. Dropbox is already paid for and already shared. The obvious move, dropping a bare repository into a shared folder and letting the desktop client sync it, is the one the README argues against most strongly. The client does not understand Git's on-disk format, so concurrent changes or sync delays can produce conflicts that corrupt the repository.

git-remote-dropbox takes a different route. It is a Git remote helper, the same extension point Git uses for other transport schemes, and it talks to the Dropbox API directly rather than through the desktop client. The README states that the helper "maintains all guarantees that are provided by a traditional Git remote" while using Dropbox as a backing store, which is what makes a shared folder usable for collaboration rather than just for syncing your own laptop and desktop.

The audience is narrow but real: developers who already pay for Dropbox, who want a remote that is private by default, and who accept installing a helper on every machine that touches the repository. It is not a replacement for a forge. There is no web UI, no pull request flow, no issue tracker.

How the bridge actually works

The architecture follows from two decisions visible in the repository. First, the package installs two console scripts, declared in pyproject.toml: `git-remote-dropbox` and `git-dropbox`. The first is the helper Git invokes when it sees a `dropbox://` URL; the second is the repository manager. Second, the only runtime dependency is `dropbox>=12,<13`, so all storage traffic goes through the Dropbox Python SDK over HTTP, not through the filesystem.

That explains the on-disk format. git-remote-dropbox stores data in a layout compatible with Git, described in the README as a directory containing `objects` and `refs`. Because the format is Git-compatible, the README documents a recovery path that does not involve the helper at all: download that directory from Dropbox, initialize an empty repository locally, replace `.git/refs` and `.git/objects` with the downloaded data, then check out a branch. That is a meaningful property. The remote is not a proprietary blob, and the helper is not a single point of failure for your history.

The helper also has to serialize concurrent writers, since Dropbox gives you no locking primitive. The README states the helper provides "identical guarantees in terms of atomicity even when there are concurrent operations, even when using a shared folder", and DESIGN.md exists in the repository as the place where that mechanism is documented. The README itself does not spell out the algorithm, so if you are evaluating the correctness claims rather than just using the tool, DESIGN.md is the file to read.

Installing git-remote-dropbox and pushing to a Dropbox remote

The README lists two prerequisites: `uv` (or another tool such as `pip`) and `git`. The recommended install is a uv tool install, which puts the helper on your PATH:

bash
uv tool install git-remote-dropbox

After that, confirm the helper is reachable. The README suggests `which git-remote-dropbox`; if that prints nothing, Git will not find the helper when you use a `dropbox://` URL, and the failure will look like an unknown transport rather than a missing install.

Authentication is OAuth and interactive. Running the login command opens the flow described in the README:

bash
git dropbox login

You can also scope access to an app folder with `git dropbox login --app-folder`. In that mode paths are rooted in a folder named git-remote-dropbox-repos under Apps in your Dropbox account. The README notes that app folders cannot be shared, so this option is for personal multi-machine use, not collaboration.

With the helper installed and an account logged in, cloning and adding a remote look like ordinary Git. The URL scheme is `dropbox:///path/to/repo`:

bash
git clone "dropbox:///path/to/repo"

For an existing local repository, add the remote and push. The README states the repository directory is created automatically the first time you push, so you do not need to create anything in Dropbox beforehand:

bash
git remote add origin "dropbox:///path/to/repo"
git push -u origin master

After that the remote behaves like any other. Multiple named accounts are supported with `git dropbox login <username>`, and you select one in the URL as `dropbox://username@/path/to/repo`. The README is explicit that these usernames are unrelated to your Dropbox login and exist only to organize accounts locally.

Sharing with other people, and the client-sync trap

Sharing is a two-step process that the helper does not do for you. You share the root folder of the repository through the Dropbox website, and each collaborator installs git-remote-dropbox and logs in with their own account. There is no invitation mechanism inside the helper, and no permission model beyond what Dropbox itself provides on the folder.

The operational rule that matters most is stated plainly in the README: do not interact with Git repositories in your Dropbox folder directly, and always use git-remote-dropbox. If the desktop client is running on the same machine, the README recommends selective sync and disabling sync for the folder holding the repository, to avoid conflicts. This is the sharpest limitation of the whole design. The tool works because it bypasses the client, so any machine where the client does sync that folder is a machine that can corrupt it.

Two more constraints are worth knowing before you commit. The helper does not support shallow cloning, so `--depth` is off the table. And cloning or fetching a large number of objects produces many loose objects, which the README addresses with `git gc --aggressive` to reclaim space locally. Neither is fatal for a small repository, but both shape how the tool fits into a workflow.

The git dropbox manager, and the HEAD problem

The second console script, exposed as `git dropbox`, handles account and repository management. The README lists its commands: `login [username]`, `logout [username]`, `show-logins`, `set-head <remote> <branch>`, and `version`. The `show-logins` command is the quickest way to confirm which accounts a machine has configured, which matters once you are juggling a personal and a work account.

The one that causes real confusion is `set-head`. If the remote HEAD is not set, a fresh clone will not check out a branch automatically, and you are left running `git checkout <branch>` by hand. That is a rough first experience for a collaborator who has never seen the tool before, and it is the kind of thing that gets reported as a bug when it is really unset state. Setting the default branch on the remote is the fix:

bash
git dropbox set-head origin master

The README does not document a rollback or undo path for this command, and it does not describe what happens if you point `set-head` at a branch that does not exist on the remote. Treat it as a one-way configuration change and confirm the branch name first. pyproject.toml also keeps a `git-dropbox-manage` entry point, with a comment explaining that older instructions told users to alias `git dropbox` to it, so existing configurations keep working.

How it compares to a bare repository on a server or a forge

The closest alternative is the one most teams already have: a bare repository on a host you control, reached over SSH or HTTPS. The difference is not the Git semantics, which are the same, but where the storage and the access control live. A bare repository on a server gives you SSH keys, hooks, and a filesystem you can inspect with normal tools. git-remote-dropbox gives you none of that. Access control is whatever Dropbox sharing gives you, and the transport is the Dropbox API, which means your push depends on Dropbox being reachable and your OAuth token being valid.

The other alternative is a hosted forge. That buys you a web interface, review tooling, and CI integration, none of which git-remote-dropbox has. What it costs is that your code lives on someone else's platform under their terms. The honest framing is that git-remote-dropbox trades tooling for privacy and for reusing storage you already pay for. If your team's workflow depends on pull requests and review comments, this is the wrong tool, and no amount of correct atomicity changes that.

There is also the naive approach the README spends two FAQ entries dismantling: putting a bare repository in a shared folder and letting the Dropbox client sync it. That is not an alternative so much as the failure mode this project exists to avoid.

Maintenance, licence and upgrade cost

The repository is not archived, and the last push was on 2026-06-27, so it is not abandoned. The repository has no published GitHub releases, so version pinning advice has to come from the package metadata rather than a changelog. The dependency range in pyproject.toml is `dropbox>=12,<13`, which is a deliberate upper bound: a major version bump of the Dropbox SDK would need a corresponding change here before you can move past it. That bound is the main upgrade consideration, because it caps how far the SDK can drift underneath you.

The declared Python floor is `requires-python = ">=3.7"`, and the project classifies itself as Production/Stable. The build backend is hatchling, and the repository configures mypy in strict mode plus ruff, so the codebase is type-checked. None of that guarantees behaviour, but it does mean contributions are held to a stricter bar than a typical small Python tool.

The licence is MIT, as stated in the repository's LICENSE.md and the classifier in pyproject.toml. In practical terms that is permissive: you can use, modify and redistribute the helper, including in commercial settings, provided you keep the copyright notice and licence text. That is a description of the licence, not legal advice, and if you are redistributing it inside a product you should read LICENSE.md yourself. The Dropbox side is a separate matter entirely: your use of the API is governed by your Dropbox account terms, not by this project's licence.

Editorial conclusion

Adopt git-remote-dropbox if you want a private Git remote for a small group and are willing to install the helper on every machine and keep the Dropbox desktop client away from the repository folder. Do not adopt it if you need shallow clones or a hosted web interface. Before trusting it with real work, verify three things: that `which git-remote-dropbox` resolves on every collaborator's PATH, that `git dropbox show-logins` lists the account each machine will use, and that the remote HEAD is set with `git dropbox set-head <remote> <branch>` so a fresh clone checks out a branch instead of leaving you in a detached state.

Frequently asked questions

How do I install git-remote-dropbox?

The README lists `uv` (or another tool such as `pip`) and `git` as prerequisites, then recommends installing the package with `uv tool install git-remote-dropbox`. After installing, `which git-remote-dropbox` should show that the helper is available on your PATH.

How do I use a Dropbox folder as a Git remote with git-remote-dropbox?

Log in once with `git dropbox login`, then clone with `git clone "dropbox:///path/to/repo"` or add the remote with `git remote add origin "dropbox:///path/to/repo"`. The README states the repository directory is created automatically the first time you push.

Does git-remote-dropbox support shallow cloning?

No. The README states that the remote helper does not support shallow cloning.

How do I recover a git-remote-dropbox repository without the helper?

The README says the on-disk format is compatible with Git: download the directory containing the `objects` and `refs` directories from Dropbox, initialize an empty repository locally, overwrite `.git/refs` and `.git/objects` with the downloaded data, then check out a branch. It also suggests running `git gc --aggressive` afterwards to save disk space.

Can I use git-remote-dropbox from behind a proxy server?

The README says you can use it from behind a proxy by setting the `HTTP_PROXY` and `HTTPS_PROXY` environment variables.

Official sources

  1. anishathalye/git-remote-dropbox on GitHub
  2. Issues
  3. License: MIT
  4. Project website
  5. README
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/anishathalye-git-remote-dropbox.svg)](https://hysenlabs.com/projects/anishathalye-git-remote-dropbox)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/anishathalye-git-remote-dropbox.svg)](https://hysenlabs.com/projects/anishathalye-git-remote-dropbox)

Was this useful?