gallery-web: Gallery’s Frontend Turns NFT Curation Into a Data System

A look at the Relay fragments, staged editor state, and mobile performance choices that make collector taste behave like software.

9 min read • View on GitHub • More from gallery-so

A collector arranges framed digital artworks on a bright white wall while a small control panel sits off to the side. The scene explains that Gallery treats presentation as the main product, with curation and display logic doing the real work.
Gallery’s real interface is not a marketplace grid. It is a publishing surface for digital objects.
Key Takeaways

Gallery is not trying to win by being the biggest place to buy NFTs. It is trying to make collections look intentional. That sounds like a design preference, but in this codebase it becomes an architectural requirement.

The repository is a TypeScript-heavy monorepo built around React Native, Relay, and shared packages. That stack tells you the product is not optimized for raw trading flow. It is optimized for display logic, identity, and the messy reality of image-rich digital objects.

Curation is the product

The clearest thing about Gallery is what it is not. It is not a generic wallet dashboard, and it is not a commodity image gallery. Its core job is closer to publishing: arrange assets, present them cleanly, and make a collector’s taste legible to other people.

That changes the software problem. Once presentation becomes the main value, the app has to preserve visual consistency across partial data, different profile states, and multiple surfaces. The UI cannot just render what exists. It has to decide what deserves to be shown, in what order, and with what fallback behavior.

Primary jobGalleryOpenSea-style marketplaceWallet-first profile
What the product is forCuration and presentationBuying and sellingHolding and verifying assets
What the UI optimizes forComposition and displayInventory and conversionBalances and identity
How identity appearsCollector profile plus social graphAccount and transaction historyAddresses and holdings
How collections are assembledStaged, authored, publishableListed or browsed as inventoryUsually incidental to custody
What success meansA collection feels publishedA trade completesA wallet is connected and recognized

That comparison is the important one. Gallery is not denying the marketplace layer. It is simply solving a different problem class. The unit of value is not the token. It is the arrangement.

Why Relay is the right bet

Relay fits this app because Gallery is full of nested, image-heavy, partially complete records. NFTs bring collections, creators, metadata, avatars, ownership, and social context into the same screen. Relay’s fragment model lets each component declare exactly what it needs, instead of pulling a giant object through the tree and hoping it stays stable.

Relay turns data ownership into a component-level contract. That keeps Gallery honest when some NFT fields exist and others do not.

const nft = graphql`
  fragment NftPreviewInnerFragment on NFT {
    id
    name
    imageUrl
    collection {
      name
      slug
    }
  }
`;

function NftPreview(props: { nft: NftPreviewInnerFragment$key }) {
  const data = useFragment(nft, props.nft);
  return <PreviewCard nft={data} />;
}

That pattern matters because it changes the failure mode. If a field disappears or is still loading, the component boundary can catch the problem without taking down the whole feed. The result is a UI that can survive incomplete data and keep the rest of the screen alive.

Nested paper fragments interlock into a single exhibit card while one missing field is caught by a small boundary box. The image explains how Relay fragments let Gallery assemble data locally and isolate failures without breaking the whole screen.
Fragments are not just a data-fetching technique here. They are the unit of composition.

The Gallery editor makes taste mutable

The editor is where Gallery stops being a viewer and becomes a tool. Staged sections create a draft state, which means a collector can compose a profile before it is published. That is a simple idea with a big effect: arrangement becomes intentional, not accidental.

This is a better mental model than a generic feed or drag-and-drop canvas. Gallery is not asking users to shuffle content around for its own sake. It is asking them to author a collection, then move that collection from private composition into public display.

Editor behaviorWhy it mattersWhat it replaces
Staged sectionsLets users compose before publishingInstant, irreversible profile edits
Component-owned fragmentsEach tile knows its own data needsOne giant editor payload
Boundary-based failure handlingOne broken asset does not sink the pageAll-or-nothing rendering
Shared render logicKeeps web and mobile behavior alignedSurface-specific one-off implementations

The important design move is not just interactivity. It is persistence of intent. Once the app models a draft collection as its own state, the editor can support premium behaviors like rearranging, previewing, and publishing without turning the interface into a fragile pile of local assumptions.

How the feed stays fast

Gallery’s feed is image-heavy, gesture-heavy, and likely unforgiving. That is why the repository leans on FlashList and Reanimated. In a normal content app, smoother scrolling is nice. In a visual identity app, it is part of the product promise.

FlashList helps recycle rows so the interface does not thrash under a long stream of artwork and profile cards. Reanimated handles motion and interaction without forcing the whole screen through expensive rerenders. Together, they keep the app feeling polished even when the underlying content is expensive to paint.

LayerStandard list behaviorGallery’s choice
ScrollingFrequent jank on heavy rowsRecycled rows with FlashList
Gesture feedbackOften tied to React rerendersAnimated on the UI side with Reanimated
Visual densityImages can overwhelm the viewportPerformance tuned for premium browsing
User perceptionFeels like a feedFeels like a curated exhibition

Authentication, identity, and the Web3 mess

Web3 identity is usually a pile of addresses, signatures, and loosely connected profiles. Gallery tries to collapse that into something more human. Privy, Farcaster, and wallet data become part of a single profile story instead of separate authentication systems competing for attention.

That matters because collectors do not think in provider names. They think in identity continuity. If I am recognized on one device, with one wallet, and across one social profile, then the app feels coherent. If not, it feels like a stack of integrations.

Identity modelUser experienceRisk
Wallet-onlyPrecise but coldUsers look like addresses
Social-onlyFamiliar but incompleteOwnership is detached
Gallery’s approachWallets and profiles convergeMore moving parts, but better continuity

What the monorepo buys them

The monorepo is not just engineering hygiene. It is the thing that lets Gallery keep its behavior aligned across mobile and web while still letting mobile lead the product. Shared packages keep data contracts, business logic, and UI expectations from drifting apart.

Moon and Yarn PnP are the quiet signal here. This is a repo that has already paid the complexity tax of scale. The payoff is consistency: the same collection logic, the same fragment contracts, and the same identity assumptions can move across surfaces without being rebuilt from scratch every time.

That is the product strategy in engineering form. Gallery wants a single collection model to survive two interfaces, one mobile-first and one web-facing. The repo structure exists to make that possible.

Why this frontend stands out

Gallery is interesting because it treats curation as a system problem. The app is not just rendering NFTs. It is enforcing data boundaries, staged composition, and a performance profile that matches a premium visual product.

That is a rarer ambition than it first appears. Most crypto interfaces are built around transaction completion. Gallery is built around presentation quality. That difference explains almost every technical choice in the repository.