ISS
← Field Notes
Distributed Systems screenshot
December 28, 2025 · Distributed Systems · 2 min read

Minting Node License NFTs On-Chain on Monad Mainnet

A React and Web3 dApp for buying Forerunner node licenses on Monad, minting validator or synchronizer NFTs on-chain with configurable metadata and a grant path.

StartSynqing is the storefront for Forerunner Network node licenses. Users connect a wallet, optionally fill in node details, and mint a validator or synchronizer license as an NFT directly on Monad Mainnet. The goal was a frictionless purchase path, and the live app runs at app.startsynqing.com.

Buy Now, Configure Later

The design choice I like most here is that configuration is optional at purchase time. A user can mint a license NFT and leave the node metadata for later, or fill it in up front. On-chain, the license carries configurable node metadata, so the "configure later" path is not a workaround, it is a first-class flow that writes the config when the user is ready.

That decoupling matters because the two decisions have different urgency. Deciding to buy a license is a moment of intent you want to capture immediately. Deciding exactly how a node will be configured is something a user may not have worked out yet. Forcing both into a single blocking step is how you lose the sale. Separating them keeps the mint one click and pushes the fiddly part downstream.

Two Data Paths

The architecture has a clean split between what goes on-chain and what does not. License purchases flow from the user through their wallet to a Monad smart contract, which mints the NFT. Grant applications, for users who cannot afford a license, flow instead through an Express API into a SQLite database. On-chain for value, off-chain for the application workflow.

The stack is deliberately conventional: React 18 with TypeScript and Vite on the front end, Tailwind for styling, and wagmi, viem, and RainbowKit for the Web3 layer. RainbowKit gives the one-click wallet connection, which is the first thing a user touches and the easiest place to add friction. The backend is Express 5 with SQLite. The target chain is Monad Mainnet, chain 143.

Where It Stands

This is prototype and internal-testing stage, and the README is straight about it. The frontend is feature-complete and the grant-application backend works. The smart contract integration is implemented but depends on contract price updates, and it is not yet on production hosting.

The takeaway is that friction is a design surface, not just a UX nicety. On-chain minting already imposes a wallet-signature step you cannot remove, so the useful move is to strip friction everywhere else: one-click connection, optional configuration, and a separate off-chain grant path so cost is never a hard wall. Spend the user's patience where the blockchain forces you to, and nowhere else.

Have something that needs building, or stabilizing?

These notes are the work log. The paid work runs through Moonshine Labs, my product and engineering studio. Tell us what you're building, or grab a call.

Work with us →
the studio: moonshinelabs.io