Private by default
Every object lives under its own organization key, and all access runs through short-lived, permission-checked links. There are no public URLs.
Files go straight to private storage, and every byte is checked.
A document attachment, a form upload or a generated export goes from the browser to private storage without passing through the app server. The server signs a short-lived link first, then compares the stored size and fingerprint to what was declared. Only a match becomes downloadable, and every download link is short-lived and permission-checked.
Product example
This is the same visual component used by the authenticated app, rendered with deterministic sample data.
The metadata, its classification, the download link and the durable deletion controls.
Inert sample data · no network access
Preview ready
Highlights
Every object lives under its own organization key, and all access runs through short-lived, permission-checked links. There are no public URLs.
After the upload the server asks the provider for the real size and fingerprint and compares them to what was declared. A mismatch is quarantined instead of published.
Deleting hides the object at once, then a retrying job removes the bytes. If the provider keeps refusing, the object is flagged as failed rather than left to linger unnoticed.
Without a shared foundation, every team rebuilds these edge cases, differently.
Streaming a large file through the application burns memory until requests time out. Letting the browser write straight to a bucket usually skips the permission check. Here the server approves first and the bytes still go direct.
An upload is cut off halfway, or the bytes differ from what was declared. Without a settlement step the broken file becomes downloadable. A mismatch here means quarantine, never availability.
A delete that fails silently leaves bytes we are still paying for, and worse, bytes marked as gone that are not. A failed deletion here surfaces with its last error for a person to act on.
The mechanism end to end, as implemented in the repository.
Ask for an upload link
The server checks your role plus the declared name, type, size and fingerprint, then returns a signed link valid for ten minutes.
The browser uploads directly
The file goes from the browser to the storage provider with progress reporting. The application server never handles the bytes.
The server verifies
After the upload the server reads the object’s real size and fingerprint from the provider. A match makes it available, a mismatch quarantines it and fails the confirmation.
Deletion is a job, not a wish
Deleting removes the object from listings immediately, then a retrying job removes the bytes. Persistent failures are flagged for the control center.
Engineering guarantees
The certification evidence runs against a disposable local S3-compatible provider, not the hosted one. Finance receipt and invoice attachments are built on this capability but their resource is still draft, so that upload path stays off until it is certified.
The boundary above is code, not a claim. These files carry the contract:
src/features/storage/server.tssrc/features/storage/jobs.tssrc/features/storage/browser-upload.ts.resource-certifications/storage.jsonThese capabilities share contracts and boundaries with this one.
The docs describe the same contracts this page demonstrates.