Add your description here
Project description
boxyard
A CLI tool for managing and syncing folders ("boxes") across local and remote storage using rclone. Track metadata, organize boxes into groups, and keep everything in sync with conflict detection.
Install
pip install boxyard
# or
uv pip install boxyard
Requires rclone to be installed and configured.
Quick start
# Initialize boxyard (creates config and data directories)
boxyard init
# Create a new box from an existing folder
boxyard new ~/projects/my-project
# Sync a box to remote storage
boxyard sync my-project
# Check sync status
boxyard yard-status
# List all boxes
boxyard list
What it does
Boxyard manages folders (called "boxes") that you want to keep synced between your local machine and remote storage (S3, SFTP, or any rclone-supported backend).
Each box has:
- Data (
data/) - the actual folder contents - Metadata (
boxmeta.toml) - name, groups, storage location, creation info - Config (
conf/) - optional per-box configuration that controls how data is synced - Sync records - track what's been synced and when, enabling conflict detection
The conf/ folder
Each box can optionally have a conf/ folder containing rclone filter files that customize which files are included or excluded when syncing the box's data:
.rclone_include- only sync files matching these patterns.rclone_exclude- skip files matching these patterns (if absent, the global default exclude list is used).rclone_filters- combined include/exclude filter rules
During sync, the conf/ folder is synced before the data, ensuring filter rules are up-to-date before they're applied. This means filter rules travel with the box across remotes -- if you want a box to always exclude .venv/ or only include *.csv, put that in its conf/ folder and it will apply everywhere the box is synced.
Boxes are identified by a unique ID ({timestamp}_{subid}, e.g. 20251122_143022_a7kx9) and organized into groups via symlinks.
Commands
| Command | Description |
|---|---|
init |
Initialize boxyard config and data directories |
new |
Create a new box from a folder |
sync |
Sync a box with remote storage |
multi-sync |
Sync multiple boxes concurrently |
list |
List all boxes |
box-status |
Show sync status of a box |
yard-status |
Show sync status of all boxes |
include |
Include a remote box in the local store |
exclude |
Exclude a box from the local store (keeps remote) |
delete |
Delete a box locally and/or remotely |
rename |
Rename a box locally, remotely, or both |
copy |
Copy a remote box to a local path without including it |
force-push |
Force push a local folder to a box's remote |
add-to-group |
Add a box to a group |
remove-from-group |
Remove a box from a group |
path |
Get the local path of a box |
which |
Identify which box a path belongs to |
Configuration
Config file: ~/.config/boxyard/config.toml
default_storage_location = "my-remote"
boxyard_data_path = "~/.boxyard"
user_boxes_path = "~/boxes"
user_box_groups_path = "~/box-groups"
[storage_locations.my-remote]
storage_type = "rclone"
store_path = "boxyard"
Storage locations are defined as rclone remotes. Boxyard uses its own rclone config at ~/.config/boxyard/boxyard_rclone.conf.
Directory layout
~/.config/boxyard/
config.toml # Main config
boxyard_rclone.conf # rclone config for remotes
~/.boxyard/
local_store/{remote}/ # Local copies of box data
sync_records/ # Per-box sync state
locks/ # File locks for concurrent operations
~/boxes/ # Symlinks to box data folders
~/box-groups/ # Group symlinks (e.g. ~/box-groups/work/my-project)
Development
Boxyard uses nblite for notebook-first development. Source files in src/boxyard/ are autogenerated -- edit the .pct.py files in pts/ instead.
uv sync # Install dependencies
nbl export --reverse # Sync pts -> nbs (after editing .pct.py files)
nbl export # Export nbs -> src/boxyard/
pytest src/tests/ # Run tests
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file boxyard-0.2.1.tar.gz.
File metadata
- Download URL: boxyard-0.2.1.tar.gz
- Upload date:
- Size: 54.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f29454848427267e8f32016ccbf625256f1349595f08187b79729fb5fff4f298
|
|
| MD5 |
0d79d3d4e5759460a529d49bbe2efb70
|
|
| BLAKE2b-256 |
c75e6ef22241fc01b97c44478408519cba0139737b70b642a9e8ded6b4980dc0
|
Provenance
The following attestation bundles were made for boxyard-0.2.1.tar.gz:
Publisher:
release.yml on lukastk/boxyard
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
boxyard-0.2.1.tar.gz -
Subject digest:
f29454848427267e8f32016ccbf625256f1349595f08187b79729fb5fff4f298 - Sigstore transparency entry: 952652683
- Sigstore integration time:
-
Permalink:
lukastk/boxyard@0d6dd7bece170f2c36fdf0182e029edb20e08cf7 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/lukastk
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0d6dd7bece170f2c36fdf0182e029edb20e08cf7 -
Trigger Event:
push
-
Statement type:
File details
Details for the file boxyard-0.2.1-py3-none-any.whl.
File metadata
- Download URL: boxyard-0.2.1-py3-none-any.whl
- Upload date:
- Size: 70.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
01d82cd6d553c45f5cd0b60042e83c5b1abfcda89a5de464b02374217d8787be
|
|
| MD5 |
878e6d75b7e6297d49150ed2e28019a0
|
|
| BLAKE2b-256 |
0448a343e6ac648354a0842f06d0f35e47c1ebd091dedba62ecf3c93b7fb37bc
|
Provenance
The following attestation bundles were made for boxyard-0.2.1-py3-none-any.whl:
Publisher:
release.yml on lukastk/boxyard
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
boxyard-0.2.1-py3-none-any.whl -
Subject digest:
01d82cd6d553c45f5cd0b60042e83c5b1abfcda89a5de464b02374217d8787be - Sigstore transparency entry: 952652685
- Sigstore integration time:
-
Permalink:
lukastk/boxyard@0d6dd7bece170f2c36fdf0182e029edb20e08cf7 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/lukastk
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0d6dd7bece170f2c36fdf0182e029edb20e08cf7 -
Trigger Event:
push
-
Statement type: