Files
netdesk/server/web/index.html
T

330 lines
27 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>NetDesk — The Fast, Secure, Self-Hosted Remote Desktop</title>
<meta name="description" content="NetDesk is the fast, end-to-end encrypted, self-hosted remote desktop. Own your server, your keys, your data. The open-source alternative to TeamViewer, AnyDesk and RustDesk — free for individuals.">
<meta name="keywords" content="remote desktop, self-hosted remote desktop, rustdesk alternative, teamviewer alternative, anydesk alternative, open source remote access, secure remote support, screen sharing">
<link rel="canonical" href="https://netdesk.space/">
<meta property="og:type" content="website">
<meta property="og:title" content="NetDesk — The Fast, Secure, Self-Hosted Remote Desktop">
<meta property="og:description" content="Own your remote access. End-to-end encrypted, self-hosted, open source. The alternative to TeamViewer and RustDesk you fully control.">
<meta property="og:url" content="https://netdesk.space/">
<meta property="og:image" content="https://netdesk.space/og.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="theme-color" content="#0a0d14">
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='7' fill='%233d7eff'/%3E%3Cpath d='M8 20l8-12 8 12-8-4z' fill='white'/%3E%3Crect x='12' y='18' width='8' height='7' rx='2' fill='white'/%3E%3C/svg%3E">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap" rel="stylesheet">
<link rel="stylesheet" href="site.css?v=2">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"SoftwareApplication","name":"NetDesk","applicationCategory":"UtilitiesApplication","operatingSystem":"Windows, macOS","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"description":"Fast, secure, self-hosted remote desktop. Open-source alternative to TeamViewer and RustDesk.","aggregateRating":{"@type":"AggregateRating","ratingValue":"4.9","ratingCount":"1280"}}
</script>
<style>
/* ===== homepage: premium 3D depth ===== */
.aurora { position: fixed; inset: 0; z-index: -2; overflow: hidden; }
.aurora::before, .aurora::after { content: ""; position: absolute; border-radius: 50%; filter: blur(90px); opacity: .55; }
.aurora::before { width: 60vw; height: 60vw; left: -10vw; top: -18vw;
background: radial-gradient(circle, #3d7eff 0%, transparent 66%); animation: drift1 22s ease-in-out infinite; }
.aurora::after { width: 52vw; height: 52vw; right: -12vw; top: -6vw;
background: radial-gradient(circle, #2fbf71 0%, transparent 66%); opacity: .32; animation: drift2 26s ease-in-out infinite; }
.aurora .b3 { position: absolute; width: 46vw; height: 46vw; left: 30vw; top: 24vw; border-radius: 50%;
background: radial-gradient(circle, #7a5cff 0%, transparent 68%); filter: blur(100px); opacity: .28; animation: drift1 30s ease-in-out infinite reverse; }
:root[data-theme="light"] .aurora::before { opacity: .28; } :root[data-theme="light"] .aurora::after { opacity: .2; }
:root[data-theme="light"] .aurora .b3 { opacity: .14; }
@keyframes drift1 { 0%,100%{transform:translate(0,0) scale(1)} 50%{transform:translate(6vw,4vw) scale(1.12)} }
@keyframes drift2 { 0%,100%{transform:translate(0,0) scale(1)} 50%{transform:translate(-5vw,5vw) scale(1.1)} }
.gridfade { position: fixed; inset: 0; z-index: -1; pointer-events: none;
background-image: linear-gradient(rgba(255,255,255,.035) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255,.035) 1px, transparent 1px);
background-size: 46px 46px; mask-image: radial-gradient(ellipse 90% 60% at 50% 0%, #000 30%, transparent 75%); }
:root[data-theme="light"] .gridfade { background-image: linear-gradient(rgba(20,40,80,.05) 1px, transparent 1px), linear-gradient(90deg, rgba(20,40,80,.05) 1px, transparent 1px); }
.hz { position: relative; text-align: center; padding: 86px 0 30px; }
.hz .tagpill { animation: rise .7s both; }
.hz h1 { font-size: clamp(40px, 6.4vw, 76px); line-height: 1.02; letter-spacing: -2.4px; font-weight: 900;
margin-bottom: 22px; animation: rise .7s .06s both; }
.hz h1 .g { background: linear-gradient(120deg,#5c93ff,#8f7bff 40%,#2fbf71); -webkit-background-clip: text; background-clip: text; color: transparent; }
.hz .sub { font-size: clamp(17px,2.1vw,21px); color: var(--muted); max-width: 660px; margin: 0 auto 34px; animation: rise .7s .12s both; }
.hz .hero-cta { animation: rise .7s .18s both; }
.trust { margin-top: 24px; color: var(--faint); font-size: 13.5px; display: flex; gap: 22px; justify-content: center; flex-wrap: wrap; animation: rise .7s .24s both; }
.trust b { color: var(--fg); }
@keyframes rise { from{opacity:0; transform: translateY(22px)} to{opacity:1; transform: none} }
/* Flat, exact replica of the NetDesk desktop app (no tilt) */
.appshot { margin: 58px auto 0; max-width: 1060px; border-radius: 14px; overflow: hidden;
border: 1px solid #263241; background: #11161d; text-align: left; font-size: 13px;
font-family: 'Segoe UI','Inter',system-ui,sans-serif;
box-shadow: 0 60px 120px -30px rgba(0,0,0,.8), 0 30px 70px -40px rgba(25,200,126,.4),
inset 0 1px 0 rgba(255,255,255,.04);
animation: rise .9s .22s both; }
.as-tbar { height: 38px; background: #0a0e13; border-bottom: 1px solid #1d2633; display: flex;
align-items: center; justify-content: space-between; padding: 0 10px 0 12px; }
.as-tl { display: flex; align-items: center; gap: 10px; }
.as-logo { width: 18px; height: 18px; border-radius: 4px; background: linear-gradient(180deg,#25d386,#16a765);
display: inline-flex; align-items: center; justify-content: center; color: #04110a; font-size: 11px; font-weight: 800; }
.as-title { font-size: 12.5px; color: #d8dee9; font-weight: 600; }
.as-sub { font-size: 11px; color: #64748b; }
.as-tr { display: flex; align-items: center; gap: 10px; }
.as-tele { display: flex; align-items: center; gap: 9px; font-size: 11px; color: #8b96a6;
background: #0f151d; border: 1px solid #1f2937; border-radius: 8px; padding: 4px 10px; white-space: nowrap; }
.as-tele b { color: #25db8e; font-family: Consolas,monospace; font-weight: 600; }
.as-win { display: flex; gap: 4px; color: #8b96a6; font-size: 12px; }
.as-win span { width: 26px; text-align: center; }
.as-body { display: grid; grid-template-columns: 216px 1fr; min-height: 430px; }
.as-side { background: #0d1117; border-right: 1px solid #1d2633; padding: 14px; display: flex; flex-direction: column; }
.as-brand { display: flex; align-items: center; gap: 10px; }
.as-brand .lg { width: 34px; height: 34px; border-radius: 9px; background: linear-gradient(180deg,#25d386,#16a765);
display: flex; align-items: center; justify-content: center; color: #04110a; font-weight: 800; font-size: 16px; }
.as-brand b { color: #e6edf3; font-size: 16px; } .as-brand i { font-style: normal; font-size: 10.5px; color: #64748b; }
.as-navlbl { font-size: 10px; letter-spacing: 1.6px; color: #5b6878; margin: 18px 0 8px; font-weight: 700; }
.as-nav { display: grid; gap: 4px; }
.as-ni { display: flex; align-items: center; justify-content: space-between; padding: 9px 10px;
border-radius: 8px; color: #94a3b8; font-size: 12.5px; border: 1px solid transparent; }
.as-ni.act { background: rgba(25,200,126,.1); color: #25db8e; border-color: rgba(25,200,126,.25); font-weight: 600; box-shadow: inset 3px 0 0 #22d08a; }
.as-bdg { font-size: 10px; padding: 2px 8px; border-radius: 999px; background: #1a222d; color: #8b96a6; }
.as-bdg.g { background: rgba(25,200,126,.16); color: #25db8e; }
.as-bdg.r { background: #321c22; color: #e05a61; }
.as-sfoot { margin-top: auto; border-top: 1px solid #1d2633; padding-top: 10px; font-size: 11px; color: #64748b; }
.as-sfoot b { color: #cbd5e1; font-weight: 600; } .as-sfoot .on { color: #25db8e; }
.as-main { padding: 15px; display: flex; flex-direction: column; gap: 12px; min-width: 0;
background: radial-gradient(130% 100% at 100% 100%, rgba(22,167,101,.07), transparent 55%), linear-gradient(165deg,#121923 0%,#10151c 58%,#0f1714 150%); }
.as-card { background: linear-gradient(180deg,#19212c,#161d27); border: 1px solid #28333f; border-radius: 12px; padding: 15px;
box-shadow: 0 1px 0 rgba(255,255,255,.02) inset, 0 10px 24px -18px rgba(0,0,0,.7); }
.as-partner { display: flex; gap: 10px; align-items: center; padding: 10px 12px; }
.as-plbl { font-size: 10.5px; letter-spacing: 1.2px; color: #25db8e; font-weight: 700; white-space: nowrap; }
.as-input { flex: 1; background: #0f141b; border: 1px solid #252f3d; border-radius: 8px; height: 32px;
display: flex; align-items: center; padding: 0 12px; color: #64748b; font-size: 12px;
font-family: Consolas,monospace; min-width: 0; overflow: hidden; white-space: nowrap; }
.as-gbtn { background: linear-gradient(180deg,#25d386,#16a765); color: #04110a; font-weight: 700;
border-radius: 8px; height: 32px; padding: 0 16px; display: inline-flex; align-items: center; font-size: 12.5px; white-space: nowrap; }
.as-grid { display: grid; grid-template-columns: 1.25fr 1fr; gap: 12px; }
.as-col { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
.as-lbl { font-size: 10.5px; letter-spacing: 1.4px; color: #8e9aa9; font-weight: 700; text-transform: uppercase; }
.as-id { font-family: Consolas,'SF Mono',monospace; font-size: 40px; font-weight: 800; letter-spacing: 4px; color: #f1f5f9; margin-top: 9px; text-shadow: 0 2px 14px rgba(0,0,0,.4); }
.as-pill { display: inline-flex; align-items: center; gap: 7px; margin-top: 10px; padding: 3px 13px; border-radius: 999px;
background: rgba(25,200,126,.13); border: 1px solid rgba(25,200,126,.35); color: #25db8e; font-size: 12px; font-weight: 600; }
.as-pill::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: #25db8e; box-shadow: 0 0 7px #25db8e; }
.as-tag { font-size: 10.5px; padding: 3px 9px; border-radius: 7px; background: #10161f; border: 1px solid #26303f; color: #8b96a6; }
.as-field { margin-top: 10px; } .as-field small { display: block; font-size: 11px; color: #8e9aa9; margin-bottom: 5px; }
.as-hd { display: flex; align-items: center; justify-content: space-between; }
.as-run { display: grid; grid-template-columns: 2fr 1fr; gap: 12px; }
.as-runbtn { background: linear-gradient(180deg,#25d386,#16a765); border-radius: 10px; height: 46px;
display: flex; align-items: center; justify-content: center; gap: 8px; font-weight: 700; color: #fff; font-size: 14px;
box-shadow: 0 8px 26px rgba(25,200,126,.35); }
.as-stopbtn { background: #232c38; border-radius: 10px; height: 46px; display: flex; align-items: center;
justify-content: center; color: #aeb9c6; font-weight: 600; font-size: 13.5px; }
.as-toggles { display: flex; justify-content: space-around; gap: 8px; flex-wrap: wrap; padding: 12px 10px; }
.as-tg { display: flex; flex-direction: column; align-items: center; gap: 7px; font-size: 11px; color: #8e9aa9; text-align: center; }
.as-sw { width: 36px; height: 20px; border-radius: 999px; background: #26303f; position: relative; }
.as-sw::after { content: ""; position: absolute; top: 2px; left: 2px; width: 16px; height: 16px; border-radius: 50%; background: #94a3b8; }
.as-sw.on { background: #19c87e; box-shadow: 0 0 12px rgba(25,200,126,.5); }
.as-sw.on::after { left: auto; right: 2px; background: #fff; }
.as-acct { font-size: 12.5px; color: #cbd5e1; } .as-acct .ok { color: #25db8e; }
.as-dev { display: inline-flex; align-items: center; gap: 8px; margin-top: 10px; background: #0f141b;
border: 1px solid #252f3d; border-radius: 8px; padding: 7px 12px; font-size: 12px; color: #cbd5e1; }
.as-dev i { width: 7px; height: 7px; border-radius: 50%; background: #25db8e; font-style: normal; }
.chip { display:inline-block; margin: 3px; padding: 5px 11px; border-radius: 8px; background: rgba(255,255,255,.05); border:1px solid var(--border); font-size: 12.5px; color: var(--muted); }
/* stat row */
.stats { display: grid; grid-template-columns: repeat(4,1fr); gap: 20px; margin-top: 12px; }
.stat { text-align: center; padding: 22px; }
.stat .n { font-size: clamp(30px,4vw,46px); font-weight: 900; letter-spacing: -1.5px; background: var(--grad); -webkit-background-clip: text; background-clip:text; color: transparent; }
.stat .l { color: var(--muted); font-size: 14.5px; margin-top: 4px; }
.reveal { opacity: 0; transform: translateY(28px); transition: opacity .7s, transform .7s; }
.reveal.in { opacity: 1; transform: none; }
.feat { transform-style: preserve-3d; }
.feat:hover { transform: translateY(-4px) rotateX(2deg); }
@media (max-width: 760px) { .as-body{grid-template-columns:1fr} .as-side{display:none}
.as-grid{grid-template-columns:1fr} .as-tele{display:none} .stats{grid-template-columns:repeat(2,1fr)} }
</style>
</head>
<body data-page="home">
<div class="aurora"><span class="b3"></span></div>
<div class="gridfade"></div>
<div id="siteHeader"></div>
<!-- HERO -->
<section class="hz"><div class="wrap">
<span class="tagpill">● Open source · Self-hosted · End-to-end encrypted</span>
<h1>Remote access,<br><span class="g">finally on your terms.</span></h1>
<p class="sub">NetDesk is the fast, secure remote desktop you fully own. Your server, your keys,
your data — never a third-party cloud. The alternative to TeamViewer, AnyDesk and RustDesk,
<b style="color:var(--fg)">free for individuals</b>.</p>
<div class="hero-cta">
<a class="btn btn-primary btn-lg" href="/download">Download for Windows</a>
<a class="btn btn-ghost btn-lg" href="/download/NetDesk-android.apk">⬇ Android app (.apk)</a>
<a class="btn btn-ghost btn-lg" href="/app">Open Web Client →</a>
<a class="btn btn-ghost btn-lg" href="/git/akronlogic/netdesk">&lt;/&gt; View source</a>
</div>
<div class="trust"><span>🔒 <b>AES-256</b> end-to-end</span><span>⚡ <b>H.264</b> 60fps</span><span>🖥️ <b>Multi-monitor</b></span><span>💸 <b>No subscription</b> to self-host</span></div>
<!-- Exact flat replica of the NetDesk desktop app -->
<div class="appshot" role="img" aria-label="The NetDesk desktop app">
<div class="as-tbar">
<span class="as-tl"><span class="as-logo"><svg width="11" height="11" viewBox="0 0 24 24" fill="none"><path d="M12 3.2L3.2 12.6H20.8L12 3.2Z" fill="#fff"/><path d="M8.7 15.1H15.3L16.4 20.5H7.6L8.7 15.1Z" fill="#fff"/></svg></span><span class="as-title">NetDesk</span>
<span class="as-sub">— Enterprise Remote Desktop &amp; Unattended Access</span></span>
<span class="as-tr"><span class="as-tele">● Relay: <b>netdesk.space</b> · <b>24 ms</b> | TLS 1.3 · AES-256-GCM</span>
<span class="as-win"><span>–</span><span>▢</span><span>✕</span></span></span>
</div>
<div class="as-body">
<div class="as-side">
<div class="as-brand"><span class="lg"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><path d="M12 3.2L3.2 12.6C2.8 13 3.1 13.7 3.7 13.7H20.3C20.9 13.7 21.2 13 20.8 12.6L12 3.2Z" fill="#fff"/><path d="M8.7 15.1H15.3L16.4 20.3C16.5 20.7 16.2 21 15.8 21H8.2C7.8 21 7.5 20.7 7.6 20.3L8.7 15.1Z" fill="#fff"/></svg></span><span><b>NetDesk</b> <i>v1.5.0</i><br><i>Zero-Trust Remote Agent</i></span></div>
<div class="as-navlbl">WORKSPACE</div>
<div class="as-nav">
<span class="as-ni act">Remote Control <span class="as-bdg g">Host</span></span>
<span class="as-ni">My Computers <span class="as-bdg">3</span></span>
<span class="as-ni">Security &amp; 2FA <span class="as-bdg g">2FA On</span></span>
<span class="as-ni">Session Logs <span class="as-bdg">150</span></span>
</div>
<div class="as-sfoot">Local Endpoint <b style="float:right">DEVPC</b><br>
Daemon Status <b class="on" style="float:right">● Online</b></div>
</div>
<div class="as-main">
<div class="as-card as-partner">
<span class="as-plbl">CONNECT TO PARTNER:</span>
<span class="as-input">Enter remote Partner ID (e.g. 842 190 441)</span>
<span class="as-gbtn">Connect →</span>
</div>
<div class="as-grid">
<div class="as-col">
<div class="as-card">
<div class="as-hd"><span class="as-lbl">This Computer's ID</span><span class="as-tag">Copy ID</span></div>
<div class="as-id">842 190 441</div>
<div class="as-hd"><span class="as-pill">Online</span><span class="as-tag">🔒 E2EE Ready</span></div>
</div>
<div class="as-card">
<div class="as-hd"><span class="as-lbl">Unattended Password</span><span class="as-tag">PBKDF2 · 200k</span></div>
<div class="as-field"><span class="as-input">••••••••••&nbsp;&nbsp;👁&nbsp;&nbsp;⟳</span></div>
<div style="margin-top:9px;font-size:11.5px;color:#64748b">● Brute-force throttle: <b style="color:#cbd5e1">0.4s / attempt</b></div>
</div>
</div>
<div class="as-col">
<div class="as-card">
<div class="as-hd"><span class="as-lbl">Connection</span><span class="as-tag" style="color:#25db8e">Ping Relay (24 ms)</span></div>
<div class="as-field"><small>Server Address</small><span class="as-input">wss://netdesk.space/ws</span></div>
<div class="as-field"><small>Computer Name</small><span class="as-input">DEVPC</span></div>
</div>
<div class="as-card as-acct">
<div class="as-hd"><span class="as-lbl">NetDesk Account</span><span class="as-bdg g">Fleet Synced</span></div>
<div style="margin-top:9px"><span class="ok">✓ Signed in</span> as you@company.com</div>
<span class="as-dev">DEVPC <i></i> Online</span>
</div>
</div>
</div>
<div class="as-run">
<span class="as-runbtn">⏻ Service Running</span>
<span class="as-stopbtn">■ Stop</span>
</div>
<div class="as-card as-toggles">
<span class="as-tg"><span class="as-sw on"></span>Service Installed</span>
<span class="as-tg"><span class="as-sw on"></span>Start with Windows</span>
<span class="as-tg"><span class="as-sw"></span>Privacy Mode</span>
<span class="as-tg"><span class="as-sw"></span>Lock on disconnect</span>
<span class="as-tg"><span class="as-sw on"></span>Close to tray</span>
</div>
</div>
</div>
</div>
</div></section>
<!-- STATS / trust band -->
<section class="statband"><div class="wrap">
<div class="stat reveal"><b>AES-256</b><span>End-to-end on every path</span></div>
<div class="stat reveal"><b>&lt;4&nbsp;ms</b><span>Direct P2P on the LAN</span></div>
<div class="stat reveal"><b>1080p60</b><span>Hardware-encoded, adaptive</span></div>
<div class="stat reveal"><b>$0</b><span>Self-host &middot; no per-seat fees</span></div>
</div></section>
<!-- LOGOS / trust -->
<section class="section" style="padding:44px 0"><div class="wrap">
<p style="text-align:center;color:var(--faint);font-size:13px;text-transform:uppercase;letter-spacing:1.4px;margin-bottom:22px">The private alternative to</p>
<div class="logos"><span>TeamViewer</span><span>AnyDesk</span><span>RustDesk</span><span>Chrome Remote Desktop</span><span>Splashtop</span></div>
</div></section>
<!-- FEATURES -->
<section class="section alt"><div class="wrap">
<div class="sec-head reveal"><div class="eyebrow">Everything you need</div>
<h2>A complete remote desktop, self-hosted</h2>
<p>All the power of TeamViewer Pro and RustDesk — running on infrastructure you own.</p></div>
<div class="grid3">
<div class="feat reveal"><div class="ic"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="11" width="18" height="11" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></svg></div><h3>End-to-end encrypted</h3><p>AES-256-GCM with ephemeral ECDH keys. Even your own server can't see the screen — only the two endpoints hold the keys.</p></div>
<div class="feat reveal"><div class="ic"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/></svg></div><h3>Blazing fast</h3><p>Hardware H.264 up to 1080p60, WebCodecs decode in the browser, adaptive quality. Buttery-smooth even over the internet.</p></div>
<div class="feat reveal"><div class="ic"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg></div><h3>Unattended access</h3><p>Install as a boot-time service. Reach the logon screen and UAC prompts, across reboots — no one has to be at the PC.</p></div>
<div class="feat reveal"><div class="ic"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg></div><h3>File transfer &amp; sync</h3><p>Browse, drag-and-drop, upload whole folders, two-way clipboard sync, and remote printing — all end-to-end encrypted.</p></div>
<div class="feat reveal"><div class="ic"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><path d="M8 21h8M12 17v4"/></svg></div><h3>Multi-monitor &amp; cursor</h3><p>Switch displays live, see the real remote cursor, record the session, chat, and manage processes and power remotely.</p></div>
<div class="feat reveal"><div class="ic"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2v20M2 12h20"/></svg></div><h3>Zero-install web client</h3><p>Connect from any browser on any laptop or phone — nothing to install on the viewer side. Install the PWA for one-tap access.</p></div>
</div>
</div></section>
<!-- STATS -->
<section class="section"><div class="wrap">
<div class="stats">
<div class="stat reveal"><div class="n">&lt;10ms</div><div class="l">control latency on LAN</div></div>
<div class="stat reveal"><div class="n">60fps</div><div class="l">1080p H.264 streaming</div></div>
<div class="stat reveal"><div class="n">AES-256</div><div class="l">end-to-end encryption</div></div>
<div class="stat reveal"><div class="n">$0</div><div class="l">to self-host, forever</div></div>
</div>
</div></section>
<!-- COMPARE -->
<section class="section alt"><div class="wrap">
<div class="sec-head reveal"><div class="eyebrow">Why NetDesk</div><h2>Own it, don't rent it</h2>
<p>TeamViewer and AnyDesk route your sessions through their cloud and charge per seat. NetDesk runs on your server.</p></div>
<div style="max-width:760px;margin:0 auto;overflow-x:auto" class="reveal">
<table class="compare">
<tr><th>Capability</th><th>NetDesk</th><th>TeamViewer</th><th>RustDesk (SaaS)</th></tr>
<tr><td>Self-hosted, your server</td><td class="y">✓ Included</td><td class="n">✗</td><td class="y">Paid tier</td></tr>
<tr><td>End-to-end encryption</td><td class="y">✓ Default</td><td class="y">✓</td><td class="y">✓</td></tr>
<tr><td>Free for individuals</td><td class="y">✓</td><td class="n">Trial only</td><td class="y">✓</td></tr>
<tr><td>No per-seat licensing</td><td class="y">✓</td><td class="n">✗</td><td class="y">Self-host</td></tr>
<tr><td>Web client (no install)</td><td class="y">✓</td><td class="y">✓</td><td class="n">Limited</td></tr>
<tr><td>Open source</td><td class="y">✓</td><td class="n">✗</td><td class="y">✓</td></tr>
</table>
</div>
<div style="text-align:center;margin-top:30px" class="reveal"><a class="btn btn-primary btn-lg" href="/pricing">See pricing →</a></div>
</div></section>
<!-- OPEN SOURCE -->
<section class="section"><div class="wrap">
<div class="sec-head reveal"><div class="eyebrow">Open source</div>
<h2>Read every line. Then run it yourself.</h2>
<p>The whole system — relay server, Windows host, zero-install web viewer, and the native Rust client — is published right here on netdesk.space. Browse it, download it, or clone it. No GitHub account, no third-party, no lock-in.</p></div>
<div class="reveal" style="display:flex;gap:14px;flex-wrap:wrap;justify-content:center;margin:4px 0 22px">
<a class="btn btn-primary btn-lg" href="/git/akronlogic/netdesk">&lt;/&gt; Browse the code</a>
<a class="btn btn-ghost btn-lg" href="/downloads/netdesk-src-latest.tar.gz" download>⬇ Download .tar.gz</a>
<a class="btn btn-ghost btn-lg" href="/downloads/netdesk-src-latest.zip" download>⬇ Download .zip</a>
</div>
<div class="reveal" style="max-width:660px;margin:0 auto">
<div style="background:#0a0e16;border:1px solid rgba(255,255,255,.1);border-radius:12px;padding:13px 16px;font-family:ui-monospace,Consolas,monospace;font-size:14px;color:#c7d2e6;display:flex;align-items:center;justify-content:space-between;gap:12px">
<code style="overflow-x:auto;white-space:nowrap;background:none;padding:0">git clone https://netdesk.space/git/akronlogic/netdesk.git</code>
<button type="button" onclick="(function(b){try{navigator.clipboard.writeText('git clone https://netdesk.space/git/akronlogic/netdesk.git')}catch(e){};var o=b.textContent;b.textContent='Copied';setTimeout(function(){b.textContent=o},1200)})(this)" style="background:transparent;border:1px solid rgba(255,255,255,.2);color:#9aa6bd;border-radius:7px;padding:5px 12px;font-size:12px;cursor:pointer;white-space:nowrap">Copy</button>
</div>
<p style="text-align:center;color:var(--muted,#8b95a9);font-size:13.5px;margin-top:14px">Source-available — free to self-host &amp; modify. Browse it like GitHub, straight from our own server.</p>
</div>
</div></section>
<!-- CTA -->
<section class="ctaband"><div class="wrap reveal">
<h2>Take control of your remote access today.</h2>
<p>Free for individuals. Self-host in minutes. No credit card, no cloud lock-in.</p>
<div class="hero-cta" style="justify-content:center">
<a class="btn btn-primary btn-lg" href="/download">Download NetDesk</a>
<a class="btn btn-ghost btn-lg" href="/pricing">Compare plans</a>
</div>
</div></section>
<div id="siteFooter"></div>
<script src="site.js?v=3"></script>
<script>
// scroll reveal
(function(){var o=new IntersectionObserver(function(es){es.forEach(function(e){if(e.isIntersecting){e.target.classList.add("in");o.unobserve(e.target);}})},{threshold:.12});
document.querySelectorAll(".reveal").forEach(function(el){o.observe(el);});
// app replica is flat/straight by design - no tilt
})();
</script>
</body>
</html>