Skip to content

Hoody’s advanced filesystem backends compose and extend the capabilities of standard remotes. Use these endpoints to create specialized storage layers — combining upstreams, caching cloud providers, splitting large files, aliasing paths, computing checksums, and adding in-memory or local disk storage. Each backend can then be mounted as a persistent FUSE filesystem for direct file access.

Mounts expose connected backends as live FUSE filesystems. Use these endpoints to list existing mounts, retrieve details, create new mounts, update VFS configuration, or remove mounts.

Get a list of all active filesystem mounts. Supports filtering by label via the label query parameter.

NameInTypeRequiredDescription
labelquerystringNoFilter mounts by label. Only mounts with this exact label will be returned.
Terminal window
curl -X GET "https://api.hoody.com/api/v1/mounts?label=Photos" \
-H "Authorization: Bearer YOUR_TOKEN"
{
"count": 2,
"mounts": [
{
"id": "mount_550e8400e29b41d4a716446655440000",
"backend_id": "bnd_550e8400e29b41d4a716446655440001",
"label": "Photos",
"mount_path": "/hoody/mounts/mount_550e8400e29b41d4a716446655440000",
"status": "active",
"created_at": 1735689600
},
{
"id": "mount_550e8400e29b41d4a716446655440002",
"backend_id": "bnd_550e8400e29b41d4a716446655440003",
"label": "Work Documents",
"mount_path": "/hoody/mounts/mount_550e8400e29b41d4a716446655440002",
"status": "active",
"created_at": 1735776000
}
]
}

Get detailed information about a specific mount, including its VFS cache configuration.

NameInTypeRequiredDescription
idpathstringYesMount ID.
Terminal window
curl -X GET "https://api.hoody.com/api/v1/mounts/mount_550e8400e29b41d4a716446655440000" \
-H "Authorization: Bearer YOUR_TOKEN"
{
"id": "mount_550e8400e29b41d4a716446655440000",
"backend_id": "bnd_550e8400e29b41d4a716446655440001",
"label": "Photos",
"mount_path": "/hoody/mounts/mount_550e8400e29b41d4a716446655440000",
"status": "active",
"created_at": 1735689600,
"vfs_config": {
"cache_max_age": 3600,
"cache_max_size": 10737418240,
"cache_mode": "writes",
"dir_cache_time": 300
}
}

Create a persistent FUSE filesystem mount for a connected backend, allowing direct file system access to remote storage.

This endpoint takes no parameters.

FieldTypeRequiredDescription
backend_idstringYesID of an existing backend connection.
labelstringNoHuman-readable label for the mount (e.g. “My NAS”, “Work S3”). Used by the UI to identify the mount and to filter via GET /api/v1/mounts?label=....
mount_pathstringNoPath for the mount. If omitted, defaults to /hoody/mounts/mount_{uuid}. Relative paths resolve under the server’s mount directory.
vfs_configobjectNoVFS configuration for performance tuning. See the fields below.

vfs_config fields:

FieldTypeRequiredDefaultDescription
cache_max_ageinteger | stringNo3600Maximum time files are cached. Accepts seconds or duration strings like "1h", "30m".
cache_max_sizeinteger | stringNo10737418240Maximum cache size in bytes (default 10GB). Accepts bytes or human-readable strings like "10G", "128M".
cache_modestringNo"writes"Cache mode. One of "off", "minimal", "writes", "full".
dir_cache_timeinteger | stringNo300How long directory listings are cached. Accepts seconds or duration strings like "5m", "1h".
Terminal window
curl -X POST "https://api.hoody.com/api/v1/mounts" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"backend_id": "bnd_550e8400e29b41d4a716446655440001",
"label": "Photos",
"vfs_config": {
"cache_mode": "full",
"cache_max_size": "20G"
}
}'
{
"success": true,
"message": "Mount created successfully",
"data": {
"id": "mount_550e8400e29b41d4a716446655440000",
"backend_id": "bnd_550e8400e29b41d4a716446655440001",
"label": "Photos",
"mount_path": "/hoody/mounts/mount_550e8400e29b41d4a716446655440000",
"status": "active"
}
}

Update the VFS configuration for an existing mount. Allows changing cache settings, buffer sizes, and other VFS parameters.

NameInTypeRequiredDescription
idpathstringYesMount ID.
FieldTypeRequiredDescription
vfs_configobjectYesVFS configuration parameters. Accepts the same field set as in the create endpoint.
Terminal window
curl -X PATCH "https://api.hoody.com/api/v1/mounts/mount_550e8400e29b41d4a716446655440000" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"vfs_config": {
"cache_mode": "full",
"cache_max_size": "50G"
}
}'
{
"success": true,
"message": "Mount configuration updated"
}

Remove a mount and disconnect the FUSE filesystem.

NameInTypeRequiredDescription
idpathstringYesMount ID.
Terminal window
curl -X DELETE "https://api.hoody.com/api/v1/mounts/mount_550e8400e29b41d4a716446655440000" \
-H "Authorization: Bearer YOUR_TOKEN"
{
"success": true,
"message": "Mount removed successfully"
}

Advanced backends wrap existing remotes to add caching, chunking, checksumming, composition, and other transformations. After connecting a backend, mount it through the endpoints above to access its files through the filesystem.

Create an alias for an existing remote or local path. Useful for exposing a deeply nested remote path under a friendly name.

This endpoint takes no parameters.

FieldTypeRequiredDefaultDescription
remotestringYes""Remote or path to alias. Can be "myremote:path/to/dir", "myremote:bucket", "myremote:" or "/local/path".
descriptionstringNo""Human-readable description of the remote.
Terminal window
curl -X POST "https://api.hoody.com/api/v1/backends/alias" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"remote": "s3-prod:backups/2025",
"description": "2025 backups alias"
}'
{
"success": true,
"message": "Backend connected successfully",
"data": {
"id": "bnd_550e8400e29b41d4a716446655440010",
"type": "alias",
"backend_type": "alias",
"mount_paths": []
}
}

Wrap a remote with a local chunk and metadata cache to reduce latency and bandwidth on repeated reads and to support Plex streaming optimizations.

This endpoint takes no parameters.

FieldTypeRequiredDefaultDescription
remotestringYes""Remote to cache. Should contain : and a path, e.g. "myremote:path/to/dir", "myremote:bucket", or "myremote:" (not recommended).
descriptionstringNo""Human-readable description of the remote.
chunk_pathstringNo"/home/user/.cache/hoody-vfs/cache-backend"Directory to cache chunk files. The remote name is appended to the final path. Defaults to the value of db_path if not set.
chunk_sizestringNo"5242880"Size of a chunk. One of "1M", "5M", "10M". Lower values suit slower connections. Changing this invalidates existing chunks.
chunk_total_sizestringNo"10737418240"Total disk space the chunks can occupy. One of "500M", "1G", "10G". Oldest chunks are deleted when exceeded.
chunk_clean_intervalintegerNo60How often (in seconds) the cache performs cleanups of the chunk storage.
chunk_no_memorybooleanNofalseDisable the in-memory cache used for streaming chunks.
db_pathstringNo"/home/user/.cache/hoody-vfs/cache-backend"Directory to store the file structure metadata DB. The remote name is used as the DB file name.
db_purgebooleanNofalseClear all cached data for this remote on start.
db_wait_timeintegerNo1Seconds to wait for the DB to be available before failing. 0 waits forever.
info_ageintegerNo21600How long (in seconds) to cache directory listings, file size, and times. Possible values: "1h", "24h", "48h".
workersintegerNo4Number of parallel workers that download chunks. Higher values need more CPU and increase cloud API request rates.
read_retriesintegerNo10How many times to retry a read from the cache storage before giving up.
rpsintegerNo-1Hard limit on requests per second to the source filesystem. -1 disables the limit. Directory listings are not throttled.
writesbooleanNofalseCache file data on writes through the filesystem so that reads right after uploads are served from cache.
tmp_upload_pathstringNo""Directory used as temporary storage for new files before they are uploaded to the cloud provider. Empty disables the feature.
tmp_wait_timeintegerNo15Seconds a file must wait in tmp_upload_path before being uploaded.
plex_urlstringNo""URL of the Plex server (enables Plex integration).
plex_usernamestringNo""Plex username.
plex_passwordstringNo""Plex password.
plex_tokenstringNo""Plex auth token. Auto-set normally.
plex_insecurestringNo""Skip certificate verification when connecting to the Plex server.
Terminal window
curl -X POST "https://api.hoody.com/api/v1/backends/cache" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"remote": "s3-prod:media",
"description": "Cached media library",
"chunk_size": "10M",
"chunk_total_size": "10G",
"workers": 8,
"writes": true
}'
{
"success": true,
"message": "Backend connected successfully",
"data": {
"id": "bnd_550e8400e29b41d4a716446655440011",
"type": "cache",
"backend_type": "cache",
"mount_paths": []
}
}

Transparently split large files on a remote into smaller chunks, useful for backends that have per-file size limits.

This endpoint takes no parameters.

FieldTypeRequiredDefaultDescription
remotestringYes""Remote to chunk/unchunk. Should contain : and a path, e.g. "myremote:path/to/dir", "myremote:bucket", or "myremote:" (not recommended).
descriptionstringNo""Human-readable description of the remote.
chunk_sizestringNo"2147483648"Files larger than this size are split into chunks.
name_formatstringNo"*.hoody-vfs_chunk.###"Format of chunk file names. The * placeholder is the base file name and one or more # characters are replaced with the chunk number.
hash_typestringNo"md5"How chunker handles hash sums. One of "none", "md5", "sha1", "md5all", "sha1all", "md5quick", "sha1quick". All modes except "none" require metadata.
meta_formatstringNo"simplejson"Format of the metadata object. One of "none", "simplejson".
start_fromintegerNo1Minimum valid chunk number. Usually 0 or 1.
transactionsstringNo"rename"How chunker handles temporary files during transactions. One of "rename", "norename", "auto".
fail_hardbooleanNofalseHow chunker should handle files with missing or invalid chunks. One of "true", "false".
Terminal window
curl -X POST "https://api.hoody.com/api/v1/backends/chunker" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"remote": "s3-prod:archives",
"description": "Chunked cold archives",
"chunk_size": "1073741824",
"hash_type": "sha1"
}'
{
"success": true,
"message": "Backend connected successfully",
"data": {
"id": "bnd_550e8400e29b41d4a716446655440012",
"type": "chunker",
"backend_type": "chunker",
"mount_paths": []
}
}

Combine several remotes into a single directory tree. Each upstream is mounted under a root directory inside the combined filesystem.

This endpoint takes no parameters.

FieldTypeRequiredDefaultDescription
upstreamsstringYesUpstreams for combining, in the form dir=remote:path dir2=remote2:path. Embedded spaces are supported by quoting entries, e.g. "dir=remote:path with space".
descriptionstringNo""Human-readable description of the remote.
Terminal window
curl -X POST "https://api.hoody.com/api/v1/backends/combine" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"upstreams": "photos=gdrive:photos videos=gdrive:videos",
"description": "Combined Google Drive"
}'
{
"success": true,
"message": "Backend connected successfully",
"data": {
"id": "bnd_550e8400e29b41d4a716446655440013",
"type": "combine",
"backend_type": "combine",
"mount_paths": []
}
}

Compute and cache checksums for files on another remote, exposing md5, sha1, or other supported hashes transparently.

This endpoint takes no parameters.

FieldTypeRequiredDefaultDescription
remotestringYes""Remote to cache checksums for, e.g. myRemote:path.
descriptionstringNo""Human-readable description of the remote.
hashesstringNo["md5","sha1"]Comma-separated list of supported checksum types.
max_ageintegerNo0Maximum time (in seconds) to keep checksums in cache. 0 disables caching, "off" caches forever.
auto_sizestringNo"0"Auto-update checksum for files smaller than this size. Disabled by default.
Terminal window
curl -X POST "https://api.hoody.com/api/v1/backends/hasher" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"remote": "s3-prod:data",
"description": "Hashed data archive",
"hashes": "md5,sha1,blake3",
"max_age": 86400
}'
{
"success": true,
"message": "Backend connected successfully",
"data": {
"id": "bnd_550e8400e29b41d4a716446655440014",
"type": "hasher",
"backend_type": "hasher",
"mount_paths": []
}
}

Expose a directory on the server’s local disk as a Hoody backend.

This endpoint takes no parameters.

FieldTypeRequiredDefaultDescription
descriptionstringNo""Human-readable description of the remote.
encodingstringNo"33554434"Backend encoding. See the encoding section in the overview for details.
case_insensitivebooleanNofalseForce the filesystem to report itself as case insensitive, overriding the OS default.
case_sensitivebooleanNofalseForce the filesystem to report itself as case sensitive, overriding the OS default.
linksbooleanNofalseTranslate symlinks to/from regular files with a .hoody-vfslink extension.
copy_linksbooleanNofalseFollow symlinks and copy the pointed-to item.
skip_linksbooleanNofalseDon’t warn about skipped symlinks or junction points.
zero_size_linksbooleanNofalseAssume the stat size of links is zero (and read them instead). Deprecated.
unicode_normalizationbooleanNofalseApply Unicode NFC normalization to paths and file names.
one_file_systembooleanNofalseDon’t cross filesystem boundaries (Unix/macOS only).
nouncbooleanNofalseDisable UNC (long path names) conversion on Windows. Must be "true" to enable.
no_preallocatebooleanNofalseDisable preallocation of disk space for transferred files.
no_sparsebooleanNofalseDisable sparse files for multi-thread downloads (Windows).
no_check_updatedbooleanNofalseDon’t check whether files change during upload. Useful for filesystems with broken mtime semantics.
no_set_modtimebooleanNofalseDisable setting modification time after upload.
no_clonebooleanNofalseDisable reflink cloning for server-side copies (macOS APFS).
time_typestringNo"0"Which time to return for entries. One of "mtime", "atime", "btime", "ctime".
Terminal window
curl -X POST "https://api.hoody.com/api/v1/backends/local" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"description": "Local archive drive",
"no_preallocate": true,
"one_file_system": true
}'
{
"success": true,
"message": "Backend connected successfully",
"data": {
"id": "bnd_550e8400e29b41d4a716446655440015",
"type": "local",
"backend_type": "local",
"mount_paths": []
}
}

Expose an in-memory object store as a Hoody backend. Data is lost when the server restarts.

This endpoint takes no parameters.

FieldTypeRequiredDefaultDescription
descriptionstringNo""Human-readable description of the remote.
Terminal window
curl -X POST "https://api.hoody.com/api/v1/backends/memory" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"description": "Ephemeral scratch space"
}'
{
"success": true,
"message": "Backend connected successfully",
"data": {
"id": "bnd_550e8400e29b41d4a716446655440016",
"type": "memory",
"backend_type": "memory",
"mount_paths": []
}
}

Merge the contents of several upstream filesystems into a single union view, with configurable policies for searches, creates, and actions.

This endpoint takes no parameters.

FieldTypeRequiredDefaultDescription
upstreamsstringYes""Space-separated list of upstreams, e.g. "upstreama:test/dir upstreamb:". Quotes support embedded spaces, e.g. "upstreama:test/space:ro dir".
descriptionstringNo""Human-readable description of the remote.
search_policystringNo"ff"Policy used to choose an upstream on SEARCH operations.
create_policystringNo"epmfs"Policy used to choose an upstream on CREATE operations.
action_policystringNo"epall"Policy used to choose an upstream on ACTION operations.
cache_timeintegerNo120How long (in seconds) to cache usage and free-space information. Only useful with path-preserving policies.
min_free_spacestringNo"1073741824"Minimum free space required for a remote to be considered by lfs/eplfs policies.
Terminal window
curl -X POST "https://api.hoody.com/api/v1/backends/union" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"upstreams": "drive-a:photos drive-b:videos drive-c:documents",
"description": "Combined drive view",
"create_policy": "epmfs"
}'
{
"success": true,
"message": "Backend connected successfully",
"data": {
"id": "bnd_550e8400e29b41d4a716446655440017",
"type": "union",
"backend_type": "union",
"mount_paths": []
}
}