FileHutch

About

Every app rebuilds the same file plumbing

Presigned uploads, a CORS rule, a column holding a bucket URL, a resize helper, a cleanup job, and no record of who uploaded what. It takes a week, it is never quite finished, and the next app starts from zero.

The tools that solve it properly are built for media companies. They price like it, and they arrive with a digital asset manager, a video pipeline and an approvals workflow attached. Most applications need avatars, a few PDFs and a link that expires.

FileHutch is the narrow version. It owns the control plane — stable file IDs, upload policies, signed URLs, named transforms, audit history, a dashboard and a REST API — and leaves the bytes to a bucket. Managed Cloudflare R2 if you want to start in ten seconds, or your own R2, S3 or B2 bucket if you would rather the files never left your account.

The reason that split matters is not architectural tidiness. It is that your database ends up holding file_8f2kq1x9 instead of a provider, a bucket, a region and a key. One of those is a string. The other four are a migration you have already agreed to write.

The rule everything serves

Application code must never depend on provider-specific URLs, bucket names, object keys or APIs. A file ID stays stable when the bytes move between providers.

It is written at the top of the codebase's own instructions, and it is the reason to say no to most feature requests.

How it is run

Promises that are cheap to make and expensive to break

Bring your own bucket on every plan
Including Free. It is the feature that makes leaving possible, so putting it behind a paywall would defeat the point of having it.
Leaving is a documented path
Managed customers get an export to their own bucket. Because your app stores file IDs, the move does not touch your code.
Credentials are encrypted and never shown twice
Your bucket keys are encrypted at rest, scoped as narrowly as the provider allows, and unreadable after you save them.
Pricing has no calculator
Flat monthly, a storage allowance, no seats and no credits. Hit the allowance and uploads stop rather than the bill climbing.
The roadmap says no more than yes
No DAM, no video pipeline, no AI tagging. A product that does four things well is more useful than one that does twelve adequately.
Unfinished things are labelled
Anything on the pricing page marked Coming is not built yet. You should know that before you pay, not after.

The shape of it

Built on
Rails 8.1, PostgreSQL and Hotwire. Cloudflare R2 for managed storage, and the S3 API for everything else.
Who it is for
Teams of one to twenty shipping an application that happens to have files in it.
Where the bytes are
Your bucket, or a Cloudflare R2 bucket we run. Never on our servers.
How to reach us
The contact page goes to a real queue. Security reports jump it.

The free plan is the honest demo.

2 GB, one project, your own bucket if you want it. Nothing expires and there is no card.