Ship It and Win
Your app is built. Your tests are passing. Now get it in front of people.
#Deploy your contract
Before you can ship the frontend, the smart contract needs to be live on the network.
If the /buidl pipeline ran to completion, the deployer agent already handled this for you. Check with:
/buidl-statusIf deployment is complete, you'll see the contract address. Copy it — you need it.
If you need to deploy manually:
Deploy the contract to OPNet testnet and give me the contract addressClaude will handle the Bitcoin transaction construction and deployment. Once deployed, the contract address is permanent — that's your contract on Bitcoin L1.
When you're ready for mainnet, ask Claude to deploy to mainnet instead of testnet. Make sure you have real BTC in your wallet.
#Three ways to ship the frontend
#Option 1: .btc Domain (Recommended)
Deploy your frontend to a .btc domain. This is the most Bitcoin-native option — your app lives on Bitcoin infrastructure, accessible at yourname.btc.
First, make sure the opnet-cli is installed:
npm install -g @btc-vision/opnet-cliBuild your frontend:
npm run buildDeploy to your .btc domain:
opnet deploy your-domain ./distThis uploads your frontend to IPFS and publishes the hash to your .btc domain in one step. Users access it at your-domain.btc through any .btc-compatible browser or resolver.
If you already have an IPFS hash from a previous deployment and just want to update the domain pointer:
opnet website your-domain QmYourIpfsHashHere#Option 2: IPFS
Deploy to IPFS for decentralized hosting without a .btc domain:
npm run buildThen use any IPFS deployment service (Fleek, Pinata, or the opnet-cli deploy command above without a domain). Users access it via an IPFS gateway or a .btc record you can add later.
This is a good option if you want decentralized hosting but aren't ready to set up a .btc domain.
#Option 3: Vercel
The fastest option for getting something live and shareable. Good for competitions where you need a regular URL.
npm install -g vercel
vercelFollow the prompts. You'll have a live URL in about 60 seconds. The downside: it's not decentralized. The upside: it's fast, free, and gives you a clean URL for sharing.
For competition submissions, Vercel works great. For production apps you want to own permanently, use the .btc domain route.
#Update your frontend with the contract address
After deployment, update your frontend config with the live contract address:
Update the contract address in the frontend config to: [your contract address]
Make sure it's pointing to mainnet, not testnetRedeploy after updating.
#Before you submit
Run through this list:
- Contract is deployed and the address is in the frontend config
- Wallet connection works with OPWallet
- Core user flow works end-to-end (connect wallet, do the main thing, see the result)
- Error states are handled (what happens if a transaction fails?)
- The app looks good on mobile
- The contract address is on the right network (testnet for testing, mainnet for production)
#Competition submission
If you're entering a hackathon or competition:
Write a good description. One paragraph explaining what your app does, who it's for, and why it's interesting. Don't assume judges know what your app does just from the name.
Record a demo. 2-3 minutes. Show the actual user flow: connect wallet, do the main thing, see the result. Don't do a slide deck. Show the app working.
Include the contract address. Judges want to verify the contract is real and deployed on OPNet. Include it in your submission.
Link the source code. If it's a competition, open-source your repo. It shows you built something real and gives other builders something to learn from.
#After you ship
Tell people about it. Share in the OPNet Discord. Post the app link. Show the contract address on the explorer.
You just deployed a smart contract on Bitcoin L1 and shipped a working DeFi app. That's not a small thing. Share it.
Ready to test your knowledge?
20 questions covering everything from vibecoding basics to shipping a complete dApp.