nova

Built to outlast its authors.

A federated archive for binary objects.

This is a running Nova federation. Upload an image and you get back a URL that is a hash — something you can verify rather than a promise you have to trust. The bytes themselves live encrypted on volunteer machines that cannot read them.

A federation: one coordinator surrounded by six donor nodes, drawn without edges between them because donors never speak to each other unprompted.

Stance

Three facts, and what they cost

Donor-blind
Volunteers store ciphertext. No keys, no filenames, no idea what they are holding. A subpoena served on a donor produces bytes nobody involved can read.
Operator-sovereign
One coordinator, on hardware one person pays for. No vendor sits in the request path and no platform can revise the terms underneath you.
No phone-home
The software reports to nobody. There is no upstream that can switch this federation off, and no telemetry pile for anyone to subpoena.

Donor-blind is not operator-blind. The coordinator holds the master key and decrypts on every read — that is how a plain <img> tag works at all. If your threat model includes the operator, encrypt before you upload, or run your own coordinator. Both are supported. Neither is pretended away here.

Register

What this federation actually is

Stack
One Go binary · Postgres · nginx
Crypto
XChaCha20-Poly1305, per blob
Addressing
SHA-256 of the ciphertext
Federation
Nebula mesh · donor-blind pinning
Replication
R=3 normal · R=5 important
Upload ceiling
100 MiB per file · 100 files per batch
Telemetry
None. No CDN by default.
Licence
Apache-2.0 · no copyleft deps
Status
Public beta

Open to anyone

Uploading needs no account and no email

Drop a file, get a permanent content-addressed URL, put it wherever you like. Nothing to sign, nothing to verify, no welcome sequence.

Procedure

Join the beta

Two things need an email: running a donor node, and signed URLs. Everything else on this site is already open to you.

Write to bug@thebugreport.dev and answer whichever of these apply. Expand any question you want the background on — the answers explain what you would be signing up for, which is the part most signup forms skip.

Why do you want in, and what would you keep here?

The unvarnished version is more useful than the impressive one. Nova suits some jobs badly: it is not a hot cache, not a CDN, and not a place to park something you will regenerate next week. It suits archives — things you intend to still have in ten years.

Knowing what you would store tells me which replication class you belong in and whether I should talk you out of it.

Are you interested in running a donor node?

A donor pins encrypted blocks on behalf of the federation. You never hold a key, never see a filename, and open no public ports — the node dials out over a Nebula mesh and nothing dials in.

What you are volunteering is disk, upstream bandwidth, and a small amount of attention when something needs upgrading. What you are not volunteering is any ability to know what you are storing.

Where would it run — which provider, and which country?

Replicas are only as independent as the machines underneath them. Three donors in one datacenter share one power feed, one transit provider, and one abuse desk: durability on paper, a single failure domain in practice.

Jurisdiction matters for the same reason. I would rather place your node where it adds a dimension the federation does not have yet than where it adds a fourth copy of one it already has.

How much disk can you commit, and for how long?

Leaving is a supported operation, not a betrayal — but it is a coordinated one. When you drain, your node keeps serving as a repair source until your replicas exist elsewhere, and then you are done. Pulling the plug instead makes the federation rebuild from every other copy rather than from yours.

So give me the horizon you actually believe in rather than the one that sounds generous. Six honest months beats a theoretical forever.

What can you spend on upload per day?

Your node caps its own outbound transfer, and you set the cap. The orchestrator does not penalise a small budget — it hands out work in proportion, so a modest donor is useful rather than tolerated.

DeploymentBudget/dayUplink
Residential, conservative20 GB50 Mbps
Residential, generous50 GB50 Mbps
Mid-tier VPS500 GB100 Mbps
High-bandwidth VPS2 TB1 Gbps
Residential line or datacenter?

Residential works, and plenty of good donors run that way. It also means an ISP with opinions about sustained upstream traffic, so the recommended budget is lower — not because your bytes are worth less, but because a terminated connection helps nobody.

Tell me which one you are on and I will suggest a starting budget rather than letting you discover the limit the hard way.

Can you verify a signed container image?

Donor images are published by digest and signed with cosign keyless signatures. Before you run one, three things must verify: the signature, the SBOM attestation, and the build provenance. If any of the three fails, the correct response is to stop and tell me, not to shrug and continue.

If that sentence was unfamiliar, say so — it is a twenty-minute thing to learn and I would rather teach it than have you skip it. Pretending to have checked is the only wrong answer.

Do you need access to signed URLs?

A signed URL is a time-limited read link for content that is otherwise private, bound to a single embedding origin. The coordinator checks the request's Origin against the one the link was minted for, so a link lifted from your page stops working when it is pasted onto someone else's.

They are minted by the coordinator because signing needs a key only the coordinator holds. If you want them, tell me which origin would embed them.

Worth knowing before you rely on it: Origin is set by browsers and forgeable with curl. This stops your images being embedded elsewhere. It does not stop a determined person downloading them — the same limit CORS has.

What should the node be called, and how do I reach you?

The name goes on your certificate and into the federation's health view, so pick something you will recognise at 2am. Lowercase, no spaces.

Upgrades are a digest re-pin and drains are coordinated, so I need a channel that reaches you within a few days. Email is fine. Anything I have to remember to check is not.

What happens next. I issue your certificates — you never generate federation identity yourself — and send you a bundle plus the digest to pin. From there it is a compose file and about ten minutes before the first pin assignments reach you.

Questions

The ones worth asking

What stops you reading my uploads?

Nothing. That is what donor-blind means and what it does not: the volunteers cannot read your file, the coordinator can. Transforms and plain image tags both need plaintext, and plaintext needs the master key.

If that is unacceptable for what you are storing, encrypt it before it reaches me. The federation will happily replicate bytes it cannot make sense of.

What happens when you lose interest?

A fair question to ask anyone running infrastructure alone. The software is Apache-2.0 with no copyleft dependencies, self-hostable, and documented well enough that someone else can stand up a coordinator without me.

Your URLs are hashes of your own content, so nothing about recovering them depends on this domain still existing.

Can I take something down?

Yes. Mail the address above with the URL. There is a takedown path with quarantine as its default, and a documented DMCA procedure for the cases that need one.

Content addressing means an identical file uploaded twice is one blob, so removal applies to the blob rather than to your copy of the link.

Why not just use an object store?

Use one, if it fits. A hosted bucket is cheaper, faster, and someone else's problem at 3am.

What it does not give you is a URL that proves its own contents, storage spread across machines with no common owner, or terms that cannot be rewritten next quarter. Nova trades convenience for those three things. If you do not want the trade, the object store is the right answer.