Token Name Platform — Complete Project Launcher

Creates the full project (backend, frontend, scripts, data) in a folder you choose using the File System Access API.

Install steps

Note: This project excludes auto-clicking and automated trading. Mouse guidance (vision) is assistive only.

Log

Awaiting folder selection…
`, "frontend/styles.css": `:root { color-scheme: dark; } * { box-sizing: border-box; } body { margin:0; font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif; background:#0b0f1a; color:#e5e7eb; } header { padding:12px 16px; background:#111827; position:sticky; top:0; z-index:50; } h1 { margin:0 0 8px 0; font-size:20px; } nav { display:flex; gap:8px; flex-wrap:wrap; } button { background:#2563eb; color:white; border:none; padding:8px 12px; border-radius:6px; cursor:pointer; } button[data-tab] { background:#1f2937; } button#refresh { background:#2563eb; } main { padding:16px; } section { max-width:900px; margin:0 auto; } .card { background:#0f172a; border:1px solid #1f2937; border-radius:8px; padding:12px; margin-bottom:12px; } .list { list-style:none; padding:0; margin:0; } .list li { display:flex; justify-content:space-between; padding:8px 10px; border-bottom:1px solid #1f2937; } .meta { color:#9ca3af; } input, textarea, select { width:100%; padding:8px; border-radius:6px; border:1px solid #374151; background:#0b0f1a; color:#e5e7eb; } label { display:block; margin:8px 0 4px; } .form-row { display:grid; grid-template-columns:1fr 1fr; gap:8px; } @media (max-width:640px){ .form-row{ grid-template-columns:1fr; } }`, "frontend/app.js": `const state = { available:null, availableMeta:null, donations:null, proposals:null, tab:'dashboard' }; async function fetchJSON(url){ const res = await fetch(url); if(!res.ok) throw new Error('Fetch failed: '+url); return res.json(); } async function refresh(){ try{ const [available, donations, proposals] = await Promise.all([ fetchJSON('/api/available').catch(()=>null), fetchJSON('/api/donations').catch(()=>null), fetchJSON('/api/proposals').catch(()=>null) ]); state.available = available; state.availableMeta = available ? { lastScan: available.lastScan, availableCount: available.availableCount } : null; state.donations = donations; state.proposals = proposals; render(); }catch(e){ console.error(e); document.getElementById('content').innerHTML = '
Error: '+e.message+'
'; } } function render(){ const content = document.getElementById('content'); if (state.tab==='dashboard') content.innerHTML = window.renderDashboard(state); else if (state.tab==='available') content.innerHTML = window.renderAvailableList(state.available || {}); else if (state.tab==='donations') { content.innerHTML = window.renderDonations(state.donations || {}); bindDonationsForm(); } else if (state.tab==='governance') { content.innerHTML = window.renderGovernance(state.proposals || {}); bindGovernanceForms(); } } function bindNav(){ document.querySelectorAll('button[data-tab]').forEach(btn=>btn.addEventListener('click',()=>{ state.tab=btn.getAttribute('data-tab'); render(); })); document.getElementById('refresh').addEventListener('click', refresh); } function bindDonationsForm(){ const form = document.getElementById('donation-form'); if(!form) return; form.addEventListener('submit', async (e)=>{ e.preventDefault(); const fd=new FormData(form); const payload=Object.fromEntries(fd.entries()); try{ const res=await fetch('/api/donations',{ method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify(payload)}); if(!res.ok) throw new Error('Donation log failed'); await refresh(); }catch(err){ alert(err.message); } }); } function bindGovernanceForms(){ const form = document.getElementById('proposal-form'); if(form){ form.addEventListener('submit', async (e)=>{ e.preventDefault(); const fd=new FormData(form); const payload=Object.fromEntries(fd.entries()); if(!payload.title||!payload.description||!payload.budget){ alert('Title, description, and budget are required'); return; } try{ const res=await fetch('/api/proposals',{ method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify(payload)}); if(!res.ok) throw new Error('Create proposal failed'); await refresh(); }catch(err){ alert(err.message); } });} document.querySelectorAll('button.vote').forEach(btn=>btn.addEventListener('click', async ()=>{ const id=btn.getAttribute('data-id'); const decision=btn.getAttribute('data-decision'); const voter=prompt('Enter voter identifier (public key or name):'); if(!voter) return; try{ const res=await fetch('/api/proposals/'+id+'/vote',{ method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify({ voter, decision })}); if(!res.ok) throw new Error('Vote failed'); await refresh(); }catch(err){ alert(err.message); } })); } if ('serviceWorker' in navigator) navigator.serviceWorker.register('/sw.js'); bindNav(); refresh();`, "frontend/components/Dashboard.js": `window.renderDashboard = (state) => { const { availableMeta, donations, proposals } = state; return \`

Overview

Last scan: \${availableMeta?.lastScan || '—'}

Available names: \${availableMeta?.availableCount ?? 0}

Donations entries: \${donations?.entries?.length ?? 0}

Proposals: \${proposals?.proposals?.length ?? 0}

\`; };`, "frontend/components/AvailableList.js": `window.renderAvailableList = (available) => { const list = (available?.available || []).map((name,i)=>\`
  • \${name}#\${i+1}
  • \`).join(''); return \`

    Available names

    Count: \${available?.availableCount ?? 0}

    \`; };`, "frontend/components/Donations.js": `window.renderDonations = (donations) => { const addr = donations?.address || ''; const entries = donations?.entries || []; const rows = entries.slice().reverse().map(e=>\`
  • Donor: \${e.donor}
    \${e.ts} • \${e.chain} • \${e.tokenMint || '—'}
    Amount: \${e.amount ?? '—'}
    \${e.txSignature}
  • \`).join(''); return \`

    Donations ledger

    Treasury: \${addr}

    Entries: \${entries.length}

    Log a donation

    Recent entries

    \`; };`, "frontend/components/Governance.js": `window.renderGovernance = (proposals) => { const list = (proposals?.proposals || []).slice().reverse().map(p=>\`
  • \${p.title}\${p.status}
    \${p.createdAt}
    \${p.description}
    Budget: \${p.budget} \${p.tokenMint ? '• Token: '+p.tokenMint : ''}
    Approvals: \${p.approvals.length} • Rejections: \${p.rejections.length}
  • \`).join(''); return \`

    Governance

    Create proposal

    Proposals

    \`; };`, "frontend/manifest.json": `{ "name": "Token Name Platform", "short_name": "TNP", "start_url": "/", "display": "standalone", "background_color": "#0b0f1a", "theme_color": "#111827", "description": "Daily token name availability, transparent donations, and governance.", "icons": [ { "src": "/icons/icon-192.png", "sizes": "192x192", "type": "image/png" }, { "src": "/icons/icon-512.png", "sizes": "512x512", "type": "image/png" } ] }`, "frontend/sw.js": `self.addEventListener('install',(e)=>{ e.waitUntil(caches.open('tnp-v1').then(c=>c.addAll(['/','/index.html','/styles.css','/app.js','/manifest.json']))); }); self.addEventListener('fetch',(e)=>{ e.respondWith(caches.match(e.request).then(r=>r||fetch(e.request))); });`, "frontend/icons/icon-192.png": "", "frontend/icons/icon-512.png": "", "data/dictionary.txt": `pepe wojak based moon banana rekt zoomers pumpking doge2 catcoin froglord gigachad snail hamster toad moth cheems shibe bongocat pengu slime`, "data/taken.json": `{ "solana": [], "pumpfun": [], "combinedCount": 0 }`, "data/donations.json": `{ "address": "", "entries": [] }`, "data/proposals.json": `{ "proposals": [] }`, "exports/available.json": `{ "lastScan": null, "available": [], "availableCount": 0 }`, "scripts/setup.bat": `@echo off SETLOCAL cd /d "%~dp0" cd .. IF NOT EXIST "node_modules" ( echo Installing dependencies... call npm install ) echo Bootstrapping storage... call npm run setup echo Setup complete. ENDLOCAL`, "scripts/run_daily.bat": `@echo off SETLOCAL cd /d "%~dp0" cd .. echo Running daily scan... call npm run scan echo Starting server... call npm run start ENDLOCAL`, "scripts/setup.sh": `#!/usr/bin/env bash set -e cd "$(dirname "$0")/.." [ -d node_modules ] || npm install npm run setup echo "Setup complete."`, "scripts/cron.sh": `#!/usr/bin/env bash set -e cd "$(dirname "$0")/.." npm run scan`, "README.md": `# Token Name Platform Daily token name scanner (Solana + Pump.fun), transparent donations ledger, and governance scaffolding. Mobile/desktop PWA. ## Quick start 1. Install Node.js 18+ 2. npm install 3. npm run setup 4. npm run scan 5. npm start 6. Open http://localhost:${port} ## Notes - This project excludes auto-clicking and automated trading. - Update data/dictionary.txt as new meme terms emerge. - Consider multisig and public policies for treasury governance. ` }; } const dirs = [ "backend", "frontend", "frontend/components", "frontend/icons", "data", "exports", "logs", "scripts" ]; const logEl = document.getElementById('log'); const pickBtn = document.getElementById('pick'); const installBtn = document.getElementById('install'); const treasuryEl = document.getElementById('treasury'); const portEl = document.getElementById('port'); let rootHandle = null; function log(msg, type = 'info') { const prefix = type === 'error' ? '[ERROR] ' : type === 'ok' ? '[OK] ' : ''; logEl.textContent += '\n' + prefix + msg; } async function ensureDir(root, pathStr) { const parts = pathStr.split('/').filter(Boolean); let dir = root; for (const p of parts) { dir = await dir.getDirectoryHandle(p, { create: true }); } return dir; } async function writeFile(root, pathStr, content) { const parts = pathStr.split('/').filter(Boolean); const fileName = parts.pop(); const dir = await ensureDir(root, parts.join('/')); const fileHandle = await dir.getFileHandle(fileName, { create: true }); const writable = await fileHandle.createWritable(); if (pathStr.endsWith('.png') && content === "") { await writable.write(new Uint8Array()); } else { await writable.write(content); } await writable.close(); } pickBtn.addEventListener('click', async () => { try { rootHandle = await window.showDirectoryPicker(); log('Folder selected.', 'ok'); installBtn.disabled = false; } catch (e) { log('Folder selection cancelled or not supported.', 'error'); } }); installBtn.addEventListener('click', async () => { if (!rootHandle) return; const treasury = treasuryEl.value.trim(); const port = portEl.value.trim() || '8080'; const files = genFiles({ treasury, port }); log('Starting installation…'); try { for (const d of dirs) { await ensureDir(rootHandle, d); log('Created directory: ' + d, 'ok'); } for (const [pathStr, content] of Object.entries(files)) { await writeFile(rootHandle, pathStr, content); log('Wrote: ' + pathStr, 'ok'); } log('Installation complete. Open the folder in a terminal and run:', 'ok'); log('npm install'); log('npm run setup'); log('npm run scan'); log('npm start'); } catch (e) { console.error(e); log('Install failed: ' + e.message, 'error'); } });