Skip to content

The Mounts API manages persistent FUSE filesystem mounts for connected backends. All mounts are automatically persisted and restored on server restart — there is no separate persistence flag.

List 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.
{
"count": 2,
"mounts": [
{
"id": "mount_550e8400e29b41d4a716446655440000",
"backend_id": "backend_a1b2c3d4e5f6",
"label": "Photos",
"mount_path": "/hoody/mounts/mount_550e8400e29b41d4a716446655440000",
"status": "active",
"created_at": 1735689600
},
{
"id": "mount_660f9500f30c52e5b827557766551111",
"backend_id": "backend_g7h8i9j0k1l2",
"label": "Work S3",
"mount_path": "/hoody/mounts/mount_660f9500f30c52e5b827557766551111",
"status": "active",
"created_at": 1735776000
}
]
}
const result = await client.files.mounts.list("Photos");

Get detailed information about a specific mount.

NameInTypeRequiredDescription
idpathstringYesMount ID
{
"id": "mount_550e8400e29b41d4a716446655440000",
"backend_id": "backend_a1b2c3d4e5f6",
"label": "Photos",
"mount_path": "/hoody/mounts/mount_550e8400e29b41d4a716446655440000",
"status": "active",
"created_at": 1735689600,
"vfs_config": {}
}
const details = await client.files.mounts.getDetails("mount_550e8400e29b41d4a716446655440000");

Create a persistent FUSE filesystem mount for a connected backend. Every mount is permanent by default. To remove a mount, use DELETE /api/v1/mounts/{id}.

FieldTypeRequiredDescription
backend_idstringYesID of an existing backend connection
labelstringNoHuman-readable label for this mount (e.g., "My NAS", "Work S3", "Photos Backup"). Used by the UI to identify mounts and filter via GET /api/v1/mounts?label=...
mount_pathstringNoPath for the mount. If omitted, defaults to /hoody/mounts/mount_{uuid}. Relative paths are resolved under the server’s mount directory (/hoody/mounts/ by default)
vfs_configobjectNoVFS configuration for performance tuning. Supports cache_max_age, cache_max_size, cache_mode (off, minimal, writes, full), and dir_cache_time
{
"success": true,
"message": "Mount created successfully",
"data": {
"id": "mount_550e8400e29b41d4a716446655440000",
"backend_id": "backend_a1b2c3d4e5f6",
"label": "Photos",
"mount_path": "/hoody/mounts/mount_550e8400e29b41d4a716446655440000",
"status": "active"
}
}
const mount = await client.files.mounts.create({
backend_id: "backend_a1b2c3d4e5f6",
label: "Photos",
vfs_config: {
cache_mode: "writes",
cache_max_size: "10G"
}
});

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
{
"success": true,
"message": "Mount configuration updated"
}
await client.files.mounts.update("mount_550e8400e29b41d4a716446655440000", {
vfs_config: {
cache_mode: "full",
cache_max_size: "20G"
}
});

Remove a mount and disconnect the FUSE filesystem.

NameInTypeRequiredDescription
idpathstringYesMount ID
{
"success": true,
"message": "Mount removed successfully"
}
await client.files.mounts.unmount("mount_550e8400e29b41d4a716446655440000");

Advanced backends are composable filesystem layers that add capabilities — caching, chunking, checksumming, aliasing, merging, or in-memory storage — on top of one or more upstream remotes.

Connect to an alias backend. Creates an alias for an existing remote or local path.

FieldTypeRequiredDescription
remotestringYesRemote or path to alias. Can be "myremote:path/to/dir", "myremote:bucket", "myremote:", or "/local/path". Default: ""
descriptionstringNoDescription of the remote. Default: ""
{
"success": true,
"message": "Backend connected successfully",
"data": {
"id": "backend_aa11bb22cc33",
"type": "alias",
"backend_type": "alias",
"mount_paths": []
}
}
const backend = await client.files.backends.connectAlias({
remote: "myremote:photos",
description: "Photo archive alias"
});

Connect to a cache backend. Caches file data and metadata from a remote for faster repeated access.

FieldTypeRequiredDefaultDescription
remotestringYes""Remote to cache. Normally should contain a : and a path, e.g. "myremote:path/to/dir"
descriptionstringNo""Description of the remote
db_pathstringNo/home/user/.cache/hoody-vfs/cache-backendDirectory to store file structure metadata DB
db_purgebooleanNofalseClear all cached data for this remote on start
db_wait_timeintegerNo1How long to wait for the DB to be available — 0 is unlimited (seconds)
chunk_pathstringNo/home/user/.cache/hoody-vfs/cache-backendDirectory to cache chunk files
chunk_sizestringNo"5242880"Size of a chunk. Enum: "1M", "5M", "10M"
chunk_total_sizestringNo"10737418240"Total size chunks can take on local disk. Enum: "500M", "1G", "10G"
chunk_clean_intervalintegerNo60How often to perform chunk cleanup (seconds)
chunk_no_memorybooleanNofalseDisable in-memory cache for streaming chunks
workersintegerNo4How many workers run in parallel to download chunks
writesbooleanNofalseCache file data on writes through the FS
read_retriesintegerNo10How many times to retry a read from cache storage
rpsintegerNo-1Hard limit on requests per second to source FS (-1 to disable)
tmp_upload_pathstringNo""Directory to keep temporary files until uploaded
tmp_wait_timeintegerNo15How long files stay in local cache before upload (seconds)
info_ageintegerNo21600How long to cache file structure information. Enum: "1h", "24h", "48h" (seconds)
plex_urlstringNo""URL of the Plex server
plex_usernamestringNo""Username of the Plex user
plex_passwordstringNo""Password of the Plex user
plex_tokenstringNo""Plex token for authentication (auto set normally)
plex_insecurestringNo""Skip all certificate verification when connecting to Plex
{
"success": true,
"message": "Backend connected successfully",
"data": {
"id": "backend_aa11bb22cc33",
"type": "cache",
"backend_type": "cache",
"mount_paths": []
}
}
const backend = await client.files.backends.connectCache({
remote: "myremote:photos",
description: "Photo archive cache",
chunk_size: "10M",
chunk_total_size: "10G"
});

Connect to a chunker backend. Transparently splits large files into smaller chunks.

FieldTypeRequiredDefaultDescription
remotestringYes""Remote to chunk/unchunk, e.g. "myremote:path/to/dir"
descriptionstringNo""Description of the remote
chunk_sizestringNo"2147483648"Files larger than this size will be split into chunks
name_formatstringNo"*.hoody-vfs_chunk.###"String format of chunk file names. Placeholders: * (base file name) and # (chunk number)
start_fromintegerNo1Minimum valid chunk number
hash_typestringNo"md5"How chunker handles hash sums. Enum: "none", "md5", "sha1", "md5all", "sha1all", "md5quick", "sha1quick"
meta_formatstringNo"simplejson"Format of metadata object. Enum: "none", "simplejson"
transactionsstringNo"rename"How chunker handles temporary files during transactions. Enum: "rename", "norename", "auto"
fail_hardbooleanNofalseHow chunker handles files with missing or invalid chunks. Enum: "true", "false"
{
"success": true,
"message": "Backend connected successfully",
"data": {
"id": "backend_aa11bb22cc33",
"type": "chunker",
"backend_type": "chunker",
"mount_paths": []
}
}
const backend = await client.files.backends.connectChunker({
remote: "myremote:large-files",
description: "Split large files into chunks",
chunk_size: "2147483648",
hash_type: "sha1"
});

Connect to a combine backend. Combines several remotes into a single directory tree.

FieldTypeRequiredDescription
upstreamsstringYesUpstreams for combining in the form dir=remote:path dir2=remote2:path. Embedded spaces require quotes
descriptionstringNoDescription of the remote. Default: ""
{
"success": true,
"message": "Backend connected successfully",
"data": {
"id": "backend_aa11bb22cc33",
"type": "combine",
"backend_type": "combine",
"mount_paths": []
}
}
const backend = await client.files.backends.connectCombine({
upstreams: "photos=myremote:photos videos=myremote:videos",
description: "Combined media tree"
});

Connect to a hasher backend. Provides better checksums for other remotes.

FieldTypeRequiredDefaultDescription
remotestringYes""Remote to cache checksums for (e.g. myRemote:path)
descriptionstringNo""Description of the remote
hashesstringNo["md5","sha1"]Comma-separated list of supported checksum types
max_ageintegerNo0Maximum time to keep checksums in cache (0 = no cache, off = cache forever). (seconds)
auto_sizestringNo"0"Auto-update checksum for files smaller than this size (disabled by default)
{
"success": true,
"message": "Backend connected successfully",
"data": {
"id": "backend_aa11bb22cc33",
"type": "hasher",
"backend_type": "hasher",
"mount_paths": []
}
}
const backend = await client.files.backends.connectHasher({
remote: "myremote:data",
description: "Hashed checksums for data remote",
hashes: "md5,sha1,sha256"
});

Connect to a local backend backed by a local disk path.

FieldTypeRequiredDefaultDescription
descriptionstringNo""Description of the remote
encodingstringNo"33554434"The encoding for the backend
case_insensitivebooleanNofalseForce the filesystem to report itself as case insensitive
case_sensitivebooleanNofalseForce the filesystem to report itself as case sensitive
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
zero_size_linksbooleanNofalseAssume the Stat size of links is zero (deprecated)
one_file_systembooleanNofalseDon’t cross filesystem boundaries (Unix/macOS only)
nouncbooleanNofalseDisable UNC (long path names) conversion on Windows. Enum: "true"
no_check_updatedbooleanNofalseDon’t check if files change during upload
no_set_modtimebooleanNofalseDisable setting modtime after upload
no_sparsebooleanNofalseDisable sparse files for multi-thread downloads
no_preallocatebooleanNofalseDisable preallocation of disk space for transferred files
no_clonebooleanNofalseDisable reflink cloning for server-side copies
unicode_normalizationbooleanNofalseApply unicode NFC normalization to paths and filenames
time_typestringNo"0"Set what kind of time is returned. Enum: "mtime", "atime", "btime", "ctime"
{
"success": true,
"message": "Backend connected successfully",
"data": {
"id": "backend_aa11bb22cc33",
"type": "local",
"backend_type": "local",
"mount_paths": []
}
}
const backend = await client.files.backends.connectLocal({
description: "Local data directory",
no_preallocate: true
});

Connect to a memory backend — an in-memory object storage system. Data is lost when the server restarts.

FieldTypeRequiredDefaultDescription
descriptionstringNo""Description of the remote
{
"success": true,
"message": "Backend connected successfully",
"data": {
"id": "backend_aa11bb22cc33",
"type": "memory",
"backend_type": "memory",
"mount_paths": []
}
}
const backend = await client.files.backends.connectMemory({
description: "Ephemeral scratch space"
});

Connect to a union backend. Merges the contents of several upstream filesystems using configurable policies.

FieldTypeRequiredDefaultDescription
upstreamsstringYes""Space-separated list of upstreams. Can be 'upstreama:test/dir upstreamb:' or quoted paths
descriptionstringNo""Description of the remote
search_policystringNo"ff"Policy to choose upstream on SEARCH category
create_policystringNo"epmfs"Policy to choose upstream on CREATE category
action_policystringNo"epall"Policy to choose upstream on ACTION category
cache_timeintegerNo120Cache time of usage and free space (seconds). Only useful with path-preserving policies
min_free_spacestringNo"1073741824"Minimum viable free space for lfs/eplfs policies
{
"success": true,
"message": "Backend connected successfully",
"data": {
"id": "backend_aa11bb22cc33",
"type": "union",
"backend_type": "union",
"mount_paths": []
}
}
const backend = await client.files.backends.connectUnion({
upstreams: "primary:fast-cdn secondary:bulk-storage",
description: "Merged storage union",
create_policy: "epmfs",
search_policy: "ff"
});