Files surface
A folder tree where any media, document, or archive lives next to the data and prose it relates to. Same first-class surface as tables, docs, and HTML; same sharing, same audit log. Drop a screenshot into the workspace it belongs to, no separate file app required.
Creating a Files surface
Click the “+” at the right end of the surface tab bar, then pick the Files tile. The surface lands as an empty folder tree ready to drop files into.
Files surfaces coexist with tables, docs, and HTML in the same workspace. A workspace can have any number of any kind, in any order. Drag the tab to reorder.
Uploading files
Three ways:
- Drag and drop from your desktop into the surface body. The dropzone highlights when files are being dragged over it; release to upload.
- Click “+ Upload” in the toolbar. Opens your OS file picker (multi-file selection supported).
- Drag files into a sub-folder. Navigate into a folder first; the upload lands in that folder, not at the root.
Upload progress shows in a floating widget at the bottom-right with one row per file. Cancel or retry per row. The widget auto-dismisses two seconds after the last upload completes.
Storage caps
Storage usage is per org, summed across every Files surface in every workspace. Visible in Settings → Files with a breakdown by file type. Trash counts toward your cap until the 30-day cleanup window expires.
Supported file types
Default-deny allowlist for security. The current set:
- Images: PNG, JPEG, WebP, GIF, AVIF, HEIC
- Video: MP4, WebM, QuickTime
- Audio: MP3, WAV, OGG, M4A, WebM
- Documents: PDF, Word (.doc, .docx), Excel (.xls, .xlsx), PowerPoint (.ppt, .pptx)
- Text: plain text, Markdown, CSV, JSON, XML
- Archives: ZIP, TAR, GZip, 7z (never extracted server-side)
Need a type that isn’t on the list? Email support@trydock.ai with the use case and we’ll add it (or explain why we won’t).
In-browser preview
Click any file to open the preview modal. Images, video, audio, and PDFs render inline. Other file types show a download button. The modal carries the file’s display name, size, and quick actions (download, delete, close).
Folders + navigation
Click “+ Folder” to create a folder. Name it and it appears in the current view. Click a folder to navigate into it; the breadcrumb above the body updates. Click any segment of the breadcrumb to jump back up the tree.
Folders nest arbitrarily deep. Each folder belongs to one Files surface (folders don’t cross surfaces).
Delete + Trash
Open any file’s preview and click the delete icon, or cmd/ctrl-click multiple files in the grid to select them, then delete via the floating bulk-action bar at the bottom.
Deleted files move to Trash for 30 days before being permanently removed. Click Trash in the toolbar to view soft-deleted files; each row shows the days remaining. Click Restore to recover.
Security model
- MIME sniffed from magic bytes server-side. Never trusts the client-declared Content-Type, so a file uploaded as
image/jpegthat’s actually a Windows executable gets rejected. - Filenames sanitized:NFC-normalized, control characters stripped, length-capped at 255. The user’s filename is metadata only; the storage key is an opaque cuid (no path traversal possible).
- Quota enforced at uploadwith a SELECT FOR UPDATE lock on the org row so concurrent uploads can’t collectively exceed the cap.
- Soft-delete window means accidental deletes are reversible for 30 days.
API
The endpoints for programmatic access:
# List folder contents
GET /api/workspaces/{slug}/files?surfaceSlug={surface}&parentFolderId={id|null}
# Upload (use @vercel/blob/client `upload()` against this endpoint)
POST /api/workspaces/{slug}/files
# Download URL
GET /api/workspaces/{slug}/files/{fileId}/download
# Metadata
GET /api/workspaces/{slug}/files/{fileId}
# Soft-delete
DELETE /api/workspaces/{slug}/files/{fileId}
# Restore
PATCH /api/workspaces/{slug}/files/{fileId} body: { restore: true }
# List trash
GET /api/workspaces/{slug}/files/trash?surfaceSlug={surface}
# Create folder
POST /api/workspaces/{slug}/folders body: { surfaceSlug, parentFolderId?, name }
# Storage usage
GET /api/orgs/{slug}/storageFrequently asked questions
- Can agents upload files?
- Not in v1. Upload stays user-only while we design the consent + per-agent size budgets. Agents can list, get metadata, and delete files via the MCP tools shipping in a follow-up.
- What happens when I delete a folder?
- Folder soft-delete cascades to files inside via the service layer. Restoring the folder restores the children. After 30 days, the cleanup cron hard-deletes the folder + every descendant file + refunds the storage to your cap.
- Can I move a file to a different workspace?
- Not yet. Single-workspace only in v1. Cross-workspace move is queued for v1.1.
- Is there a public-link share for individual files?
- Not in v1. The pattern works for whole workspaces (visibility = public/unlisted) but per-file public links land after the public-workspace pattern proves out at scale.
- Why isn't SVG supported?
- SVG can carry executable JavaScript and external references. v1 excludes SVG from the allowlist; v2 wires DOMPurify sanitization server-side and re-enables it.