# Introduction (https://s3.dimah.dev/docs)



**dimah-s3** is a modular, full-stack S3 toolkit for React and Node.js runtimes. It provides typed server handlers, headless React hooks, optional [shadcn](https://ui.shadcn.com) UI components, and a database plugin for object tracking.

It is not an S3 SDK wrapper. List, copy, tagging, and other operations stay
in your own code with the
[AWS SDK](https://www.npmjs.com/package/@aws-sdk/client-s3).

## Architecture flow [#architecture-flow]

<Flow
  label="Presign-first architecture"
  steps="[
  { name: &#x22;Browser&#x22;, kind: &#x22;client&#x22;, note: &#x22;requests signed URL&#x22; },
  { name: &#x22;Server&#x22;, kind: &#x22;server&#x22;, note: &#x22;executes guards & signs URL&#x22; },
  { name: &#x22;S3 Bucket&#x22;, kind: &#x22;s3&#x22;, note: &#x22;receives direct upload bytes&#x22; },
]"
/>

It follows a **presign-first** architecture: the backend generates short-lived signed URLs, the browser communicates directly with your S3-compatible storage, and AWS credentials never leave your server.

Coding agents: [llms.txt](https://s3.dimah.dev/llms.txt) · [llms-full.txt](https://s3.dimah.dev/llms-full.txt).

***

## What you get [#what-you-get]

* Fast setup — a working upload in minutes, not a week of wiring
* Full stack — server, client, and optional shadcn UI; not a client uploader you
  have to back yourself
* Full lifecycle — upload, download, and delete, including multipart
* Server hooks — auth, quotas, confirm, and cleanup where they belong
* Optional database — ownership, listings, and resumable uploads when you
  need them

## Frequently asked questions [#frequently-asked-questions]

<Accordions>
  <Accordion title="How does delete work compared to upload and download?">
    Upload and download are presigned (the client communicates directly with S3). Deletion is executed server-side: the client sends a delete request to your API, the server runs your `delete.guard`, issues `DeleteObjectCommand` via the AWS SDK, and triggers `onDeleted` cleanup.
  </Accordion>

  <Accordion title="Can I use dimah-s3 with Cloudflare R2 or MinIO?">
    Yes. Any S3-compatible storage works out of the box. For Cloudflare R2, configure `upload: { method: "PUT" }`. For MinIO, pass `forcePathStyle: true` in your S3Client.
  </Accordion>
</Accordions>

***

## Explore documentation [#explore-documentation]

<Cards>
  <Card title="Quickstart" href="/docs/quickstart" description="Get a working upload flow running in under 5 minutes." />

  <Card title="Server Guide" href="/docs/server" description="Configure routes, lifecycle hooks, guards, and runtimes." />

  <Card title="React Client" href="/docs/react" description="Headless hooks for upload, download, and delete." />

  <Card title="UI Components" href="/docs/react/ui" description="Prebuilt shadcn components for buttons, dropzones, and status." />

  <Card title="Providers" href="/docs/providers" description="Setup guides for AWS S3, Cloudflare R2, and MinIO." />

  <Card title="Database Plugin" href="/docs/db" description="Track object metadata, ownership scopes, and file listings." />
</Cards>
