Operity

Advisory: the private repository was publicly reachable, 2026-09-06 to 2026-09-17

Published 2026-09-18. Incident window 2026-09-06 12:12 to 2026-09-17 about 19:00 (Central European Summer Time). Served at /docs/advisory-2026-09-17-repository-exposure and linked from limitations, section 10.

Who this is for. Anyone who used, evaluated or relied on the hosted Operity instance at https://operity.vercel.app. The short version: no users existed during the window, so there is nobody to notify. That is not the same as there being nothing to notify about. The private source, the internal plans and the research data behind every published figure were downloadable by anyone for eleven days, and anyone who fetched them still has them.


Summary

The project's source code is kept in a private repository. For eleven days the public deployment served the contents of that repository, and some files that were never in it, to anyone who asked for them by path: /CLAUDE.md, /docs/PLAN-M8.md, the source under /operity/, the tests under /tests/, and the whole of the gold-key audit. That audit's material included the full text of all 160 documents the readers were given, every answer each reader gave for each field, the adjudicator's verdict and reasoning on every disputed field, and the known answers themselves. No credential was exposed. No database was reachable. No user's data existed to expose.

This advisory corrects an earlier account. The first account of this incident, in the project's internal record, said files whose names begin with a dot were not served. That was wrong. It was generalised from probing .env*, .git and .vercel, which the platform withholds by default. Other dot-folders were served, including .gold-keys/, which held the audit's reader documents and judgements. Everything below was established by listing the files of every deployment made during the window, before those deployments were deleted.

Timeline

when (CEST) what
2026-09-06 12:12 first production deployment. From here on, every deployment served its whole upload by path
2026-09-10 21:30 the gold-key audit's working files are written to a local folder, .gold-keys/, that is not part of the repository
2026-09-10 22:12 the next deployment uploads and serves .gold-keys/. So does every deployment after it until the fix, eleven in all
2026-09-17 ~18:45 found while reading how the documentation was served: /docs/LIMITATIONS.md answered 200 although no route serves that name
2026-09-17 ~19:00 fixed and deployed: the platform serves only a one-file public/ directory, and files the application does not read are no longer uploaded. An acceptance test sampling 45 repository paths refused the old deployment with 39 of them and passes on the new one
2026-09-18 this advisory; the gold-key pool retired (below)
2026-09-18 every deployment made before the fix, 22 of them, deleted, so none can be restored; the platform's access token for automated requests revoked (below)

What was reachable

Everything uploaded with a deployment, by its path in the project folder:

What was not exposed, and how that was established

What we cannot tell you: who downloaded what. The platform keeps request logs for hours, not days, so there is no record of the requests made during the window. Treat everything listed above as public.

Root cause

A platform default nobody decided. The deployment is configured with no web framework and no output directory. For a project configured that way, the hosting platform treats the whole uploaded folder as the website's static files, and it serves a matching file before it consults the rule that sends every request to the application. Nobody chose that; it is what happens when the setting is absent. The upload was the whole project folder, so the website was the whole project folder. The same shape has produced this project's other serious defects: a signing key nothing read, so the published default signed every passport; and a scheduled routine nothing scheduled.

What changed

What you need to do

Nothing. There were no users to act, and no credential, key or account to rotate because of this. If you are evaluating Operity, assume its source code and internal plans are public. Its security was designed on that assumption anyway: every threshold is published, and no check depends on a secret parameter.