← Hub

Register a new BRC333 project

Fills in project.json + umi-registry.json and gives you copy-paste deploy steps. Preview stages (local / preview / on-chain) use the same pattern as UMi: put mint-pending-preview.html in the project folder (copy from UMi once), then open /projects/<slug>/mint-pending-preview.html?stage=….

Set both to 0 for an empty registry (no staged mints). Use 0 and 49 for fifty mints like UMi.

',", " '',", " '',", " ''", " ].join('\\n');", " await writeFile(join('mints', String(i) + '.html'), html, 'utf8');", '}', "console.log('Wrote mints/' + start + '.html … ' + end + '.html');" ].join('\n'); } var state = { slug: '', pj: '', reg: '', scaffold: '', slots: '' }; document.getElementById('btnGen').addEventListener('click', function () { var msg = document.getElementById('msg'); var slug = document.getElementById('slug').value.trim().toLowerCase(); var title = document.getElementById('title').value.trim(); var desc = document.getElementById('desc').value.trim(); var master = document.getElementById('master').value.trim(); var dev = document.getElementById('dev').value.trim(); var start = parseInt(document.getElementById('start').value, 10); var end = parseInt(document.getElementById('end').value, 10); msg.style.display = 'block'; msg.className = 'out'; if (!SLUG_RE.test(slug)) { msg.innerHTML = 'Slug must be lowercase letters, digits, hyphens; 1–63 chars; no leading/trailing hyphen.'; return; } if (!title) { msg.innerHTML = 'Title required.'; return; } if (!INS_RE.test(master)) { msg.innerHTML = 'Master inscription id must look like 64 hex chars + i0 (e.g. …abc123i0).'; return; } if (dev && !INS_RE.test(dev)) { msg.innerHTML = 'Dev inscription id format invalid.'; return; } if (!Number.isFinite(start) || !Number.isFinite(end) || start < 0 || end < start || end > 0xffffff) { msg.innerHTML = 'Invalid index range (0 … 16777215, start ≤ end).'; return; } var pjObj = buildProjectJson(slug, title, desc, dev || null); if (!pjObj.devInscriptionId) delete pjObj.devInscriptionId; var regObj = buildRegistry(master, start, end); state.slug = slug; state.pj = JSON.stringify(pjObj, null, 2) + '\n'; state.reg = JSON.stringify(regObj, null, 2) + '\n'; state.scaffold = buildScaffoldMjs(master); state.slots = buildProjectSlotsJson(slug); msg.innerHTML = 'Ready. Download the JSON files + script + project-slots, copy preview HTML from UMi (commands below), run the script on the server, then deploy.'; document.getElementById('slugOut').textContent = slug; document.getElementById('nodeCmd').textContent = 'node scaffold-mints.mjs --start ' + start + ' --end ' + end; document.getElementById('dl').style.display = 'block'; document.getElementById('shell').style.display = 'block'; document.getElementById('urls').style.display = 'block'; var root = '/var/www/brc333-projects/' + slug; document.getElementById('sh').textContent = 'sudo mkdir -p ' + root + '/mints\n' + 'sudo cp /var/www/brc333-projects/umi/mint-pending-preview.html ' + root + '/\n' + 'sudo cp /var/www/brc333-projects/umi/preview.html ' + root + '/\n' + '# Upload project.json, project-slots.json, umi-registry.json, scaffold-mints.mjs into ' + root + '\n' + 'cd ' + root + ' && sudo node scaffold-mints.mjs --start ' + start + ' --end ' + end + '\n' + 'sudo nginx -t && sudo systemctl reload nginx'; var base = 'https://app.brc333.xyz/projects/' + slug + '/'; var ul = document.getElementById('urlList'); ul.innerHTML = ''; [ ['Mint preview (stage B default)', base + 'mint-pending-preview.html'], ['Local stage', base + 'mint-pending-preview.html?stage=local'], ['Preview stage', base + 'mint-pending-preview.html?stage=preview'], ['On-chain stage', base + 'mint-pending-preview.html?stage=onchain'], ['Hub redirect', base + 'preview.html'] ].forEach(function (pair) { var li = document.createElement('li'); li.innerHTML = pair[0] + ': ' + pair[1] + ''; ul.appendChild(li); }); }); document.getElementById('d1').addEventListener('click', function () { download('project.json', state.pj); }); document.getElementById('d2').addEventListener('click', function () { download('umi-registry.json', state.reg); }); document.getElementById('d3').addEventListener('click', function () { download('scaffold-mints.mjs', state.scaffold, 'text/javascript'); }); document.getElementById('d4').addEventListener('click', function () { download('project-slots.json', state.slots); }); })();