We're now on Discord!Join

Storage

Store and serve
any type of digital content

An open source Object store with unlimited scalability, for any file type.

With custom policies and permissions that are familiar and easy to implement.

storage header
storage header

Interoperable

Integrates well with the rest of Supabase ecosystem, including Auth and Postgres.

Lightning fast

Thin API server layer that leverages Postgres' permissions and performance.

Dependable

Enterprise-level scalability and durability.

Sleek dashboard for managing your media

A complete Object Explorer so that any of your team can use.

Drag and drop uploading, moving objects, and multiple object selection. As easy as working on your desktop.

File previews

Preview any media type, including video and audio.

Column view

Slick Miller-column navigation for rapid folder exploration.

List view

List View to find detailed File metadata at a glance.

Multi select actions

Multi-import and multi-export. Select multiple files from multiple folders.

Path navigator

If you know the exact path of your file, type it in and navigate directly.

Check out our example app

Profile management example

Update a user account with public profile information, including uploading a profile image.

Created by:supabase

Simple and convenient APIs

Built from the ground-up for interoperable authentication.

Fast and easy to implement using our powerful library clients. Asset optimization and image transformation coming soon!

CDN

Serve from the edge to reduce latency.

Coming soon

Transformations

Resize and compress your media before you serve it.

Coming soon
1
2// Upload an image to the "avatars" bucket
3const spaceCat = event.target.files[0]
4const { data, error } = await supabase
5  .storage
6  .from('avatars')
7  .upload('space-cat.png', spaceCat)
8  
9  
10  
11
12
13  
1
2// Download the "space-cat.png" image from the "avatars" bucket
3const { data, error } = await supabase
4    .storage
5    .from('avatars')
6    .download('space-cat.png')
7
8
9
10
11
12        
13  
1
2// List all the files in the "avatars" bucket
3const { data, error } = await supabase
4    .storage
5    .from('avatars')
6    .list()
7
8
9
10
11
12        
13  
1
2// Move and rename files
3const { data, error } = await supabase
4  .storage
5  .from('avatars')
6  .move('public/space-cat.png', 'private/space-cat.png')
7
8
9
10
11
12
13        
14  
1
2// Delete a list of files
3const { data, error } = await supabase
4  .storage
5  .from('avatars')
6  .remove([ 'avatar1.png', 'avatar2.png' ])
7
8
9
10
11
12
13
14        
15  

Integrates natively
with Supabase Auth

Using Postgres Row Level Security to create Object access rules.

Storage Authorization is built around Postgres so that you can use any combination of SQL, Postgres functions, and even your own metadata to write policies.

1create policy "Public Access" 
2on storage.objects for all 
3using ( bucket_id = 'avatars' );
4    
1create policy "Public access to a folder" 
2on storage.objects for all 
3using (
4  bucket_id = 'avatars' 
5  and (storage.foldername(name))[1] = 'public' 
6);
7    
1create policy "Logged in access" 
2on storage.objects 
3for all using (
4  bucket_id = 'avatars' 
5  and auth.role() = 'authenticated'
6);
1create policy "Individual access" 
2on storage.objects for all 
3using (
4  bucket_id = 'avatars' 
5  and name = 'folder/only_uid.jpg' 
6  and auth.uid() = 'd8c7bce9-cfeb-497b-bd61-e66ce2cbdaa2'
7);
Allow public CRUD access to a bucket

This will allow any user access to the bucket named 'avatars'

Allow public CRUD access to a folder in a bucket

This will allow any user access to the folder named 'public' in the bucket 'avatars'

Allow any authenticated user access to a folder

This will allow any authenticated user access to the folder named 'authenticated' in the bucket 'avatars'

Allow a specific user access to a file

This will allow a specific user based on the user's UID access to a file named 'only_uid.jpg'

Build in a weekend, scale to millions