In today's web3 ecosystem, creating truly decentralized applications requires more than just smart contracts. You need decentralized storage, seamless user experiences, and simplified payment options. Unfortunately, more than 95% of all web3 dApps are deployed on centralized platforms like Vercel.
This guide will walk you through building a completely decentralized NFT minting app that leverages the power of Arweave for permanent storage and Crossmint for simplified NFT creation. You'll learn how to store NFT content permanently, create and mint NFTs, build a frontend with authentication and payment options, and deploy your application to Arweave.
By the end of this tutorial, you'll have created a fully functional dApp that allows users to:
Log into your app easily through Crossmint's Auth
Purchase semi-fungible tokens (SFTs) following the ERC-1155 standard
Pay for SFTs using Crossmint with crypto or credit card
Access your application through a human-readable ArNS domain
You'll be well versed in building fully decentralized apps with the Crossmint SDK, ArDrive SDK, and the AR.IO SDK.
Storage Setup: You'll begin by storing an AI-generated image on Arweave using ArDrive.io, ensuring your NFT content is permanently preserved.
Collection and Template Creation: You'll create an ERC-1155 collection and template on Crossmint where your semi-fungible tokens will be minted.
SFT Minting: You'll use Crossmint's API to mint semi-fungible tokens from your template, following their straightforward API guide.
Frontend Development: You'll clone the Zero-to-Arweave starter kit, which provides a solid foundation using Vite, React, and JavaScript along with the AR.IO SDK and ArDrive SDKs.
Authentication Integration: You'll implement Crossmint's client-side authentication system, making it easy for users to interact with your application.
Payment Integration: You'll add Crossmint's embedded checkout to enable users to purchase SFTs with both crypto and credit cards.
Frontend Design Improvements: You'll update the frontend design to better showcase your NFTs and create a more intuitive user flow.
Decentralized Deployment: You'll deploy your completed frontend to Arweave, ensuring your entire application stack is decentralized and permanently accessible.
Domain Configuration: Finally, you'll configure your ArNS domain to point to your newly deployed application, providing users with a friendly URL to access your dApp.
First, you'll need to store your NFT image on Arweave using ardrive.io. This step ensures that your NFT's visual content is permanently preserved on the decentralized Arweave network.
Generate an AI Image
Start by creating an AI-generated image that will become your NFT:
Now that you have your image, store it permanently on Arweave:
Visit ArDrive.io and log in to your account (or create one if you're new)
Fund your ArDrive wallet if needed (this requires AR tokens)
Create a new folder for your NFT project
Drag and drop your AI-generated image into this folder
Wait for the upload to complete and for the transaction to be processed
Retrieve the Arweave Transaction ID
Once your image is successfully uploaded:
Click on the uploaded image in your ArDrive folder
Look for the "Transaction ID" or "TX ID" in the file details
Copy this Transaction ID - it looks something like Abc123XYZ... (a long alphanumeric string)
Save this Transaction ID somewhere safe - you'll need it later when creating your NFT metadata
This Transaction ID is crucial as it's the permanent reference to your image on the Arweave network. When you create your SFT template in the next step, you'll include this ID to link the tokens to this permanently stored image.
Staging: For development and testing (what we'll use first)
Production: For your final, live application
Get a Server-Side API Key
After logging in, navigate to the "Integrate" tab
Click on "API Keys" at the top of the page
In the "Server-side keys" section, click "Create new key"
Select the following scopes under "Minting API":
collections.create - Required for creating a new collection
nfts.create - Required for minting NFTs
nfts.read - Needed to read NFT information
Create and save this API key securely - you'll need it for our API calls
Create an ERC-1155 Collection
Let's create a collection for your semi-fungible tokens using Crossmint's API:
Create a new file called createCollection.js in your project directory
Add the following code:
constapiKey="YOUR_API_KEY";constenv="staging"; // Using staging environment for developmentconsturl=`https://${env}.crossmint.com/api/2022-06-09/collections`;constoptions= { method:"POST", headers: {"accept":"application/json","content-type":"application/json","x-api-key": apiKey, }, body:JSON.stringify({ chain:"ethereum-sepolia",// Using Ethereum testnet for development fungibility:"semi-fungible",// For ERC-1155 tokens metadata: { name:"lil dumdumz SFT Collection", imageUrl:"https://arweave.net/YOUR_ARWEAVE_TX_ID",// Optional collection image description:"A collection of semi-fungible tokens with images stored on Arweave" } }),};fetch(url, options).then((res) =>res.json()).then((json) => {console.log(json);console.log("Collection created! Collection ID:",json.id);console.log("Save this Collection ID for the next steps"); }).catch((err) =>console.error("Error:", err));
Replace the placeholders:
YOUR_API_KEY with the API key you created in the previous step
YOUR_ARWEAVE_TX_ID with your collection image's Arweave Transaction ID (optional)
Run the script with: node createCollection.js
After a few seconds, you'll receive a response with the Collection ID - save this ID for the next steps
Create an SFT Template
Now, let's create a template within your collection from which you can mint multiple identical SFTs:
Create a new file called createTemplate.js in your project directory
Add the following code:
constapiKey="YOUR_API_KEY";constenv="staging"; // Using staging environment for developmentconstcollectionId="YOUR_COLLECTION_ID"; // From the previous stepconstarweaveImageTxId="YOUR_NFT_IMAGE_TX_ID"; // From Step 1consturl=`https://${env}.crossmint.com/api/2022-06-09/collections/${collectionId}/templates`;constoptions= { method:"POST", headers: {"accept":"application/json","content-type":"application/json","x-api-key": apiKey, }, body:JSON.stringify({ onChain: { tokenId:"1"// You can assign any unique ID to this template }, supply: { limit:100// Maximum number of tokens that can be minted from this template }, metadata: { name:"lil dumdumz SFT", image:`https://arweave.net/${arweaveImageTxId}`,// Arweave gateway URL description:"Semi-fungible token with image permanently stored on Arweave", attributes: [ { trait_type:"Storage", value:"Arweave" }, { trait_type:"Permanence", value:"Forever" } ] } }),};fetch(url, options).then((res) =>res.json()).then((json) => {console.log(json);console.log("Template created! Template ID:",json.id);console.log("Save this Template ID for minting SFTs"); }).catch((err) =>console.error("Error:", err));
Replace the placeholders:
YOUR_API_KEY with your API key
YOUR_COLLECTION_ID with the Collection ID from the previous step
YOUR_NFT_IMAGE_TX_ID with the Arweave Transaction ID of your NFT image from Step 1
Run the script with: node createTemplate.js
After a few seconds, you'll receive a response with the Template ID - save this ID for minting SFTs
Now that you have your collection and template set up, let's mint an SFT from your template.
Create a Minting Script
Create a new file called mintSFT.js in your project directory
Add the following code:
constapiKey="YOUR_API_KEY";constenv="staging"; // Using staging environment for developmentconstcollectionId="YOUR_COLLECTION_ID"; // From Step 2consttemplateId="YOUR_TEMPLATE_ID"; // From Step 2constrecipientEmail="YOUR_EMAIL_ADDRESS"; // Replace with your emailconsturl=`https://${env}.crossmint.com/api/2022-06-09/collections/${collectionId}/sfts`;constoptions= { method:"POST", headers: {"accept":"application/json","content-type":"application/json","x-api-key": apiKey, }, body:JSON.stringify({ templateId: templateId, recipient:`email:${recipientEmail}:ethereum-sepolia`,// Using email as recipient amount:1// Number of tokens to mint }),};fetch(url, options).then((res) =>res.json()).then((json) => {console.log(json);console.log("Minting initiated! Action ID:",json.actionId);console.log("Save this Action ID to check the minting status"); }).catch((err) =>console.error("Error:", err));
Replace the placeholders:
YOUR_API_KEY with your API key
YOUR_COLLECTION_ID with the Collection ID from Step 2
YOUR_TEMPLATE_ID with the Template ID from Step 2
YOUR_EMAIL_ADDRESS with your email for testing
Run the script with: node mintSFT.js
After a few seconds, you'll receive a response with an Action ID - save this ID for checking the minting status
Check Minting Status
Since blockchain transactions take time to confirm, you need to check the status of your mint:
Create a new file called checkMintStatus.js with the following code:
constapiKey="YOUR_API_KEY";constenv="staging";constactionId="YOUR_ACTION_ID"; // From the previous stepconsturl=`https://${env}.crossmint.com/api/2022-06-09/actions/${actionId}`;constoptions= { method:"GET", headers: { "x-api-key": apiKey },};fetch(url, options).then((response) =>response.json()).then((response) => {console.log(response);console.log("Minting Status:",response.status); }).catch((err) =>console.error(err));
Replace the placeholders with your API key and the Action ID from the previous step
Run the script with: node checkMintStatus.js
Keep checking until the status field returns "success"
View Your Newly Minted SFT
Once the minting is successful, you can view your SFT by:
Looking for your newly minted SFT with the Arweave-stored image
Verify that all the metadata appears correctly, including the image from Arweave
Congratulations! You've now successfully created a collection, defined a template, and minted an SFT with its image permanently stored on Arweave. This combination provides true decentralization for your token's content.
In the next step, you'll set up your frontend application by cloning the Zero-to-Arweave starter kit.
Now that you have your image stored on Arweave and your NFT contract deployed with Crossmint, let's set up the frontend application. You'll use the Zero-to-Arweave Starter Kit, which provides a solid foundation for building decentralized applications on Arweave.
Install the required dependencies using your preferred package manager:
# Using pnpmpnpminstall# OR using yarnyarninstall
Configure Your Arweave Wallet
Place your Arweave wallet file in the project root as wallet.json. This will be required for deploying the application later, but you'll need it now to test the app functionality.
Important
Never commit your wallet file to version control. The starter kit includes wallet.json in its .gitignore file by default.
Explore the Project Structure
Take a moment to understand the project structure:
Update the homepage in src/pages/Home.jsx to include information about your NFT minting application:
import React from'react';import { ConnectButton } from'@arweave-wallet-kit/react';constHome= () => {return ( <divclassName="container mx-auto px-4 py-8"> <h1className="text-4xl font-bold mb-6">Decentralized NFT Minting</h1> <divclassName="bg-gray-100 p-6 rounded-lg mb-8"> <h2className="text-2xl font-semibold mb-4">About This Project</h2> <pclassName="mb-4"> This is a fully decentralized NFT minting application that leverages: </p> <ulclassName="list-disc pl-6 mb-4"> <li>Arweave for permanent image storage</li> <li>Crossmint for simplified NFT minting</li> <li>AR.IO for decentralized domain names</li> </ul> <p> Connect your wallet to get started with minting your own NFTs. </p> </div> <divclassName="text-center mb-8"> <ConnectButtonclassName="bg-purple-600 hover:bg-purple-700 text-white font-bold py-2 px-4 rounded" /> </div> </div> );};exportdefault Home;
Start the Development Server
Run the development server to make sure everything is working properly:
pnpmrundev# or yarn dev
Open your browser to the URL shown in the terminal (typically http://localhost:5173) to see your application.
At this point, you should see your customized frontend with the Arweave wallet integration working. The application is still missing your Crossmint integration, which you'll add in the next steps.
The Zero-to-Arweave Starter Kit provides all the necessary SDKs and configurations to work with Arweave, including:
Now you need to integrate Crossmint's client-side authentication into your app. This will allow users to log in and interact with your NFT minting functionality seamlessly. Let's implement Crossmint Auth in your Zero-to-Arweave starter kit.
Visit your application in the browser and test these features:
Sign in button should open the Crossmint authentication modal
After signing in, you should see your user information displayed
Sign out button should work correctly
Customization Notes
In our implementation, we made the following changes to improve the user experience:
Simplified the NavBar - We removed the Arweave wallet connection and ARIO SDK functionality to focus solely on Crossmint authentication, creating a cleaner interface.
Streamlined User Interface - The app now shows a single "Sign in with Crossmint" button in the navbar, which provides a more intuitive authentication flow.
Removed Redundant Components - We eliminated unused state variables and effects from the NavBar component, making the code more maintainable.
Enhanced Brand Identity - Changed all references to "lil dumdumz NFT" to strengthen the brand presence in the application.
With Crossmint's authentication now integrated, your users can easily sign up and log in to your decentralized NFT minting application. In the next step, you'll add the Crossmint payment button to enable users to mint NFTs directly from your application.
For your fully decentralized NFT minting application, you've implemented a client-side approach for payment integration using Crossmint's headless API for crypto payments. This allows users to purchase NFTs directly from your application using cryptocurrency, maintaining the decentralized nature of your platform.
Environment Variables Setup
You've configured your application with the necessary environment variables:
Create an order by clicking the Create Order button
When prompted, sign the transaction in your wallet
Monitor the order status until completion
Verify that the NFT appears in your Crossmint wallet
Benefits of the Crypto Payment Approach
This crypto payment implementation offers several advantages:
Fully Decentralized: The entire payment process happens client-side, aligning with your goal of a decentralized application
Native Blockchain Experience: Users interact directly with their wallets for a true web3 experience
No Server-Side Requirements: All API calls are made from the client, making the app compatible with Arweave deployment
Transparent Process: Users can see and verify each step of the transaction process
Cross-Chain Compatibility: The same approach can be used to accept payments on various blockchains
By implementing this payment flow, you've created a seamless way for users to purchase NFTs using cryptocurrency while maintaining the decentralized nature of your application. This sets the stage for the next step: deploying your complete application to Arweave.
After implementing the core functionality of your application, it's important to enhance the user interface to create a more engaging and professional experience. A well-designed UI not only improves usability but also increases user trust in your NFT platform. Let's update your frontend design to better showcase your NFTs and create a more intuitive user flow.
Redesigning the NavBar Component
First, let's enhance your NavBar with a modern design and responsive functionality:
A full-height flexible layout with a subtle gradient background
Consistent page structure with appropriate margins and padding
A placeholder dashboard with skeleton loading states for future NFT displays
Proper routing with protected routes for authenticated content
Creating an Engaging Home Page
A good landing page is crucial for NFT platforms. You've redesigned your Home component to create a more engaging and informative experience:
import React from'react';import { Link } from'react-router-dom';import { useAuth } from"@crossmint/client-sdk-react-ui";constHome= () => {const { user,login } =useAuth();constarweaveImageUrl="https://btruuwgkero6dqsk6y2w72kgbtfbncafhdch3bepa33cdpxxdhfa.arweave.net/DONKWMokXeHCSvY1b-lGDMoWiAU4xH2Ejwb2Ib73Gco";return ( <> {/* Hero Section */} <sectionclassName="bg-gradient-to-r from-indigo-600 to-purple-600 text-white"> <divclassName="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20 md:py-28"> <divclassName="grid md:grid-cols-2 gap-12 items-center"> <divclassName="text-center md:text-left"> <h1className="text-4xl md:text-5xl font-bold mb-6 leading-tight"> Collect Unique Digital Art from lil dumdumz </h1> <pclassName="text-xl mb-8 text-indigo-100"> Fully decentralized NFTs with permanent storage on Arweave. Own a piece of digital history that lasts forever. </p> <divclassName="flex flex-col sm:flex-row justify-center md:justify-start gap-4"> {user ? ( <Linkto="/purchase"className="px-8 py-3 bg-white text-indigo-600 rounded-full font-bold text-lg shadow-lg hover:bg-indigo-50 transition duration-300" > Purchase NFT </Link> ) : ( <buttononClick={login}className="px-8 py-3 bg-white text-indigo-600 rounded-full font-bold text-lg shadow-lg hover:bg-indigo-50 transition duration-300" > Connect Wallet </button> )} <ahref="#learn-more"className="px-8 py-3 bg-transparent border-2 border-white rounded-full font-bold text-lg hover:bg-white hover:bg-opacity-10 transition duration-300" > Learn More </a> </div> </div> <divclassName="relative"> <divclassName="relative z-10 overflow-hidden rounded-2xl shadow-2xl transform rotate-2 hover:rotate-0 transition-transform duration-500"> <imgsrc={arweaveImageUrl} alt="Featured NFT"className="w-full h-auto" /> <divclassName="absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/70 to-transparent p-6"> <pclassName="text-white text-xl font-semibold">lil dumdumz #1</p> <divclassName="flex justify-between items-center mt-2"> <spanclassName="text-indigo-200">Price: 0.01 ETH</span> <spanclassName="bg-indigo-500 text-white px-3 py-1 rounded-full text-sm">Limited Edition</span> </div> </div> </div> <divclassName="absolute -bottom-5 -right-5 h-48 w-48 bg-yellow-400 rounded-full opacity-70 blur-3xl -z-10"></div> <divclassName="absolute -top-5 -left-5 h-36 w-36 bg-purple-500 rounded-full opacity-70 blur-3xl -z-10"></div> </div> </div> </div> </section> {/* Features Section */} <sectionid="learn-more"className="py-20 bg-white"> <divclassName="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <h2className="text-3xl font-bold text-center mb-16 text-gray-800"> A Truly <spanclassName="text-indigo-600">Decentralized</span> NFT Platform </h2> <divclassName="grid md:grid-cols-3 gap-12"> <divclassName="bg-gray-50 rounded-xl p-8 shadow-md transform hover:scale-105 transition duration-300"> <divclassName="h-14 w-14 bg-indigo-100 text-indigo-600 rounded-full flex items-center justify-center mb-6"> <svgxmlns="http://www.w3.org/2000/svg"className="h-8 w-8"fill="none"viewBox="0 0 24 24"stroke="currentColor"> <pathstrokeLinecap="round"strokeLinejoin="round"strokeWidth={2} d="M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4" /> </svg> </div> <h3className="text-xl font-semibold mb-3 text-gray-800">Permanent Storage</h3> <pclassName="text-gray-600"> Your NFT images are stored on Arweave, ensuring they'll be accessible forever. No more broken NFTs due to centralized servers going offline. </p> </div> <divclassName="bg-gray-50 rounded-xl p-8 shadow-md transform hover:scale-105 transition duration-300"> <divclassName="h-14 w-14 bg-indigo-100 text-indigo-600 rounded-full flex items-center justify-center mb-6"> <svgxmlns="http://www.w3.org/2000/svg"className="h-8 w-8"fill="none"viewBox="0 0 24 24"stroke="currentColor"> <pathstrokeLinecap="round"strokeLinejoin="round"strokeWidth={2} d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z" /> </svg> </div> <h3className="text-xl font-semibold mb-3 text-gray-800">Simplified Purchasing</h3> <pclassName="text-gray-600"> Crossmint integration allows for easy NFT purchasing with cryptocurrency, making blockchain technology accessible to everyone. </p> </div> <divclassName="bg-gray-50 rounded-xl p-8 shadow-md transform hover:scale-105 transition duration-300"> <divclassName="h-14 w-14 bg-indigo-100 text-indigo-600 rounded-full flex items-center justify-center mb-6"> <svgxmlns="http://www.w3.org/2000/svg"className="h-8 w-8"fill="none"viewBox="0 0 24 24"stroke="currentColor"> <pathstrokeLinecap="round"strokeLinejoin="round"strokeWidth={2} d="M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9" /> </svg> </div> <h3className="text-xl font-semibold mb-3 text-gray-800">Decentralized Domain</h3> <pclassName="text-gray-600"> Your app is hosted on the AR.IO network, ensuring it will remain accessible indefinitely with a human-readable domain name. </p> </div> </div> </div> </section> {/* NFT Preview Section */} <sectionclassName="py-20 bg-gray-50"> <divclassName="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <divclassName="text-center mb-16"> <h2className="text-3xl font-bold text-gray-800 mb-4">Featured NFT</h2> <pclassName="text-lg text-gray-600 max-w-3xl mx-auto"> A limited edition artwork with permanent storage on the Arweave network, and verification on the Base Sepolia blockchain. </p> </div> <divclassName="bg-white rounded-2xl shadow-xl overflow-hidden max-w-4xl mx-auto"> <divclassName="md:flex"> <divclassName="md:w-1/2"> <imgsrc={arweaveImageUrl} alt="Featured NFT"className="w-full h-full object-cover" /> </div> <divclassName="md:w-1/2 p-8"> <h3className="text-2xl font-bold text-gray-800 mb-4">lil dumdumz NFT #1</h3> <divclassName="flex items-center mb-6"> <spanclassName="bg-green-100 text-green-800 px-3 py-1 rounded-full text-sm mr-3">Available</span> <spanclassName="text-gray-500 text-sm">Limited Edition of 100</span> </div> <pclassName="text-gray-600 mb-6"> This unique NFT features stunning artwork permanently stored on the Arweave network, ensuring its availability for generations to come. Own a piece of digital history that can't be altered or deleted. </p> <divclassName="border-t border-gray-200 pt-6 mb-6"> <divclassName="flex justify-between mb-2"> <spanclassName="text-gray-500">Storage</span> <spanclassName="font-medium">Arweave</span> </div> <divclassName="flex justify-between mb-2"> <spanclassName="text-gray-500">Blockchain</span> <spanclassName="font-medium">Base Sepolia</span> </div> <divclassName="flex justify-between mb-2"> <spanclassName="text-gray-500">Price</span> <spanclassName="font-medium">0.01 ETH</span> </div> </div> {user ? ( <Linkto="/purchase"className="block w-full py-3 px-4 bg-indigo-600 text-white text-center font-medium rounded-lg hover:bg-indigo-700 transition duration-300" > Purchase This NFT </Link> ) : ( <buttononClick={login}className="block w-full py-3 px-4 bg-indigo-600 text-white text-center font-medium rounded-lg hover:bg-indigo-700 transition duration-300" > Connect Wallet to Purchase </button> )} </div> </div> </div> </div> </section> {/* CTA Section */} <sectionclassName="bg-indigo-600 text-white py-16 pb-24"> <divclassName="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 text-center"> <h2className="text-3xl font-bold mb-6">Ready to own your piece of digital history?</h2> <pclassName="text-xl text-indigo-100 mb-8 max-w-3xl mx-auto"> Join the movement for truly permanent digital ownership with our decentralized NFT platform. </p> {user ? ( <Linkto="/purchase"className="inline-block px-8 py-4 bg-white text-indigo-600 rounded-full font-bold text-lg shadow-lg hover:bg-indigo-50 transition duration-300" > Purchase Your NFT Now </Link> ) : ( <buttononClick={login}className="inline-block px-8 py-4 bg-white text-indigo-600 rounded-full font-bold text-lg shadow-lg hover:bg-indigo-50 transition duration-300" > Connect Wallet to Get Started </button> )} </div> </section> </> );};exportdefault Home;
This enhanced Home page includes several key elements:
Engaging Hero Section:
A bold color gradient background with a two-column layout
Prominent headline and subheading that clearly communicates the value proposition
Featured NFT display with hover effects and overlay information
Call-to-action buttons that adapt based on user authentication status
Features Explanation:
Three-column layout highlighting the key benefits of the platform
Custom icons with consistent styling
Interactive hover effects to increase engagement
Clear, concise descriptions of the advantages of using your platform
NFT Showcase Section:
Detailed card displaying the NFT with its specifications
Responsive design that adapts to different screen sizes
Clear visual hierarchy with appropriate spacing
Contextual call-to-action based on authentication state
Compelling Call-to-Action Section:
Bold color background to draw attention
Clear, benefit-focused headline
Prominent action button to drive conversions
Design Enhancement Benefits
These frontend improvements offer several advantages for your NFT platform:
Increased User Engagement: The visually appealing design with interactive elements keeps users interested and encourages exploration.
Better User Experience: The responsive design ensures a consistent experience across all devices, while the intuitive navigation makes the platform easy to use.
Enhanced Brand Identity: The consistent color scheme, typography, and styling elements strengthen your "lil dumdumz NFT" brand identity.
Improved Conversion Rates: Strategic placement of call-to-action buttons and clear value propositions help guide users toward purchasing NFTs.
Accessibility Improvements: Proper contrast ratios, ARIA attributes, and semantic HTML make the platform more accessible to all users.
By implementing these design improvements, you've transformed your functional NFT platform into a visually appealing and user-friendly experience that better showcases your NFTs and encourages user interaction.
Now that you have built your complete NFT minting application with Arweave storage and Crossmint integration, let's deploy it to the Arweave network. This will make your entire application permanently available and truly decentralized.
Prepare for Deployment
Before deploying, make sure you have:
Your Arweave wallet file (wallet.json) in the project root
Sufficient AR tokens in your wallet for the deployment transaction
Turbo credits for fast uploads (available from turbo-topup.com)
Build the Production Version
Build your application for production:
pnpmrunbuild# or yarn build
This will create optimized production files in the dist directory.
Deploy to Arweave
The starter kit comes with a pre-configured deployment script. Run it to deploy your application:
pnpmrundeploy# or yarn deploy
This script will:
Take your built application from the dist directory
Upload all assets to Arweave using Turbo for faster deployment
Generate a manifest file that binds all your application files together
Provide you with a deployment URL in the format: https://arweave.net/{manifestId}
Once the deployment completes, you'll see output similar to:
✅ Deployment successful!📝 Manifest ID: YOUR_MANIFEST_ID🔗 Your application is now available at: https://arweave.net/YOUR_MANIFEST_ID
Important: Save this manifest ID as you'll need it for the next step.
Test Your Deployed Application
Visit the provided URL (https://arweave.net/YOUR_MANIFEST_ID) to verify your application is working correctly.
Test all functionality:
Arweave wallet connection
Crossmint authentication
NFT minting with the payment button
Since your application is now deployed to Arweave, it will remain accessible at this URL forever! Unlike traditional web hosting, there are no recurring fees or servers to maintain.
Benefits of Arweave Deployment
By deploying to Arweave, your NFT minting application gains several advantages:
Permanence: The application is stored permanently on the blockchain
Censorship resistance: No central authority can remove your application
No server maintenance: No need to manage servers or renew domains
True decentralization: Both the app's data (NFT images) and the application itself are decentralized
In the next and final step, you'll connect your deployed application to a human-readable domain name, making it easier for users to access.
Now that your application is deployed to Arweave, the final step is to connect it to a human-readable domain name using the Arweave Name System (ArNS). This will make your dApp easily accessible with a memorable URL.
Prerequisites
Before configuring your domain, ensure you have:
Successfully deployed your application to Arweave (from Step 8)
Find your ARNS name and click on the settings icon
Copy the Process ID displayed in the management interface
Update the Base Record Configuration
Open the /scripts/setBaseArns.js file in your project
Update the processId in the configuration:
constant=ANT.init({ signer:newArweaveSigner(jwk), processId:'YOUR_PROCESS_ID_HERE'// Replace with your Process ID});
Update the dataLink value with your deployment's manifest ID:
constresult=awaitant.setRecord({ name:'@', ttlSeconds:900,// 15 minutes dataLink:'YOUR_MANIFEST_ID'// Replace with the manifest ID from Step 8});
Set the Base Record
Run the command to update your ARNS name with your application's manifest ID:
pnpmrunset-base# or yarn set-base
The script will connect to AR.IO, submit the transaction, and update your name to point to your application. When successful, you'll see output similar to:
✅ Base record update successful!🔗 Your application is now available at: https://YOUR-NAME.ar.io
Optional: Configure Undernames
If you want to create subdomains for different parts of your application, you can set up undernames:
Open /scripts/setUndername.js
Update the processId with your Process ID
Configure the undername and data link
Run:
pnpmrunset-undername# or yarn set-undername
Verify Your Domain Configuration
To verify all records associated with your ARNS name:
Open /scripts/getRecords.js
Update the processId with your Process ID
Run:
pnpmrunrecords# or yarn records
This will display all the records for your ARNS name, including the base record that should now point to your application.
Access Your Application
Your application is now accessible at:
https://YOUR-NAME.ar.io
Share this user-friendly URL with your users - they can now access your fully decentralized NFT minting application using a memorable domain name.
Important Notes
ARNS name record updates may take a few minutes to propagate through the network
The default TTL (Time-to-Live) for name records is 15 minutes
If users experience issues accessing your domain, they can always use the direct Arweave URL: https://arweave.net/YOUR_MANIFEST_ID
Congratulations! 🎉 You've successfully built and deployed a fully decentralized NFT minting application that:
Stores NFT images permanently on Arweave
Mints NFTs on Ethereum using Crossmint
Provides seamless authentication for users
Offers multiple payment options for NFT purchases
Is deployed in a truly decentralized manner on Arweave
Is accessible via a human-readable domain name
Your application represents the future of Web3: decentralized storage, simplified user experiences, and permanent availability. Users can now mint NFTs with confidence, knowing that their digital assets will truly last forever on the permaweb supported by the permanent cloud solution, AR.IO.
Congratulations! You've successfully built an end-to-end decentralized NFT minting application that combines the permanent storage capabilities of Arweave with the user-friendly minting experience of Crossmint. This powerful combination creates a truly decentralized application that overcomes many of the traditional barriers to NFT adoption.
What You've Accomplished
In this tutorial, you've:
Stored Content Permanently - Used ArDrive.io to store your NFT images on Arweave, ensuring they'll remain accessible forever
Simplified NFT Creation - Integrated Crossmint's SDK to mint NFTs without requiring users to understand complex blockchain interactions
Built a User-Friendly Frontend - Created a React application with wallet connection and authentication
Added Payment Options - Implemented Crossmint's payment button to allow purchases with credit cards and cryptocurrencies
Deployed Decentrally - Published your entire application to Arweave, ensuring it will remain available indefinitely
Created a Memorable Address - Connected your application to a human-readable domain name
The Power of This Approach
This architecture solves several key problems in the NFT space:
True Permanence: Unlike NFTs that reference assets on centralized servers, your NFT images are stored permanently on Arweave
Accessibility: By offering credit card payments, you've made NFTs accessible to mainstream users
Complete Decentralization: Both your application and your assets are stored on decentralized networks
User-Friendly Experience: The combination of Arweave and Crossmint creates a seamless experience for both creators and collectors
Next Steps
To continue building on this foundation, consider:
Adding a gallery feature to display owned NFTs
Implementing NFT rarity traits and metadata
Creating a multi-creator marketplace
Adding social features like comments or likes
Building analytics to track sales and engagement
Resources
For more information on the technologies you've used:
By combining these powerful tools, you've built an application that represents the best of what Web3 has to offer: true ownership, permanence, permissionlessness, and accessibility. Your users can now mint NFTs with confidence, knowing that their digital assets will truly last forever on the permaweb supported by the permanent cloud solution, AR.IO.