# Object storage (/docs/composer/object-storage)

> For the complete Prisma documentation index, see [llms.txt](https://www.prisma.io/docs/llms.txt). A markdown version of any docs page is available by appending `.md` to its URL.

Provision an S3-compatible object-store bucket and use it from a service with any S3 client.

Location: Composer > Object storage

`bucket` is a raw S3-compatible object-store bucket: a flat key-value store with no higher-level abstractions attached. Like [`postgres()`](https://www.prisma.io/docs/composer/databases), it is a resource with two ends: the service declares the need, and the module that owns the bucket provisions it.

```ts title="src/uploads/service.ts"
import { bucket, compute } from '@prisma/composer-prisma-cloud';

export default compute({
  name: 'uploads',
  deps: { store: bucket() }, // dependency end: receives credentials
  // ...
});
```

```ts title="module.ts"
const store = provision(bucket({ name: 'uploads' })); // resource end: provisions + mints a keypair
provision(uploadsService, { deps: { store } });
```

Inside the service entry, `load()` hands back `{ url, bucket, accessKeyId, secretAccessKey }`, the standard S3 config set. Use any S3-compatible client (`@aws-sdk/client-s3`, `minio`, Bun's S3 API):

```ts title="src/uploads/server.ts"
import { S3Client } from '@aws-sdk/client-s3';

const { store } = service.load();
const s3 = new S3Client({
  endpoint: store.url,
  bucket: store.bucket,
  credentials: { accessKeyId: store.accessKeyId, secretAccessKey: store.secretAccessKey },
});
```

## Buckets and the storage Module [#buckets-and-the-storage-module]

A bucket resource uses the same S3 contract kind as the [`storage` Module's](https://www.prisma.io/docs/composer/building-blocks) blob store. A service declared with `deps: { store: s3() }`, where `s3` is imported from `@prisma/composer-prisma-cloud/storage`, can be rewired to a `bucket` resource without changing the service declaration. Reach for the `storage` Module when you want a managed blob store with its own internals; reach for `bucket` when you want the raw S3 surface.

`dev` provisions a local stand-in bucket with working credentials, so upload code runs locally without an account. See [Local development](https://www.prisma.io/docs/composer/local-development).

## Next steps [#next-steps]

* [Building blocks](https://www.prisma.io/docs/composer/building-blocks): the storage and streams Modules built on the same contract.
* [Service input](https://www.prisma.io/docs/composer/service-input): when a credential should be input instead of a dependency.

## Related pages

- [`Apps and Modules`](https://www.prisma.io/docs/composer/apps-and-modules): How services, resources, and Modules compose into a Prisma App, and how provision() wires them together.
- [`Building blocks`](https://www.prisma.io/docs/composer/building-blocks): Compose the ready-made cron, storage, and streams Modules instead of building scheduled jobs, blob storage, or event streams yourself.
- [`Core concepts`](https://www.prisma.io/docs/composer/core-concepts): The ideas every Composer declaration and command builds on: services, resources, Modules, ports, contracts, stages, and the deploy model.
- [`Databases`](https://www.prisma.io/docs/composer/databases): Give a service a Postgres database, either as a plain connection or typed by a Prisma 8 contract with managed migrations.
- [`Deploying`](https://www.prisma.io/docs/composer/deploying): Deploy a Prisma App to production or an isolated stage, run it in CI, and tear environments down safely.