Solana NFTs Without Metaplex: What I Learned Building NFTs with Token Extensions π¨
Before this week, I assumed every NFT on Solana required Metaplex. After spending several days building on Devnet, I realized that isn't the whole story.
Using Token-2022 (SPL Token Extensions), I built NFTs with on-chain metadata, grouped them into collections, audited their state directly on-chain, and even updated their metadata liveβall without relying on Metaplex.
This post summarizes the biggest concepts that clicked for me.
π§ What is a Solana NFT?
Coming from Web2, I initially thought NFTs were just images stored on a blockchain.
That isn't really true.
A Solana NFT is fundamentally just an SPL Token Mint configured with a few important properties:
- Supply = 1
- Decimals = 0
- Mint Authority disabled
- Metadata attached to the mint
- Optional collection membership
Think of it like a database record.
Instead of
Users
Products
Orders
you have
Mint
Metadata
Collection
Owner
The mint address acts like the primary key, while metadata and collection information provide the additional context that wallets and marketplaces use to render the NFT.
π οΈ What I Built
During this NFT arc I progressively built more complex assets.
1. A 1-of-1 NFT
The journey started with the simplest NFT possible.
spl-token create-token --decimals 0
spl-token mint <MINT> 1
spl-token authorize <MINT> mint --disable
After disabling the mint authority, no additional copies could ever be created.
2. On-chain Metadata
Next, I enabled the Token Metadata extension.
Instead of relying on separate metadata accounts, Token-2022 lets metadata live directly on the mint itself.
I added:
- Name
- Symbol
- Metadata URI
- Image
- Attributes
which immediately appeared inside Solana Explorer.
3. NFT Collections
Instead of leaving NFTs independent, I grouped them into an on-chain collection.
Solana Sketchbook
β
ββββββββββββββ΄βββββββββββββ
β β
Sketch #1 Sketch #2
The Collection Mint stores the Group Extension, while each NFT stores a Group Member Extension pointing back to its parent collection.
This felt very similar to foreign keys in relational databases.
4. Live Metadata Updates
The most interesting experiment was updating metadata after minting.
spl-token update-metadata <MINT> name "Field Notes"
spl-token update-metadata <MINT> rarity legendary
Refreshing Solana Explorer immediately showed the updated values.
Watching blockchain data behave like editable database rows completely changed how I think about NFTs.
β‘ What Surprised Me
The biggest surprise wasn't creating the NFT.
It was realizing that the NFT itself is just structured on-chain data.
The image isn't stored on-chain.
Instead, the NFT stores a URI pointing to a JSON file.
That JSON then points to the actual image.
NFT
β
Metadata URI
β
metadata.json
β
Image URL
Changing the metadata happens immediately because it's stored on-chain.
Changing the image may take longer because wallets cache the off-chain assets.
That distinction between on-chain state and off-chain resources was probably the biggest lesson from this week.
π What's Next?
Now that I understand how NFTs are built with Token Extensions, I'd like to explore more advanced functionality such as:
- Transfer Hooks
- Royalty enforcement
- Programmable NFTs
- Metaplex Core
- Dynamic game assets
I'm particularly interested in seeing how these extensions can be combined to build gaming assets, memberships, and digital credentials.
Final Thoughts
This week completely changed my understanding of Solana NFTs.
Instead of thinking of NFTs as "JPEGs on the blockchain," I now think of them as programmable digital assets whose behavior and metadata are stored directly on-chain.
That mental model feels much closer to how software engineers already think about data structures and databases.
This post is part of my #100DaysOfSolana journey.
Top comments (0)