www/index.html page updated as per the refactoring...
This commit is contained in:
1 parent
19e48270ed
commit
6a3c744667
1 file changed
+106
-66
+106
-66
@@ -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>
|
||||||
├── <span class="dir">1/</span> <span class="comment"># User 1</span><br>
|
??? <span class="dir">1/</span> <span class="comment"># User 1</span><br>
|
||||||
│ ├── <span class="file">analytics.db</span> <span class="comment"># Isolated metrics</span><br>
|
? ??? <span class="file">analytics.db</span> <span class="comment"># Isolated metrics</span><br>
|
||||||
│ └── <span class="file">content.db</span> <span class="comment"># Isolated URLs/Pages</span><br>
|
? ??? <span class="file">content.db</span> <span class="comment"># Isolated URLs/Pages</span><br>
|
||||||
│<br>
|
?<br>
|
||||||
└── <span class="dir">2/</span> <span class="comment"># User 2</span><br>
|
??? <span class="dir">2/</span> <span class="comment"># User 2</span><br>
|
||||||
├── <span class="file">analytics.db</span><br>
|
??? <span class="file">analytics.db</span><br>
|
||||||
└── <span class="file">content.db</span>
|
??? <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>
|
||||||
Reference in new issue
Block a user