An NFT on Solana is just a token with supply 1, decimals 0 and metadata. Everything else is optional.
Before this week, I thought Solana NFTs required Metaplex. Turns out you can mint one with just the Token Extensions program, a GitHub Gist and a few CLI commands.
On Solana, an NFT is not a special type. It's a token mint with:
- Decimals: 0 (can't be split)
- Supply: 1 (only one exists)
- Metadata extension (name, symbol, image URI)
- Mint authority disabled (can't mint more)
That's it. The rest is metadata, collections, and off-chain JSON.
Everything else you see in wallets and marketplaces—images, attributes, collection pages—is built on top of this foundation.
Over three days, I minted:
- A standalone NFT with metadata (name, symbol, image, attributes)
- A collection mint with the Group extension (max size 3)
- Two member NFTs linked to the collection via the Member extension
All on devnet. All with the Token-2022 program. No separate metadata program needed.
Here's how the collection + member flow works:
# Create collection mint with group extension
spl-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb create-token \
--decimals 0 \
--enable-metadata \
--enable-group
# Initialize group with max size 3
spl-token initialize-group <COLLECTION_MINT> 3
# Create member mint with member extension
spl-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb create-token \
--decimals 0 \
--enable-metadata \
--enable-member
# Link member to collection
spl-token initialize-member <MEMBER_MINT> <COLLECTION_MINT>
Metadata is mutable by default. The update authority can change name, symbol, URI and custom fields at any time.
This is useful for fixing errors. But it also means you trust the update authority not to rug you.
I mutated my NFT live on devnet:
# Update name
spl-token update-metadata <MINT> name "Field Notes"
# Add custom field
spl-token update-metadata <MINT> rarity legendary
# Remove custom field
spl-token update-metadata <MINT> rarity --remove
On-chain updates are instant. Off-chain image caching is not.
The name updated immediately in Solana Explorer. The new image may took longer to appear in Phantom. That asymmetry is something you have to design for.
What I'd build next
A complete NFT drop with a fixed collection size, automated minting, and on-chain royalties.
Token Extensions support transfer fees. Royalties can be enforced at the protocol level without a separate marketplace integration. No middleware. No trust. Just math.
The takeaway
Solana NFTs are not complicated. They're just tokens with a few extensions enabled.
Metaplex is one way to build them. Token Extensions is another. Both work. One is lighter, more composable, and lives entirely inside the mint account.
If you're coming from Web2, this might feel unfamiliar. But the mental shift is worth it.
Try it yourself. Mint one on devnet. Change its name. Add a custom field. Send it to a friend. The tools are all there.
This post is part of #100DaysOfSolana. Follow along or jump in any day.
Resources
-
Official Solana documentation on token extensions and their use cases
-
Technical reference for storing NFT metadata directly on mint accounts
-
Official guide for building dynamic NFTs with on-chain metadata
Comparison of original SPL Token, Token-2022, and Metaplex standards
Top comments (0)