Object storage on hardware we own.
Buckets, uploads, and shareable links on the same infrastructure your instances run on, billed on the same invoice. Public access is set object by object, so one bucket can hold the logo your site serves to the world and the export nobody outside your organization should ever see. A presigned link hands a file to someone who has no account and never needs one.
client-deliverables
What it does
Five things you can do with a bucket, each of them granted on its own. The list below is everything object storage does today, with no higher tier holding anything back.
Buckets you create and name
A bucket is the container files go into, and you make as many as the work needs. One for a client, another for the assets a website serves. Inside a bucket, each object carries a path of its own, so images/avatars/face.png lands where the name says it should instead of in one flat pile. Creating, renaming, and deleting buckets is a single permission, held apart from everything that happens to the files inside, and renaming one later does not move what it holds.
Uploads into a bucket
Files arrive from the dashboard or from an application running on one of your instances, and either way they land in the same bucket and appear in the same listing. Upload is its own permission, so an account can be allowed to add files without being allowed to touch anything that is already stored.
Browsing what is stored
Viewing is separate from everything else. An account with view access opens the bucket list, walks the objects inside, and downloads what it needs. Nothing it does can add a file, remove one, or expose one, which makes it the right grant for the person who needs to look something up now and then.
Share links and public objects
Two ways to put a file in front of someone. A presigned share link works for whoever holds it, without an account, and expires at the end of the window you set on it. Marking an object public gives it an address a browser can fetch directly, which is what static assets want. Both take the share permission, and it is not bundled with upload.
Deletes, held separately
Removing an object is a grant of its own. An account can be given the ability to clear out last year's exports without gaining the ability to create buckets or publish anything, and an account that uploads all day can be kept away from delete entirely. The two are different jobs and they are handed out as different jobs.
Scoped to your organization
Every query against object storage is filtered by the organization that owns the bucket. Buckets, objects, and the names of both stay inside the tenant that created them, and nothing crosses between tenants. What reaches the outside world is what someone with the share permission decides to publish or link.
Where it fits
Object storage is the place for files that should outlive a single instance, or that need an address of their own. These are the placements it gets used for most.
Five separate permissions
Viewing, managing buckets, uploading, deleting, and sharing are granted separately. An account holds any combination of the five, and holding one gives it no claim on the others.
- View buckets and objectsRead access. The account opens the bucket list, looks through what is inside, and downloads what it needs. That is the whole extent of it.
- Create, rename, and delete bucketsControl over the containers rather than their contents. Renaming a bucket later does not move the files inside it.
- Upload files into bucketsWrite access on its own. An account with this and nothing else adds files without touching what is already there.
- Delete objects from bucketsRemoval, held apart from upload, so emptying a bucket is something a person was deliberately trusted with rather than a side effect of being able to fill it.
- Share objectsMint a presigned link, or mark an object public so anyone with the address can fetch it. This is the grant that lets a file leave your organization.
The shape this is built for is the contractor who needs to put files somewhere. Give that account upload access and it can add files to the bucket for as long as the engagement runs, with no ability to delete what is already there, rename the bucket, or publish anything to the open internet. When the work ends you remove one grant and the account goes quiet.
The same split covers the read-only case. Someone who needs to pull an export gets view access and nothing else, so the worst outcome of a session going missing is a download rather than an empty bucket.
Sharing is kept apart from uploading on purpose, because minting a link or marking an object public is the point where a file leaves your organization. That is a different decision from putting the file in a bucket, and in most teams it belongs to different people. Underneath all five grants, every query is scoped to the organization that owns the bucket, so permissions decide what your own people can do and tenancy decides the rest.
Three ways in
A signed-in session in the dashboard is one of them. The second is an API key issued to your own code, and the third is a share URL held by someone who has neither. A key carries separate read, write, and delete scopes, so the separation of duties you set up for people is the separation of duties you get for machine credentials.
- ReadList buckets, list what is in them, and download the contents. A key carrying this and nothing else can copy data out and change none of it.
- WriteUpload objects, including large files sent in parts. A key carrying this adds data and cannot remove any.
- DeleteRemove objects, and abort a large upload that is still in flight. Held on its own, the same way it is for people.
- Object storage templateA ready-made scope set that grants all three at once, for the key that genuinely has to do everything.
A key is issued with the scopes the job needs and nothing beyond them, which is the argument above applied to machine credentials. The key a deployment pipeline uses can be given write and stopped there, so a build runner that gets compromised can add an artifact and cannot empty the bucket behind it. A key that serves a public site gets read. The routes sit under /api/v1/cos/, and a key only ever holds the scopes it was issued with.
Large files are sent in parts instead of one long request, and an upload interrupted partway resumes from the parts the server already holds rather than starting from the beginning. It matters for the files large enough that a dropped connection would otherwise cost you the whole transfer, and it works the same way from the dashboard and from your own code.
The third way in carries no credential at all. A share URL works for whoever holds it, with no account behind it, which is why minting one is a permission of its own and why it reaches a single object rather than the bucket around it.
On the same invoice
Storage is a line on the monthly invoice you already receive, next to your instances and your bandwidth. There is no separate storage subscription to sign up for, no second billing portal to keep credentials for, and no minimum spend to commit to before a bucket will hold a file.
Rates are published on the pricing page, and they are the rates the dashboard charges against. Create a bucket, upload to it, and what you store appears on the next invoice beside everything else you run with us.
In our buildings
Objects sit on hardware in Carpathian facilities in Des Moines, Iowa. US Central 001 is the production site and US Central 002 is the disaster recovery site, and both are buildings we operate, which makes this site redundancy inside our own footprint.
Nothing is relayed to a third-party storage provider. When a customer or an auditor asks where a file physically lives, the answer is a building with an address, staffed by people we employ, so data residency is a question we can answer without drawing a supply chain.
- US Central 001 in Des Moines, the production site
- US Central 002 in Des Moines, the disaster recovery site
- No third-party storage provider anywhere in the path
- Every query scoped to the organization that owns the bucket
Common questions
What teams ask before they move files onto it.
Is public access set on the bucket or on the object?
Does someone need a Carpathian account to open a share link?
Can I let a contractor upload without letting them delete?
Can I reach object storage from my own code?
How does storage get billed?
Where do the objects physically live?
Is this the same as the nightly backups on my instance?
Can another organization see my buckets?
The rest of what runs on this hardware
Buckets usually sit beside the instances that fill them and the nightly archives that protect those instances. Storage, infrastructure, and bandwidth land on one monthly invoice.
Create a bucket on hardware we own.
Object storage is part of Carpathian Cloud, so an account that reaches your instances reaches your buckets. Make one, upload a file, and decide object by object who gets to see it.