# Nostr Media

> Image, video and file hosting for the [Nostr](https://nostr.com) protocol. Nostr Media
> is a Blossom- and NIP-96-compatible media server: any Nostr client that speaks either
> protocol can upload to it by pointing at `https://nostrmedia.com`.

- **Site:** <https://nostrmedia.com>
- **File manager:** <https://nostrmedia.com/manage>
- **Blob host:** `https://file.nostrmedia.com`
- **Operator:** 21 Million LLC dba Nostr Services
- **Support:** support@NostrMedia.com
- **Nostr:** [npub18jnd0ssw2v882c0t9xsxdhafsah8j86prdfpsld8kv2dcjx43r8qke59kc](https://njump.me/npub18jnd0ssw2v882c0t9xsxdhafsah8j86prdfpsld8kv2dcjx43r8qke59kc)

## What it does

Nostr Media stores media on behalf of a Nostr public key. Authentication is a signed
Nostr event rather than a username and password, so there is no account to create and no
password to lose — access is proven by signing with the key you already have.

| Capability | Detail |
| --- | --- |
| Upload protocols | [Blossom](https://github.com/hzrd149/blossom) and [NIP-96](https://github.com/nostr-protocol/nips/blob/master/96.md) |
| Max file size | 5 GB per file (via the presigned endpoint); 125 MB via a single `POST /upload` |
| Storage | 100 GB (Purple), 210 GB (Onyx), 2.1 TB (Gold) |
| Retention | Uploads never expire while the subscription is active |
| Payment | Credit card via Stripe, or Bitcoin over Lightning via a Nostr zap |
| Monetisation | Zapwall — charge satoshis to unlock a file, paid 100% to the file owner |
| Free tier | None. A paid plan is required to upload or store files. |

## Documentation for agents and developers

| Document | Contents |
| --- | --- |
| [api.md](https://nostrmedia.com/docs/api.md) | Complete HTTP API reference: auth, upload, mirror, list, rename, delete, usage, Zapwall |
| [clients.md](https://nostrmedia.com/docs/clients.md) | How to point Amethyst, Primal, Nostur, noStrudel, 0xchat, YakiHonne and other clients at Nostr Media |
| [pricing.md](https://nostrmedia.com/docs/pricing.md) | Plans, prices, storage limits and per-tier file-type rules |
| [faq.md](https://nostrmedia.com/docs/faq.md) | Frequently asked questions |
| [file-manager.md](https://nostrmedia.com/docs/file-manager.md) | What the web file manager at /manage can do |
| [terms.md](https://nostrmedia.com/docs/terms.md) | Terms of Service |
| [privacy.md](https://nostrmedia.com/docs/privacy.md) | Privacy Policy |
| [aup.md](https://nostrmedia.com/docs/aup.md) | Acceptable Use Policy |

Machine-readable index: [llms.txt](https://nostrmedia.com/llms.txt).
Everything concatenated into one file: [llms-full.txt](https://nostrmedia.com/llms-full.txt).

## How uploading works, in short

1. The user's Nostr client computes the SHA-256 hash of the file.
2. The client signs a kind `24242` Nostr event with a `["t", "upload"]` tag and an
   `["x", "<sha256>"]` tag.
3. The signed event is base64-encoded and sent as `Authorization: Nostr <base64-event>`.
4. The file is sent to `https://nostrmedia.com/upload`.
5. The server checks the event's pubkey against the subscriber lists, stores the blob,
   and returns the public URL under `https://file.nostrmedia.com/p/<pubkey>/<sha256>.<ext>`.

Files larger than 125 MB use `https://nostrmedia.com/presigned`, which hands back
presigned URLs the client `PUT`s the file to directly. See
[api.md](https://nostrmedia.com/docs/api.md) for both flows in full.

## Why files are addressed by hash

Every blob is stored under its own SHA-256 hash, so a URL is a verifiable content
address: fetch it, hash the bytes, and you can confirm you received exactly the file the
Nostr event referred to. This is the property Blossom is built around, and it is why the
same file uploaded twice occupies one path rather than two.

## What Nostr Media is not

- It is not affiliated with the Nostr project itself.
- It is not a Nostr relay. It stores files; relays store events.
- It does not hold, see or store private keys (`nsec`). A lost key cannot be recovered.
- It is not a free service; uploading requires an active paid subscription.
- Listing and deleting over the Blossom/NIP-96 wire protocols is not implemented yet.
  Those operations go through the endpoints documented in
  [api.md](https://nostrmedia.com/docs/api.md) or the web file manager.
