Animated on-chain ready NFT card generator with flame black interface. Generate, customize, mint on Monad Mainnet, download PNG & video β all from one HTML file. No dependencies, no build tools, open directly in browser.
- π΄ Animated NFT card with canvas rendering at 30 FPS
- πΌοΈ Drag & drop image upload (PNG, JPG, GIF, WEBP)
- π¨ 12 neon lightning colors β toggle individually or use palette presets
- β‘ 4 palette presets: NEON / MATRIX (green/black) / MONO (white/grey/black) / FIRE
- πͺ 4 customizable power stats with live sliders (Attack, Defense, Speed, Magic)
- β 6 rarity grades: SSS+ Mythic / SSS Legendary / SS Epic / S Rare / A Uncommon / B Common
- πΎ Download as PNG (full resolution 800Γ1200)
- π¬ Download as animated WebM/MP4 video (5 seconds at 30 FPS)
- πΏ Mint on Monad Mainnet β sends 100 MON to owner wallet
- π₯ Flame black interface with rising ember particles
- β‘ Every button vibrates on click
- π± Fully responsive β works on mobile
NFT-CARD-GENERATOR-PRO/
βββ index.html # Complete app β single file, no dependencies
βββ README.md
| Function | Description |
|---|---|
loadImage(file) |
Reads image via FileReader, sets img variable, auto-triggers generateCard() |
| Drag & drop | dragover / dragleave / drop events on .upload-zone |
| File input | change event on #imageInput β accepts image/* |
| Function | Description |
|---|---|
generateCard() |
Shows canvas, enables download buttons, starts animation loop |
animate(ts) |
requestAnimationFrame loop β increments time, calls drawCard(), tracks FPS |
drawCard() |
Full canvas render β background, orbs, image, floating icons, rarity badge, name panel, stat bars, watermark |
drawStatBar(stat, y, cols, t) |
Draws one animated stat bar with shimmer effect |
drawCornerAccents(col) |
Draws 4 glowing corner bracket decorations |
roundRect(ctx, x, y, w, h, r) |
Canvas helper β draws rounded rectangle path |
| Function | Description |
|---|---|
setPalette(name) |
Sets active colors from preset β 'neon' / 'matrix' / 'mono' / 'fire' |
| Color button toggle | Click .color-btn to add/remove color from activeColors array |
Palette presets:
| Name | Colors |
|---|---|
neon |
Green, Cyan, Magenta, Yellow, Pink, Purple, Red, Blue |
matrix |
Green, Lime, Dark green, White shades |
mono |
White, Grey, Black shades |
fire |
Red, Orange, Yellow, Gold shades |
| Function | Description |
|---|---|
downloadCard() |
Pauses animation β renders final frame β canvas.toBlob() β triggers download as {name}.png |
Output: 800Γ1200px PNG, named from NFT name field.
| Function | Description |
|---|---|
downloadVideo() |
Records 5-second canvas stream using MediaRecorder API |
Details:
- Tries MIME types in order:
video/webm;codecs=vp9βvideo/webm;codecs=vp8βvideo/webmβvideo/mp4 - Records at 8 Mbps, 30 FPS
- Shows red REC indicator with countdown timer
- Shows progress bar during recording
- Auto-downloads as
{name}-animated.webmor.mp4 - Requires Chrome or Firefox (Safari has limited MediaRecorder support)
| Function | Description |
|---|---|
mintOnChain() |
Connects MetaMask β switches to Monad β sends 100 MON to owner β polls for receipt β auto-downloads PNG on success |
Config:
const OWNER_ADDRESS = '0x592B35c8917eD36c39Ef73D0F5e92B0173560b2e';
const MONAD_CHAIN_ID = '0x8F'; // 143
const MINT_PRICE_WEI = '0x' + BigInt('100000000000000000000').toString(16); // 100 MONFlow:
eth_requestAccountsβ connect walletwallet_switchEthereumChainβ switch to Monad (chain ID 143)wallet_addEthereumChainβ adds Monad if not presenteth_sendTransactionβ sends 100 MON to owner address (gas: 21000)- Polls
eth_getTransactionReceiptevery 2 seconds (max 60 attempts = 2 min) - On success β auto-downloads card PNG
document.addEventListener('click', e => {
const btn = e.target.closest('button, .color-btn, .upload-zone');
if (!btn || btn.disabled) return;
btn.classList.remove('vibrating');
void btn.offsetWidth; // reflow to restart animation
btn.classList.add('vibrating');
btn.addEventListener('animationend', () => btn.classList.remove('vibrating'), { once: true });
});Every button on the page vibrates when clicked β 10-step shake with translate + rotate + scale.
| Function | Description |
|---|---|
updatePreviewSize() |
Updates preview info bar β size (800Γ1200) and LIVE/PAUSED status. Runs every 500ms via setInterval |
βββββββββββββββββββββββββββ β Animated flame border + corner accents
β β
β [IMAGE AREA 720Γ560] β β User image, shimmer overlay, floating icons
β β SS β β β Rarity badge with pulse glow
β β
β NAME #001 β β Name panel (black bg)
β Edition: 1/100 β
β β
β βοΈ ATTACK βββββ 85 β β Animated stat bars with shimmer
β π‘οΈ DEFENSE βββββ 70 β
β β‘ SPEED βββββ 90 β
β β¨ MAGIC βββββ 75 β
β β
β imperamonad.xyz β β Watermark
βββββββββββββββββββββββββββ
# Clone repo
git clone https://github.com/00impera/NFT-CARD-GENERATOR-PRO
cd NFT-CARD-GENERATOR-PRO
# No build needed β open directly
open index.html
# OR deploy to GitHub Pages
# Settings β Pages β Branch: main β / (root) β Save
# Live at: https://nftgeneratornft.nelutz2you.workers.dev/To change mint price or owner address, edit these lines in index.html:
const OWNER_ADDRESS = '0x592B35c8917eD36c39Ef73D0F5e92B0173560b2e'; // β your wallet
const MONAD_CHAIN_ID = '0x8F'; // β 143 = Monad
const MINT_PRICE_WEI = '0x' + BigInt('100000000000000000000').toString(16); // β 100 MONTo change price to 50 MON:
const MINT_PRICE_WEI = '0x' + BigInt('50000000000000000000').toString(16);| Browser | Generate | PNG | Video | Mint |
|---|---|---|---|---|
| Chrome | β | β | β | β |
| Firefox | β | β | β | β |
| Safari | β | β | β | |
| Mobile Chrome | β | β | β | β |
| Mobile Safari | β | β | β | β |
MIT β see LICENSE
Built on Monad Mainnet Β· Pure HTML/Canvas/JS Β· No dependencies