File storage

Presigned uploads, built in.

Get presigned upload URLs without standing up an upload service. Files land on local disk in development and an S3-compatible bucket such as R2, Backblaze, MinIO, or AWS in production. One environment variable selects the backend.

components/Avatar.tsx
import { FileUpload } from "@pylonsync/react";
function AvatarPicker() {
return (
<FileUpload
accept="image/*"
onUploaded={(file) => callFn("setAvatar", { fileId: file.id })}
/>
);
}
  • Presigned uploads send files straight from the client to storage
  • Local disk in dev, S3-compatible buckets in prod
  • R2, Backblaze B2, MinIO, or AWS S3 via one env var
  • File metadata lives in your typed schema, gated by the same policies

How it works.

presigned uploads
invoice.pdf0%
avatar.png33%
export.csv67%
presigned · S3-compatible

Pylon gives the client a short-lived presigned URL, so the bytes go straight to the bucket and large files do not tie up a server worker. The same access policies that guard your rows also guard downloads.

What you’d otherwise wire up.

Each line is a piece teams normally assemble for this one capability. On Pylon it is part of the runtime.

  • An object-store SDK and a service to sign upload URLs
  • An upload proxy that streams file bytes through your API
  • Access checks bolted on after the fact to file URLs
  • Per-environment bucket policies kept in sync by hand

Apps built with it.

Scaffold any of these with npm create @pylonsync/pylon.

All examples →
Agency / studio

A studio site with a case-study portfolio, plus a back-office: clients, invoices with PDF export, and live project availability.

Case studiesInvoices + PDFLive availability
template: agency

Build it on Pylon.

One framework for your schema, sync, auth, functions, realtime, and SSR. Free to start.