Filelayer

Should you depend on this?

Probably not yet. This page exists so you can decide that quickly, with the real numbers, instead of inferring it from what a README doesn't say.

Filelayer is a file layer for SaaS applications: files with owners, orgs and roles, share links that expire and can be revoked, lifecycle, and an audit trail that records denials. Its first release on npm was 0.3.0, on 6 September 2026 — the registry's own timestamp, which is a day later than this page said until 4 October.


The state of it, in numbers

Version0.33.0 — alpha
Known production deployments0
Maintainers with commit rights1
Independent security reviewnone
Load measuredFirst run 4 October 2026, benchmark/load/RESULTS.md. One machine, no network, no object store, seconds per cell
Tests696, all of them against a real PostgreSQL, every commit; the suite also runs on Node 22, 24 and 26, where the suites needing credentials or two connections skip themselves
Concurrency, against a real PostgreSQL with two backends8 tests, every commit
Adversarial suite27 attacks, 0 breaches
Runtime dependencies0
LicenceApache-2.0
Storage adapter against live Cloudflare R212 tests every commit, 13 nightly
Storage adapter against live AWS S312 tests every commit, 13 nightly, eu-north-1 only

If any row in that table is disqualifying for you, it should be, and you can stop reading. We would rather you decline today for accurate reasons than adopt on a misunderstanding and discover the gap during an incident.


What is actually tested

The authorization engine is the part we stand behind. There is one function that answers every access question, and a property suite that covers cross-tenant isolation, revocation that beats a live URL, delegation attenuation, download caps under concurrency, audit tamper-evidence (within the limit named below), and the full role matrix.

Two of those tests are worth naming because they are the ones that catch the mistakes people actually make:

What runs against a real object store, and what still does not

Since 30 September 2026 the storage adapter runs against live Cloudflare R2 on every commit. Twelve tests per commit and a thirteenth nightly, in CI, against a real bucket: put/get/head/ delete, ranged reads, prefix listing, keys containing characters that break naive URL construction, a presigned GET the store actually honours, a presigned URL expiring for real, a tampered one refused, and — on the nightly run and on manual dispatch — an 11 MB multipart upload reassembled byte-exactly. Plus the whole Filelayer lifecycle end to end on top of it.

Before that it had never run against anything but a local harness, and this page said so for three weeks.

Since 3 October 2026 the same tests also run against AWS S3 itself, on every commit, against a bucket in eu-north-1 reached through a least-privilege IAM user. R2 is S3-compatible, not S3, which is the whole reason for running both: AWS has its own checksum requirements, real IAM evaluation, virtual-hosted addressing and its own error codes. Until that day those were exercised only against the local harness that recomputes every SigV4 signature — a harness that found nine real bugs, including one where a key containing # silently collided with a different object and returned the wrong file's bytes, but which is not the counterparty.

What that still does not say: one region, one bucket configuration, and no traffic. The tests write a handful of objects and an 11 MB multipart upload on the nightly run. Nobody has put load on this on either provider.

The job fails, rather than passing quietly, if the credentials are present and the suite skips itself — the one failure mode that looks exactly like success. That check had itself never executed until the day the credentials arrived, and it was broken: it read the runner's tally in a format the runner had stopped emitting. Fixed the same day, and it now reads either format and also fails on a non-zero failure count, which the first version did not.

What is known broken or unfinished

Kept current, and complete, in LIMITATIONS.md — fourteen entries, which ship in the npm tarball. The ones most likely to matter:


What would make this trustworthy

Not a roadmap of features. These are the specific things that would let a sceptical engineer say yes, in the order they matter:

  1. Production deployments that are not ours. One, then three, then ten. This is the only item on the list we cannot manufacture, and it is the one that matters most. Everything else is work; this is evidence.
  2. The storage adapter under real load, and in more than one region and bucket configuration. It runs against live R2 and live AWS S3 on every commit; what no test here has produced is traffic.
  3. An independent security review of schema.sql and authz.ts, published in full including whatever it finds. The property suite is self-asserted, and cross-tenant isolation is exactly the claim that needs an adversary who is not the author.
  4. 1.0, with a frozen schema and a written compatibility promise.
  5. A second maintainer, and a demonstrated response time on a real report.

We will report against this list publicly, including when a number stays at zero.


Using it anyway

If you want to try it, the honest framing is: this is a good design that has not met production. Reasonable ways to engage, roughly in order of exposure:

If you do try it, open an issue about anything that confused you. Confusion is a defect here; the whole claim is that this removes decisions you would otherwise get wrong quietly, and a confusing API does the opposite.

Security reports: see SECURITY.md.