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.