React forms with direct uploads to your S3/R2 bucket.

Try it: drag a sample into the form. This demo sends it straight to a test S3/R2 bucket.

What’s happening

  1. Open uploadFillo
  2. Sign file partFillo
  3. Send file bytesS3 / R2
  4. Verify uploadFillo
  5. Save responseFillo

Your form in your app.

Your React app owns the UI. Fillo handles the schema, upload session, validation, and response record.

SupportForm.tsx
const form = defineForm({
  id: "support",
  pages: [{ id: "request", blocks: [
    { id: "attachment", kind: "file_upload" },
  ] },
] });

<FilloForm form={form} client={fillo} />

Why not just build the form yourself?

You can. The fields are the easy bit. It’s everything after someone presses submit that becomes a project.

The work starts after submit.

You keep the fields and UI. Fillo handles what happens next.

Your app
Fillo
  1. ValidateCheck every reply on the server.
  2. SaveKeep answers and files together.
  3. DeliverRetry webhooks and send to Slack.
  4. TrackSave progress and show drop-off.

File uploads need a backend.

Each file needs signed parts, retries, completion checks, and cleanup. Fillo handles that; the bytes go to your storage.

Form changes shouldn’t break old replies.

Old replies should still make sense after a field is added, renamed, or removed.

Works with the tools your team already uses.

ZapierGoogle SheetsNotionSlackGoogle DriveBoxAmazon S3Cloudflare R2CSV exportWebhooksEmail

Built in Denmark. Hosted in the EU.

Frequently asked questions

Why not ask an AI agent to build it?

Do that for the form people see. Fillo handles the part behind it: checking answers, moving files, saving replies, and keeping later changes safe.

Where do the files go?

Straight from the browser to the S3 or R2 bucket you connect. Fillo saves the reply and a reference to the file.

Can anyone open the files?

No. Keep the bucket private. Only people in your workspace can open durable files through Fillo.

What if an upload stops halfway?

Fillo keeps track of it, resumes where the storage provider allows, and cleans up uploads that were abandoned.

What happens when I change the form?

Each reply remembers the form version it came from, so old answers still make sense after you publish a change.

Is the form an iframe?

No. The React SDK renders normal controls in your app. Use the defaults, bring your own components, or go fully headless.

How the upload works.

Presigned parts, retries, verification, and cleanup are documented.