A social app where the collectibles live in the feed.

    A React Native app for iOS and Android that combined a social feed, NFT views, DeSo-backed identity and transaction flows, community chat and wallet activity.

    StackReact Native, iOS + Android, DeSo, Redux Toolkit, RxJS, PubNub, Firebase

    Filters, follows, comments
    Feed
    Mint, bid, ownership
    NFTs
    DeSo, via WebView
    Identity
    Live channels
    Community
    Balance + history
    Wallet

    What it looked like on a phone.

    Captured from a development build, with test content. The app was built under the name Toodum, which is the name on screen.

    Screen 1 of 5

    The connect screen. Social sign-in sits beside DeSo account creation and seed-phrase login — though in the source the Google and MetaMask buttons are commented out.

    • Screen 1 of 5. Sign-in screen with Google and MetaMask buttons above a Create Account button and a log in with seed phrase link.

      The connect screen. Social sign-in sits beside DeSo account creation and seed-phrase login — though in the source the Google and MetaMask buttons are commented out.

    • Screen 2 of 5. Home feed with a row of category filters above a post showing artwork, likes, comments, a price and a buy button.

      The feed: category filters across the top, and posts that carry their own price and buy action.

    • Screen 3 of 5. Profile screen with a cover image, avatar, follower counts and Owned, Created, Bidded and Saved tabs above a grid of NFT artwork.

      A profile splits a user's collectibles four ways — owned, created, bidded and saved — over the same grid.

    • Screen 4 of 5. Step two of the create NFT flow: a sale toggle, a set price or timer bid switch, a minimum bid price field, a bid end date and time, and a creator royalty field.

      Minting, step two: sell or not, a fixed price or a timed bid, and the creator royalty that rides along with the NFT.

    • Screen 5 of 5. NFT detail screen showing artwork, owner and creator, likes and comments, current price with a countdown, a details panel, and Buy Now and Make offer buttons.

      The detail screen for a collectible. Price, countdown and the buy-or-offer decision sit under the artwork. Its offers and activity panels render rows from a local mock file, so those prices are placeholders rather than market data.

    One mobile app, two data paths.

    Actions that belong on DeSo go through identity and signing. Everything else — saved content, chat, notifications — runs on ordinary services beside it.

    React Native app

    iOS and Android, running on Hermes

    • UI + navigation

      React Navigation with nested stacks.

      • Bottom tabsHome, Search, Wallet, Community and Account.
      • Root stacksSeparate flows for account creation, post detail, chat and a two-step NFT creation flow, plus a community drawer.
    • State

      Split by how long the data needs to live.

      • Redux ToolkitCross-screen drafts and UI state — in-progress account, post, NFT, profile and community data.
      • Screen hooksFetched lists, filters, pagination and local interaction state, owned by the screen that shows them.
    • DeSo path

      Identity, social data and signed transactions.

      • DeSo Identity (WebView)A hidden embedded WebView handling login, JWTs, signing, approval and encryption.
      • DeSo node APIFeeds, profiles, follows, posts, NFT entries, bids and transaction submission.
    • Supporting services

      Everything that is not on-chain.

      • App serverSaved posts and collections.
      • PubNubCommunity-channel history, presence and live messages.
      • FirebasePush-notification permission and device tokens, a foreground message listener, and feed deep links.

    The client architecture as it appears in the source — not a full production infrastructure diagram.

    Every on-chain action takes the same route.

    A like and an NFT bid look nothing alike on screen. Underneath, both are a transaction that has to be created, signed and submitted.

    • Step 1

      A user acts

      Post, like, follow, update a profile, mint an NFT, bid, or accept a bid.

    • Step 2

      The screen calls the API service

      One service layer wraps the DeSo node routes, so screens never build transactions themselves.

    • Step 3

      The DeSo node returns an unsigned transaction

      The client receives a transaction payload, not a finished action.

    • Step 4

      DeSo Identity signs it

      The request goes to the embedded Identity WebView. The app hands off signing rather than holding the key itself.

    • Step 5

      Approval, when Identity asks for it

      If Identity needs the user to confirm, its approval route opens in the WebView before the flow continues.

    • Step 6

      The client submits the signed transaction

      The signed payload goes back to the DeSo node.

    • Step 7

      The screen refreshes

      The UI fetches the resulting data. Profile updates additionally wait for the related transaction to be found before continuing.

    Direct messages add one step.

    The message is encrypted through DeSo Identity first, then created, signed and submitted like any other transaction.

    The social feed holds it together.

    Everything else in the app — collectibles, profiles, conversations — is reached from content. The feed is where that content lives.

    • Trending, Video, Photo and Text filters
    • Following and global views
    • Pull-to-refresh and incremental loading keyed on the last-seen posts
    • Post detail with comments, likes and saves
    • Profile search, followers and following
    • Notifications

    Collectibles are posts, not a separate marketplace.

    An NFT in the app is a post with extra state. Its detail view is derived from the DeSo NFT entries behind that post, so the collectible and the conversation around it sit in the same place.

    • Availability, editions and current owner
    • Minimum bid, highest bid and buy-now values
    • A staged creation flow: copies, creator and coin royalties, sale mode and pricing
    • Profile views that separate owned, created, bid activity and saved content
    • Mint, bid and accept-bid calls through the same signing pipeline

    The systems a social app still needs.

    Chat, money and re-engagement each came from a different service, and each is kept to the job it is good at.

    • PubNub

      Community chat

      Community channels load their message history, subscribe to presence and new messages, and publish from the device. Direct messages take a different path: they are encrypted through DeSo Identity and sent as signed transactions.

    • DeSo node

      Wallet activity

      The wallet reads the DeSo exchange rate and transaction info to show balances in dollars alongside the transaction history, with an entry point for buying DeSo.

    • Firebase

      Push + deep links

      Notification permission and device tokens are handled on the client, with a listener for foreground messages. Shared feed links routed straight into post detail through Firebase Dynamic Links, a service Google has since shut down.

    Several systems, one mobile surface.

    React Native gave the product a single app for iOS and Android. Most of the engineering sat in keeping identity, chain data, chat and notifications from leaking into each other.

    • One pipeline for every signed action

      Posts, follows, profile updates, mints and bids all go through the same create → sign → submit sequence, so identity handling lives in one service instead of in every screen.

    • RxJS for the identity round-trip

      Signing is asynchronous across a WebView boundary and sometimes needs user approval. Modelling each step as an observable kept those sequences composable, including the wait for a profile transaction to land.

    • On-chain and off-chain kept apart

      Saved posts and collections live on an app server; community chat lives on PubNub. Only the actions that belong on DeSo pay the cost of signing.

    Looking back

    What I would validate and strengthen if I picked it up today.

    • End-to-end tests for mint, bid and accept-bid against a test node
    • An audit of loading and error states across every flow
    • Sending notifications from the server rather than the client
    • Secrets and configuration management
    • Accessibility checks on the core screens
    • A dependency upgrade path — React Native and the Firebase stack have moved on, and Dynamic Links needs a replacement