# Storage Providers

> Configure AWS S3 (or any S3-compatible provider).

*Canonical: https://makerkit.dev/docs/nextjs-prisma/storage/providers*

---

The storage package supports multiple cloud providers through unstorage drivers. This guide covers setup for each provider.

## Local Filesystem (Development)

The filesystem driver is enabled by default in development:

```bash {% title=".env.local" %}
# .env.local
STORAGE_PROVIDER=fs
STORAGE_BASE_URL=/storage.dev
```

Files are stored locally and served via Next.js static file serving at `/storage.dev/*`.

**Note:** Filesystem storage is disabled in production (`NODE_ENV === 'production'`).

## AWS S3 (or any S3-compatible provider)

### Environment Variables

```bash {% title=".env.production" %}
# .env.production
STORAGE_PROVIDER=s3
STORAGE_BASE_URL=https://my-bucket.s3.us-east-1.amazonaws.com

STORAGE_S3_ACCESS_KEY_ID=your-access-key
STORAGE_S3_SECRET_ACCESS_KEY=your-secret-key
# Optional for S3-compatible providers (R2, MinIO, etc.)
STORAGE_S3_REGION=us-east-1
STORAGE_S3_BUCKET=my-bucket
```

In the current implementation, the S3 driver reads its endpoint/public base from `STORAGE_BASE_URL`.

Never commit secrets. For production, set `STORAGE_S3_SECRET_ACCESS_KEY` in your hosting provider's secret manager.

## Custom Provider

Register any unstorage-compatible driver:

```typescript {% title="packages/storage/src/registry.ts" %}
import { storageRegistry } from '@kit/storage';
import customDriver from './my-custom-driver';

storageRegistry.register('custom', async () => {
  const { createStorage } = await import('unstorage');

  return createStorage({
    driver: customDriver({
      // Driver options
    }),
  });
});
```

Then set:

```bash
STORAGE_PROVIDER=custom
```

---

**Next:** [API Reference](./api-reference)
