---
title: "Storage"
description: "Uploads to any S3 API."
url: https://plate.findmalek.engineer/docs/storage
markdown: https://plate.findmalek.engineer/docs/storage.md
group: "Modules"
---

# Storage

The `storage` module adds `packages/storage`, a small client for any S3 compatible API: Garage, Cloudflare R2, AWS S3 or MinIO. It is on by default.

```bash
findplate create my-app --modules storage
```

## What it adds

Files and folders:

- `packages/storage`

Packages:

- `@acme/storage`

## Env keys

```bash
S3_ENDPOINT=
S3_REGION=auto
S3_BUCKET=
S3_ACCESS_KEY_ID=
S3_SECRET_ACCESS_KEY=
```

`createStorage(config)` returns `null` when the config is incomplete, so the feature turns itself off instead of crashing. Only `apps/api` uses it. Self-hosted S3 can be provisioned for you, see [provisioning](https://plate.findmalek.engineer/docs/provision.md).

## Remove

Run `findplate remove storage` in the project, see [add and doctor](https://plate.findmalek.engineer/docs/add-doctor.md#findplate-remove). It deletes the files the module owns, strips its code from shared files and drops its packages, only where you haven't edited them.

If you'd rather do it by hand: for a new project leave `storage` out of `--modules`. In a project that already exists, delete the paths above, drop its packages from the `package.json` files, remove its env block and fix what `pnpm check-types` reports.

## Swap

The package only speaks the S3 API, so swapping provider is an env change: point `S3_ENDPOINT` at R2, AWS, MinIO or Garage and set `S3_REGION`. Use `auto` for R2.
