1
0
mirror of https://github.com/rclone/rclone.git synced 2026-01-30 16:24:01 +00:00

Compare commits

...

24 Commits

Author SHA1 Message Date
Nick Craig-Wood
cbecc57ded docs: update making a new backend docs 2026-01-30 12:30:44 +00:00
Nick Craig-Wood
0cdfae3313 docs: build overview page from the backend data 2026-01-30 12:30:44 +00:00
Nick Craig-Wood
02e6c4fc26 docs: add tiering to the documentation - fixes #8873 2026-01-30 12:30:27 +00:00
Nick Craig-Wood
16f33824fe docs: add data about each backend in YAML format 2026-01-30 12:22:33 +00:00
Nick Craig-Wood
5b9925e19b docs: add bin/manage_backends.py for managing the backend data files 2026-01-30 11:52:35 +00:00
Nick Craig-Wood
315a148820 test_all: allow drime more time to complete 2026-01-30 11:51:56 +00:00
Nick Craig-Wood
b873f838db onedrive: fix permissions on onedrive Personal 2026-01-29 21:31:51 +00:00
Nick Craig-Wood
1d6f86900b onedrive: fix require sign in for Onedrive Personal
require_sign_in and regain_inherited_permissions in Onedrive Personal
have been brought into line with Onedrive Business.
2026-01-29 21:31:51 +00:00
Nick Craig-Wood
8a31921fb0 onedrive: Onedrive Personal no longer supports description
Uploading files with description set is no longer allowed with
Onedrive personal. This brings it into line with Onedrive business.
2026-01-29 21:31:51 +00:00
Nick Craig-Wood
c64161822d onedrive: fix setting modification time on directories for onedrive Personal
Onedrive Personal started ignoring the time parameters given to create
directory in the same way as onedrive Business.
2026-01-29 21:31:51 +00:00
Nick Craig-Wood
d660960775 onedrive: fix cancelling multipart upload
Before this change it was giving back "401 Unauthorized" however
removing the "Authorization: XXXX" from the request fixes the problem
as the auth is in the URL already.
2026-01-29 21:31:51 +00:00
Duncan Smart
7615636093 docs: fix WinFsp link in mount documentation 2026-01-29 10:27:24 +00:00
Nick Craig-Wood
cc9abcad06 cmount: make work under OpenBSD - fixes #1727 2026-01-29 10:24:33 +00:00
Nick Craig-Wood
5c4af237e4 vfs: make mount tests run on OpenBSD 2026-01-29 10:24:33 +00:00
albertony
90a57da9d5 docs: improve alignment of icons 2026-01-29 10:22:25 +00:00
Nick Craig-Wood
824257583c protondrive: update to use forks of upstream modules
This updates rclone to use forks of the upstream proton drive modules
in preparation for making changes.

The go-proton-api modules has had changes from master merged so rclone
and Proton-API-Bridge are using the same version.
2026-01-28 11:38:38 +00:00
Nick Craig-Wood
cd857754c7 Add hyusap to contributors 2026-01-28 11:38:31 +00:00
Nick Craig-Wood
017d930dfc Add Nick Owens to contributors 2026-01-28 11:38:31 +00:00
Nick Craig-Wood
6ed68883fe Add Mikel Olasagasti Uranga to contributors 2026-01-28 11:38:31 +00:00
hyusap
2a5e0b28c9 docs: fix googlephotos custom client_id instructions
The Google Photos custom client_id documentation was incomplete - it
only mentioned changing the scopes but did not mention that you need
to enable the "Photos Library API" instead of the "Google Drive API"
in step 3 of the referenced Google Drive instructions.

This fixes the documentation to clearly state both differences from
the Google Drive setup:
- Enable "Photos Library API" instead of "Google Drive API"
- Use the Google Photos specific scopes

Co-authored-by: hyusap <paulayush@gmail.com>
2026-01-27 13:48:12 +00:00
Nick Owens
264e75d892 cmount: fix OpenBSD mount support.
this pulls in https://github.com/winfsp/cgofuse/pull/100 to fix OpenBSD
mount support.

part of #1727
2026-01-27 13:47:00 +00:00
Mikel Olasagasti Uranga
4553c3de7b fs: fix bwlimit: correctly report minutes
Signed-off-by: Mikel Olasagasti Uranga <mikel@olasagasti.info>
2026-01-27 11:44:47 +00:00
Mikel Olasagasti Uranga
2e9e4a47a2 fs: fix bwlimit: use %d instead of %q for ints
Signed-off-by: Mikel Olasagasti Uranga <mikel@olasagasti.info>
2026-01-27 11:44:47 +00:00
necaran
e44829a448 mega: reverts TLS workaround
The workaround to include the obsolete cipher suite is no longer needed because storage endpoints now support TLS1.3.
2026-01-24 12:35:02 +00:00
107 changed files with 2514 additions and 263 deletions

View File

@@ -632,14 +632,22 @@ Add your backend to the docs - you'll need to pick an icon for it from
alphabetical order of full name of remote (e.g. `drive` is ordered as
`Google Drive`) but with the local file system last.
First add a data file about your backend in
`docs/data/backends/remote.yaml` - this is used to build the overview
tables and the tiering info.
- Create it with: `bin/manage_backends.py create docs/data/backends/remote.yaml`
- Edit it to fill in the blanks. Look at the [tiers docs](https://rclone.org/tiers/).
- Run this command to fill in the features: `bin/manage_backends.py features docs/data/backends/remote.yaml`
Next edit these files:
- `README.md` - main GitHub page
- `docs/content/remote.md` - main docs page (note the backend options are
automatically added to this file with `make backenddocs`)
- make sure this has the `autogenerated options` comments in (see your
reference backend docs)
- update them in your backend with `bin/make_backend_docs.py remote`
- `docs/content/overview.md` - overview docs - add an entry into the Features
table and the Optional Features table.
- `docs/content/docs.md` - list of remotes in config section
- `docs/content/_index.md` - front page of rclone.org
- `docs/layouts/chrome/navbar.html` - add it to the website navigation

View File

@@ -17,12 +17,10 @@ Improvements:
import (
"context"
"crypto/tls"
"encoding/base64"
"errors"
"fmt"
"io"
"net/http"
"path"
"slices"
"strings"
@@ -256,25 +254,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e
defer megaCacheMu.Unlock()
srv := megaCache[opt.User]
if srv == nil {
// srv = mega.New().SetClient(fshttp.NewClient(ctx))
// Workaround for Mega's use of insecure cipher suites which are no longer supported by default since Go 1.22.
// Relevant issues:
// https://github.com/rclone/rclone/issues/8565
// https://github.com/meganz/webclient/issues/103
clt := fshttp.NewClient(ctx)
clt.Transport = fshttp.NewTransportCustom(ctx, func(t *http.Transport) {
var ids []uint16
// Read default ciphers
for _, cs := range tls.CipherSuites() {
ids = append(ids, cs.ID)
}
// Insecure but Mega uses TLS_RSA_WITH_AES_128_GCM_SHA256 for storage endpoints
// (e.g. https://gfs302n114.userstorage.mega.co.nz) as of June 18, 2025.
t.TLSClientConfig.CipherSuites = append(ids, tls.TLS_RSA_WITH_AES_128_GCM_SHA256)
})
srv = mega.New().SetClient(clt)
srv = mega.New().SetClient(fshttp.NewClient(ctx))
srv.SetRetries(ci.LowLevelRetries) // let mega do the low level retries
srv.SetHTTPS(opt.UseHTTPS)
srv.SetLogger(func(format string, v ...any) {

View File

@@ -133,7 +133,7 @@ type RemoteItemFacet struct {
// FolderFacet groups folder-related data on OneDrive into a single structure
type FolderFacet struct {
ChildCount int64 `json:"childCount"` // Number of children contained immediately within this container.
ChildCount int64 `json:"childCount,omitempty"` // Number of children contained immediately within this container.
}
// HashesType groups different types of hashes into a single structure, for an item on OneDrive.

View File

@@ -60,7 +60,7 @@ var systemMetadataInfo = map[string]fs.MetadataHelp{
ReadOnly: true,
},
"description": {
Help: "A short description of the file. Max 1024 characters. Only supported for OneDrive Personal.",
Help: "A short description of the file. Max 1024 characters. No longer supported by Microsoft.",
Type: "string",
Example: "Contract for signing",
},
@@ -259,12 +259,8 @@ func (m *Metadata) Set(ctx context.Context, metadata fs.Metadata) (numSet int, e
m.btime = t
numSet++
case "description":
if m.fs.driveType != driveTypePersonal {
fs.Debugf(m.remote, "metadata description is only supported for OneDrive Personal -- skipping: %s", v)
continue
}
m.description = v
numSet++
fs.Debugf(m.remote, "metadata description is no longer supported -- skipping: %s", v)
continue
case "permissions":
if !m.fs.opt.MetadataPermissions.IsSet(rwWrite) {
continue
@@ -292,9 +288,6 @@ func (m *Metadata) toAPIMetadata() api.Metadata {
update := api.Metadata{
FileSystemInfo: &api.FileSystemInfoFacet{},
}
if m.description != "" && m.fs.driveType == driveTypePersonal {
update.Description = m.description
}
if !m.mtime.IsZero() {
update.FileSystemInfo.LastModifiedDateTime = api.Timestamp(m.mtime)
}
@@ -603,12 +596,10 @@ func (m *Metadata) addPermission(ctx context.Context, p *api.PermissionsType) (n
req := &api.AddPermissionsRequest{
Recipients: fillRecipients(p, m.fs.driveType),
RequireSignIn: m.fs.driveType != driveTypePersonal, // personal and business have conflicting requirements
RequireSignIn: true,
Roles: p.Roles,
}
if m.fs.driveType != driveTypePersonal {
req.RetainInheritedPermissions = false // not supported for personal
}
req.RetainInheritedPermissions = false
if p.Link != nil && p.Link.Scope == api.AnonymousScope {
link, err := m.fs.PublicLink(ctx, m.remote, fs.DurationOff, false)
@@ -816,15 +807,13 @@ func (f *Fs) MkdirMetadata(ctx context.Context, dir string, metadata fs.Metadata
if err != nil {
return nil, err
}
info, meta, err = f.createDir(ctx, parentID, dir, leaf, metadata)
_, meta, err = f.createDir(ctx, parentID, dir, leaf, metadata)
if err != nil {
return nil, err
}
if f.driveType != driveTypePersonal {
// for some reason, OneDrive Business needs this extra step to set modtime, while Personal does not. Seems like a bug...
fs.Debugf(dir, "setting time %v", meta.mtime)
info, err = meta.Write(ctx, false)
}
// for some reason, OneDrive Business and Personal needs this extra step to set modtime. Seems like a bug...
fs.Debugf(dir, "setting time %v", meta.mtime)
info, err = meta.Write(ctx, false)
} else if err == nil {
// Directory exists and needs updating
info, meta, err = f.updateDir(ctx, dirID, dir, metadata)

View File

@@ -2554,7 +2554,7 @@ func (o *Object) cancelUploadSession(ctx context.Context, url string) (err error
}
var resp *http.Response
err = o.fs.pacer.Call(func() (bool, error) {
resp, err = o.fs.srv.Call(ctx, &opts)
resp, err = o.fs.unAuth.Call(ctx, &opts)
return shouldRetry(ctx, resp, err)
})
return

View File

@@ -136,11 +136,6 @@ func (f *Fs) TestReadPermissions(t *testing.T, r *fstest.Run) {
_, expectedMeta := f.putWithMeta(ctx, t, &file1, []*api.PermissionsType{}) // return var intentionally switched here
permissions := defaultPermissions(f.driveType)
_, actualMeta := f.putWithMeta(ctx, t, &file1, permissions)
if f.driveType == driveTypePersonal {
perms, ok := actualMeta["permissions"]
assert.False(t, ok, fmt.Sprintf("permissions metadata key was unexpectedly found: %v", perms))
return
}
assert.JSONEq(t, expectedMeta["permissions"], actualMeta["permissions"])
}
@@ -159,7 +154,7 @@ func (f *Fs) TestReadMetadata(t *testing.T, r *fstest.Run) {
if slices.Contains(optionals, k) {
continue
}
if k == "description" && f.driveType != driveTypePersonal {
if k == "description" {
continue // not supported
}
gotV, ok := actualMeta[k]
@@ -196,7 +191,7 @@ func (f *Fs) TestDirectoryMetadata(t *testing.T, r *fstest.Run) {
if slices.Contains(optionals, k) {
continue
}
if k == "description" && f.driveType != driveTypePersonal {
if k == "description" {
continue // not supported
}
gotV, ok := actualMeta[k]
@@ -417,9 +412,7 @@ func (f *Fs) compareMeta(t *testing.T, expectedMeta, actualMeta fs.Metadata, ign
compareTimeStrings(t, k, v, gotV, time.Second)
continue
case "description":
if f.driveType != driveTypePersonal {
continue // not supported
}
continue // not supported
}
assert.True(t, ok, fmt.Sprintf("expected metadata key is missing: %v", k))
assert.Equal(t, v, gotV, actualMeta)

View File

@@ -10,8 +10,8 @@ import (
"strings"
"time"
protonDriveAPI "github.com/henrybear327/Proton-API-Bridge"
"github.com/henrybear327/go-proton-api"
protonDriveAPI "github.com/rclone/Proton-API-Bridge"
"github.com/rclone/go-proton-api"
"github.com/pquerna/otp/totp"

300
bin/manage_backends.py Executable file
View File

@@ -0,0 +1,300 @@
#!/usr/bin/env python3
"""
Manage the backend yaml files in docs/data/backends
usage: manage_backends.py [-h] {create,features,update,help} [files ...]
Manage rclone backend YAML files.
positional arguments:
{create,features,update,help}
Action to perform
files List of YAML files to operate on
options:
-h, --help show this help message and exit
"""
import argparse
import sys
import os
import yaml
import json
import subprocess
import time
import socket
from contextlib import contextmanager
from pprint import pprint
# --- Configuration ---
# The order in which keys should appear in the YAML file
CANONICAL_ORDER = [
"backend",
"name",
"tier",
"maintainers",
"features_score",
"integration_tests",
"data_integrity",
"performance",
"adoption",
"docs",
"security",
"virtual",
"remote",
"features",
"hashes",
"precision"
]
# Default values for fields when creating/updating
DEFAULTS = {
"tier": None,
"maintainers": None,
"features_score": None,
"integration_tests": None,
"data_integrity": None,
"performance": None,
"adoption": None,
"docs": None,
"security": None,
"virtual": False,
"remote": None,
"features": [],
"hashes": [],
"precision": None
}
# --- Test server management ---
def wait_for_tcp(address_str, delay=1, timeout=2, tries=60):
"""
Blocks until the specified TCP address (e.g., '172.17.0.3:21') is reachable.
"""
host, port = address_str.split(":")
port = int(port)
print(f"Waiting for {host}:{port}...")
for tri in range(tries):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.settimeout(timeout)
result = sock.connect_ex((host, port))
if result == 0:
print(f"Connected to {host}:{port} successfully!")
break
else:
print(f"Failed to connect to {host}:{port} try {tri} !")
time.sleep(delay)
def parse_init_output(binary_input):
"""
Parse the output of the init script
"""
decoded_str = binary_input.decode('utf-8')
result = {}
for line in decoded_str.splitlines():
if '=' in line:
key, value = line.split('=', 1)
result[key.strip()] = value.strip()
return result
@contextmanager
def test_server(remote):
"""Start the test server for remote if needed"""
remote_name = remote.split(":",1)[0]
init_script = "fstest/testserver/init.d/" + remote_name
if not os.path.isfile(init_script):
yield
return
print(f"--- Starting {init_script} ---")
out = subprocess.check_output([init_script, "start"])
out = parse_init_output(out)
pprint(out)
# Configure the server with environment variables
env_keys = []
for key, value in out.items():
env_key = f"RCLONE_CONFIG_{remote_name.upper()}_{key.upper()}"
env_keys.append(env_key)
os.environ[env_key] = value
for key,var in os.environ.items():
if key.startswith("RCLON"):
print(key, var)
if "_connect" in out:
wait_for_tcp(out["_connect"])
try:
yield
finally:
print(f"--- Stopping {init_script} ---")
subprocess.run([init_script, "stop"], check=True)
# Remove the env vars
for env_key in env_keys:
del os.environ[env_key]
# --- Helper Functions ---
def load_yaml(filepath):
if not os.path.exists(filepath):
return {}
with open(filepath, 'r', encoding='utf-8') as f:
return yaml.safe_load(f) or {}
def save_yaml(filepath, data):
# Reconstruct dictionary in canonical order
ordered_data = {}
# Add known keys in order
for key in CANONICAL_ORDER:
if key in data:
ordered_data[key] = data[key]
# Add any other keys that might exist (custom fields)
for key in data:
if key not in CANONICAL_ORDER:
ordered_data[key] = data[key]
# Ensure features are a sorted list (if present)
if 'features' in ordered_data and isinstance(ordered_data['features'], list):
ordered_data['features'].sort()
with open(filepath, 'w', encoding='utf-8') as f:
yaml.dump(ordered_data, f, default_flow_style=False, sort_keys=False, allow_unicode=True)
print(f"Saved {filepath}")
def get_backend_name_from_file(filepath):
"""
s3.yaml -> S3
azureblob.yaml -> Azureblob
"""
basename = os.path.basename(filepath)
name, _ = os.path.splitext(basename)
return name.title()
def fetch_rclone_features(remote_str):
"""
Runs `rclone backend features remote:` and returns the JSON object.
"""
cmd = ["rclone", "backend", "features", remote_str]
try:
with test_server(remote_str):
result = subprocess.run(cmd, capture_output=True, text=True, check=True)
return json.loads(result.stdout)
except subprocess.CalledProcessError as e:
print(f"Error running rclone: {e.stderr}")
return None
except FileNotFoundError:
print("Error: 'rclone' command not found in PATH.")
sys.exit(1)
# --- Verbs ---
def do_create(files):
for filepath in files:
if os.path.exists(filepath):
print(f"Skipping {filepath} (already exists)")
continue
data = DEFAULTS.copy()
# Set a default name based on filename
data['name'] = get_backend_name_from_file(filepath)
save_yaml(filepath, data)
def do_update(files):
for filepath in files:
if not os.path.exists(filepath):
print(f"Warning: {filepath} does not exist. Use 'create' first.")
continue
data = load_yaml(filepath)
modified = False
# Inject the filename as the 'backend'
file_backend = os.path.splitext(os.path.basename(filepath))[0]
if data.get('backend') != file_backend:
data['backend'] = file_backend
modified = True
print(f"[{filepath}] Updated backend to: {file_backend}")
# Add missing default fields
for key, default_val in DEFAULTS.items():
if key not in data:
data[key] = default_val
modified = True
print(f"[{filepath}] Added missing field: {key}")
# Special handling for 'name' if it was just added as None or didn't exist
if data.get('name') is None:
data['name'] = get_backend_name_from_file(filepath)
modified = True
print(f"[{filepath}] Set default name: {data['name']}")
if modified:
save_yaml(filepath, data)
else:
# We save anyway to enforce canonical order if the file was messy
save_yaml(filepath, data)
def do_features(files):
for filepath in files:
if not os.path.exists(filepath):
print(f"Error: {filepath} not found.")
continue
data = load_yaml(filepath)
remote = data.get('remote')
if not remote:
print(f"Error: [{filepath}] 'remote' field is missing or empty. Cannot fetch features.")
continue
print(f"[{filepath}] Fetching features for remote: '{remote}'...")
rclone_data = fetch_rclone_features(remote)
if not rclone_data:
print(f"Failed to fetch data for {filepath}")
continue
# Process Features (Dict -> Sorted List of True keys)
features_dict = rclone_data.get('Features', {})
# Filter only true values and sort keys
feature_list = sorted([k for k, v in features_dict.items() if v])
# Process Hashes
hashes_list = rclone_data.get('Hashes', [])
# Process Precision
precision = rclone_data.get('Precision')
# Update data
data['features'] = feature_list
data['hashes'] = hashes_list
data['precision'] = precision
save_yaml(filepath, data)
# --- Main CLI ---
def main():
parser = argparse.ArgumentParser(description="Manage rclone backend YAML files.")
parser.add_argument("verb", choices=["create", "features", "update", "help"], help="Action to perform")
parser.add_argument("files", nargs="*", help="List of YAML files to operate on")
args = parser.parse_args()
if args.verb == "help":
parser.print_help()
sys.exit(0)
if not args.files:
print("Error: No files specified.")
parser.print_help()
sys.exit(1)
if args.verb == "create":
do_create(args.files)
elif args.verb == "update":
do_update(args.files)
elif args.verb == "features":
do_features(args.files)
if __name__ == "__main__":
main()

View File

@@ -1,4 +1,4 @@
//go:build cmount && ((linux && cgo) || (darwin && cgo) || (freebsd && cgo) || windows)
//go:build cmount && ((linux && cgo) || (darwin && cgo) || (freebsd && cgo) || (openbsd && cgo) || windows)
package cmount
@@ -6,6 +6,7 @@ import (
"io"
"os"
"path"
"runtime"
"strings"
"sync"
"sync/atomic"
@@ -210,6 +211,12 @@ func (fsys *FS) Readdir(dirPath string,
// We can't seek in directories and FUSE should know that so
// return an error if ofst is ever set.
if ofst > 0 {
// However openbsd doesn't seem to know this - perhaps a bug in its
// FUSE implementation or a bug in cgofuse?
// See: https://github.com/billziss-gh/cgofuse/issues/49
if runtime.GOOS == "openbsd" {
return 0
}
return -fuse.ESPIPE
}

View File

@@ -1,4 +1,4 @@
//go:build cmount && ((linux && cgo) || (darwin && cgo) || (freebsd && cgo) || windows)
//go:build cmount && ((linux && cgo) || (darwin && cgo) || (freebsd && cgo) || (openbsd && cgo) || windows)
// Package cmount implements a FUSE mounting system for rclone remotes.
//
@@ -8,9 +8,9 @@ package cmount
import (
"errors"
"fmt"
"strings"
"os"
"runtime"
"strings"
"time"
"github.com/rclone/rclone/cmd/mountlib"
@@ -59,12 +59,14 @@ func mountOptions(VFS *vfs.VFS, device string, mountpoint string, opt *mountlib.
} else {
options = append(options, "-o", "fsname="+device)
options = append(options, "-o", "subtype=rclone")
options = append(options, "-o", fmt.Sprintf("max_readahead=%d", opt.MaxReadAhead))
// This causes FUSE to supply O_TRUNC with the Open
// call which is more efficient for cmount. However
// it does not work with cgofuse on Windows with
// WinFSP so cmount must work with or without it.
options = append(options, "-o", "atomic_o_trunc")
if runtime.GOOS != "openbsd" {
options = append(options, "-o", fmt.Sprintf("max_readahead=%d", opt.MaxReadAhead))
// This causes FUSE to supply O_TRUNC with the Open
// call which is more efficient for cmount. However
// it does not work with cgofuse on Windows with
// WinFSP so cmount must work with or without it.
options = append(options, "-o", "atomic_o_trunc")
}
if opt.DaemonTimeout != 0 {
options = append(options, "-o", fmt.Sprintf("daemon_timeout=%d", int(time.Duration(opt.DaemonTimeout).Seconds())))
}

View File

@@ -1,4 +1,4 @@
//go:build cmount && ((linux && cgo) || (darwin && cgo) || (freebsd && cgo) || windows) && (!race || !windows)
//go:build cmount && ((linux && cgo) || (darwin && cgo) || (freebsd && cgo) || (openbsd && cgo) || windows) && (!race || !windows)
// Package cmount implements a FUSE mounting system for rclone remotes.
//

View File

@@ -1,4 +1,4 @@
//go:build !((linux && cgo && cmount) || (darwin && cgo && cmount) || (freebsd && cgo && cmount) || (windows && cmount))
//go:build !((linux && cgo && cmount) || (darwin && cgo && cmount) || (freebsd && cgo && cmount) || (openbsd && cgo && cmount) || (windows && cmount))
// Package cmount implements a FUSE mounting system for rclone remotes.
//

View File

@@ -66,7 +66,7 @@ at all, then 1 PiB is set as both the total and the free size.
### Installing on Windows
To run `rclone @ on Windows`, you will need to
download and install [WinFsp](http://www.secfs.net/winfsp/).
download and install [WinFsp](https://winfsp.dev).
[WinFsp](https://github.com/winfsp/winfsp) is an open-source
Windows File System Proxy which makes it easy to write user space file

View File

@@ -246,7 +246,7 @@ These backends adapt or modify other storage providers:
## Links
- {{< icon "fa fa-home" >}} [Home page](https://rclone.org/)
- {{< icon "fab fa-github" >}} [GitHub project page for source and bug tracker](https://github.com/rclone/rclone)
- {{< icon "fa fa-comments" >}} [Rclone Forum](https://forum.rclone.org)
- {{< icon "fas fa-cloud-download-alt" >}}[Downloads](/downloads/)
- {{< icon "fa fa-home fa-fw" >}} [Home page](https://rclone.org/)
- {{< icon "fab fa-github fa-fw" >}} [GitHub project page for source and bug tracker](https://github.com/rclone/rclone)
- {{< icon "fa fa-comments fa-fw" >}} [Rclone Forum](https://forum.rclone.org)
- {{< icon "fas fa-cloud-download-alt fa-fw" >}}[Downloads](/downloads/)

View File

@@ -2,7 +2,7 @@
title: "Amazon Drive"
description: "Rclone docs for Amazon Drive"
versionIntroduced: "v1.20"
status: Deprecated
status: Removed
---
# {{< icon "fab fa-amazon" >}} Amazon Drive

View File

@@ -1067,3 +1067,6 @@ put them back in again. -->
- Qingwei Li <332664203@qq.com>
- yy <yhymmt37@gmail.com>
- Marc-Philip <marc-philip.werner@sap.com>
- Mikel Olasagasti Uranga <mikel@olasagasti.info>
- Nick Owens <mischief@offblast.org>
- hyusap <paulayush@gmail.com>

View File

@@ -2,7 +2,6 @@
title: "Cache"
description: "Rclone docs for cache remote"
versionIntroduced: "v1.39"
status: Deprecated
---
# {{< icon "fa fa-archive" >}} Cache
@@ -10,6 +9,9 @@ status: Deprecated
The `cache` remote wraps another existing remote and stores file structure
and its data for long running tasks like `rclone mount`.
It is **deprecated** so not recommended for use with new installations
and may be removed at some point.
## Status
The cache backend code is working but it currently doesn't

View File

@@ -2,7 +2,6 @@
title: "Chunker"
description: "Split-chunking overlay remote"
versionIntroduced: "v1.50"
status: Beta
---
# {{< icon "fa fa-cut" >}} Chunker

View File

@@ -2,7 +2,6 @@
title: "Compress"
description: "Compression Remote"
versionIntroduced: "v1.54"
status: Experimental
---
# {{< icon "fas fa-compress" >}} Compress

View File

@@ -659,8 +659,14 @@ second that each client_id can do set by Google.
If there is a problem with this client_id (eg quota too low or the
client_id stops working) then you can make your own.
Please follow the steps in [the google drive docs](https://rclone.org/drive/#making-your-own-client-id).
You will need these scopes instead of the drive ones detailed:
Please follow the steps in [the google drive docs](https://rclone.org/drive/#making-your-own-client-id)
with the following differences:
- At step 3, instead of enabling the "Google Drive API", search for and
enable the "Photos Library API".
- At step 5, you will need to add different scopes. Use these scopes
instead of the drive ones:
```text
https://www.googleapis.com/auth/photoslibrary.appendonly

View File

@@ -2,7 +2,6 @@
title: "Hasher"
description: "Better checksums for other remotes"
versionIntroduced: "v1.57"
status: Experimental
---
# {{< icon "fa fa-check-double" >}} Hasher

View File

@@ -2,7 +2,6 @@
title: "iCloud Drive"
description: "Rclone docs for iCloud Drive"
versionIntroduced: "v1.69"
status: Beta
---
# {{< icon "fa fa-cloud" >}} iCloud Drive

View File

@@ -14,105 +14,7 @@ show through.
Here is an overview of the major features of each cloud storage system.
| Name | Hash | ModTime | Case Insensitive | Duplicate Files | MIME Type | Metadata |
| ---------------------------- |:-----------------:|:-------:|:----------------:|:---------------:|:---------:|:--------:|
| 1Fichier | Whirlpool | - | No | Yes | R | - |
| Akamai Netstorage | MD5, SHA256 | R/W | No | No | R | - |
| Amazon S3 (or S3 compatible) | MD5 | R/W | No | No | R/W | RWU |
| Backblaze B2 | SHA1 | R/W | No | No | R/W | - |
| Box | SHA1 | R/W | Yes | No | - | - |
| Citrix ShareFile | MD5 | R/W | Yes | No | - | - |
| Cloudinary | MD5 | R | No | Yes | - | - |
| Drime | - | - | No | No | R/W | - |
| Dropbox | DBHASH ¹ | R | Yes | No | - | - |
| Enterprise File Fabric | - | R/W | Yes | No | R/W | - |
| FileLu Cloud Storage | MD5 | R/W | No | Yes | R | - |
| Filen | Blake3 | R/W | Yes | No | R/W | - |
| Files.com | MD5, CRC32 | DR/W | Yes | No | R | - |
| FTP | - | R/W ¹⁰ | No | No | - | - |
| Gofile | MD5 | DR/W | No | Yes | R | - |
| Google Cloud Storage | MD5 | R/W | No | No | R/W | - |
| Google Drive | MD5, SHA1, SHA256 | DR/W | No | Yes | R/W | DRWU |
| Google Photos | - | - | No | Yes | R | - |
| HDFS | - | R/W | No | No | - | - |
| HiDrive | HiDrive ¹² | R/W | No | No | - | - |
| HTTP | - | R | No | No | R | R |
| iCloud Drive | - | R | No | No | - | - |
| Internet Archive | MD5, SHA1, CRC32 | R/W ¹¹ | No | No | - | RWU |
| Jottacloud | MD5 | R/W | Yes | No | R | RW |
| Koofr | MD5 | - | Yes | No | - | - |
| Linkbox | - | R | No | No | - | - |
| Mail.ru Cloud | Mailru ⁶ | R/W | Yes | No | - | - |
| Mega | - | - | No | Yes | - | - |
| Memory | MD5 | R/W | No | No | - | - |
| Microsoft Azure Blob Storage | MD5 | R/W | No | No | R/W | - |
| Microsoft Azure Files Storage | MD5 | R/W | Yes | No | R/W | - |
| Microsoft OneDrive | QuickXorHash ⁵ | DR/W | Yes | No | R | DRW |
| OpenDrive | MD5 | R/W | Yes | Partial ⁸ | - | - |
| OpenStack Swift | MD5 | R/W | No | No | R/W | - |
| Oracle Object Storage | MD5 | R/W | No | No | R/W | RU |
| pCloud | MD5, SHA1 ⁷ | R/W | No | No | W | - |
| PikPak | MD5 | R | No | No | R | - |
| Pixeldrain | SHA256 | R/W | No | No | R | RW |
| premiumize.me | - | - | Yes | No | R | - |
| put.io | CRC-32 | R/W | No | Yes | R | - |
| Proton Drive | SHA1 | R/W | No | No | R | - |
| QingStor | MD5 | - ⁹ | No | No | R/W | - |
| Quatrix by Maytech | - | R/W | No | No | - | - |
| Seafile | - | - | No | No | - | - |
| SFTP | MD5, SHA1 ² | DR/W | Depends | No | - | - |
| Shade | - | - | Yes | No | - | - |
| Sia | - | - | No | No | - | - |
| SMB | - | R/W | Yes | No | - | - |
| SugarSync | - | - | No | No | - | - |
| Storj | - | R | No | No | - | - |
| Uloz.to | MD5, SHA256 ¹³ | - | No | Yes | - | - |
| WebDAV | MD5, SHA1 ³ | R ⁴ | Depends | No | - | - |
| Yandex Disk | MD5 | R/W | No | No | R | - |
| Zoho WorkDrive | - | - | No | No | - | - |
| The local filesystem | All | DR/W | Depends | No | - | DRWU |
¹ Dropbox supports [its own custom
hash](https://www.dropbox.com/developers/reference/content-hash).
This is an SHA256 sum of all the 4 MiB block SHA256s.
² SFTP supports checksums if the same login has shell access and
`md5sum` or `sha1sum` as well as `echo` are in the remote's PATH.
³ WebDAV supports hashes when used with Fastmail Files, Owncloud and Nextcloud only.
⁴ WebDAV supports modtimes when used with Fastmail Files, Owncloud and Nextcloud
only.
⁵ [QuickXorHash](https://docs.microsoft.com/en-us/onedrive/developer/code-snippets/quickxorhash)
is Microsoft's own hash.
⁶ Mail.ru uses its own modified SHA1 hash
⁷ pCloud only supports SHA1 (not MD5) in its EU region
⁸ Opendrive does not support creation of duplicate files using
their web client interface or other stock clients, but the underlying
storage platform has been determined to allow duplicate files, and it
is possible to create them with `rclone`. It may be that this is a
mistake or an unsupported feature.
⁹ QingStor does not support SetModTime for objects bigger than 5 GiB.
¹⁰ FTP supports modtimes for the major FTP servers, and also others
if they advertised required protocol extensions. See [this](/ftp/#modification-times)
for more details.
¹¹ Internet Archive requires option `wait_archive` to be set to a non-zero value
for full modtime support.
¹² HiDrive supports [its own custom
hash](https://static.hidrive.com/dev/0001).
It combines SHA1 sums for each 4 KiB block hierarchically to a single
top-level sum.
¹³ Uloz.to provides server-calculated MD5 hash upon file upload. MD5 and SHA256
hashes are client-calculated and stored as metadata fields.
{{< features-table >}}
### Hash
@@ -508,74 +410,7 @@ See [the metadata docs](/docs/#metadata) for more info.
All rclone remotes support a base command set. Other features depend
upon backend-specific capabilities.
| Name | Purge | Copy | Move | DirMove | CleanUp | ListR | StreamUpload | MultithreadUpload | LinkSharing | About | EmptyDir |
| ---------------------------- |:-----:|:----:|:----:|:-------:|:-------:|:-----:|:------------:|:------------------|:------------:|:-----:|:--------:|
| 1Fichier | No | Yes | Yes | No | No | No | No | No | Yes | No | Yes |
| Akamai Netstorage | Yes | No | No | No | No | Yes | Yes | No | No | No | Yes |
| Amazon S3 (or S3 compatible) | No | Yes | No | No | Yes | Yes | Yes | Yes | Yes | No | No |
| Backblaze B2 | No | Yes | No | No | Yes | Yes | Yes | Yes | Yes | No | No |
| Box | Yes | Yes | Yes | Yes | Yes | No | Yes | No | Yes | Yes | Yes |
| Citrix ShareFile | Yes | Yes | Yes | Yes | No | No | No | No | No | No | Yes |
| Drime | Yes | Yes | Yes | Yes | No | No | Yes | Yes | No | No | Yes |
| Dropbox | Yes | Yes | Yes | Yes | No | No | Yes | No | Yes | Yes | Yes |
| Cloudinary | No | No | No | No | No | No | Yes | No | No | No | No |
| Enterprise File Fabric | Yes | Yes | Yes | Yes | Yes | No | No | No | No | No | Yes |
| Filen | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes |
| Files.com | Yes | Yes | Yes | Yes | No | No | Yes | No | Yes | No | Yes |
| FTP | No | No | Yes | Yes | No | No | Yes | No | No | No | Yes |
| Gofile | Yes | Yes | Yes | Yes | No | No | Yes | No | Yes | Yes | Yes |
| Google Cloud Storage | Yes | Yes | No | No | No | No | Yes | No | No | No | No |
| Google Drive | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes |
| Google Photos | No | No | No | No | No | No | No | No | No | No | No |
| HDFS | Yes | No | Yes | Yes | No | No | Yes | No | No | Yes | Yes |
| HiDrive | Yes | Yes | Yes | Yes | No | No | Yes | No | No | No | Yes |
| HTTP | No | No | No | No | No | No | No | No | No | No | Yes |
| iCloud Drive | Yes | Yes | Yes | Yes | No | No | No | No | No | No | Yes |
| ImageKit | Yes | No | Yes | No | No | No | No | No | No | No | Yes |
| Internet Archive | No | Yes | No | No | Yes | Yes | No | No | Yes | Yes | No |
| Jottacloud | Yes | Yes | Yes | Yes | Yes | Yes | No | No | Yes | Yes | Yes |
| Koofr | Yes | Yes | Yes | Yes | No | No | Yes | No | Yes | Yes | Yes |
| Mail.ru Cloud | Yes | Yes | Yes | Yes | Yes | No | No | No | Yes | Yes | Yes |
| Mega | Yes | No | Yes | Yes | Yes | No | No | No | Yes | Yes | Yes |
| Memory | No | Yes | No | No | No | Yes | Yes | No | No | No | No |
| Microsoft Azure Blob Storage | Yes | Yes | No | No | No | Yes | Yes | Yes | No | No | No |
| Microsoft Azure Files Storage | No | Yes | Yes | Yes | No | No | Yes | Yes | No | Yes | Yes |
| Microsoft OneDrive | Yes | Yes | Yes | Yes | Yes | Yes ⁵ | No | No | Yes | Yes | Yes |
| OpenDrive | Yes | Yes | Yes | Yes | No | No | No | No | No | Yes | Yes |
| OpenStack Swift | Yes ¹ | Yes | No | No | No | Yes | Yes | No | No | Yes | No |
| Oracle Object Storage | No | Yes | No | No | Yes | Yes | Yes | Yes | No | No | No |
| pCloud | Yes | Yes | Yes | Yes | Yes | Yes | No | No | Yes | Yes | Yes |
| PikPak | Yes | Yes | Yes | Yes | Yes | No | No | No | Yes | Yes | Yes |
| Pixeldrain | Yes | No | Yes | Yes | No | No | Yes | No | Yes | Yes | Yes |
| premiumize.me | Yes | No | Yes | Yes | No | No | No | No | Yes | Yes | Yes |
| put.io | Yes | No | Yes | Yes | Yes | No | Yes | No | No | Yes | Yes |
| Proton Drive | Yes | No | Yes | Yes | Yes | No | No | No | No | Yes | Yes |
| QingStor | No | Yes | No | No | Yes | Yes | No | No | No | No | No |
| Quatrix by Maytech | Yes | Yes | Yes | Yes | No | No | No | No | No | Yes | Yes |
| Seafile | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes |
| SFTP | No | Yes ⁴| Yes | Yes | No | No | Yes | No | No | Yes | Yes |
| Sia | No | No | No | No | No | No | Yes | No | No | No | Yes |
| SMB | No | No | Yes | Yes | No | No | Yes | Yes | No | No | Yes |
| SugarSync | Yes | Yes | Yes | Yes | No | No | Yes | No | Yes | No | Yes |
| Storj | Yes ² | Yes | Yes | No | No | Yes | Yes | No | Yes | No | No |
| Uloz.to | No | No | Yes | Yes | No | No | No | No | No | No | Yes |
| WebDAV | Yes | Yes | Yes | Yes | No | No | Yes ³ | No | No | Yes | Yes |
| Yandex Disk | Yes | Yes | Yes | Yes | Yes | No | Yes | No | Yes | Yes | Yes |
| Zoho WorkDrive | Yes | Yes | Yes | Yes | No | No | No | No | No | Yes | Yes |
| The local filesystem | No | No | Yes | Yes | No | No | Yes | Yes | No | Yes | Yes |
¹ Note Swift implements this in order to delete directory markers but
it doesn't actually have a quicker way of deleting files other than
deleting them individually.
² Storj implements this efficiently only for entire buckets. If
purging a directory inside a bucket, files are deleted individually.
³ StreamUpload is not supported with Nextcloud
⁴ Use the `--sftp-copy-is-hardlink` flag to enable.
⁵ Use the `--onedrive-delta` flag to enable.
{{< optional-features-table >}}
### Purge

View File

@@ -2,7 +2,6 @@
title: "Proton Drive"
description: "Rclone docs for Proton Drive"
versionIntroduced: "v1.64.0"
status: Beta
---
# {{< icon "fa fa-folder" >}} Proton Drive

58
docs/content/tiers.md Normal file
View File

@@ -0,0 +1,58 @@
---
title: "Backend Support Tiers"
description: "A complete list of supported backends and their stability tiers."
---
# Tiers
Rclone backends are divided into tiers to give users an idea of the stability of each backend.
| Tier | Label | Intended meaning |
|--------|---------------|------------------|
| {{< tier tier="Tier 1" >}} | Core | Production-grade, first-class |
| {{< tier tier="Tier 2" >}} | Stable | Well-supported, minor gaps |
| {{< tier tier="Tier 3" >}} | Supported | Works for many uses; known caveats |
| {{< tier tier="Tier 4" >}} | Experimental | Use with care; expect gaps/changes |
| {{< tier tier="Tier 5" >}} | Deprecated | No longer maintained or supported |
## Overview
Here is a summary of all backends:
{{< tiers-table >}}
## Scoring
Here is how the backends are scored.
### Features
These are useful optional features a backend should have in rough
order of importance. Each one of these scores a point for the Features
column.
- F1: Hash(es)
- F2: Modtime
- F3: Stream upload
- F4: Copy/Move
- F5: DirMove
- F6: Metadata
- F7: MultipartUpload
### Tier
The tier is decided after determining these attributes. Some discretion is allowed in tiering as some of these attributes are more important than others.
| Attr | T1: Core | T2: Stable | T3: Supported | T4: Experimental | T5: Incubator |
|------|----------|------------|---------------|------------------|---------------|
| Maintainers | >=2 | >=1 | >=1 | >=0 | >=0 |
| API source | Official | Official | Either | Either | Either |
| Features (F1-F7) | >=5/7 | >=4/7 | >=3/7 | >=2/7 | N/A |
| Integration tests | All Green | All green | Nearly all green | Some Flaky | N/A |
| Error handling | Pacer | Pacer | Retries | Retries | N/A |
| Data integrity | Hashes, alt, modtime | Hashes or alt | Hash OR modtime | Best-effort | N/A |
| Perf baseline | Bench within 2x S3 | Bench doc | Anecdotal OK | Optional | N/A |
| Adoption | widely used | often used | some use | N/A | N/A |
| Docs completeness | Full | Full | Basic | Minimal | Minimal |
| Security | Principle-of-least-privilege | Reasonable scopes | Basic auth | Works | Works |

View File

@@ -0,0 +1,16 @@
backend: alias
name: Alias
tier: Tier 1
maintainers: Core
features_score: 7
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: true
remote: null
features: null
hashes: null
precision: null

View File

@@ -0,0 +1,43 @@
backend: archive
name: Archive
tier: Tier 3
maintainers: Core
features_score: 3
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Some use
docs: Full
security: High
virtual: true
remote: 'TestArchive:'
features:
- About
- CanHaveEmptyDirectories
- DirMove
- Move
- OpenWriterAt
- Overlay
- PartialUploads
- PutStream
- ReadMetadata
- SetWrapper
- UnWrap
- UserMetadata
- WrapFs
- WriteMetadata
hashes:
- md5
- sha1
- whirlpool
- crc32
- sha256
- sha512
- blake3
- xxh3
- xxh128
- dropbox
- hidrive
- mailru
- quickxor
precision: 1000000000

View File

@@ -0,0 +1,34 @@
backend: azureblob
name: Azure Blob
tier: Tier 1
maintainers: Core
features_score: 7
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestAzureBlob:'
features:
- BucketBased
- BucketBasedRootOK
- Copy
- DoubleSlash
- GetTier
- ListP
- ListR
- OpenChunkWriter
- Purge
- PutStream
- ReadMetadata
- ReadMimeType
- ServerSideAcrossConfigs
- SetTier
- UserMetadata
- WriteMetadata
- WriteMimeType
hashes:
- md5
precision: 1

View File

@@ -0,0 +1,30 @@
backend: azurefiles
name: Azure Files
tier: Tier 2
maintainers: Core
features_score: 6
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestAzureFiles:'
features:
- About
- CanHaveEmptyDirectories
- CaseInsensitive
- Copy
- DirMove
- ListP
- Move
- OpenWriterAt
- PartialUploads
- PutStream
- ReadMimeType
- SlowHash
- WriteMimeType
hashes:
- md5
precision: 1000000000

View File

@@ -0,0 +1,31 @@
backend: b2
name: B2
tier: Tier 1
maintainers: Core
features_score: 6
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestB2:'
features:
- BucketBased
- BucketBasedRootOK
- ChunkWriterDoesntSeek
- CleanUp
- Command
- Copy
- ListP
- ListR
- OpenChunkWriter
- PublicLink
- Purge
- PutStream
- ReadMimeType
- WriteMimeType
hashes:
- sha1
precision: 1000000

View File

@@ -0,0 +1,32 @@
backend: box
name: Box
tier: Tier 1
maintainers: Core
features_score: 6
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestBox:'
features:
- About
- CanHaveEmptyDirectories
- CaseInsensitive
- ChangeNotify
- CleanUp
- Copy
- DirCacheFlush
- DirMove
- ListP
- Move
- PublicLink
- Purge
- PutStream
- PutUnchecked
- Shutdown
hashes:
- sha1
precision: 1000000000

View File

@@ -0,0 +1,40 @@
backend: cache
name: Cache
tier: Tier 5
maintainers: None
features_score: 7
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Some use
docs: Full
security: High
virtual: true
remote: 'TestCache:'
features:
- About
- CanHaveEmptyDirectories
- Command
- DirCacheFlush
- DirMove
- Move
- Overlay
- PutStream
- SetWrapper
- UnWrap
- WrapFs
hashes:
- md5
- sha1
- whirlpool
- crc32
- sha256
- sha512
- blake3
- xxh3
- xxh128
- dropbox
- hidrive
- mailru
- quickxor
precision: 1

View File

@@ -0,0 +1,16 @@
backend: chunker
name: Chunker
tier: Tier 4
maintainers: None
features_score: 7
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Some use
docs: Full
security: High
virtual: true
remote: 'TestChunkerLocal:'
features: null
hashes: null
precision: null

View File

@@ -0,0 +1,18 @@
backend: cloudinary
name: Cloudinary
tier: Tier 3
maintainers: Core
features_score: 3
integration_tests: Failing
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestCloudinary:'
features:
- CanHaveEmptyDirectories
hashes:
- md5
precision: 3153600000000000000

View File

@@ -0,0 +1,49 @@
backend: combine
name: Combine
tier: Tier 1
maintainers: Core
features_score: 7
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: true
remote: TestCombine:dir1
features:
- About
- CanHaveEmptyDirectories
- DirModTimeUpdatesOnWrite
- DirMove
- DirSetModTime
- ListP
- MkdirMetadata
- Move
- OpenWriterAt
- Overlay
- PartialUploads
- PutStream
- ReadDirMetadata
- ReadMetadata
- SlowHash
- UserDirMetadata
- UserMetadata
- WriteDirMetadata
- WriteDirSetModTime
- WriteMetadata
hashes:
- md5
- sha1
- whirlpool
- crc32
- sha256
- sha512
- blake3
- xxh3
- xxh128
- dropbox
- hidrive
- mailru
- quickxor
precision: 1

View File

@@ -0,0 +1,39 @@
backend: compress
name: Compress
tier: Tier 4
maintainers: Core
features_score: 5
integration_tests: Failing
data_integrity: Hash
performance: Medium
adoption: Some use
docs: Full
security: High
virtual: true
remote: 'TestCompress:'
features:
- About
- CanHaveEmptyDirectories
- DirModTimeUpdatesOnWrite
- DirMove
- DirSetModTime
- ListP
- MkdirMetadata
- Move
- Overlay
- PartialUploads
- PutStream
- ReadDirMetadata
- ReadMetadata
- ReadMimeType
- SetWrapper
- UnWrap
- UserDirMetadata
- UserMetadata
- WrapFs
- WriteDirMetadata
- WriteDirSetModTime
- WriteMetadata
hashes:
- md5
precision: 1

View File

@@ -0,0 +1,16 @@
backend: crypt
name: Crypt
tier: Tier 1
maintainers: Core
features_score: 7
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: true
remote: 'TestCryptLocal:'
features: null
hashes: null
precision: null

View File

@@ -0,0 +1,16 @@
backend: doi
name: Doi
tier: Tier 2
maintainers: External
features_score: 0
integration_tests: N/A
data_integrity: Other
performance: High
adoption: Some use
docs: Full
security: High
virtual: false
remote: null
features: null
hashes: null
precision: null

View File

@@ -0,0 +1,27 @@
backend: drime
name: Drime
tier: Tier 1
maintainers: Core
features_score: 4
integration_tests: Passing
data_integrity: High
performance: High
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestDrime:'
features:
- CanHaveEmptyDirectories
- Copy
- DirCacheFlush
- DirMove
- Move
- OpenChunkWriter
- Purge
- PutStream
- PutUnchecked
- ReadMimeType
- WriteMimeType
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,48 @@
backend: drive
name: Drive
tier: Tier 1
maintainers: Core
features_score: 7
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestDrive:'
features:
- About
- CanHaveEmptyDirectories
- ChangeNotify
- CleanUp
- Command
- Copy
- DirCacheFlush
- DirMove
- DirSetModTime
- DuplicateFiles
- FilterAware
- ListP
- ListR
- MergeDirs
- MkdirMetadata
- Move
- PublicLink
- Purge
- PutStream
- PutUnchecked
- ReadDirMetadata
- ReadMetadata
- ReadMimeType
- UserDirMetadata
- UserMetadata
- WriteDirMetadata
- WriteDirSetModTime
- WriteMetadata
- WriteMimeType
hashes:
- md5
- sha1
- sha256
precision: 1000000

View File

@@ -0,0 +1,29 @@
backend: dropbox
name: Dropbox
tier: Tier 1
maintainers: Core
features_score: 6
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestDropbox:'
features:
- About
- CanHaveEmptyDirectories
- CaseInsensitive
- ChangeNotify
- Copy
- DirMove
- ListP
- Move
- PublicLink
- Purge
- PutStream
- Shutdown
hashes:
- dropbox
precision: 1000000000

View File

@@ -0,0 +1,26 @@
backend: fichier
name: Fichier
tier: Tier 3
maintainers: Core
features_score: 2
integration_tests: Passing
data_integrity: Hash
performance: Medium
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestFichier:'
features:
- About
- CanHaveEmptyDirectories
- Copy
- DirMove
- DuplicateFiles
- Move
- PublicLink
- PutUnchecked
- ReadMimeType
hashes:
- whirlpool
precision: 3153600000000000000

View File

@@ -0,0 +1,26 @@
backend: filefabric
name: Filefabric
tier: Tier 4
maintainers: Core
features_score: 3
integration_tests: Failing
data_integrity: Modtime
performance: Medium
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestFileFabric:'
features:
- CanHaveEmptyDirectories
- CaseInsensitive
- CleanUp
- Copy
- DirCacheFlush
- DirMove
- Move
- Purge
- ReadMimeType
- WriteMimeType
hashes: []
precision: 1000000000

View File

@@ -0,0 +1,21 @@
backend: filelu
name: Filelu
tier: Tier 1
maintainers: Core
features_score: 1
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestFileLu:'
features:
- About
- CanHaveEmptyDirectories
- Move
- Purge
- SlowHash
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,29 @@
backend: filen
name: Filen
tier: Tier 1
maintainers: External
features_score: 6
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestFilen:'
features:
- About
- CanHaveEmptyDirectories
- ChunkWriterDoesntSeek
- CleanUp
- DirMove
- ListR
- Move
- OpenChunkWriter
- Purge
- PutStream
- ReadMimeType
- WriteMimeType
hashes:
- blake3
precision: 1000000

View File

@@ -0,0 +1,29 @@
backend: filescom
name: Filescom
tier: Tier 1
maintainers: Core
features_score: 5
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestFilesCom:'
features:
- CanHaveEmptyDirectories
- CaseInsensitive
- Copy
- DirModTimeUpdatesOnWrite
- DirMove
- DirSetModTime
- Move
- PublicLink
- Purge
- PutStream
- ReadMimeType
hashes:
- md5
- crc32
precision: 1000000000

View File

@@ -0,0 +1,22 @@
backend: ftp
name: FTP
tier: Tier 1
maintainers: Core
features_score: 4
integration_tests: Passing
data_integrity: Modtime
performance: High
adoption: Widely used
docs: Full
security: Varies
virtual: false
remote: 'TestFTPProftpd:'
features:
- CanHaveEmptyDirectories
- DirMove
- Move
- PartialUploads
- PutStream
- Shutdown
hashes: []
precision: 1000000000

View File

@@ -0,0 +1,34 @@
backend: gofile
name: Gofile
tier: Tier 1
maintainers: Core
features_score: 5
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestGoFile:'
features:
- About
- CanHaveEmptyDirectories
- Copy
- DirCacheFlush
- DirModTimeUpdatesOnWrite
- DirMove
- DirSetModTime
- DuplicateFiles
- ListR
- MergeDirs
- Move
- PublicLink
- Purge
- PutStream
- PutUnchecked
- ReadMimeType
- WriteDirSetModTime
hashes:
- md5
precision: 1000000000

View File

@@ -0,0 +1,26 @@
backend: googlecloudstorage
name: Google Cloud Storage
tier: Tier 1
maintainers: Core
features_score: 6
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestGoogleCloudStorage:'
features:
- BucketBased
- BucketBasedRootOK
- CanHaveEmptyDirectories
- Copy
- ListP
- ListR
- PutStream
- ReadMimeType
- WriteMimeType
hashes:
- md5
precision: 1

View File

@@ -0,0 +1,20 @@
backend: googlephotos
name: Google Photos
tier: Tier 5
maintainers: None
features_score: 0
integration_tests: Failing
data_integrity: Other
performance: Low
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestGooglePhotos:'
features:
- Disconnect
- ReadMimeType
- Shutdown
- UserInfo
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,16 @@
backend: hasher
name: Hasher
tier: Tier 4
maintainers: Core
features_score: 7
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Some use
docs: Full
security: High
virtual: true
remote: null
features: null
hashes: null
precision: null

View File

@@ -0,0 +1,22 @@
backend: hdfs
name: HDFS
tier: Tier 2
maintainers: Core
features_score: 4
integration_tests: Passing
data_integrity: Modtime
performance: Medium
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestHdfs:'
features:
- About
- CanHaveEmptyDirectories
- DirMove
- Move
- Purge
- PutStream
hashes: []
precision: 1000000000

View File

@@ -0,0 +1,25 @@
backend: hidrive
name: Hidrive
tier: Tier 1
maintainers: Core
features_score: 5
integration_tests: Passing
data_integrity: Hash
performance: Medium
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestHiDrive:'
features:
- CanHaveEmptyDirectories
- Copy
- DirMove
- Move
- Purge
- PutStream
- PutUnchecked
- Shutdown
hashes:
- hidrive
precision: 1000000000

View File

@@ -0,0 +1,20 @@
backend: http
name: HTTP
tier: Tier 3
maintainers: Core
features_score: 0
integration_tests: N/A
data_integrity: Other
performance: High
adoption: Widely used
docs: Full
security: Varies
virtual: false
remote: ':http,url=''http://downloads.rclone.org'':'
features:
- CanHaveEmptyDirectories
- Command
- PutStream
- ReadMetadata
hashes: []
precision: 1000000000

View File

@@ -0,0 +1,16 @@
backend: iclouddrive
name: Iclouddrive
tier: Tier 4
maintainers: External
features_score: 3
integration_tests: Flaky
data_integrity: Modtime
performance: Low
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestICloudDrive:'
features: null
hashes: null
precision: null

View File

@@ -0,0 +1,23 @@
backend: imagekit
name: Imagekit
tier: Tier 1
maintainers: External
features_score: 0
integration_tests: Passing
data_integrity: Other
performance: High
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestImageKit:'
features:
- CanHaveEmptyDirectories
- FilterAware
- PublicLink
- Purge
- ReadMetadata
- ReadMimeType
- SlowHash
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,28 @@
backend: internetarchive
name: Internet Archive
tier: Tier 3
maintainers: Core
features_score: 5
integration_tests: Failing
data_integrity: Hash
performance: Medium
adoption: Widely used
docs: Full
security: High
virtual: false
remote: TestIA:rclone-integration-test
features:
- About
- BucketBased
- CleanUp
- Copy
- ListR
- PublicLink
- ReadMetadata
- UserMetadata
- WriteMetadata
hashes:
- md5
- sha1
- crc32
precision: 1

View File

@@ -0,0 +1,32 @@
backend: jottacloud
name: Jottacloud
tier: Tier 2
maintainers: Core
features_score: 6
integration_tests: Flaky
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestJottacloud:'
features:
- About
- CanHaveEmptyDirectories
- CaseInsensitive
- CleanUp
- Copy
- DirMove
- ListR
- Move
- PublicLink
- Purge
- ReadMetadata
- ReadMimeType
- Shutdown
- UserInfo
- WriteMetadata
hashes:
- md5
precision: 1000000000

View File

@@ -0,0 +1,25 @@
backend: koofr
name: Koofr
tier: Tier 2
maintainers: Core
features_score: 5
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestKoofr:'
features:
- About
- CanHaveEmptyDirectories
- CaseInsensitive
- Copy
- DirMove
- Move
- PublicLink
- PutStream
hashes:
- md5
precision: 1000000

View File

@@ -0,0 +1,20 @@
backend: linkbox
name: Linkbox
tier: Tier 5
maintainers: Core
features_score: 2
integration_tests: Failing
data_integrity: Modtime
performance: High
adoption: Often used
docs: Basic
security: High
virtual: false
remote: 'TestLinkbox:'
features:
- CanHaveEmptyDirectories
- CaseInsensitive
- DirCacheFlush
- Purge
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,50 @@
backend: local
name: Local
tier: Tier 1
maintainers: Core
features_score: 7
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: .
features:
- About
- CanHaveEmptyDirectories
- Command
- DirModTimeUpdatesOnWrite
- DirMove
- DirSetModTime
- FilterAware
- IsLocal
- MkdirMetadata
- Move
- OpenWriterAt
- PartialUploads
- PutStream
- ReadDirMetadata
- ReadMetadata
- SlowHash
- UserDirMetadata
- UserMetadata
- WriteDirMetadata
- WriteDirSetModTime
- WriteMetadata
hashes:
- md5
- sha1
- whirlpool
- crc32
- sha256
- sha512
- blake3
- xxh3
- xxh128
- dropbox
- hidrive
- mailru
- quickxor
precision: 1

View File

@@ -0,0 +1,27 @@
backend: mailru
name: Mailru
tier: Tier 1
maintainers: External
features_score: 6
integration_tests: Passing
data_integrity: Hash
performance: Medium
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestMailru:'
features:
- About
- CanHaveEmptyDirectories
- CaseInsensitive
- CleanUp
- Copy
- DirMove
- Move
- PublicLink
- Purge
- ServerSideAcrossConfigs
hashes:
- mailru
precision: 1000000000

View File

@@ -0,0 +1,27 @@
backend: mega
name: Mega
tier: Tier 2
maintainers: Core
features_score: 3
integration_tests: Flaky
data_integrity: Other
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestMega:'
features:
- About
- CanHaveEmptyDirectories
- CleanUp
- DirCacheFlush
- DirMove
- DuplicateFiles
- MergeDirs
- Move
- PublicLink
- Purge
- PutUnchecked
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,25 @@
backend: memory
name: Memory
tier: Tier 1
maintainers: Core
features_score: 4
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: ':memory:'
features:
- BucketBased
- BucketBasedRootOK
- Copy
- ListP
- ListR
- PutStream
- ReadMimeType
- WriteMimeType
hashes:
- md5
precision: 1

View File

@@ -0,0 +1,22 @@
backend: netstorage
name: Netstorage
tier: Tier 1
maintainers: Core
features_score: 3
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestnStorage:'
features:
- CanHaveEmptyDirectories
- Command
- ListR
- Purge
- PutStream
hashes:
- md5
precision: 1000000000

View File

@@ -0,0 +1,38 @@
backend: onedrive
name: Onedrive
tier: Tier 1
maintainers: Core
features_score: 6
integration_tests: Flaky
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestOneDrive:'
features:
- About
- CanHaveEmptyDirectories
- CaseInsensitive
- ChangeNotify
- CleanUp
- Copy
- DirCacheFlush
- DirMove
- DirSetModTime
- ListP
- MkdirMetadata
- Move
- PublicLink
- Purge
- ReadDirMetadata
- ReadMetadata
- ReadMimeType
- Shutdown
- WriteDirMetadata
- WriteDirSetModTime
- WriteMetadata
hashes:
- quickxor
precision: 1000000000

View File

@@ -0,0 +1,25 @@
backend: opendrive
name: Opendrive
tier: Tier 1
maintainers: Core
features_score: 5
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestOpenDrive:'
features:
- About
- CanHaveEmptyDirectories
- CaseInsensitive
- Copy
- DirCacheFlush
- DirMove
- Move
- Purge
hashes:
- md5
precision: 1000000000

View File

@@ -0,0 +1,32 @@
backend: oracleobjectstorage
name: Oracle Object Storage
tier: Tier 1
maintainers: Core
features_score: 6
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestOracleObjectStorage:'
features:
- BucketBased
- BucketBasedRootOK
- CleanUp
- Command
- Copy
- GetTier
- ListP
- ListR
- OpenChunkWriter
- PutStream
- ReadMetadata
- ReadMimeType
- SetTier
- SlowModTime
- WriteMimeType
hashes:
- md5
precision: 1000000

View File

@@ -0,0 +1,31 @@
backend: pcloud
name: Pcloud
tier: Tier 1
maintainers: Core
features_score: 5
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestPcloud:'
features:
- About
- CanHaveEmptyDirectories
- ChangeNotify
- Copy
- DirCacheFlush
- DirMove
- ListP
- ListR
- Move
- PartialUploads
- PublicLink
- Purge
- Shutdown
hashes:
- sha1
- sha256
precision: 1000000000

View File

@@ -0,0 +1,30 @@
backend: pikpak
name: Pikpak
tier: Tier 1
maintainers: External
features_score: 5
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestPikPak:'
features:
- About
- CanHaveEmptyDirectories
- CleanUp
- Command
- Copy
- DirCacheFlush
- DirMove
- Move
- NoMultiThreading
- PublicLink
- Purge
- ReadMimeType
- UserInfo
hashes:
- md5
precision: 3153600000000000000

View File

@@ -0,0 +1,29 @@
backend: pixeldrain
name: Pixeldrain
tier: Tier 1
maintainers: Core
features_score: 7
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestPixeldrain:'
features:
- About
- CanHaveEmptyDirectories
- ChangeNotify
- DirMove
- DirSetModTime
- Move
- PublicLink
- Purge
- PutStream
- ReadMetadata
- ReadMimeType
- WriteMetadata
hashes:
- sha256
precision: 1000000

View File

@@ -0,0 +1,27 @@
backend: premiumizeme
name: Premiumizeme
tier: Tier 3
maintainers: Core
features_score: 2
integration_tests: Passing
data_integrity: Other
performance: High
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestPremiumizeMe:'
features:
- About
- CanHaveEmptyDirectories
- CaseInsensitive
- DirCacheFlush
- DirMove
- Move
- PublicLink
- Purge
- PutUnchecked
- ReadMimeType
- Shutdown
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,27 @@
backend: protondrive
name: Proton Drive
tier: Tier 5
maintainers: None
features_score: 4
integration_tests: Failing
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestProtonDrive:'
features:
- About
- CanHaveEmptyDirectories
- CleanUp
- DirCacheFlush
- DirMove
- Disconnect
- Move
- NoMultiThreading
- Purge
- ReadMimeType
hashes:
- sha1
precision: 1000000000

View File

@@ -0,0 +1,28 @@
backend: putio
name: Putio
tier: Tier 2
maintainers: Core
features_score: 5
integration_tests: Flaky
data_integrity: Hash
performance: Low
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestPutio:'
features:
- About
- CanHaveEmptyDirectories
- CleanUp
- Copy
- DirCacheFlush
- DirMove
- DuplicateFiles
- Move
- Purge
- PutUnchecked
- ReadMimeType
hashes:
- crc32
precision: 1000000000

View File

@@ -0,0 +1,25 @@
backend: qingstor
name: Qingstor
tier: Tier 3
maintainers: Core
features_score: 3
integration_tests: Disabled
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestQingStor:'
features:
- BucketBased
- BucketBasedRootOK
- CleanUp
- Copy
- ListR
- ReadMimeType
- SlowModTime
- WriteMimeType
hashes:
- md5
precision: 3153600000000000000

View File

@@ -0,0 +1,24 @@
backend: quatrix
name: Quatrix
tier: Tier 3
maintainers: Core
features_score: 3
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestQuatrix:'
features:
- About
- CanHaveEmptyDirectories
- Copy
- DirCacheFlush
- DirMove
- Move
- PartialUploads
- Purge
hashes: []
precision: 1000

View File

@@ -0,0 +1,37 @@
backend: s3
name: S3
tier: Tier 1
maintainers: Core
features_score: 7
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestS3:'
features:
- BucketBased
- BucketBasedRootOK
- CleanUp
- Command
- Copy
- DoubleSlash
- GetTier
- ListP
- ListR
- OpenChunkWriter
- PublicLink
- Purge
- PutStream
- ReadMetadata
- ReadMimeType
- SetTier
- SlowModTime
- UserMetadata
- WriteMetadata
- WriteMimeType
hashes:
- md5
precision: 1

View File

@@ -0,0 +1,28 @@
backend: seafile
name: Seafile
tier: Tier 3
maintainers: Core
features_score: 3
integration_tests: Failing
data_integrity: Other
performance: Medium
adoption: Some use
docs: Basic
security: High
virtual: false
remote: 'TestSeafile:'
features:
- About
- CanHaveEmptyDirectories
- CleanUp
- Copy
- DirMove
- ListR
- Move
- PublicLink
- Purge
- PutStream
- Shutdown
- UserInfo
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,29 @@
backend: sftp
name: SFTP
tier: Tier 1
maintainers: Core
features_score: 5
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestSFTPOpenssh:'
features:
- About
- CanHaveEmptyDirectories
- Copy
- DirModTimeUpdatesOnWrite
- DirMove
- DirSetModTime
- Move
- PartialUploads
- PutStream
- Shutdown
- SlowHash
hashes:
- md5
- sha1
precision: 1000000000

View File

@@ -0,0 +1,20 @@
backend: shade
name: Shade
tier: Tier 1
maintainers: External
features_score: 0
integration_tests: Passing
data_integrity: Other
performance: High
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestShade:'
features:
- CanHaveEmptyDirectories
- DirMove
- Move
- OpenChunkWriter
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,17 @@
backend: sharefile
name: Sharefile
tier: Tier 5
maintainers: Core
features_score: 4
integration_tests: Disabled
data_integrity: Modtime
performance: Medium
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestSharefile:'
features: null
hashes:
- md5
precision: 1000000000

View File

@@ -0,0 +1,18 @@
backend: sia
name: Sia
tier: Tier 4
maintainers: Core
features_score: 1
integration_tests: Failing
data_integrity: Other
performance: Medium
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestSia:'
features:
- CanHaveEmptyDirectories
- PutStream
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,26 @@
backend: smb
name: SMB
tier: Tier 2
maintainers: External
features_score: 5
integration_tests: Passing
data_integrity: Modtime
performance: Medium
adoption: Some use
docs: Full
security: High
virtual: false
remote: TestSMB:rclone
features:
- About
- BucketBased
- CanHaveEmptyDirectories
- CaseInsensitive
- DirMove
- Move
- OpenWriterAt
- PartialUploads
- PutStream
- Shutdown
hashes: []
precision: 1000000

View File

@@ -0,0 +1,24 @@
backend: storj
name: Storj
tier: Tier 1
maintainers: Core
features_score: 4
integration_tests: Passing
data_integrity: Modtime
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestStorj:'
features:
- BucketBased
- BucketBasedRootOK
- Copy
- ListR
- Move
- PublicLink
- Purge
- PutStream
hashes: []
precision: 1

View File

@@ -0,0 +1,26 @@
backend: sugarsync
name: Sugarsync
tier: Tier 3
maintainers: Core
features_score: 3
integration_tests: Passing
data_integrity: Other
performance: Medium
adoption: Some use
docs: Full
security: High
virtual: false
remote: TestSugarSync:Test
features:
- CanHaveEmptyDirectories
- CaseInsensitive
- Copy
- DirCacheFlush
- DirMove
- Move
- PublicLink
- Purge
- PutStream
- PutUnchecked
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,28 @@
backend: swift
name: Swift
tier: Tier 1
maintainers: Core
features_score: 4
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestSwiftAIO:'
features:
- About
- BucketBased
- BucketBasedRootOK
- Copy
- ListP
- ListR
- Purge
- PutStream
- ReadMimeType
- SlowModTime
- WriteMimeType
hashes:
- md5
precision: 1

View File

@@ -0,0 +1,25 @@
backend: ulozto
name: Ulozto
tier: Tier 3
maintainers: Core
features_score: 3
integration_tests: Failing
data_integrity: Hash
performance: Medium
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestUlozto:'
features:
- About
- CanHaveEmptyDirectories
- DirCacheFlush
- DirMove
- DuplicateFiles
- Move
- PutUnchecked
hashes:
- md5
- sha256
precision: 1000

View File

@@ -0,0 +1,47 @@
backend: union
name: Union
tier: Tier 1
maintainers: Core
features_score: 7
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: true
remote: 'TestUnion:'
features:
- About
- CanHaveEmptyDirectories
- DirModTimeUpdatesOnWrite
- DirMove
- DirSetModTime
- MkdirMetadata
- Move
- Overlay
- PartialUploads
- PutStream
- ReadDirMetadata
- ReadMetadata
- SlowHash
- UserDirMetadata
- UserMetadata
- WriteDirMetadata
- WriteDirSetModTime
- WriteMetadata
hashes:
- md5
- sha1
- whirlpool
- crc32
- sha256
- sha512
- blake3
- xxh3
- xxh128
- dropbox
- hidrive
- mailru
- quickxor
precision: 1

View File

@@ -0,0 +1,24 @@
backend: webdav
name: WebDAV
tier: Tier 1
maintainers: Core
features_score: 5
integration_tests: Passing
data_integrity: Hash
performance: Low
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestWebdavNextcloud:'
features:
- About
- CanHaveEmptyDirectories
- Copy
- DirMove
- ListP
- Move
- Purge
hashes:
- sha1
precision: 1000000000

View File

@@ -0,0 +1,27 @@
backend: yandex
name: Yandex
tier: Tier 1
maintainers: External
features_score: 5
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestYandex:'
features:
- About
- CanHaveEmptyDirectories
- CleanUp
- Copy
- DirMove
- Move
- PublicLink
- Purge
- PutStream
- ReadMimeType
hashes:
- md5
precision: 1

View File

@@ -0,0 +1,23 @@
backend: zoho
name: Zoho
tier: Tier 3
maintainers: External
features_score: 2
integration_tests: Failing
data_integrity: Other
performance: Medium
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestZoho:'
features:
- About
- CanHaveEmptyDirectories
- Copy
- DirCacheFlush
- DirMove
- Move
- Purge
hashes: []
precision: 3153600000000000000

View File

@@ -41,7 +41,12 @@
{{ with .Params.status | lower }}
{{ $statusCode := . }}
{{ $statusMessage := index $statusMap $statusCode }}
<span class="badge badge-pill badge-danger float-right" style="margin-top: 30px; font-size: 100%" title="{{ $statusMessage }}">{{ $statusCode }}</span>
<span class="badge badge-pill badge-danger float-right" style="margin-top: 30px; font-size: 100%" title="{{ $statusMessage }}">{{ $statusCode | title }}</span>
{{ end }}
{{ if .Page.File }}
{{ $backendName := .Page.File.TranslationBaseName }}
{{ partial "tier.html" (dict "name" $backendName "align" true) }}
{{ end }}
{{ block "main" . }}

View File

@@ -51,6 +51,7 @@
</a>
<div class="dropdown-menu pre-scrollable" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="/overview/"><i class="fas fa-map fa-fw"></i> Overview</a>
<a class="dropdown-item" href="/tiers/"><i class="fas fa-map fa-fw"></i> Support Tiers</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="/fichier/"><i class="fa fa-archive fa-fw"></i> 1Fichier</a>
<a class="dropdown-item" href="/netstorage/"><i class="fas fa-database fa-fw"></i> Akamai NetStorage</a>
@@ -71,7 +72,7 @@
<a class="dropdown-item" href="/filefabric/"><i class="fa fa-cloud fa-fw"></i> Enterprise File Fabric</a>
<a class="dropdown-item" href="/filelu/"><i class="fa fa-folder fa-fw"></i> FileLu Cloud Storage</a>
<a class="dropdown-item" href="/s3/#filelu-s5"><i class="fa fa-folder fa-fw"></i> FileLu S5 (S3-Compatible)</a>
<a class="dropdown-item" href="/filen/"><i class="fa fa-solid fa-f"></i> Filen</a>
<a class="dropdown-item" href="/filen/"><i class="fa fa-solid fa-f fa-fw"></i> Filen</a>
<a class="dropdown-item" href="/filescom/"><i class="fa fa-brands fa-files-pinwheel fa-fw"></i> Files.com</a>
<a class="dropdown-item" href="/ftp/"><i class="fa fa-file fa-fw"></i> FTP</a>
<a class="dropdown-item" href="/gofile/"><i class="fa fa-folder fa-fw"></i> Gofile</a>

View File

@@ -0,0 +1,6 @@
{{ if . }}
<span class="text-success">&#10004;</span>
{{ else }}
<span class="text-danger">&#10006;</span>
{{ end }}

View File

@@ -0,0 +1,42 @@
{{/* Context: Accepts .tier (string) OR .name (string) for lookup. Optional: .align (bool) */}}
{{ $tierColors := dict
"Tier 1" "success"
"Tier 2" "success"
"Tier 3" "warning"
"Tier 4" "danger"
"Tier 5" "danger"
}}
{{ $tierMessages := dict
"Tier 1" "Core: Production-grade, first-class"
"Tier 2" "Stable: Well-supported, minor gaps"
"Tier 3" "Supported: Works for many uses; known caveats"
"Tier 4" "Experimental: Use with care; expect gaps/changes"
"Tier 5" "Deprecated: No longer maintained or supported"
}}
{{/* Determine the Tier Name */}}
{{ $currentTier := "" }}
{{ if .tier }}
{{/* Direct Tier Usage */}}
{{ $currentTier = .tier }}
{{ else if .name }}
{{/* Backend Lookup Usage */}}
{{ $backendName := .name | lower }}
{{ $data := index site.Data.backends $backendName }}
{{ if $data }}
{{ $currentTier = $data.tier }}
{{ end }}
{{ end }}
{{/* Render Badge if a Tier was found */}}
{{ if $currentTier }}
{{ $color := index $tierColors $currentTier | default "secondary" }}
{{ $message := index $tierMessages $currentTier | default "" }}
<a href="/tiers/" class="badge badge-pill badge-{{ $color }} {{ if .align }}float-right{{ end }}" style="{{ if .align }}margin-top: 30px; {{ end }}font-size: 100%" title="{{ $message }}">
{{ $currentTier }}
</a>
{{ end }}

View File

@@ -0,0 +1,120 @@
<table>
<thead>
<tr>
<th>Name</th>
<th>Tier</th>
<th>Hash</th>
<th>ModTime</th>
<th>Case Insensitive</th>
<th>Duplicate Files</th>
<th>MIME Type</th>
<th>Metadata</th>
</tr>
</thead>
<tbody>
{{ range sort site.Data.backends "name" "asc" }}
{{ if .virtual }}{{ continue }} {{ end }}
<tr>
<td style="font-weight: bold;">
<a href="/{{ .backend | urlize }}">{{ .name }}</a>
</td>
{{/* Tier Column */}}
<td>
{{ partial "tier.html" (dict "name" .backend "align" false) }}
</td>
{{/* Hash Column */}}
<td>
{{ $local := in .features "IsLocal" }}
{{ if $local }}
<b>ALL</b>
{{ else }}
{{ with .hashes }}
{{ delimit . ", " }}
{{ else }}
-
{{ end }}
{{ end }}
</td>
{{/* ModTime */}}
<td>
{{ $d := or (in .features "MkdirMetadata") (in .features "DirSetModTime") }}
{{ $r := true }} {{/* FIXME don't have a way of reading this from the features */}}
{{ $w := and (isset . "precision") (le .precision 1000000000) }}
{{- if $d -}}
D
{{- end -}}
{{ if and $r $w -}}
R/W
{{- else if $r -}}
R
{{- else if $w -}}
W
{{- else -}}
-
{{- end -}}
</td>
{{/* Case Insensitive */}}
<td>
{{ partial "bool.html" (in .features "CaseInsensitive") }}
</td>
{{/* Duplicate Files */}}
<td>
{{ partial "bool.html" (in .features "DuplicateFiles") }}
</td>
{{/* MIME Type Synthesis */}}
<td>
{{ $r := in .features "ReadMimeType" }}
{{ $w := in .features "WriteMimeType" }}
{{ if and $r $w }}
R/W
{{ else if $r }}
R
{{ else if $w }}
W
{{ else }}
-
{{ end }}
</td>
{{/* Metadata Synthesis */}}
<td>
{{ $meta := "" }}
{{/* Check Directory Metadata Support */}}
{{ if or (in .features "ReadDirMetadata") (in .features "WriteDirMetadata") }}
{{ $meta = "D" }}
{{ end }}
{{/* Check System Metadata Read */}}
{{ if in .features "ReadMetadata" }}
{{ $meta = print $meta "R" }}
{{ end }}
{{/* Check System Metadata Write */}}
{{ if in .features "WriteMetadata" }}
{{ $meta = print $meta "W" }}
{{ end }}
{{/* Check User Metadata Support */}}
{{ if in .features "UserMetadata" }}
{{ $meta = print $meta "U" }}
{{ end }}
{{/* Output result or hyphen if empty */}}
{{ if eq $meta "" }}
-
{{ else }}
{{ $meta }}
{{ end }}
</td>
</tr>
{{ end }}
</tbody>
</table>

View File

@@ -0,0 +1,40 @@
<table>
<thead>
<tr>
<th align="left">Name</th>
<th align="center">Purge</th>
<th align="center">Copy</th>
<th align="center">Move</th>
<th align="center">DirMove</th>
<th align="center">CleanUp</th>
<th align="center">ListR</th>
<th align="center">StreamUpload</th>
<th align="left">MultithreadUpload</th>
<th align="center">LinkSharing</th>
<th align="center">About</th>
<th align="center">EmptyDir</th>
</tr>
</thead>
<tbody>
{{ range sort site.Data.backends "name" "asc" }}
{{ if .virtual }}{{ continue }} {{ end }}
<tr>
<td align="left" style="font-weight: bold;">
<a href="/{{ .backend | urlize }}">{{ .name }}</a>
</td>
<td align="center">{{ partial "bool.html" (in .features "Purge") }}</td>
<td align="center">{{ partial "bool.html" (in .features "Copy") }}</td>
<td align="center">{{ partial "bool.html" (in .features "Move") }}</td>
<td align="center">{{ partial "bool.html" (in .features "DirMove") }}</td>
<td align="center">{{ partial "bool.html" (in .features "CleanUp") }}</td>
<td align="center">{{ partial "bool.html" (in .features "ListR") }}</td>
<td align="center">{{ partial "bool.html" (in .features "PutStream") }}</td>
<td align="center">{{ partial "bool.html" (or (in .features "OpenChunkWriter") (in .features "OpenWriterAt")) }}</td>
<td align="center">{{ partial "bool.html" (in .features "PublicLink") }}</td>
<td align="center">{{ partial "bool.html" (in .features "About") }}</td>
<td align="center">{{ partial "bool.html" (in .features "CanHaveEmptyDirectories") }}</td>
</tr>
{{ end }}
</tbody>
</table>

View File

@@ -0,0 +1 @@
{{ partial "tier.html" (dict "tier" (.Get "tier") "name" (.Get "name") "align" (.Get "align")) }}

View File

@@ -0,0 +1,41 @@
<table>
<thead>
<tr>
<th>Backend</th>
<th>Tier</th>
<th>Maintainers</th>
<th>Features</th>
<th>Tests</th>
<th>Integrity</th>
<th>Perf</th>
<th>Adoption</th>
<th>Docs</th>
<th>Security</th>
</tr>
</thead>
<tbody>
{{ range $name, $data := site.Data.backends }}
<tr>
<td style="font-weight: bold;">
<a href="/{{ $name | urlize }}">{{ $data.name }}</a>
</td>
<td>
{{ partial "tier.html" (dict "name" $name "align" false) }}
</td>
<td>{{ $data.maintainers | default "-" }}</td>
<td>{{ $data.features_score | string | default "-" }}</td>
<td>
<span class="{{ if eq $data.integration_tests "Passing" }}text-success{{ else }}text-danger{{ end }}">
{{ if eq $data.integration_tests "Passing" }}&#10004;{{ else }}&#10006;{{ end }}
</span>
{{ $data.integration_tests | default "-" }}
</td>
<td>{{ $data.data_integrity | default "-" }}</td>
<td>{{ $data.performance | default "-" }}</td>
<td>{{ $data.adoption | default "-" }}</td>
<td>{{ $data.docs | default "-" }}</td>
<td>{{ $data.security | default "-" }}</td>
</tr>
{{ end }}
</tbody>
</table>

View File

@@ -90,14 +90,14 @@ func validateHour(HHMM string) error {
return fmt.Errorf("invalid hour in time specification %q: %v", HHMM, err)
}
if hh < 0 || hh > 23 {
return fmt.Errorf("invalid hour (must be between 00 and 23): %q", hh)
return fmt.Errorf("invalid hour (must be between 00 and 23): %d", hh)
}
mm, err := strconv.Atoi(HHMM[3:])
if err != nil {
return fmt.Errorf("invalid minute in time specification: %q: %v", HHMM, err)
}
if mm < 0 || mm > 59 {
return fmt.Errorf("invalid minute (must be between 00 and 59): %q", hh)
return fmt.Errorf("invalid minute (must be between 00 and 59): %d", mm)
}
return nil
}

Some files were not shown because too many files have changed in this diff Show More