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.
Authentication happens on your server, the upload happens on ours. Type-safe from client to server with full progress tracking.
Files go directly from the browser to storage via presigned URLs. No server bottleneck.
Run auth and validation on your server before any upload starts. Full TypeScript inference.
Your data stays on your infrastructure. S3-compatible storage you control completely.
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 };
}),<UploadButton
endpoint="imageUploader" // Typesafe btw
onClientUploadComplete={(response) => ...}
onUploadError={(error) => ...}
/>