www/index.html page updated as per the refactoring...

This commit is contained in:
thakares committed 2026-06-19 20:58:53 +05:30
1 parent 19e48270ed
commit 6a3c744667
1 file changed
+106 -66
+106 -66
View File
@@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="BZOD — Self-hosted Multi-User URL Management Platform written in Rust with landing pages, QR codes, analytics, audit logging, and SQLite backend."> <meta name="description" content="BZOD ? Self-hosted Multi-User URL Management Platform written in Rust with landing pages, QR codes, analytics, audit logging, and SQLite backend.">
<title>BZOD | Self-Hosted URL Management in Rust</title> <title>BZOD | Self-Hosted URL Management in Rust</title>
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;600&family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;600&family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
@@ -209,12 +209,28 @@
<div class="hero-inner"> <div class="hero-inner">
<div> <div>
<div class="hero-badge"><span class="pulse"></span> Production Ready</div> <div class="hero-badge"><span class="pulse"></span> Production Ready</div>
<h1>Control Your URLs<br><span class="hl">Self-Hosted with</span> <span class="hr">Rust</span></h1> <h1>Control Your URLs.<br><span class="hl">Self-Hosted with</span> <span class="hr">Rust</span></h1>
<p class="hero-desc">BZOD is a complete multi-user URL management platform featuring custom landing pages, analytics, audit logging, and automated disaster recovery. Powered entirely by SQLite.</p> <p class="hero-desc">BZOD is a complete multi-user URL management platform featuring custom landing pages, analytics, audit logging, and automated disaster recovery. Powered entirely by SQLite.</p>
<div class="hero-ctas"> <div class="hero-ctas">
<a href="#install" class="btn-lg p">Deployment Guide</a> <a href="#install" class="btn-lg p">Deployment Guide</a>
<a href="/login" class="btn-lg o">User Panel</a> <a href="/login" class="btn-lg o">User Panel</a>
</div> </div>
<!-- One-Command Installer -->
<div style="margin-top:2.5rem;background:var(--bg2);border:1px solid var(--border);border-radius:12px;padding:1.25rem 1.5rem">
<div style="font-family:var(--mono);font-size:0.85rem;color:var(--t2);margin-bottom:0.75rem">One-command installer</div>
<div style="display:flex;align-items:center;gap:1rem;background:var(--bg3);padding:0.85rem 1.25rem;border-radius:8px;font-family:var(--mono);font-size:0.9rem;color:var(--t1);overflow-x:auto">
<span style="color:var(--a2)">$</span>
<span id="install-cmd" style="flex:1">curl -fsSL https://bzo.in/deploy.sh | sudo bash</span>
<button onclick="copyInstallCommand()"
style="background:transparent;border:none;color:var(--a1);cursor:pointer;font-size:1.2rem;padding:4px 8px;border-radius:6px;transition:all .2s">
📋
</button>
</div>
<div id="copy-msg" style="display:none;color:var(--a2);font-size:0.8rem;margin-top:0.5rem;text-align:center">✅ Copied to clipboard!</div>
</div>
<div class="hero-meta"> <div class="hero-meta">
<span class="meta-tag">Rust 2021</span> <span class="meta-tag">Rust 2021</span>
<span class="meta-tag">Axum</span> <span class="meta-tag">Axum</span>
@@ -222,33 +238,46 @@
<span class="meta-tag">Docker Ready</span> <span class="meta-tag">Docker Ready</span>
</div> </div>
</div> </div>
<!-- Terminal remains the same -->
<div class="terminal"> <div class="terminal">
<div class="t-bar"><span class="dot d-r"></span><span class="dot d-y"></span><span class="dot d-g"></span><span class="t-title">bzod — bash</span></div> <div class="t-bar"><span class="dot d-r"></span><span class="dot d-y"></span><span class="dot d-g"></span><span class="t-title">bzod ? running</span></div>
<div class="t-body"> <div class="t-body"><span class="tp">$</span> <span class="tc">git clone https://github.com/thakares/bzod</span>
<span class="tp">$</span> <span class="tc">git clone https://github.com/thakares/nx9-url-shortener bzod</span>
<span class="to">Cloning into 'bzod'...</span> <span class="to">Cloning into 'bzod'...</span>
<span class="t-spacer"></span>
<span class="tp">$</span> <span class="tc">cargo build --release</span> <span class="tp">$</span> <span class="tc">cargo build --release</span>
<span class="to"> Compiling bzod v0.5.0</span> <span class="to"> Compiling bzod v0.5.0</span>
<span class="tg"> Finished release [optimized] in 12.58s</span> <span class="tg"> Finished release [optimized] in 12.58s</span>
<span class="t-spacer"></span>
<span class="tp">$</span> <span class="tc">./target/release/bzod serve</span> <span class="tp">$</span> <span class="tc">./target/release/bzod serve</span>
<span class="t-spacer"></span>
<span class="to">[INFO]</span> <span class="tc">database=SQLite multi_user=enabled</span> <span class="tg">[INFO]</span> <span class="tk">database</span>=<span class="tv">"SQLite"</span> <span class="tk">multi_user</span>=<span class="tv">enabled</span>
<span class="to">[INFO]</span> <span class="tc">Listening on 0.0.0.0:8654</span> <span class="tg">[INFO]</span> <span class="tk">audit_logging</span>=<span class="tv">enabled</span> <span class="tk">backup</span>=<span class="tv">supported</span>
<span class="t-spacer"></span> <span class="tg">[INFO]</span> Listening on 0.0.0.0:3000
<span class="tp">$</span> <span class="tc">curl -X POST http://localhost:8654/api/v1/urls \</span>
<span class="tc"> -H "Authorization: bzo_TOKEN" \</span> <span class="tp">$</span> <span class="tc">curl -X POST http://localhost:3000/api/users \
<span class="tc"> -d '{"target_url":"https://example.com","code":"my-link"}'</span> -H "Content-Type: application/json" \
<span class="tg">✅ Created: http://localhost:8654/my-link</span> -d '{"username":"admin","password":"secure"}'</span>
</div>
<span class="tv">{</span>
<span class="to"> "id": 1,
"username": "admin",
"created_at": "2026-06-19T13:17:28Z"</span>
<span class="tv">}</span>
<span class="tp">$</span> <span class="tc">curl -X POST http://localhost:3000/api/short-urls \
-H "Authorization: Bearer TOKEN" \
-d '{"target":"https://example.com","slug":"my-link"}'</span>
<span class="tg">✅ Short URL created: http://localhost:3000/my-link</span></div>
</div> </div>
</div> </div>
</header> </header>
<div class="stats-band"> <div class="stats-band">
<div class="stats-grid"> <div class="stats-grid">
<div><span class="stat-n">∞</span><div class="stat-l">Short URLs</div></div> <div><span class="stat-n">?</span><div class="stat-l">Short URLs</div></div>
<div><span class="stat-n">QR</span><div class="stat-l">Generation</div></div> <div><span class="stat-n">QR</span><div class="stat-l">Generation</div></div>
<div><span class="stat-n">Realtime</span><div class="stat-l">Analytics</div></div> <div><span class="stat-n">Realtime</span><div class="stat-l">Analytics</div></div>
<div><span class="stat-n">Multi</span><div class="stat-l">User Config</div></div> <div><span class="stat-n">Multi</span><div class="stat-l">User Config</div></div>
@@ -264,10 +293,10 @@
<h2 class="section-title">Professional URL Management</h2> <h2 class="section-title">Professional URL Management</h2>
<p class="section-sub">A highly optimized architecture providing your organization with total ownership of internal and external links, operational data, and analytics.</p> <p class="section-sub">A highly optimized architecture providing your organization with total ownership of internal and external links, operational data, and analytics.</p>
<div class="grid-4" style="margin-bottom:1.5rem"> <div class="grid-4" style="margin-bottom:1.5rem">
<div class="card"><span class="card-icon">🔗</span><div class="card-title">URL Shortening</div><p class="card-desc">Create memorable URLs. Features include password protection, expirations, and elegant preview cards.</p></div> <div class="card"><span class="card-icon">?</span><div class="card-title">URL Shortening</div><p class="card-desc">Create memorable URLs. Features include password protection, expirations, and elegant preview cards.</p></div>
<div class="card"><span class="card-icon">📄</span><div class="card-title">Landing Pages</div><p class="card-desc">Host structured landing pages with built-in analytics, dynamic QR codes, and integrated domains.</p></div> <div class="card"><span class="card-icon">?</span><div class="card-title">Landing Pages</div><p class="card-desc">Host structured landing pages with built-in analytics, dynamic QR codes, and integrated domains.</p></div>
<div class="card"><span class="card-icon">📊</span><div class="card-title">Analytics</div><p class="card-desc">Accurate visitor tracking encompassing browser metrics, referrers, and seamless CSV exports.</p></div> <div class="card"><span class="card-icon">?</span><div class="card-title">Analytics</div><p class="card-desc">Accurate visitor tracking encompassing browser metrics, referrers, and seamless CSV exports.</p></div>
<div class="card"><span class="card-icon">🛡️</span><div class="card-title">Memory Safe</div><p class="card-desc">Engineered in Rust to fundamentally eliminate memory leaks, null pointers, and thread data races.</p></div> <div class="card"><span class="card-icon">??</span><div class="card-title">Memory Safe</div><p class="card-desc">Engineered in Rust to fundamentally eliminate memory leaks, null pointers, and thread data races.</p></div>
</div> </div>
</div> </div>
</section> </section>
@@ -283,18 +312,18 @@
<div> <div>
<div class="flow-diagram"> <div class="flow-diagram">
<div><span class="fbox">Client Browser</span></div> <div><span class="fbox">Client Browser</span></div>
<div class="farrow">↓ HTTP/REST</div> <div class="farrow">? HTTP/REST</div>
<div><span class="fbox" style="border-color:var(--a1)">Axum Routing Engine</span></div> <div><span class="fbox" style="border-color:var(--a1)">Axum Routing Engine</span></div>
<div class="farrow">↓ system.db lookup</div> <div class="farrow">? system.db lookup</div>
<div><span class="fbox">Global Slug Registry</span></div> <div><span class="fbox">Global Slug Registry</span></div>
<div class="farrow">↓ Resolve Tenant</div> <div class="farrow">? Resolve Tenant</div>
<div style="display:flex;justify-content:center;gap:1.5rem;margin:1rem 0"> <div style="display:flex;justify-content:center;gap:1.5rem;margin:1rem 0">
<div><div style="font-size:0.75rem;margin-bottom:0.25rem">URL Data</div><span class="fbox">content.db</span></div> <div><div style="font-size:0.75rem;margin-bottom:0.25rem">URL Data</div><span class="fbox">content.db</span></div>
<div><div style="font-size:0.75rem;margin-bottom:0.25rem">Tracking</div><span class="fbox">analytics.db</span></div> <div><div style="font-size:0.75rem;margin-bottom:0.25rem">Tracking</div><span class="fbox">analytics.db</span></div>
</div> </div>
<div class="farrow">↓ Write Event</div> <div class="farrow">? Write Event</div>
<div><span class="fbox" style="border-color:var(--a3)">Audit Log (system.db)</span></div> <div><span class="fbox" style="border-color:var(--a3)">Audit Log (system.db)</span></div>
<div class="farrow">↓</div> <div class="farrow">?</div>
<div><span class="fbox">Response / Redirect</span></div> <div><span class="fbox">Response / Redirect</span></div>
</div> </div>
</div> </div>
@@ -329,19 +358,19 @@
<div> <div>
<div class="file-tree"> <div class="file-tree">
data/<br> data/<br>
├── <span class="dir">admin/</span> <span class="comment"># Global Metadata</span><br> ??? <span class="dir">admin/</span> <span class="comment"># Global Metadata</span><br>
│ ├── <span class="file">admin.db</span> <span class="comment"># Internal management</span><br> ? ??? <span class="file">admin.db</span> <span class="comment"># Internal management</span><br>
│ ├── <span class="file">system.db</span> <span class="comment"># Global slugs & audit logs</span><br> ? ??? <span class="file">system.db</span> <span class="comment"># Global slugs & audit logs</span><br>
│ └── <span class="file">users.db</span> <span class="comment"># Auth, sessions, quotas</span><br> ? ??? <span class="file">users.db</span> <span class="comment"># Auth, sessions, quotas</span><br>
│<br> ?<br>
└── <span class="dir">users/</span> <span class="comment"># Tenant Isolation</span><br> ??? <span class="dir">users/</span> <span class="comment"># Tenant Isolation</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;├── <span class="dir">1/</span> <span class="comment"># User 1</span><br> &nbsp;&nbsp;&nbsp;&nbsp;??? <span class="dir">1/</span> <span class="comment"># User 1</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;│ ├── <span class="file">analytics.db</span> <span class="comment"># Isolated metrics</span><br> &nbsp;&nbsp;&nbsp;&nbsp;? ??? <span class="file">analytics.db</span> <span class="comment"># Isolated metrics</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;│ └── <span class="file">content.db</span> <span class="comment"># Isolated URLs/Pages</span><br> &nbsp;&nbsp;&nbsp;&nbsp;? ??? <span class="file">content.db</span> <span class="comment"># Isolated URLs/Pages</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;│<br> &nbsp;&nbsp;&nbsp;&nbsp;?<br>
&nbsp;&nbsp;&nbsp;&nbsp;└── <span class="dir">2/</span> <span class="comment"># User 2</span><br> &nbsp;&nbsp;&nbsp;&nbsp;??? <span class="dir">2/</span> <span class="comment"># User 2</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;├── <span class="file">analytics.db</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;??? <span class="file">analytics.db</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└── <span class="file">content.db</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;??? <span class="file">content.db</span>
</div> </div>
</div> </div>
<div> <div>
@@ -454,7 +483,7 @@ Authorization: Bearer bzo_xxxxxxxxxxxx
<div class="container"> <div class="container">
<div class="eyebrow">Market Comparison</div> <div class="eyebrow">Market Comparison</div>
<h2 class="section-title">How BZOD Compares</h2> <h2 class="section-title">How BZOD Compares</h2>
<p class="section-sub">Unlike standard shorteners, BZOD provides a comprehensive suite of features—from landing pages to multi-tenant user isolation—in a single, compiled binary.</p> <p class="section-sub">Unlike standard shorteners, BZOD provides a comprehensive suite of features?from landing pages to multi-tenant user isolation?in a single, compiled binary.</p>
<table class="compare-tbl"> <table class="compare-tbl">
<thead> <thead>
@@ -469,52 +498,52 @@ Authorization: Bearer bzo_xxxxxxxxxxxx
<tbody> <tbody>
<tr> <tr>
<td>Language</td> <td>Language</td>
<td>Rust 🦀</td> <td>Rust ?</td>
<td>PHP</td> <td>PHP</td>
<td>PHP</td> <td>PHP</td>
<td>Rust</td> <td>Rust</td>
</tr> </tr>
<tr> <tr>
<td>Deployment</td> <td>Deployment</td>
<td><span class="check-yes">✅ Single Binary</span></td> <td><span class="check-yes">? Single Binary</span></td>
<td><span class="check-no">❌ Requires PHP/Web Server</span></td> <td><span class="check-no">? Requires PHP/Web Server</span></td>
<td><span class="check-no">❌ Requires PHP/Web Server</span></td> <td><span class="check-no">? Requires PHP/Web Server</span></td>
<td><span class="check-yes">✅ Single Binary</span></td> <td><span class="check-yes">? Single Binary</span></td>
</tr> </tr>
<tr> <tr>
<td>External DB Required</td> <td>External DB Required</td>
<td><span class="check-yes">✅ None (SQLite)</span></td> <td><span class="check-yes">? None (SQLite)</span></td>
<td><span class="check-partial">⚠️ Usually (PostgreSQL/Maria)</span></td> <td><span class="check-partial">?? Usually (PostgreSQL/Maria)</span></td>
<td><span class="check-partial">⚠️ Usually (MySQL)</span></td> <td><span class="check-partial">?? Usually (MySQL)</span></td>
<td><span class="check-yes">✅ None</span></td> <td><span class="check-yes">? None</span></td>
</tr> </tr>
<tr> <tr>
<td>Landing Pages</td> <td>Landing Pages</td>
<td><span class="check-yes">✅ Native</span></td> <td><span class="check-yes">? Native</span></td>
<td><span class="check-no">❌ No</span></td> <td><span class="check-no">? No</span></td>
<td><span class="check-partial">⚠️ Via Plugin</span></td> <td><span class="check-partial">?? Via Plugin</span></td>
<td><span class="check-no">❌ No</span></td> <td><span class="check-no">? No</span></td>
</tr> </tr>
<tr> <tr>
<td>QR + Analytics</td> <td>QR + Analytics</td>
<td><span class="check-yes">✅ Native</span></td> <td><span class="check-yes">? Native</span></td>
<td><span class="check-partial">⚠️ Partial</span></td> <td><span class="check-partial">?? Partial</span></td>
<td><span class="check-partial">⚠️ Via Plugin</span></td> <td><span class="check-partial">?? Via Plugin</span></td>
<td><span class="check-partial">⚠️ Partial</span></td> <td><span class="check-partial">?? Partial</span></td>
</tr> </tr>
<tr> <tr>
<td>Multi-User / Quotas</td> <td>Multi-User / Quotas</td>
<td><span class="check-yes">✅ Native (Isolated)</span></td> <td><span class="check-yes">? Native (Isolated)</span></td>
<td><span class="check-partial">⚠️ Partial</span></td> <td><span class="check-partial">?? Partial</span></td>
<td><span class="check-partial">⚠️ Via Plugin</span></td> <td><span class="check-partial">?? Via Plugin</span></td>
<td><span class="check-no">❌ No</span></td> <td><span class="check-no">? No</span></td>
</tr> </tr>
<tr> <tr>
<td>Backup & Recovery</td> <td>Backup & Recovery</td>
<td><span class="check-yes">✅ Built-in CLI & Web UI</span></td> <td><span class="check-yes">? Built-in CLI & Web UI</span></td>
<td><span class="check-no">❌ External Tools Needed</span></td> <td><span class="check-no">? External Tools Needed</span></td>
<td><span class="check-no">❌ External Tools Needed</span></td> <td><span class="check-no">? External Tools Needed</span></td>
<td><span class="check-no">❌ No</span></td> <td><span class="check-no">? No</span></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@@ -596,7 +625,7 @@ Authorization: Bearer bzo_xxxxxxxxxxxx
</div> </div>
</div> </div>
<div class="footer-bottom"> <div class="footer-bottom">
<span>© 2026 BZOD. Dual licensed under GPLv3 and Commercial License.</span> <span>� 2026 BZOD. Dual licensed under GPLv3 and Commercial License.</span>
</div> </div>
</footer> </footer>
@@ -615,6 +644,17 @@ Authorization: Bearer bzo_xxxxxxxxxxxx
document.getElementById(tabName).classList.add('on'); document.getElementById(tabName).classList.add('on');
e.currentTarget.classList.add('on'); e.currentTarget.classList.add('on');
} }
/* copy & paste installation link */
function copyInstallCommand() {
const cmd = "curl -fsSL https://bzo.in/deploy.sh | sudo bash";
navigator.clipboard.writeText(cmd).then(() => {
const msg = document.getElementById('copy-msg');
msg.style.display = 'block';
setTimeout(() => msg.style.display = 'none', 2000);
});
}
</script> </script>
</body> </body>
</html> </html>