uploadthing

Your Auth. Our Bandwidth.

The right balance of security and simplicity.

Authentication happens on your server, the upload happens on ours.

export const fileRouter = {
  imageUploader: f({ image: { maxFileSize: "4MB" } })
    .middleware(async ({ req }) => {
      // This code runs on your server before upload
      const user = await auth(req);
 
      // Throw to block uploading
      if (!user)
        throw new UploadThingError("Unauthorized");
 
      // Return metadata to client
      return { userId: user.id };
    })
    .onUploadComplete(async ({ metadata, file }) => {
      // ...
    }),
} satisfies FileRouter;
<UploadButton
  endpoint="imageUploader" // Typesafe btw
  onClientUploadComplete={(response) => ...}
  onUploadError={(error) => ...}
/>

Theo

I asked for a better S3 for years. UploadThing exists because we got tired of waiting.

Easily manage your files.

A powerful, intuitive dashboard for developers to securely manage and track all uploaded files.