Community

Apps

Bouquet

Bouquet turns the quiet storage layer of Nostr into something you can actually manage: Blossom servers, NIP-96 compatibility, uploads, mirrors and the public server list behind your media.

Bouquet icon
Apps The product layer Clients, signers, publishing tools, wallets and protocol utilities.
Back to Nostr
Apps

Apps shelf

Apps pages collect clients, signers, tools, developer libraries and product research without turning the app into the whole network.

Apps All Apps pages App routeProduct profiles, categories, tools and source links Browse appsClose shelf

App orientation

App categories

App profiles

0xchatadvanced-nostr-searchAegisAlbyAlby GoAlby HubAlby HubAlby SDKAmberAmberAmethystAmethystApp and product researchApplication-specific dataBlossomBlossom spec NIP-B7BookstrBorisBouquetCalendar by FormstrChachiNostr Apps DirectoryCoracleCoracleCorny ChatCreatrDamusDamusDeveloper stack researchDittoDittodiVineDocstrDTANEmojitoFlotillaFlycatFormstrFountainFreeFromFundstrfutrGIF BuddyGittrgo-nostrGossipGossipGrimoireGroups NIP-29HablaHablaHello Nostr — ResourcesHighlighterHiveTalkhomebrew-nostrHORNET StorageHugo2NostrHyperNoteIrisIrisJumblekanbanstrKeys BandListrLNBits NostrmarketLumeLumilumiLUMINAMapstrMarmot Protocolmatrix-nostr-bridgeMeetstrMemestrMindsmonstrmostardMostronaknak — Nostr Army KnifeNalgorithmNarrnashboardNDKNegentropyngitNofluxNosNos Socialnos2xnosbinnosclNostorg Feature MatrixNostr App ManagerNostr Apps Directory GuideNostr clients feature listNostr Compass — ProjectsNostr Developer GuideNostr Development KitNostr Events MonitorNostr MCP ServerNostr NestsNostr PlaygroundNostr Service ProvidersNostr Writernostr-post-checkernostr-protocol/nostrnostr-rubynostr-sdknostr-sdk-ffinostr-sdk-flutternostr-to-rssnostr-toolsNostr.bandnostr.buildnostr.co.uk ClientsNostr.how — Clientsnostr.hsNostrabilityNostrAppsNostrApps category — AudioNostrApps category — CareerNostrApps category — CommunityNostrApps category — CurationNostrApps category — Direct MessageNostrApps category — DiscoveryNostrApps category — File SharingNostrApps category — Group ChatNostrApps category — MeatspaceNostrApps category — OnboardingNostrApps category — SignersNostrApps category — Toolsnostrchecknostrdbnostrdb-rsNostreeNostreonNostriaNostridNostrium / read.nostr.comNostrmoNostrubenoStrudelnoStrudelNostterNosturNosturNotedeckNpub.proNpub.worldnsec.appnsiteNsiteNstart.meObsidian Nostr WriterOlasOpenvibeOracoloOstrich WorkOwn Your PostsP2P BandPazPeridotPhoenixPlebeian MarketPostizPostr / write.nostr.comPrimalPrimalPrimal Article Editor / Reads authoringPrimal Studiopynostrpython-nostrRecommended Application HandlersRelay Toolsrsslayrust-nostrrust-nostr docsSatelliteSatellite EarthSatlantisSatShootShakespeareShopstrSlidestrSnortSnortStemstrswift-nostr-clientTreasuresWavlakeWavlakeWikifreediaWikistrYakiHonneYakiHonneYakiHonne mobile/web app directoryYondar

App pages

Deep dives

Field guides

Awesome Nostr branches

Research and library

Source inventory

Deep Research: Clients, apps and product surfacesDeep Research: Developer stack and toolingResearch Map: nostrapps.comResearch Source: 0xchatResearch Source: 0xchat — NostrApps pageResearch Source: advanced-nostr-searchResearch Source: Aegis — NostrApps pageResearch Source: AlbyResearch Source: Alby — NostrApps pageResearch Source: Alby GoResearch Source: Alby HubResearch Source: Alby Hub GitHubResearch Source: Alby SDKResearch Source: AmberResearch Source: Amber — NostrApps pageResearch Source: AmethystResearch Source: Amethyst GitHubResearch Source: Awesome Nostr ResourcesResearch Source: BookstrResearch Source: BorisResearch Source: Boris — NostrApps pageResearch Source: BouquetResearch Source: Bouquet — NostrApps pageResearch Source: Calendar by FormstrResearch Source: ChachiResearch Source: Chachi — NostrApps pageResearch Source: CoracleResearch Source: Coracle — NostrApps pageResearch Source: Corny ChatResearch Source: DamusResearch Source: Damus — NostrApps pageResearch Source: DittoResearch Source: Ditto — NostrApps pageResearch Source: DocstrResearch Source: DTANResearch Source: DTAN — NostrApps pageResearch Source: EmojitoResearch Source: Emojito — NostrApps pageResearch Source: Flotilla — NostrApps pageResearch Source: FlycatResearch Source: FormstrResearch Source: Formstr — NostrApps pageResearch Source: FountainResearch Source: FreeFromResearch Source: FreeFrom — NostrApps pageResearch Source: FundstrResearch Source: futrResearch Source: futr — NostrApps pageResearch Source: GIF BuddyResearch Source: GIF Buddy — NostrApps pageResearch Source: GittrResearch Source: go-nostr GitHubResearch Source: GossipResearch Source: Gossip — NostrApps pageResearch Source: GrimoireResearch Source: Grimoire — NostrApps pageResearch Source: HablaResearch Source: Habla — NostrApps pageResearch Source: Hello Nostr — ResourcesResearch Source: HighlighterResearch Source: HiveTalkResearch Source: HORNET Storage — NostrCompassResearch Source: IrisResearch Source: Iris — NostrApps pageResearch Source: JumbleResearch Source: Jumble — NostrApps pageResearch Source: Keys BandResearch Source: Keys Band — NostrApps pageResearch Source: ListrResearch Source: LNBits NostrmarketResearch Source: LumeResearch Source: LumilumiResearch Source: LUMINAResearch Source: MapstrResearch Source: Marmot ProtocolResearch Source: MeetstrResearch Source: MemestrResearch Source: MindsResearch Source: monstr GitHubResearch Source: mostardResearch Source: MostroResearch Source: my.nostr.comResearch Source: nak — Nostr Army KnifeResearch Source: nak GitHubResearch Source: NalgorithmResearch Source: Narr — NostrApps pageResearch Source: nashboardResearch Source: NDK GitHubResearch Source: NDK NPMResearch Source: NegentropyResearch Source: Noflux — NostrApps pageResearch Source: Nos SocialResearch Source: Nos Social — NostrApps pageResearch Source: nos2xResearch Source: nos2x — NostrApps pageResearch Source: nosbinResearch Source: noscl GitHubResearch Source: Nostorg Feature MatrixResearch Source: Nostr App ManagerResearch Source: Nostr Book — KindsResearch Source: Nostr DesignResearch Source: Nostr Developer GuideResearch Source: Nostr NestsResearch Source: Nostr Nests — NostrApps pageResearch Source: Nostr PlaygroundResearch Source: nostr-post-checkerResearch Source: nostr-protocol/nostr GitHubResearch Source: nostr-sdk crates.ioResearch Source: nostr-sdk-ffi GitHubResearch Source: nostr-tools GitHubResearch Source: nostr-tools NPMResearch Source: Nostr.BandResearch Source: nostr.buildResearch Source: nostr.co.uk ClientsResearch Source: Nostr.howResearch Source: Nostr.how — ClientsResearch Source: Nostr.how — ProtocolResearch Source: Nostr.how — What is Nostr?Research Source: Nostr.orgResearch Source: NostrabilityResearch Source: NostrAppsResearch Source: NostrApps category — AudioResearch Source: NostrApps category — CareerResearch Source: NostrApps category — CommunityResearch Source: NostrApps category — CurationResearch Source: NostrApps category — Direct MessageResearch Source: NostrApps category — DiscoveryResearch Source: NostrApps category — File SharingResearch Source: NostrApps category — Group ChatResearch Source: NostrApps category — MeatspaceResearch Source: NostrApps category — OnboardingResearch Source: NostrApps category — SignersResearch Source: NostrApps category — ToolsResearch Source: nostrcheckResearch Source: nostrdb GitHubResearch Source: NostreeResearch Source: Nostree — NostrApps pageResearch Source: NostriaResearch Source: Nostria — NostrApps pageResearch Source: NostridResearch Source: Nostrmo — NostrApps pageResearch Source: Nostrmo GitHubResearch Source: NostrubeResearch Source: noStrudelResearch Source: noStrudel — NostrApps pageResearch Source: NostterResearch Source: NosturResearch Source: Nostur — NostrApps pageResearch Source: NotedeckResearch Source: Npub.proResearch Source: Npub.worldResearch Source: nsec.appResearch Source: NsiteResearch Source: Nstart.meResearch Source: Nstart.me — NostrApps pageResearch Source: Obsidian Nostr Writer — NostrApps pageResearch Source: OlasResearch Source: Olas — NostrApps pageResearch Source: OpenvibeResearch Source: OracoloResearch Source: Oracolo — NostrApps pageResearch Source: Ostrich WorkResearch Source: P2P BandResearch Source: PazResearch Source: PeridotResearch Source: Peridot — NostrApps pageResearch Source: PhoenixResearch Source: Phoenix — NostrApps pageResearch Source: Plebeian MarketResearch Source: Plebeian Market — NostrApps pageResearch Source: PrimalResearch Source: Primal — NostrApps pageResearch Source: Primal Article Editor / Reads authoringResearch Source: Primal StudioResearch Source: pynostr GitHubResearch Source: python-nostr GitHubResearch Source: Registry of KindsResearch Source: Relay Tools — NostrApps pageResearch Source: rsslayResearch Source: rust-nostr docsResearch Source: rust-nostr GitHubResearch Source: SatelliteResearch Source: SatShootResearch Source: ShakespeareResearch Source: Shakespeare — NostrApps pageResearch Source: ShopstrResearch Source: Shopstr — NostrApps pageResearch Source: SlidestrResearch Source: SnortResearch Source: start.nostr.netResearch Source: StemstrResearch Source: TreasuresResearch Source: WavlakeResearch Source: WikifreediaResearch Source: Wikifreedia — NostrApps pageResearch Source: WikistrResearch Source: Wikistr — NostrApps pageResearch Source: YakiHonne mobile/web app directoryResearch Source: YondarResearch Source: Yondar — NostrApps page
Apps16 min readBlossom and NIP-96 media manager

Bouquet

Bouquet is the practical control room for a part of Nostr most people only notice when it breaks: the media servers behind your pictures, PDFs, audio files and video links.

The quick readBouquet is not a social client and not a file host. It is a web app for managing the Blossom and NIP-96 servers your Nostr identity uses for media: upload, browse, download, sync between servers and publish the server list other clients can discover.

The boring question that matters

Nostr makes identity and publishing feel light. You sign an event, send it to relays, and another client can read it without asking one company for permission. But media is not light. Images, videos, audio files, PDFs and thumbnails do not fit neatly inside that tiny signed event. They live on HTTP servers, CDNs, paid storage, hobby servers, public uploaders and half-remembered domains that may or may not still exist when a reader opens your post six months later.

That is the unglamorous corner Bouquet walks into. It asks the question most people skip: where do your files actually live, and can another Nostr client find them if the first URL dies? For a casual meme, that may sound fussy. For a creator, musician, writer, event organizer or builder shipping product screenshots, it becomes basic hygiene. If your Nostr presence depends on media, your media servers are part of your publishing stack.

Bouquet is useful because it refuses to turn that stack into folklore. It gives you a product surface for the storage layer. You can see servers, upload files, browse what is already there, move content between places and publish your preference list on Nostr. That sounds almost too practical to be interesting. In this ecosystem, practical is exactly the interesting part.

What Bouquet actually does

The short public description is accurate: Bouquet is a personal manager for Blossom media servers. NostrApps lists the core jobs plainly: upload files, download files, manage your list of media servers, broadcast that list on Nostr, sync files between servers and browse files on your media servers. Read that list slowly and you can see the shape of the product. Bouquet is not trying to be your timeline, your long-form editor or your image gallery. It is the drawer where the handles for your media infrastructure live.

A normal user flow looks like this: you connect a Nostr identity, choose or add media servers, upload a file, inspect the resulting metadata, and decide whether that file should exist on one server or be mirrored elsewhere. If you publish your Blossom server list, other clients can discover where you prefer to host your blobs. If you still use a NIP-96 file server, Bouquet keeps that older preference list in the conversation too.

The app bundle also shows a practical set of known server options and examples, including services such as blossom.primal.net, cdn.nostrcheck.me, cdn.satellite.earth, files.v0l.io and nostr.build. Do not read that as an endorsement of any one host. Read it as the product telling you the truth: Nostr media is plural. You may use one server for convenience, another for redundancy, and a third because a specific client or community already understands it.

The most important feature is not the upload button. It is the server list. Uploading a file to a host is easy. Publishing a machine-readable list of the servers you trust, in a way other clients can discover, is what turns media storage from a one-off upload into part of your portable identity.

Imagine you are publishing a venue announcement. The text note can move across relays, but the poster image may sit on one media domain. If that domain expires, rate-limits your audience, changes its terms or drops old files, the note still exists but the thing people came to see is gone. Bouquet gives you a place to think about that before the failure happens. You can keep a primary host, mirror the same content elsewhere and make your preferred servers visible to the rest of the network.

That is also why Bouquet feels different from a generic uploader. A generic uploader says: give me a file and I will give you a URL. Bouquet says: choose the servers that belong to your Nostr identity, understand what each one can do, and make the list portable. It is closer to a media cockpit than a drag-and-drop box.

The technology under the flowers

The official app runs at bouquet.slidestr.net. The public repository trail points to git.v0l.io/florian/bouquet, and the app shell is a Vite-style web application with a Bouquet icon at /bouquet.png. The package history shows a modern React and TypeScript stack: Vite, React, React Router, TanStack React Query, NDK, NDK Cache Dexie, nostr-tools, blossom-client-sdk, react-pdf, blurhash, p-limit and axios. That tells you what kind of app it is. It is a client-side control panel, not a hidden server that stores your files for you.

NDK matters because Bouquet has to speak Nostr, not just HTTP. The public code imports NIP-07, NIP-46 and private-key signer paths through NDK, uses an NDK cache adapter backed by Dexie, and connects to a default relay set that includes familiar public relays such as relay.damus.io, relay.nostr.band, relay.snort.social, nos.lol, nostr.wine, relay.primal.net and purplepag.es. Again, the exact relay list is less important than the pattern: Bouquet needs relays to read and publish the events that describe your server preferences.

The Blossom side is where the product gets its teeth. Blossom stores files as blobs addressed by SHA-256 hash. BUD-01 defines the basic HTTP behavior for retrieving blobs by hash. BUD-03 defines the user server list as a replaceable Nostr event of kind 10063, with one or more server tags. NIP-B7 then describes how Nostr clients should use Blossom for media, especially by fetching a user's kind 10063 server list when a media URL can no longer be reached from its original host.

Bouquet also cares about NIP-96, the older HTTP file-storage integration. NIP-96 is now marked unrecommended in favor of Blossom, but existing clients and servers still use it. NIP-96 preference events use kind 10096, and Bouquet's code tracks a NIP-96 server list beside the Blossom server list. That is a very real product decision. The ecosystem is not switching storage standards overnight. Bouquet is useful precisely because it stands in the messy transition zone where both protocols matter.

The repository history makes that transition feel concrete. Recent public changes mention pagination for Blossom and NIP-96 list endpoints, improved transfers with retry logic and cancellation, mirror support and a fix around empty SHA-256 values from older server uploads. Those are not brochure features. They are the rough places a real media manager hits when it leaves the demo path. Lists can be paged. Transfers fail. Some servers support listing; some do not. A file can be transformed by a server and still need to be found by its original hash. Bouquet is interesting because it has to handle those ordinary annoyances.

There is a quiet design lesson here for the whole Nostr app landscape. The social layer is only one layer. A mature client has to know where media comes from, how it was signed, whether it can be fetched again, whether a thumbnail is trustworthy, and how to avoid locking the user into one upload service by accident. Bouquet does not solve every piece of that puzzle, but it brings the puzzle onto the screen.

The public trail behind the project

The honest answer to "who is behind Bouquet?" is narrower than a marketing page would like. The public source trail points to the Gitea repository florian/bouquet on git.v0l.io, to the v0l infrastructure family, and to the Slidestr-adjacent deployment at bouquet.slidestr.net. The repository history shows work by Florian, a merge from Quentin for an old-server SHA-256 fix, and later changes around Docker builds, pagination for Blossom and NIP-96 list endpoints, retry logic and transfer robustness.

That is enough to say something useful and not enough to invent a founder story. Bouquet looks like a builder-led tool from the v0l/Slidestr neighborhood of Nostr, built for people who already understand why media storage is becoming a product category. It is not presented as a polished consumer brand with a support desk, pricing page and corporate about section. Treat it like a serious open web tool: powerful, revealing, and worth testing with your own threat model instead of blind trust.

The deploy script in the public package history uses nsite-cli to upload the built dist folder. That detail fits the whole project nicely. Bouquet is a web client for managing portable media infrastructure, and it can itself be published as a static site. The tool and the deployment philosophy are pulling in the same direction.

The lack of a glossy about page is not a defect by itself. Many useful Nostr tools arrive from builders first and brands later, if at all. But it does change how you should read the app. You should look at the repository, the commit history, the servers it suggests, the signing flow and the exact events it publishes. In a protocol world, evidence is better than a slogan. Bouquet gives enough public evidence to treat it as a real project, and enough unfinished surface to remind you that you are using open infrastructure, not a sealed consumer platform.

How to use it without fooling yourself

If you are a creator, start small. Connect with a signer you trust, add a server you actually understand, upload a harmless test file, then open the result from another Nostr client. Look at the URL. Look at the hash. Look at whether Bouquet can list the file later. If the server supports mirroring, try moving the same blob to a second server. Then publish your server list and see whether another tool can discover it. That sequence will teach you more than any abstract argument about decentralization.

Do not confuse portability with privacy. Blossom is designed around content-addressed media, not private vault storage. A file that is public on a media server should be treated as public. If the file contains a face, location, document, private chat screenshot or anything you would regret seeing indexed, think before uploading. Check the server's terms, quotas, retention policy, metadata handling, transformation behavior and deletion support. Keep your originals. Keep a second copy. Media servers are infrastructure, not magic.

If you are a developer, Bouquet is useful as a map of where Nostr media clients are heading. It touches the same themes every serious media client eventually has to face: signer UX, relay discovery, server preference events, hash-based retrieval, upload limits, compatibility with older NIP-96 servers, mirroring and the awkward truth that some popular servers do not expose the same listing features as others. Bouquet makes those constraints visible instead of hiding them behind a pretty upload form.

If you run a community, the app gives you a simple operational ritual. Pick the media servers you trust, test them with small files, document which one is primary, mirror important assets, and check the list every few weeks. That may sound overly careful until you try to recover a missing event flyer, a band photo, a product screenshot or a recorded session from a dead URL. The cost of a small storage routine is low. The cost of losing your media archive is annoying at best and reputation-damaging at worst.

If you are evaluating Bouquet for a business or a serious creator workflow, ask boring questions on purpose. Who operates each server? What happens when you exceed quota? Can you delete? Does the server transform files? Does it strip metadata? Does it support range requests for video? Does it support list endpoints well enough for Bouquet to show your files? Does mirroring preserve the hash you expect? Can another client find the blob from your published server list? These are not edge cases. They are the difference between owning a media workflow and hoping an upload link survives.

The product is niche, but the niche is important. Nostr needs timelines, wallets, signers and search. It also needs tools that help people own the boring layer under the beautiful post. Bouquet is one of those tools. You open it when you are ready to stop treating media as an attachment and start treating it as part of your Nostr identity.

Sources worth opening

This article keeps claims close to the public project trail. Start with these pages when you want to verify Bouquet yourself.

Back to the Crays Nostr page
Apps route visual cue 1
Apps route visual cue 2
Apps route visual cue 3
Apps route visual cue 4
Apps route visual cue 5

How to use this page

Find the product surface first.

Search clients, signers, product categories or developer tools when you need a specific app, source file or comparison clue.

AppsKeep exploring AppsApp routeProduct profiles, categories, signer guides and source links.Browse apps
Apps route visual cue 1
Apps route visual cue 2
Apps route visual cue 3
Apps route visual cue 4
Apps route visual cue 5

Bring something back

Ask, suggest, submit or nominate.

Use these links when something is missing, a source is stale, or a public Nostr builder belongs in the map.