> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xpander.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# File storage

> Where xpander keeps agent workspaces, uploads and generated files, and how agents reach your S3 buckets.

| Files | Where they live |
| - | - |
| Agent workspaces: a session's code, downloads and outputs | Claude Code, Codex and OpenCode agents: [fleet volumes](#workspace-volumes) on an XFS StorageClass with `prjquota`, with a 20 GiB limit per agent by default (a ceiling, not reserved space). Agents whose harness is **xpander** and that use a workspace: a 5 GiB volume each |
| Uploads, attachments, generated files, live-surface assets | xpander's asset store on xpander cloud and Hybrid. [Supabase Storage](#object-storage) on an in-cluster volume on Air-Gapped, which signs Storage URLs instead of using xpander's CDN |
| Files in your own S3 buckets | Your AWS account, through the [Amazon S3 skill](#s3-as-a-skill) |

## Workspace volumes

Each agent is a directory on a fleet volume, and every turn runs in its own sandbox against it. The fleet needs an XFS StorageClass with project quotas: set `fleet.storage.createClass: true`, or name an existing one in `fleet.storage.className`. Without it, the fleet refuses to start rather than run unbounded. Sizing: [Sizing and requirements](https://docs.xpander.ai/self-hosted/sizing.md).

The **Computer view** in xpander Chat browses the workspace. Credential stores such as `.aws`, `.ssh` and `.kube` never appear in it. See [Agent workspace](https://docs.xpander.ai/use/agents/conversations.md#results-and-the-files-an-agent-produces).

## Object storage

A self-hosted install needs 48 GiB of volumes for the chart's stores, plus 500 GiB per executor for the fleet volume, plus 5 GiB for each agent whose harness is **xpander** and that uses a workspace. On Air-Gapped, Supabase Storage keeps objects on its own in-cluster volume (`supabase.storage.persistence`, 50 GiB by default):

```yaml theme={"dark"}
supabase:
  storage:
    persistence:
      size: 100Gi
      storageClass: gp3
    publicUrl: https://<supabase host>
```

It runs one replica with no S3 backend, so back the volume up with your snapshot policy. A sealed VPC still needs the S3 gateway endpoint, for ECR image pulls.

## S3 as a skill

The **Amazon S3** skill is served by the [AWS Operator](https://docs.xpander.ai/self-hosted/aws-operator.md) in your cluster. The operator assumes a per-skill IAM role and signs each call, so no bucket credential ever reaches an agent. See [IAM best practices](https://docs.xpander.ai/self-hosted/iam-best-practices.md) and [Amazon S3](https://docs.xpander.ai/connectors/amazon-s3.md).

## Next steps

> [card] [Size the executor fleet](https://docs.xpander.ai/self-hosted/sizing.md)
>
> Workspace sizing

> [card] [Design IAM roles for AWS skills](https://docs.xpander.ai/self-hosted/iam-best-practices.md)
>
> Per-skill roles


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.