Better file uploads for developers

Developers deserve better than S3. That's why we made UploadX, the easier (and safer) alternative. From the button to the server, we've got you covered.

Your Auth. Our Storage.

The right balance of security and simplicity.

Authentication happens on your server, the upload happens on ours. Type-safe from client to server with full progress tracking.

Presigned Uploads

Files go directly from the browser to storage via presigned URLs. No server bottleneck.

🔒

Type-safe Middleware

Run auth and validation on your server before any upload starts. Full TypeScript inference.

⚙️

Self-hosted MinIO

Your data stays on your infrastructure. S3-compatible storage you control completely.

server.ts
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 Error("Unauthorized");

      return { userId: user.id };
    }),
client.tsx
<UploadButton
  endpoint="imageUploader"  // Typesafe btw
  onClientUploadComplete={(response) => ...}
  onUploadError={(error) => ...}
/>