---
title: 'Media'
description: 'Effortlessly manage and serve all your media files.'
---

**bknd** provides a flexible and efficient way to handle media files, making it easy to upload, manage, and deliver content across various platforms.

### **Core Features**
- **File Uploads**: Supports direct (chunked coming soon) uploads of files up to 5GB (depending
on your environment).
- **Adapter-Based Design**:
   - Pre-built support for S3, S3-compatible services (e.g., R2, Tigris), and Cloudinary.
   - Extend functionality by implementing custom adapters.
- **Entity Integration**: Attach media files directly to entities for seamless data association.
- **Content Delivery**: Serve media over an API endpoint or directly from your provider.

The media tools are designed to integrate effortlessly into your workflows, offering scalability
and control without added complexity.

### Pre-built support for S3

There are two ways to enable S3 or S3 compatible storage in bknd. 

1. Enable via the admin UI.

Simply navigate to the **Media** tab of the bknd admin UI and enable the S3 media support. 
Enter your AWS S3-compatible storage Access Key, Secret Access Key, and URL. 
This will automatically configure the S3 adapter for you. 

2. Enable programmatically.

To enable using a code-first approach, create an [Initial Structure](/usage/database#initial-structure) using the 
`initialConfig` option in your `bknd.config.ts` file. 

```typescript bknd.config.ts
import type { BkndConfig } from "bknd/adapter";

export default {
   initialConfig: {
      media: {
         enabled: true,
         adapter: {
            type: "s3",
            config: {
               access_key: "<key>",
               secret_access_key: "<secret key>",
               url: "<bucket url>"
            }
         }
      }
   }
} satisfies BkndConfig;
```

### Local adapter for development

For local development and testing, you can use the local file system adapter. This is particularly useful when working with Node.js environments.

```typescript bknd.config.ts
import { registerLocalMediaAdapter } from "bknd/adapter/node";
import type { BkndConfig } from "bknd/adapter";

// Register the local media adapter
const local = registerLocalMediaAdapter();

export default {
   initialConfig: {
      media: {
         enabled: true,
         adapter: local({
            path: "./public/uploads", // Files will be stored in this directory
         }),
      }
   }
} satisfies BkndConfig;
```

This configuration will store uploaded files in the specified directory, 
making them accessible through your application's public path or whever 
you choose.
