SFTP
Provided by: Hoody API (SSH Proxy)
- Built on SSH protocol (port 22)
- Same infrastructure as SSH access
- Same authentication (SSH keys)
- Privacy-preserving routing
- Universal SFTP client support
You mount the container’s storage on your own computer, so the connection is client-initiated: your machine connects to the container, not the other way around. From there you get drag-and-drop file access in whatever file manager you already use.
What that gives you:
File access:
Related access:
Two protocols support local mounting:
SFTP
Provided by: Hoody API (SSH Proxy)
WebDAV
Provided by: hoody-kit (hoody-files service)
Both protocols reach the same container filesystem: SFTP through the Hoody API, WebDAV through hoody-kit.
SFTP is provided by the Hoody API’s SSH Proxy, the same infrastructure as SSH access.
Protocol: SFTP (SSH File Transfer Protocol)Host: {projectId}-{containerId}-ssh.{serverName}.containers.hoody.comPort: 22Username: rootAuthentication: SSH public keyYou mount from your local machine to the container: a client-initiated connection, for security and control.
Example: if your container is on server us-west-1, the SFTP host is:
{projectId}-{containerId}-ssh.us-west-1.containers.hoody.comPrivacy benefit: the same endpoint serves all containers on that server. SFTP routing happens by SSH public key during the handshake, so the target container is not visible in the connection URL.
sftp://{projectId}-{containerId}-ssh.us-west-1.containers.hoody.com~/.ssh/hoody-container-1Mounted at: /Volumes/{projectId}-{containerId}-ssh.us-west-1.containers.hoody.com/
# Mount via sshfs (requires osxfuse/macFUSE)brew install macfusebrew install gromgit/fuse/sshfs-mac
# Create mount pointmkdir -p ~/Hoody/container-1
# Mount containersshfs root@{projectId}-{containerId}-ssh.us-west-1.containers.hoody.com:/ \ ~/Hoody/container-1 \ -o IdentityFile=~/.ssh/hoody-container-1
# Access filesls ~/Hoody/container-1/hoody/storage
# Unmount when doneumount ~/Hoody/container-1Download: WinSCP
New Site:
{projectId}-{containerId}-ssh.us-west-1.containers.hoody.com22rootAuthentication:
%USERPROFILE%\.ssh\hoody-container-1Login - the container filesystem appears in WinSCP’s file manager
Optional: Tools → Preferences → Integration → Explorer
Edit → Settings → Connection → SFTP
%USERPROFILE%\.ssh\hoody-container-1Site Manager → New Site:
{projectId}-{containerId}-ssh.us-west-1.containers.hoody.com22rootConnect - a two-pane file manager shows local and remote side by side
Windows has no native SFTP client. Use WinSCP or FileZilla.
Or map a WebDAV drive instead (see the WebDAV section below).
# Install sshfssudo apt-get install sshfs # Debian/Ubuntusudo dnf install sshfs # Fedorasudo pacman -S sshfs # Arch
# Create mount pointmkdir -p ~/hoody-containers/container-1
# Mount containersshfs root@{projectId}-{containerId}-ssh.us-west-1.containers.hoody.com:/ \ ~/hoody-containers/container-1 \ -o IdentityFile=~/.ssh/hoody-container-1
# Access filesls ~/hoody-containers/container-1/hoody/storage
# Make persistent (add to /etc/fstab)echo "root@{projectId}-{containerId}-ssh.us-west-1.containers.hoody.com:/ /home/user/hoody-containers/container-1 fuse.sshfs defaults,IdentityFile=/home/user/.ssh/hoody-container-1,allow_other 0 0" | sudo tee -a /etc/fstab
# Unmountfusermount -u ~/hoody-containers/container-1| Client | Platform | GUI | Features |
|---|---|---|---|
| FileZilla | Win/Mac/Linux | Yes | Two-pane, queue, bookmarks, free |
| WinSCP | Windows | Yes | Explorer integration, scripting, sync |
| Cyberduck | Mac/Windows | Yes | Finder integration, cloud services |
| Transmit | Mac | Yes | Polished UI, fast, paid |
| sshfs | Mac/Linux | No | Command-line, native mounting |
| Mountain Duck | Mac/Windows | Yes | Mount as drive letter, paid |
WebDAV provides HTTP-based filesystem access with native operating-system support.
# Get container details to build WebDAV URLhoody containers get $CONTAINER_ID
# The WebDAV URL follows this pattern:# https://{project}-{container}-files-1.{server}.containers.hoody.com/const container = await client.api.containers.get(CONTAINER_ID);const { project_id, id, server_name } = container.data;
// Construct WebDAV URL from container detailsconst webdavUrl = `https://${project_id}-${id}-files-1.${server_name}.containers.hoody.com/`;console.log(webdavUrl);// https://PROJECT_ID-CONTAINER_ID-files-1.us-west-1.containers.hoody.com/# Get container details to find server name and IDscurl "https://api.hoody.com/api/v1/containers/$CONTAINER_ID" \ -H "Authorization: Bearer $TOKEN"
# Build WebDAV URL from response:# https://{project_id}-{container_id}-files-1.{server_name}.containers.hoody.com/One request, one link
cURL runs inside your container and can wrap any HTTP request into a single GET URL. The call stops being something you need a client for and becomes something you can paste into a browser, send in a chat, bookmark, schedule with cron, or drop into a no-code tool.
Nothing is installed on the machine that opens it. The link does carry whatever credentials the call needs, so treat it as you would treat those credentials.
Slashes, colons and braces pass through as they are. The one character you must
encode is an & inside a value, which happens when the wrapped URL
carries its own query string. Left raw it ends the value early, and the rest is
read as cURL's own parameters, so you get a 200 on a request you did
not make.
How the wrapping works Chaining calls into one link Turning a link into a shortcut
Returns the container’s details, including project_id, id, and server_name, which you combine into the WebDAV URL as shown above.
https://PROJECT_ID-CONTAINER_ID-curl-1.SERVER.containers.hoody.com/api/v1/curl/request?url=https://api.hoody.com/api/v1/containers/CONTAINER_ID&method=GET&bearer_token=TOKEN&response=transparent The link carries a credential and executes with it, so it is as sensitive as the credential itself — and it passes through the cURL service's request log on the way, not just the target's. Share it only where you would share the secret, and prefer a delegated token with minimal permissions and an expiry: see API tokens.
Connection details:
URL: https://{project}-{container}-files-1.{server}.containers.hoody.com/Authentication: Hoody Proxy PermissionsExample URL:
https://PROJECT_ID-CONTAINER_ID-files-1.us-west-1.containers.hoody.com/You mount from your client to the container, so you control the connection.
Finder → Go → Connect to Server (⌘K)
Server Address:
https://PROJECT_ID-CONTAINER_ID-files-1.us-west-1.containers.hoody.com/Click Connect
Authentication:
The container filesystem mounts as a WebDAV drive
Mounted at: /Volumes/webdav/
Add to Login Items for auto-mount:
Right-click “This PC” → Map network drive
Drive letter: Choose (e.g., Z:)
Folder:
https://PROJECT_ID-CONTAINER_ID-files-1.us-west-1.containers.hoody.com/Check: “Reconnect at sign-in” (for persistence)
Check: “Connect using different credentials”
Credentials:
Click Finish - the drive appears in Explorer as Z:\
If “The network path was not found”:
Enable WebClient service:
# Run as Administratorsc config webclient start=autosc start webclientModify registry for HTTPS support:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\ParametersBasicAuthLevel = 2 (DWORD)Try mapping again
# Install davfs2sudo apt-get install davfs2 # Debian/Ubuntusudo dnf install davfs2 # Fedora
# Create mount pointsudo mkdir -p /mnt/hoody-container
# Add credentials to /etc/davfs2/secrets (if Proxy Permissions configured)echo "https://PROJECT_ID-CONTAINER_ID-files-1.us-west-1.containers.hoody.com/ USERNAME PASSWORD" | sudo tee -a /etc/davfs2/secrets# OR leave blank if no permissions configuredsudo chmod 600 /etc/davfs2/secrets
# Mountsudo mount -t davfs https://PROJECT_ID-CONTAINER_ID-files-1.us-west-1.containers.hoody.com/ /mnt/hoody-container
# Access filesls /mnt/hoody-container/hoody/storage
# Make persistent (add to /etc/fstab)echo "https://PROJECT_ID-CONTAINER_ID-files-1.us-west-1.containers.hoody.com/ /mnt/hoody-container davfs user,noauto 0 0" | sudo tee -a /etc/fstab
# Unmountsudo umount /mnt/hoody-containerRecommended WebDAV client for Android:
Install WebDAV Navigator from Play Store
Add Connection:
https://PROJECT_ID-CONTAINER_ID-files-1.us-west-1.containers.hoody.com/Browse Files:
/hoody/storage, /home/user, etc. all accessibleFile Operations:
A file manager with WebDAV support:
Install Solid Explorer
Add Storage:
PROJECT_ID-CONTAINER_ID-files-1.us-west-1.containers.hoody.com/Access:
Install FX File Explorer
Network → Add Network Location → WebDAV
https://PROJECT_ID-CONTAINER_ID-files-1.us-west-1.containers.hoody.com/Browse and manage files like local storage
iOS 13 and later have built-in WebDAV support.
Open Files app
Tap ••• (More) → Connect to Server
Server:
https://PROJECT_ID-CONTAINER_ID-files-1.us-west-1.containers.hoody.com/Authentication:
Container mounts in sidebar under “Shared”
Access Files:
A file manager with WebDAV support, search, and PDF viewing:
Install Documents
Services → + → WebDAV Server
https://PROJECT_ID-CONTAINER_ID-files-1.us-west-1.containers.hoody.com/Full file management:
Install FE File Explorer
Remote Storage → WebDAV
PROJECT_ID-CONTAINER_ID-files-1.us-west-1.containers.hoody.com/Two-pane file manager with thumbnails
The two differ in setup, platform support, and metadata handling:
| Feature | SFTP | WebDAV |
|---|---|---|
| Provided By | Hoody API (SSH Proxy) | hoody-kit (hoody-files) |
| Setup | Requires SSH key | Uses Proxy Permissions |
| Native Support | macOS/Linux (via sshfs) | macOS/Windows/iOS (built-in) |
| Mobile Support | Android/iOS SSH clients | Android/iOS native file managers |
| Security | SSH protocol | HTTPS |
| Firewall | Port 22 (sometimes blocked) | Port 443 (rarely blocked) |
| Speed | Fast | Slightly slower (HTTP overhead) |
| Metadata | Full POSIX support | Limited metadata |
| Compatibility | All SFTP clients | All WebDAV clients |
Recommendation:
Mount the container, edit locally, and the changes land in the container immediately:
# Mount container filesystem# macOS:open sftp://{projectId}-{containerId}-ssh.us-west-1.containers.hoody.com
# Edit files in your favorite local editorcode /Volumes/{projectId}-{containerId}-ssh.us-west-1.containers.hoody.com/hoody/storage/myapp/
# Changes saved locally = changes in container instantlyGood for: editing code, configs, and logs without an SSH terminal.
Drag and drop a backup through your file manager:
# Mount container# Copy /hoody/storage to local backupcp -r /Volumes/webdav/hoody/storage ~/Backups/container-backup-2025-11-10/
# Or use rsync for incremental backupsrsync -av /Volumes/webdav/hoody/storage/ ~/Backups/container-latest/Better than: manual file downloads via the HTTP API.
Upload hundreds of files in one operation:
# Mount container WebDAV# Drag entire project folder from local machine# to /Volumes/webdav/hoody/storage/projects/
# Or use command-linecp -r ~/Projects/website/* /Volumes/webdav/var/www/html/Faster than: sequential HTTP uploads.
Tail logs in a local text editor:
# Mount container# Open log file with live-updating editor (e.g., VS Code, Sublime Text)code /Volumes/webdav/hoody/storage/myapp/logs/app.log
# Log updates appear in real-time as container writesAlternative to: SSH plus tail -f.
SFTP’s public key routing means the connection URL doesn’t reveal which container you’re accessing:
# Same endpoint for all containers{projectId}-{containerId}-ssh.us-west-1.containers.hoody.com
# Routing happens by SSH key (invisible to network observers)WebDAV URLs contain the project and container IDs, which are visible to anyone who sees the URL.
SFTP: SSH keys already in ~/.ssh/ with permissions 600
WebDAV: Use credential managers:
chmod 600Never hard-code API tokens in scripts.
Leaving mounts active consumes resources:
# macOSumount /Volumes/webdav
# Linuxfusermount -u ~/hoody-containers/container-1
# Windowsnet use Z: /deleteOr set up auto-unmount on logout and shutdown.
SFTP (Linux/macOS):
sshfs root@{projectId}-{containerId}-ssh.{serverName}.containers.hoody.com:/ ~/container-1 \ -o ro,IdentityFile=~/.ssh/keyA read-only mount prevents accidental deletions when you are only browsing or reading files.
Local mounting is for human interaction: file managers and editors.
For automation such as scripts and CI/CD, use the Hoody Files HTTP API:
# Automation: Direct HTTPcurl "https://...-files.../api/v1/files/data.json"
# Automation: Mounting unnecessarymount → access → unmount (slower, more complex)Yes. SFTP uses SSH authentication, so your container must have an ssh_public_key configured. See SSH Access.
WebDAV does not require SSH. It uses Hoody Proxy Permissions, or no authentication if permissions are disabled.
Yes. Each container has unique SFTP and WebDAV endpoints, so mount as many as you need.
SFTP: Different SSH keys route to different containers (same hostname).
WebDAV: Different container URLs mount as different drives.
Minimal impact. File operations go through the hoody-files service, which is optimized for this use case.
Heavy operations, such as copying gigabytes of data, consume bandwidth and I/O like any file transfer.
SFTP: Only if they have the container’s SSH private key.
WebDAV: Only if they pass Proxy Permissions (if configured). If permissions disabled, WebDAV is open access.
Security: Configure Proxy Permissions for WebDAV access control. SFTP is always key-protected.
Files are permanently deleted from the container filesystem, the same as running rm over SSH.
Safety: Create snapshots before bulk deletions.
Yes. Mounting is inbound, to the container, through the Hoody Proxy. Network block mode only prevents outbound traffic from the container.
Problem: “Connection refused” when mounting SFTP
Solutions:
Verify container is running:
curl "https://api.hoody.com/api/v1/containers/{id}" \ -H "Authorization: Bearer $TOKEN"# Check: "status": "running"Test SSH connectivity:
ssh -i ~/.ssh/hoody-container-1 root@{projectId}-{containerId}-ssh.{serverName}.containers.hoody.com# Should connect to shellCheck SSH key is added to container:
# Verify via APIGET /api/v1/containers/{id}# Check: "ssh_public_key" field is setProblem: Windows can’t connect to WebDAV, authentication fails
Solutions:
Enable WebClient service:
sc config webclient start=autosc start webclientAllow Basic Auth over HTTPS:
Registry: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters
BasicAuthLevel = 2Check Proxy Permissions:
Problem: macOS blocks the WebDAV connection over the SSL certificate
Solution: Hoody issues and renews per-server wildcard certificates (*.{serverName}.containers.hoody.com), so this should not happen.
If it does:
Problem: Changes made in container don’t appear in mounted filesystem
Cause: File manager caching
Solutions:
Unmount and remount:
umount /Volumes/webdav# RemountRefresh view: F5 or ⌘R in file manager
Use Hoody Terminal to verify file contents:
cat /path/to/changed/fileProblem: File transfers via mounted filesystem are slow
Solutions:
Check network latency:
ping {projectId}-{containerId}-ssh.{serverName}.containers.hoody.com# High latency = slow transfersUse a nearby server: create the container on a geographically close server
Compress before transfer:
# Instead of copying entire directorytar czf backup.tar.gz /source/dir# Copy single compressed file (faster)Use a direct HTTP upload for large files:
curl -X PUT "https://...-files.../api/v1/files/uploads/large-file.zip" \ --data-binary @large-file.zipOther storage capabilities:
/hoody/storage/hoody/databases/File access methods:
What this page covered: