# 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.