Skip to main content

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
doctor Read-only health check of the machine's boxyard state
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

doctor

boxyard doctor runs a strictly read-only health check of the machine's boxyard state, so misuse and drift get caught mechanically. It never mutates or auto-fixes anything, and exits with code 0 when healthy and 1 when there is any finding — so it can run under cron/supervisors and be asserted by scripts and agents.

boxyard doctor                 # full check, including remote storage
boxyard doctor --no-remote     # offline: skip checks that access remote storage
boxyard doctor -o json         # machine-readable report

Checks:

Check What it flags
unregistered-folder Directories in user_boxes_path that are not registered boxes (e.g. hand-created instead of via boxyard new)
malformed-name Entries in user_boxes_path whose names don't parse as <timestamp>_<subid>__<name> (legacy formats are accepted)
broken-registration local_store registrations missing boxmeta.toml, or with one that fails to parse/validate
duplicate-box-id The same box id registered more than once
stale-cache boxyard_meta.json disagreeing with a fresh scan of local_store
dangling-symlinks Group symlinks whose targets don't exist
group-tree-debris Real (non-symlink) files in the group tree, which make create-user-symlinks raise
orphaned-sync-records sync_records/<index>/ with no matching registration
interrupted-sync Local sync records left incomplete by an interrupted sync (the local copy may be incomplete), or that fail to parse
unknown-storage-location local_store dirs and remote-index caches left over from removed/renamed storage locations
rclone-config Unresolvable rclone binary, rclone storage locations with no remote in boxyard_rclone.conf, or a missing default exclude file
stale-meta-mirror Remote boxmetas not mirrored locally (what sync-missing-meta would fetch); skipped with --no-remote
tombstoned-box Locally registered boxes that were deleted (tombstoned) on the remote from another machine; skipped with --no-remote
tree-orphans Boxmeta parents referencing unknown box ids

Every finding comes with a one-line hint on how to fix it.

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

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

boxyard-0.3.0.tar.gz (69.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

boxyard-0.3.0-py3-none-any.whl (87.3 kB view details)

Uploaded Python 3

File details

Details for the file boxyard-0.3.0.tar.gz.

File metadata

  • Download URL: boxyard-0.3.0.tar.gz
  • Upload date:
  • Size: 69.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for boxyard-0.3.0.tar.gz
Algorithm Hash digest
SHA256 69dd1c0fc9a33525cc3c311e81748ba1ccddf88b54246c24b0ff9161d03132d4
MD5 f3be27b9930b9fdb4620a9b28fbc7796
BLAKE2b-256 a043d3a4900689dddbcf0b9d40a5ed26375d787a187a46fef071c1487aff6e56

See more details on using hashes here.

Provenance

The following attestation bundles were made for boxyard-0.3.0.tar.gz:

Publisher: release.yml on lukastk/boxyard

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file boxyard-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: boxyard-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 87.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for boxyard-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 83b1cd33b6ae94f4d5b179c001f624d6d1956e2d9520dc61912054683f50c7f7
MD5 851e9704c3d37e20f534557af798fe38
BLAKE2b-256 9a22866172c8e99127e14a26e74643f0c24ff03484254256110ac90daefd4c97

See more details on using hashes here.

Provenance

The following attestation bundles were made for boxyard-0.3.0-py3-none-any.whl:

Publisher: release.yml on lukastk/boxyard

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.3.1

2 files

This release

0.3.0 This release

2 files

0.2.1

2 files

0.2.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page