Skip to content

Remote Storage

marimo makes it easy to work with cloud storage and remote filesystems by automatically detecting obstore and fsspec storage connections in your notebook. From the Files panel, you can browse directories, search entries, copy URLs, and download files—all without leaving the editor.

Supported libraries

marimo auto-discovers variables that are instances of:

Library Base class Example stores
obstore obstore.store.ObjectStore S3Store, GCSStore, AzureStore, HTTPStore, LocalStore, MemoryStore
fsspec fsspec.AbstractFileSystem S3FileSystem, GithubFileSystem, FTPFileSystem, DatabricksFileSystem, and many more

Creating a storage connection

You can either create a storage connection using the UI or code.

1. Using the UI

From the Files panel in the sidebar, expand the Remote Storage section and click the Add remote storage button. The UI will guide you through entering your storage connection details.

Add a storage connection through the UI

If you'd like to connect to a storage that isn't supported by the UI, you can use the code method below, or submit a feature request.

2. Using code

obstore

from obstore.store import S3Store

store = S3Store.from_url(
    "s3://my-bucket",
    access_key_id="...",
    secret_access_key="...",
)

S3-compatible stores can also authenticate with container-vended credentials — used by ECS/EKS task roles and CoreWeave sandboxes, where the platform injects a credential endpoint and a token file:

import os

from obstore.store import S3Store

store = S3Store(
    "my-bucket",
    endpoint="https://my-bucket.cwobject.com",
    virtual_hosted_style_request=True,
    container_credentials_full_uri=os.environ["AWS_CONTAINER_CREDENTIALS_FULL_URI"],
    container_authorization_token_file=os.environ["AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE"],
)

S3 endpoint gotchas

  • AWS_ENDPOINT_URL_S3 takes precedence over the endpoint argument, so an explicitly configured endpoint is silently ignored when that variable is set.
  • virtual_hosted_style_request=True expects the bucket name to already be part of the endpoint hostname; unlike boto3, obstore does not prepend it.

fsspec

from fsspec.implementations.github import GithubFileSystem

repo = GithubFileSystem(org="marimo-team", repo="marimo")

After the cell runs, the Remote Storage section will populate with your connection, its detected protocol, and root path.

Remote storage panel

Multiple connections

You can have multiple storage connections in the same notebook — each one appears as a separate namespace. The panel header shows the variable name so you can tell them apart.

from obstore.store import S3Store

prod = S3Store.from_url("s3://prod-bucket")
staging = S3Store.from_url("s3://staging-bucket")