Changelog

Version 0.5.1 (2026-06-02)

New features:

  • borgstore.server.rest: support REST http via stdio (so one can, for example, invoke borgstore-server-rest –stdio via ssh). Speaks http over stdin/stdout, stderr is used for log output.

  • Store now supports “rest:” backend URLs:

    • rest://user@host:port/relative/path - creates an ssh connection to a remote system, starts a borgstore-server-rest process there with a posixfs backend at ./relative/path on the remote system.

    • rest:///relative/path - creates and connects to a borgstore-server-rest process with a posixfs backend at ./relative/path on the local system, without using ssh (good for testing).

Version 0.5.0 (2026-05-28)

New features:

  • implement an optional cache (modes: off, mirror, writethrough; max_age and size LRU eviction need atime support), see the store_caching.rst docs

  • rclone: add BORGSTORE_RCLONE_DEBUG env var

Other changes:

  • Store: remove “levels” argument, replaced by new “config” argument

  • Store: optimize / speed up .find method (no backend.info calls when there is only 1 level, as usual)

  • docs: split README, real docs, sphinx

Version 0.4.1 (2026-04-26)

New features:

  • quota: implement quota tracking and enforcement (posixfs), #19

  • load: implement tail loading support (negative offset)

  • store: hashsum content verification (REST server/client), #148

  • hash: item content hashing, e.g. sha256

  • defrag: defragmentation helper (copies blocks from source to target items)

  • sftp: try to use “check-file” for SFTP server-side hashing (not supported by OpenSSH and also not tested by us; please give feedback if you use it)

  • REST backend (client): support sub-paths, #155, #156

  • REST server:

    • server-side implementation of defrag and hash

    • –socket-activation - add systemd socket activation support, enabling on-demand per-repo startup without port management.

    • contrib/server/nginx-systemd/ has a nginx reverse proxy setup example that can support multiple stores at different sub-paths.

    • support quotas (via posixfs backend)

Fixes:

  • rclone: fix process leak in close()

  • REST server:

    • sanitize error messages to avoid leaking absolute storage paths

    • harden authentication against timing attacks

    • slightly optimize directory listing memory usage

  • sftp:

    • fix SSH connection leak

    • host_config[“port”] is a str

    • Store paramiko.SSHClient in self.ssh and ensure it is closed in _disconnect, _connect calls _disconnect on any failure during setup.

Version 0.4.0 (2026-03-15)

New features:

  • REST (http/https) backend, REST server, #18

Fixes:

  • fix permissions check, #139

  • posixfs/sftp: do not raise if base_path can not be deleted, #133

  • list: do not yield invalid names, #130

  • posixfs, s3, sftp: URL-unquote, #129

Other changes:

  • add “rclone” and “rest” extras, “requests” is now an optional requirement

Version 0.3.1 (2026-02-09)

Bug fixes:

  • s3 URL: ensure s3 endpoint is optional

Other changes:

  • add support for Python 3.14, remove 3.9

  • backends: have separate exceptions for invalid URL and dependency missing

  • posixfs: better exception message if not absolute path

  • use SPDX license identifier, require a recent setuptools

  • CI:

    • add sftp store testing, #64

    • add s3 store testing

  • docs:

    • describe the posixfs permissions system

    • updates, typos and grammar fixes

    • mention the permissions system of posixfs backend

Version 0.3.0 2025-05-22

New features:

  • posixfs: add a permissions system, #105

  • Store: add permissions argument (only supported by posixfs)

  • Store: add logging for Store ops, #104. It logs:

    • operation

    • name(s)

    • parameters such as deleted

    • size and timing

    Please note:

    • logging is done at DEBUG level, so log output is not visible with a default logger.

    • borgstore does not configure logging; that is the task of the application that uses borgstore.

Version 0.2.0 2025-04-21

Breaking changes:

  • Store.list: changed deleted argument semantics, #83:

    • True: list ONLY soft-deleted items

    • False: list ONLY non-deleted items

New features:

  • new s3/b2 backend that uses the boto3 library, #96

  • posixfs/sftp: create missing parent directories of the base path

  • rclone: add a way to specify the path to the rclone binary for custom installations

Bug fixes:

  • rclone: fix discard thread issues, #92

  • rclone: check rclone regex before raising rclone-related exceptions

Other changes:

  • posixfs: also support Windows file:/// URLs, #82

  • posixfs / sftp: optimize mkdir usage, add retries, #85

  • posixfs / sftp: change .precreate_dirs default to False

  • rclone init: use a random port instead of relying on rclone to pick one

Version 0.1.0 2024-10-15

Breaking changes:

  • accepted store URLs: see README

  • Store: require complete levels configuration, #46

Other changes:

  • sftp/posixfs backends: remove ad hoc mkdir calls, #46

  • optimize Sftp._mkdir, #80

  • sftp backend is now optional, avoiding dependency issues on some platforms, #74. Use pip install “borgstore[sftp]” to install with the sftp backend.

Version 0.0.5 2024-10-01

Fixes:

  • backend.create: only reject non-empty storage, #57

  • backends.sftp: fix _mkdir edge case

  • backends.sftp: raise BackendDoesNotExist if base path is not found

  • rclone backend:

    • don’t error on create if source directory is empty, #57

    • fix hang on termination, #54

New features:

  • rclone backend: retry errors on load and store 3 times

Other changes:

  • remove MStore for now, see commit 6a6fb334.

  • refactor Store tests, add Store.set_levels method

  • move types-requests to tox.ini, only needed for development

Version 0.0.4 2024-09-22

  • rclone: new backend to access any of the 100s of cloud backends that rclone supports; needs rclone >= v1.57.0.

    See the rclone docs for installing rclone and creating remotes. After that, borgstore will support URLs like:

    • rclone://remote:

    • rclone://remote:path

    • rclone:///tmp/testdir (local fs, for testing)

  • Store.list: give up trying to do anything with a directory’s “size”

  • .info / .list: return st.st_size for a directory “as-is”

  • tests: BORGSTORE_TEST_RCLONE_URL to set rclone test URL

  • tests: allow BORGSTORE_TEST_*_URL in the testenv to make tox work for testing sftp, rclone, or other URLs.

Version 0.0.3 2024-09-17

  • sftp: add support for ~/.ssh/config, #37

  • sftp: username is optional, #27

  • load known_hosts, remove AutoAddPolicy, #39

  • store: raise backend-specific exceptions, #34

  • add Store.stats property, #25

  • bandwidth emulation via BORGSTORE_BANDWIDTH [bit/s], #24

  • latency emulation via BORGSTORE_LATENCY [us], #24

  • fix demo code, also output stats

  • tests: BORGSTORE_TEST_SFTP_URL to set sftp test URL

Version 0.0.2 2024-09-10

  • sftp backend: use paramiko’s client.posix_rename, #17

  • posixfs backend: hack: accept file://relative/path, #23

  • support and test on Python 3.13, #21

Version 0.0.1 2024-08-23

First PyPI release.