Skip to content
Hoody.com

Advanced backends add composable layers to your file system — caching, chunking, aliasing, hashing, unioning, and in-memory storage. This page documents the HTTP API for connecting these backends and managing the persistent FUSE mounts that expose them to your container.

Mount operations create, inspect, update, and remove persistent FUSE mounts for any connected backend. Every mount survives container restarts and can be filtered by label.

List all active mounts. Supports filtering by label via the label query parameter.

This endpoint takes no request body.

NameInTypeRequiredDescription
labelquerystringNoFilter mounts by label. Only mounts with this exact label will be returned.
Terminal window
curl -X GET "https://{projectId}-{containerId}-files-1.{server}.containers.hoody.icu/api/v1/mounts?label=Photos"

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

This endpoint takes no request body.

NameInTypeRequiredDescription
idpathstringYesMount ID
Terminal window
curl -X GET "https://{projectId}-{containerId}-files-1.{server}.containers.hoody.icu/api/v1/mounts/mount_550e8400"

Create a persistent FUSE filesystem mount for a connected backend. Every mount is automatically persisted and restored on container restart — there is no separate persistence flag. To remove a mount, use DELETE /api/v1/mounts/{id}.

This endpoint takes no URL parameters.

NameTypeRequiredDefaultDescription
backend_idstringYesID of an existing backend connection
labelstringNoHuman-readable label for the mount (e.g., "Photos"). Used by the UI and filterable via GET /api/v1/mounts?label=...
mount_pathstringNoAbsolute path for the mount. If omitted, defaults to /hoody/mounts/mount_{uuid}
vfs_configobjectNoVFS cache configuration for performance tuning

vfs_config supports the following properties:

NameTypeRequiredDefaultDescription
cache_max_ageinteger or stringNo3600Maximum time files are cached. Accepts seconds or duration strings like "1h"
cache_max_sizeinteger or stringNo10737418240Maximum cache size in bytes. Accepts bytes or human-readable strings like "10G"
cache_modestringNo"writes"Cache mode. One of "off", "minimal", "writes", "full"
dir_cache_timeinteger or stringNo300How long directory listings are cached. Accepts seconds or duration strings like "5m"
Terminal window
curl -X POST "https://{projectId}-{containerId}-files-1.{server}.containers.hoody.icu/api/v1/mounts" \
-H "Content-Type: application/json" \
-d '{
"backend_id": "backend_abc123",
"label": "Photos",
"vfs_config": {
"cache_mode": "writes",
"cache_max_age": 3600
}
}'

Update the VFS configuration for an existing mount. Use this to retune cache settings without unmounting and remounting the backend.

NameInTypeRequiredDescription
idpathstringYesMount ID
NameTypeRequiredDescription
vfs_configobjectYesVFS configuration parameters (same shape as the vfs_config object accepted by POST /api/v1/mounts)
Terminal window
curl -X PATCH "https://{projectId}-{containerId}-files-1.{server}.containers.hoody.icu/api/v1/mounts/mount_550e8400" \
-H "Content-Type: application/json" \
-d '{
"vfs_config": {
"cache_mode": "full",
"cache_max_age": 7200
}
}'

Remove a mount and disconnect the underlying FUSE filesystem.

This endpoint takes no request body.

NameInTypeRequiredDescription
idpathstringYesMount ID
Terminal window
curl -X DELETE "https://{projectId}-{containerId}-files-1.{server}.containers.hoody.icu/api/v1/mounts/mount_550e8400"

The endpoints below connect specialized backends that transform or compose other remotes. Use them to layer caching, chunking, hashing, aliasing, unioning, and in-memory storage on top of existing connections. Once connected, mount each backend with POST /api/v1/mounts to access it as a FUSE filesystem.

Create an alias for an existing remote or local path. The alias exposes the source under a new backend ID.

This endpoint takes no URL parameters.

NameTypeRequiredDefaultDescription
descriptionstringNo""Description of the remote
remotestringYes""Remote or path to alias. Accepts "myremote:path/to/dir", "myremote:bucket", "myremote:", or "/local/path"
Terminal window
curl -X POST "https://{projectId}-{containerId}-files-1.{server}.containers.hoody.icu/api/v1/backends/alias" \
-H "Content-Type: application/json" \
-d '{
"remote": "myremote:archive/2024",
"description": "Archive folder for 2024"
}'

Create a cache backend that stores file structure metadata and chunk data locally to accelerate reads from a slower remote.

This endpoint takes no URL parameters.

NameTypeRequiredDefaultDescription
remotestringYes""Remote to cache (e.g., "myremote:path/to/dir" or "myremote:bucket")
descriptionstringNo""Description of the remote
chunk_clean_intervalintegerNo60How often the cache performs chunk cleanups (seconds)
chunk_no_memorybooleanNofalseDisable the in-memory cache for streaming chunks
chunk_pathstringNo"/home/user/.cache/hoody-vfs/cache-backend"Directory where partial file data (chunks) is stored
chunk_sizestringNo"5242880"Size of a chunk. One of "1M", "5M", "10M"
chunk_total_sizestringNo"10737418240"Maximum total disk usage of chunks. One of "500M", "1G", "10G"
db_pathstringNo"/home/user/.cache/hoody-vfs/cache-backend"Directory for the file structure metadata database
db_purgebooleanNofalseClear all cached data for this remote on start
db_wait_timeintegerNo1Seconds to wait for the DB to become available (0 waits forever)
info_ageintegerNo21600How long to cache file structure information (seconds). One of "1h", "24h", "48h"
plex_urlstringNo""URL of the Plex server (optional integration)
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 certificate verification when connecting to Plex
read_retriesintegerNo10Number of times to retry a read from cache storage
rpsintegerNo-1Hard limit on requests per second to the source FS (-1 disables)
tmp_upload_pathstringNo""Directory for temporary files before upload (empty disables)
tmp_wait_timeintegerNo15Seconds a file must wait in the temp location before upload
workersintegerNo4Number of parallel workers for downloading chunks
writesbooleanNofalseCache file data on writes through the FS
Terminal window
curl -X POST "https://{projectId}-{containerId}-files-1.{server}.containers.hoody.icu/api/v1/backends/cache" \
-H "Content-Type: application/json" \
-d '{
"remote": "myremote:bucket/media",
"description": "Local cache for media bucket",
"chunk_size": "5M",
"chunk_total_size": "10G",
"workers": 4
}'

Create a chunker backend that transparently splits large files into smaller chunks on the remote and reassembles them on read.

This endpoint takes no URL parameters.

NameTypeRequiredDefaultDescription
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
fail_hardbooleanNofalseHow chunker handles files with missing or invalid chunks. One of true, false
hash_typestringNo"md5"How chunker handles hash sums. One of "none", "md5", "sha1", "md5all", "sha1all", "md5quick", "sha1quick"
meta_formatstringNo"simplejson"Format of the metadata object. One of "none", "simplejson"
name_formatstringNo"*.hoody-vfs_chunk.###"String format of chunk file names. The two placeholders are base file name (*) and chunk number (#)
start_fromintegerNo1Minimum valid chunk number (usually 0 or 1)
transactionsstringNo"rename"How chunker handles temporary files during transactions. One of "rename", "norename", "auto"
Terminal window
curl -X POST "https://{projectId}-{containerId}-files-1.{server}.containers.hoody.icu/api/v1/backends/chunker" \
-H "Content-Type: application/json" \
-d '{
"remote": "myremote:bucket/large-files",
"description": "Split large backups into chunks",
"chunk_size": "1073741824",
"hash_type": "sha1"
}'

Create a combine backend that joins several remotes into a single namespace by mapping each to a root directory.

This endpoint takes no URL parameters.

NameTypeRequiredDefaultDescription
upstreamsstringYesUpstreams in the form dir=remote:path dir2=remote2:path. Embedded spaces require quotes ("dir=remote:path with space")
descriptionstringNo""Description of the remote
Terminal window
curl -X POST "https://{projectId}-{containerId}-files-1.{server}.containers.hoody.icu/api/v1/backends/combine" \
-H "Content-Type: application/json" \
-d '{
"upstreams": "photos=myremote:bucket/photos videos=myremote:bucket/videos",
"description": "Combined view of photos and videos"
}'

Create a hasher backend that provides better checksums for files on another remote by intercepting hash requests.

This endpoint takes no URL parameters.

NameTypeRequiredDefaultDescription
remotestringYes""Remote to cache checksums for (e.g., "myRemote:path")
descriptionstringNo""Description of the remote
auto_sizestringNo"0"Auto-update checksum for files smaller than this size (disabled by default)
hashesstringNo"md5,sha1"Comma-separated list of supported checksum types
max_ageintegerNo0Maximum time to keep checksums in cache (seconds). 0 = no cache, off = cache forever
Terminal window
curl -X POST "https://{projectId}-{containerId}-files-1.{server}.containers.hoody.icu/api/v1/backends/hasher" \
-H "Content-Type: application/json" \
-d '{
"remote": "myremote:bucket/backups",
"description": "Cached checksums for backups",
"hashes": "md5,sha1,sha256",
"max_age": 3600
}'

Create a local backend that exposes a directory on the container’s local disk.

This endpoint takes no URL parameters.

NameTypeRequiredDefaultDescription
descriptionstringNo""Description of the remote
encodingstringNo"33554434"Backend encoding. See the encoding overview for details
case_insensitivebooleanNofalseForce the filesystem to report itself as case insensitive
case_sensitivebooleanNofalseForce the filesystem to report itself as case sensitive
copy_linksbooleanNofalseFollow symlinks and copy the pointed-to item
linksbooleanNofalseTranslate symlinks to and from regular files with a .hoody-vfslink extension
no_check_updatedbooleanNofalseDon’t check whether files change during upload
no_clonebooleanNofalseDisable reflink cloning for server-side copies
no_preallocatebooleanNofalseDisable preallocation of disk space for transferred files
no_set_modtimebooleanNofalseDisable setting modification time after upload
no_sparsebooleanNofalseDisable sparse files for multi-thread downloads
nouncbooleanNofalseDisable UNC (long path names) conversion on Windows
one_file_systembooleanNofalseDon’t cross filesystem boundaries (Unix/macOS only)
skip_linksbooleanNofalseDon’t warn about skipped symlinks
time_typestringNo"0"Which timestamp to return. One of "mtime", "atime", "btime", "ctime"
unicode_normalizationbooleanNofalseApply unicode NFC normalization to paths and filenames
zero_size_linksbooleanNofalseAssume the stat size of links is zero (deprecated)
Terminal window
curl -X POST "https://{projectId}-{containerId}-files-1.{server}.containers.hoody.icu/api/v1/backends/local" \
-H "Content-Type: application/json" \
-d '{
"description": "Local workspace",
"no_check_updated": true
}'

Create an in-memory object storage backend. Files written here are kept in RAM and lost when the backend is removed or the container restarts.

This endpoint takes no URL parameters.

NameTypeRequiredDefaultDescription
descriptionstringNo""Description of the remote
Terminal window
curl -X POST "https://{projectId}-{containerId}-files-1.{server}.containers.hoody.icu/api/v1/backends/memory" \
-H "Content-Type: application/json" \
-d '{
"description": "Scratch space in RAM"
}'

Create a union backend that merges the contents of several upstream filesystems into a single view.

This endpoint takes no URL parameters.

NameTypeRequiredDefaultDescription
upstreamsstringYes""Space-separated list of upstreams (e.g., "upstreama:test/dir upstreamb:"). Embedded spaces require quotes
descriptionstringNo""Description of the remote
action_policystringNo"epall"Policy to choose upstream on ACTION category
cache_timeintegerNo120Cache time of usage and free space (seconds). Only used with path preserving policies
create_policystringNo"epmfs"Policy to choose upstream on CREATE category
min_free_spacestringNo"1073741824"Minimum viable free space for lfs/eplfs policies (bytes)
search_policystringNo"ff"Policy to choose upstream on SEARCH category
Terminal window
curl -X POST "https://{projectId}-{containerId}-files-1.{server}.containers.hoody.icu/api/v1/backends/union" \
-H "Content-Type: application/json" \
-d '{
"upstreams": "upstreama:test/dir upstreamb:",
"description": "Merged view of two remotes",
"create_policy": "epmfs",
"search_policy": "ff"
}'