Spaces:
Running
Running
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>OSINT Hound - Open Directory Scanner</title> | |
| <script src="https://cdn.tailwindcss.com"></script> | |
| <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=JetBrains+Mono:wght@400;700&family=Space+Grotesk:wght@300;400;500;600;700&display=swap" rel="stylesheet"> | |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> | |
| <script> | |
| tailwind.config = { | |
| theme: { | |
| extend: { | |
| fontFamily: { | |
| mono: ['"JetBrains Mono"', 'monospace'], | |
| sans: ['"Space Grotesk"', 'system-ui', 'sans-serif'], | |
| }, | |
| colors: { | |
| void: { | |
| 950: '#07070e', | |
| 900: '#0c0c18', | |
| 800: '#131324', | |
| 700: '#1c1c35', | |
| 600: '#2a2a4a', | |
| 500: '#3d3d6a', | |
| 400: '#5a5a8f', | |
| 300: '#8282b5', | |
| 200: '#b0b0d8', | |
| 100: '#e0e0f0', | |
| }, | |
| obsidian: { | |
| 500: '#1a1a2e', | |
| 400: '#16213e', | |
| }, | |
| crimson: { | |
| DEFAULT: '#ff2a6d', | |
| dim: '#cc1a4d', | |
| glow: '#ff5c8d', | |
| }, | |
| chartreuse: { | |
| DEFAULT: '#b4e600', | |
| dim: '#8db300', | |
| glow: '#d4ff33', | |
| }, | |
| azure: { | |
| DEFAULT: '#05d9e8', | |
| dim: '#03a3af', | |
| glow: '#4df0fc', | |
| } | |
| }, | |
| backgroundImage: { | |
| 'grid-pattern': "linear-gradient(to right, rgba(255,255,255,0.03) 1px, transparent 1px), linear-gradient(to bottom, rgba(255,255,255,0.03) 1px, transparent 1px)", | |
| }, | |
| boxShadow: { | |
| 'neon-red': '0 0 15px rgba(255, 42, 109, 0.3), 0 0 30px rgba(255, 42, 109, 0.1)', | |
| 'neon-cyan': '0 0 15px rgba(5, 217, 232, 0.3), 0 0 30px rgba(5, 217, 232, 0.1)', | |
| 'neon-green': '0 0 15px rgba(180, 230, 0, 0.3), 0 0 30px rgba(180, 230, 0, 0.1)', | |
| } | |
| } | |
| } | |
| } | |
| </script> | |
| <style> | |
| :root { | |
| --bg-primary: #07070e; | |
| --bg-secondary: #0c0c18; | |
| --accent: #05d9e8; | |
| --accent-dim: #03a3af; | |
| --danger: #ff2a6d; | |
| --success: #b4e600; | |
| } | |
| body { | |
| background-color: var(--bg-primary); | |
| font-family: 'Space Grotesk', sans-serif; | |
| color: #e0e0f0; | |
| overflow-x: hidden; | |
| } | |
| /* Custom Scrollbar */ | |
| ::-webkit-scrollbar { | |
| width: 6px; | |
| height: 6px; | |
| } | |
| ::-webkit-scrollbar-track { | |
| background: var(--bg-secondary); | |
| } | |
| ::-webkit-scrollbar-thumb { | |
| background: var(--void-600); | |
| border-radius: 3px; | |
| } | |
| ::-webkit-scrollbar-thumb:hover { | |
| background: var(--void-500); | |
| } | |
| /* Animations */ | |
| @keyframes scan-line { | |
| 0% { top: 0; opacity: 0; } | |
| 10% { opacity: 1; } | |
| 90% { opacity: 1; } | |
| 100% { top: 100%; opacity: 0; } | |
| } | |
| @keyframes pulse-glow { | |
| 0%, 100% { box-shadow: 0 0 10px rgba(5, 217, 232, 0.1); } | |
| 50% { box-shadow: 0 0 25px rgba(5, 217, 232, 0.25); } | |
| } | |
| @keyframes data-flow { | |
| 0% { background-position: 0% 0%; } | |
| 100% { background-position: 0% 100%; } | |
| } | |
| @keyframes blink-caret { | |
| 0%, 100% { border-color: transparent; } | |
| 50% { border-color: var(--accent); } | |
| } | |
| @keyframes slide-in-up { | |
| from { transform: translateY(20px); opacity: 0; } | |
| to { transform: translateY(0); opacity: 1; } | |
| } | |
| @keyframes border-rotate { | |
| 0% { --angle: 0deg; } | |
| 100% { --angle: 360deg; } | |
| } | |
| @property --angle { | |
| syntax: '<angle>'; | |
| initial-value: 0deg; | |
| inherits: false; | |
| } | |
| /* UI Components */ | |
| .glass-panel { | |
| background: rgba(12, 12, 24, 0.6); | |
| backdrop-filter: blur(20px); | |
| -webkit-backdrop-filter: blur(20px); | |
| border: 1px solid rgba(255, 255, 255, 0.06); | |
| } | |
| .scan-line-overlay { | |
| position: fixed; | |
| left: 0; | |
| right: 0; | |
| height: 2px; | |
| background: linear-gradient(90deg, transparent, var(--accent), transparent); | |
| box-shadow: 0 0 15px var(--accent); | |
| z-index: 50; | |
| pointer-events: none; | |
| display: none; | |
| } | |
| .scan-line-overlay.active { | |
| display: block; | |
| animation: scan-line 3s linear infinite; | |
| } | |
| .terminal-text { | |
| font-family: 'JetBrains Mono', monospace; | |
| } | |
| .typing-cursor::after { | |
| content: '|'; | |
| animation: blink-caret 1s step-end infinite; | |
| color: var(--accent); | |
| } | |
| .keyword-highlight { | |
| display: inline-block; | |
| padding: 1px 6px; | |
| border-radius: 4px; | |
| font-weight: 700; | |
| font-size: 0.85em; | |
| letter-spacing: 0.02em; | |
| border: 1px solid transparent; | |
| } | |
| .kw-critical { | |
| background: rgba(255, 42, 109, 0.12); | |
| color: #ff5c8d; | |
| border-color: rgba(255, 42, 109, 0.3); | |
| text-shadow: 0 0 8px rgba(255, 42, 109, 0.4); | |
| } | |
| .kw-alert { | |
| background: rgba(244, 196, 48, 0.12); | |
| color: #ffd700; | |
| border-color: rgba(244, 196, 48, 0.3); | |
| } | |
| .kw-info { | |
| background: rgba(5, 217, 232, 0.12); | |
| color: #4df0fc; | |
| border-color: rgba(5, 217, 232, 0.3); | |
| } | |
| .hit-card { | |
| animation: slide-in-up 0.4s cubic-bezier(0.16, 1, 0.3, 1) forwards; | |
| } | |
| .hit-card:hover { | |
| transform: translateY(-2px); | |
| box-shadow: 0 8px 30px rgba(5, 217, 232, 0.08); | |
| border-color: rgba(5, 217, 232, 0.25); | |
| } | |
| .btn-primary { | |
| background: linear-gradient(135deg, #05d9e8, #03a3af); | |
| color: #07070e; | |
| font-weight: 700; | |
| transition: all 0.3s ease; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .btn-primary:hover { | |
| transform: translateY(-1px); | |
| box-shadow: 0 0 25px rgba(5, 217, 232, 0.4); | |
| } | |
| .btn-primary::after { | |
| content: ''; | |
| position: absolute; | |
| top: -50%; | |
| left: -50%; | |
| width: 200%; | |
| height: 200%; | |
| background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent); | |
| transform: rotate(45deg) translateY(-100%); | |
| transition: transform 0.6s; | |
| } | |
| .btn-primary:hover::after { | |
| transform: rotate(45deg) translateY(100%); | |
| } | |
| .btn-danger { | |
| background: linear-gradient(135deg, #ff2a6d, #cc1a4d); | |
| color: white; | |
| font-weight: 700; | |
| } | |
| .btn-danger:hover { | |
| box-shadow: 0 0 25px rgba(255, 42, 109, 0.4); | |
| transform: translateY(-1px); | |
| } | |
| .input-field { | |
| background: rgba(7, 7, 14, 0.6); | |
| border: 1px solid rgba(255, 255, 255, 0.08); | |
| color: #e0e0f0; | |
| transition: all 0.3s ease; | |
| } | |
| .input-field:focus { | |
| border-color: var(--accent); | |
| box-shadow: 0 0 0 3px rgba(5, 217, 232, 0.1); | |
| outline: none; | |
| } | |
| /* Ticker */ | |
| .ticker-wrap { | |
| overflow: hidden; | |
| white-space: nowrap; | |
| } | |
| .ticker-content { | |
| display: inline-block; | |
| animation: ticker 30s linear infinite; | |
| } | |
| @keyframes ticker { | |
| 0% { transform: translateX(0); } | |
| 100% { transform: translateX(-50%); } | |
| } | |
| /* Status Indicators */ | |
| .status-dot { | |
| width: 8px; | |
| height: 8px; | |
| border-radius: 50%; | |
| display: inline-block; | |
| } | |
| .status-idle { background: #5a5a8f; box-shadow: 0 0 8px #5a5a8f; } | |
| .status-running { background: var(--success); box-shadow: 0 0 10px var(--success); animation: pulse-dot 1.5s infinite; } | |
| .status-stopping { background: var(--danger); box-shadow: 0 0 10px var(--danger); } | |
| .status-done { background: var(--azure); box-shadow: 0 0 10px var(--azure); } | |
| @keyframes pulse-dot { | |
| 0%, 100% { opacity: 1; transform: scale(1); } | |
| 50% { opacity: 0.5; transform: scale(1.2); } | |
| } | |
| /* File size badge */ | |
| .file-badge { | |
| font-size: 0.7rem; | |
| padding: 2px 6px; | |
| border-radius: 4px; | |
| font-family: 'JetBrains Mono', monospace; | |
| } | |
| /* Grid background */ | |
| .bg-grid { | |
| background-size: 40px 40px; | |
| background-image: | |
| linear-gradient(to right, rgba(255,255,255,0.02) 1px, transparent 1px), | |
| linear-gradient(to bottom, rgba(255,255,255,0.02) 1px, transparent 1px); | |
| } | |
| /* Preview modal */ | |
| .preview-modal { | |
| position: fixed; | |
| inset: 0; | |
| z-index: 100; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| background: rgba(7, 7, 14, 0.85); | |
| backdrop-filter: blur(8px); | |
| opacity: 0; | |
| pointer-events: none; | |
| transition: opacity 0.3s ease; | |
| } | |
| .preview-modal.active { | |
| opacity: 1; | |
| pointer-events: auto; | |
| } | |
| .preview-modal-content { | |
| transform: scale(0.95); | |
| transition: transform 0.3s ease; | |
| } | |
| .preview-modal.active .preview-modal-content { | |
| transform: scale(1); | |
| } | |
| /* Animated border on active scan */ | |
| .scanning-border { | |
| position: relative; | |
| } | |
| .scanning-border::before { | |
| content: ''; | |
| position: absolute; | |
| inset: -1px; | |
| border-radius: inherit; | |
| padding: 1px; | |
| background: conic-gradient(from var(--angle), transparent 30%, var(--accent) 50%, transparent 70%); | |
| -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); | |
| -webkit-mask-composite: xor; | |
| mask-composite: exclude; | |
| animation: border-rotate 3s linear infinite; | |
| opacity: 0; | |
| transition: opacity 0.3s; | |
| pointer-events: none; | |
| z-index: 10; | |
| } | |
| .scanning-border.active::before { | |
| opacity: 1; | |
| } | |
| .progress-track { | |
| background: rgba(255,255,255,0.05); | |
| border-radius: 4px; | |
| overflow: hidden; | |
| } | |
| .progress-fill { | |
| height: 100%; | |
| background: linear-gradient(90deg, var(--accent-dim), var(--accent)); | |
| border-radius: 4px; | |
| transition: width 0.3s ease; | |
| position: relative; | |
| } | |
| .progress-fill::after { | |
| content: ''; | |
| position: absolute; | |
| right: 0; | |
| top: 0; | |
| bottom: 0; | |
| width: 20px; | |
| background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3)); | |
| } | |
| </style> | |
| </head> | |
| <body class="min-h-screen bg-grid text-void-200 selection:bg-azure selection:text-void-950"> | |
| <div id="scanLine" class="scan-line-overlay"></div> | |
| <!-- Header --> | |
| <header class="sticky top-0 z-40 glass-panel border-b border-white/[0.06]"> | |
| <div class="max-w-[1600px] mx-auto px-4 py-3 flex items-center justify-between"> | |
| <div class="flex items-center gap-4"> | |
| <div class="relative"> | |
| <div class="w-10 h-10 rounded-lg bg-void-800 border border-azure/20 flex items-center justify-center"> | |
| <i class="fa-solid fa-shield-halved text-azure text-lg"></i> | |
| </div> | |
| <div class="absolute -top-1 -right-1 w-3 h-3 bg-azure rounded-full animate-ping opacity-40"></div> | |
| </div> | |
| <div> | |
| <h1 class="text-xl font-bold tracking-tight text-white">OSINT <span class="text-azure">Hound</span></h1> | |
| <p class="text-[11px] text-void-400 font-mono tracking-widest uppercase">Open Directory Reconnaissance Engine</p> | |
| </div> | |
| </div> | |
| <div class="hidden md:flex items-center gap-6"> | |
| <div class="flex items-center gap-2 text-sm"> | |
| <span class="status-dot status-idle" id="statusDot"></span> | |
| <span class="text-void-400 font-mono text-xs uppercase tracking-wider" id="statusText">IDLE</span> | |
| </div> | |
| <div class="h-6 w-px bg-white/10"></div> | |
| <a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank" class="text-[11px] text-void-400 hover:text-azure transition-colors font-mono"> | |
| Built with <span class="text-azure font-semibold">anycoder</span> <i class="fa-solid fa-arrow-up-right-from-square ml-1 text-[9px]"></i> | |
| </a> | |
| </div> | |
| </div> | |
| </header> | |
| <!-- Main Layout --> | |
| <main class="max-w-[1600px] mx-auto px-4 py-6 grid grid-cols-1 xl:grid-cols-[380px_1fr] gap-6"> | |
| <!-- Left Panel: Controls --> | |
| <aside class="space-y-5"> | |
| <!-- Configuration Card --> | |
| <div class="glass-panel rounded-xl p-5 scanning-border" id="configCard"> | |
| <div class="flex items-center gap-2 mb-4"> | |
| <i class="fa-solid fa-sliders text-azure text-sm"></i> | |
| <h2 class="text-sm font-bold uppercase tracking-wider text-white">Configuration</h2> | |
| </div> | |
| <div class="space-y-4"> | |
| <div> | |
| <label class="block text-xs font-mono text-void-400 mb-1.5">TARGET URL</label> | |
| <input type="text" id="targetUrl" value="http://192.168.1.100:8080" | |
| class="input-field w-full rounded-lg px-3 py-2.5 text-sm font-mono placeholder-void-600" | |
| placeholder="http://target.com"> | |
| </div> | |
| <div class="grid grid-cols-2 gap-3"> | |
| <div> | |
| <label class="block text-xs font-mono text-void-400 mb-1.5">THREADS</label> | |
| <input type="number" id="threads" value="12" min="1" max="64" | |
| class="input-field w-full rounded-lg px-3 py-2.5 text-sm font-mono"> | |
| </div> | |
| <div> | |
| <label class="block text-xs font-mono text-void-400 mb-1.5">TIMEOUT (ms)</label> | |
| <input type="number" id="timeout" value="5000" min="1000" step="500" | |
| class="input-field w-full rounded-lg px-3 py-2.5 text-sm font-mono"> | |
| </div> | |
| </div> | |
| <div> | |
| <label class="block text-xs font-mono text-void-400 mb-1.5">KEYWORDS</label> | |
| <textarea id="keywords" rows="4" readonly | |
| class="input-field w-full rounded-lg px-3 py-2.5 text-xs font-mono leading-relaxed text-void-300 resize-none">bitcoin, recovery, wallet, private, key, secret, username, password</textarea> | |
| </div> | |
| <div> | |
| <label class="block text-xs font-mono text-void-400 mb-1.5">DETECTION MODE</label> | |
| <div class="flex gap-2"> | |
| <label class="flex-1 cursor-pointer"> | |
| <input type="radio" name="mode" value="12" class="peer sr-only" checked> | |
| <div class="text-center py-2 rounded-lg border border-white/[0.06] text-xs font-mono text-void-400 peer-checked:bg-azure/10 peer-checked:border-azure/30 peer-checked:text-azure transition-all"> | |
| 12-WORD | |
| </div> | |
| </label> | |
| <label class="flex-1 cursor-pointer"> | |
| <input type="radio" name="mode" value="24" class="peer sr-only"> | |
| <div class="text-center py-2 rounded-lg border border-white/[0.06] text-xs font-mono text-void-400 peer-checked:bg-azure/10 peer-checked:border-azure/30 peer-checked:text-azure transition-all"> | |
| 24-WORD | |
| </div> | |
| </label> | |
| <label class="flex-1 cursor-pointer"> | |
| <input type="radio" name="mode" value="both" class="peer sr-only"> | |
| <div class="text-center py-2 rounded-lg border border-white/[0.06] text-xs font-mono text-void-400 peer-checked:bg-azure/10 peer-checked:border-azure/30 peer-checked:text-azure transition-all"> | |
| BOTH | |
| </div> | |
| </label> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Action Panel --> | |
| <div class="glass-panel rounded-xl p-5"> | |
| <div class="grid grid-cols-2 gap-3 mb-4"> | |
| <button id="btnStart" class="btn-primary rounded-lg py-3 px-4 text-sm flex items-center justify-center gap-2"> | |
| <i class="fa-solid fa-play text-xs"></i> | |
| <span>START SCAN</span> | |
| </button> | |
| <button id="btnStop" class="btn-danger rounded-lg py-3 px-4 text-sm flex items-center justify-center gap-2 opacity-50 cursor-not-allowed" disabled> | |
| <i class="fa-solid fa-stop text-xs"></i> | |
| <span>ABORT</span> | |
| </button> | |
| </div> | |
| <button id="btnClear" class="w-full py-2.5 rounded-lg border border-white/[0.06] text-xs font-mono text-void-400 hover:text-white hover:border-white/20 hover:bg-white/5 transition-all flex items-center justify-center gap-2"> | |
| <i class="fa-solid fa-trash-can"></i> | |
| CLEAR RESULTS | |
| </button> | |
| </div> | |
| <!-- Terminal / Log --> | |
| <div class="glass-panel rounded-xl overflow-hidden flex flex-col" style="height: 380px;"> | |
| <div class="px-4 py-2.5 border-b border-white/[0.06] flex items-center justify-between bg-void-950/50"> | |
| <div class="flex items-center gap-2"> | |
| <i class="fa-solid fa-terminal text-void-500 text-xs"></i> | |
| <span class="text-[11px] font-mono font-bold text-void-400 uppercase">System Log</span> | |
| </div> | |
| <div class="flex items-center gap-1.5"> | |
| <span class="w-2.5 h-2.5 rounded-full bg-crimson/20 border border-crimson/40"></span> | |
| <span class="w-2.5 h-2.5 rounded-full bg-chartreuse/20 border border-chartreuse/40"></span> | |
| <span class="w-2.5 h-2.5 rounded-full bg-azure/20 border border-azure/40"></span> | |
| </div> | |
| </div> | |
| <div id="logContainer" class="flex-1 overflow-y-auto p-4 font-mono text-xs space-y-1.5 bg-void-950/30"> | |
| <div class="text-void-500 italic">Ready to initialize scan sequence...</div> | |
| </div> | |
| </div> | |
| </aside> | |
| <!-- Right Panel: Results --> | |
| <div class="space-y-5"> | |
| <!-- Stats Bar --> | |
| <div class="grid grid-cols-2 md:grid-cols-4 gap-3"> | |
| <div class="glass-panel rounded-xl p-4 relative overflow-hidden"> | |
| <div class="absolute top-0 right-0 p-2 opacity-10"> | |
| <i class="fa-solid fa-globe text-4xl text-azure"></i> | |
| </div> | |
| <div class="text-[11px] font-mono text-void-400 uppercase tracking-wider mb-1">URLs Scanned</div> | |
| <div class="text-2xl font-bold text-white tabular-nums" id="statScanned">0</div> | |
| <div class="progress-track h-1 mt-3"> | |
| <div class="progress-fill" id="progressBar" style="width: 0%"></div> | |
| </div> | |
| </div> | |
| <div class="glass-panel rounded-xl p-4 relative overflow-hidden"> | |
| <div class="absolute top-0 right-0 p-2 opacity-10"> | |
| <i class="fa-solid fa-bullseye text-4xl text-chartreuse"></i> | |
| </div> | |
| <div class="text-[11px] font-mono text-void-400 uppercase tracking-wider mb-1">Hits Found</div> | |
| <div class="text-2xl font-bold text-chartreuse tabular-nums" id="statHits">0</div> | |
| <div class="flex items-center gap-1 mt-2"> | |
| <div class="h-1.5 w-1.5 rounded-full bg-chartreuse animate-pulse"></div> | |
| <span class="text-[10px] font-mono text-void-500" id="statHitRate">0.0% success rate</span> | |
| </div> | |
| </div> | |
| <div class="glass-panel rounded-xl p-4 relative overflow-hidden"> | |
| <div class="absolute top-0 right-0 p-2 opacity-10"> | |
| <i class="fa-solid fa-file-lines text-4xl text-void-300"></i> | |
| </div> | |
| <div class="text-[11px] font-mono text-void-400 uppercase tracking-wider mb-1">Files Indexed</div> | |
| <div class="text-2xl font-bold text-white tabular-nums" id="statFiles">0</div> | |
| <div class="text-[10px] font-mono text-void-500 mt-2" id="statSize">0 B total</div> | |
| </div> | |
| <div class="glass-panel rounded-xl p-4 relative overflow-hidden"> | |
| <div class="absolute top-0 right-0 p-2 opacity-10"> | |
| <i class="fa-solid fa-bug text-4xl text-crimson"></i> | |
| </div> | |
| <div class="text-[11px] font-mono text-void-400 uppercase tracking-wider mb-1">Keywords Hit</div> | |
| <div class="text-2xl font-bold text-crimson tabular-nums" id="statKeywords">0</div> | |
| <div class="text-[10px] font-mono text-void-500 mt-2">12/24-word phrases</div> | |
| </div> | |
| </div> | |
| <!-- Active Ticker --> | |
| <div class="glass-panel rounded-lg overflow-hidden border-l-2 border-azure"> | |
| <div class="ticker-wrap py-2 bg-void-900/40"> | |
| <div class="ticker-content font-mono text-[11px] text-void-400" id="tickerText"> | |
| <span class="mx-6 text-azure"><i class="fa-solid fa-circle text-[6px] mr-2"></i>SCANNER INITIALIZED</span> | |
| <span class="mx-6 text-void-500">WAITING FOR TARGET</span> | |
| <span class="mx-6 text-void-500">MODULES: DIRECTORY_INDEXER, KEYWORD_EXTRACTOR, MNEMONIC_FINDER</span> | |
| <span class="mx-6 text-void-500">DICTIONARY: BIP39 ENGLISH (2048 WORDS)</span> | |
| <span class="mx-6 text-azure"><i class="fa-solid fa-circle text-[6px] mr-2"></i>SCANNER INITIALIZED</span> | |
| <span class="mx-6 text-void-500">WAITING FOR TARGET</span> | |
| <span class="mx-6 text-void-500">MODULES: DIRECTORY_INDEXER, KEYWORD_EXTRACTOR, MNEMONIC_FINDER</span> | |
| <span class="mx-6 text-void-500">DICTIONARY: BIP39 ENGLISH (2048 WORDS)</span> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Results Grid --> | |
| <div class="space-y-4" id="resultsArea"> | |
| <!-- Empty State --> | |
| <div id="emptyState" class="glass-panel rounded-xl p-16 text-center border-dashed border-2 border-white/[0.04]"> | |
| <div class="w-20 h-20 mx-auto mb-6 rounded-full bg-void-800 border border-white/[0.06] flex items-center justify-center"> | |
| <i class="fa-solid fa-magnifying-glass text-3xl text-void-600"></i> | |
| </div> | |
| <h3 class="text-lg font-bold text-void-300 mb-2">No Data</h3> | |
| <p class="text-sm text-void-500 max-w-sm mx-auto">Configure a target URL and initiate the scan sequence to begin directory reconnaissance and keyword extraction.</p> | |
| </div> | |
| </div> | |
| </div> | |
| </main> | |
| <!-- Preview Modal --> | |
| <div id="previewModal" class="preview-modal" onclick="if(event.target === this) closePreview()"> | |
| <div class="preview-modal-content w-full max-w-3xl mx-4"> | |
| <div class="glass-panel rounded-xl overflow-hidden shadow-2xl border border-azure/20"> | |
| <div class="px-5 py-3 border-b border-white/[0.06] flex items-center justify-between bg-void-900/80"> | |
| <div class="flex items-center gap-3"> | |
| <i class="fa-solid fa-file-code text-azure"></i> | |
| <span class="font-mono text-sm text-white" id="previewFilename">document.txt</span> | |
| </div> | |
| <button onclick="closePreview()" class="w-8 h-8 rounded-lg hover:bg-white/10 flex items-center justify-center transition-colors text-void-400 hover:text-white"> | |
| <i class="fa-solid fa-xmark"></i> | |
| </button> | |
| </div> | |
| <div class="p-5 bg-void-950/60 overflow-y-auto max-h-[60vh]"> | |
| <pre class="font-mono text-sm text-void-300 leading-relaxed whitespace-pre-wrap" id="previewContent"></pre> | |
| </div> | |
| <div class="px-5 py-3 border-t border-white/[0.06] bg-void-900/50 flex items-center justify-between"> | |
| <span class="text-[11px] font-mono text-void-500" id="previewMeta">128 KB | text/plain</span> | |
| <button class="text-xs font-mono text-azure hover:text-azure-glow transition-colors flex items-center gap-2"> | |
| <i class="fa-solid fa-download"></i> | |
| DOWNLOAD | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Footer --> | |
| <footer class="mt-12 border-t border-white/[0.04] py-6"> | |
| <div class="max-w-[1600px] mx-auto px-4 flex flex-col md:flex-row items-center justify-between gap-4"> | |
| <div class="flex items-center gap-4 text-[11px] text-void-500 font-mono"> | |
| <span>OSINT HOUND v2.4.1</span> | |
| <span class="text-void-700">|</span> | |
| <span>Python 3.11 Engine</span> | |
| <span class="text-void-700">|</span> | |
| <span class="text-chartreuse">SECURE CONNECTION</span> | |
| </div> | |
| <div class="text-[11px] text-void-600 font-mono"> | |
| Built with <a href="https://huggingface.co/spaces/akhaliq/anycoder" class="text-azure hover:underline">anycoder</a> | |
| </div> | |
| </div> | |
| </footer> | |
| <script> | |
| // ====== DATA & UTILITIES ====== | |
| const BIP39 = [ | |
| "abandon","ability","able","about","above","absent","absorb","abstract","absurd","abuse","access","accident", | |
| "account","accuse","achieve","acid","acoustic","acquire","across","act","action","actor","actress","actual", | |
| "adapt","add","addict","address","adjust","admit","adult","advance","advice","aerobic","affair","afford", | |
| "afraid","again","age","agent","agree","ahead","aim","air","airport","aisle","alarm","album","alcohol", | |
| "alert","alien","all","alley","allow","almost","alone","alpha","already","also","alter","always","amateur", | |
| "amazing","among","amount","amused","analyst","anchor","ancient","anger","angle","angry","animal","ankle", | |
| "announce","annual","another","answer","antenna","antique","anxiety","any","apart","apology","appear","apple", | |
| "approve","april","arch","arctic","area","arena","argue","arm","armed","armor","army","around","arrange", | |
| "arrest","arrive","arrow","art","artefact","artist","artwork","ask","aspect","assault","asset","assist", | |
| "assume","asthma","athlete","atom","attack","attend","attitude","attract","auction","audit","august","aunt", | |
| "author","auto","autumn","average","avocado","avoid","awake","aware","away","awesome","awful","awkward", | |
| "axis","baby","bachelor","bacon","badge","bag","balance","balcony","ball","bamboo","banana","banner","bar", | |
| "barely","bargain","barrel","base","basic","basket","battle","beach","bean","beauty","because","become", | |
| "beef","before","begin","behave","behind","believe","below","belt","bench","benefit","best","betray", | |
| "better","between","beyond","bicycle","bid","bike","bind","biology","bird","birth","bitter","black", | |
| "blade","blame","blanket","blast","bleak","bless","blind","blood","blossom","blouse","blue","blur","blush", | |
| "board","boat","body","boil","bomb","bone","bonus","book","boost","border","boring","borrow","boss", | |
| "bottom","bounce","box","boy","bracket","brain","brand","brass","brave","bread","breeze","brick","bridge", | |
| "brief","bright","bring","brisk","broccoli","broken","bronze","broom","brother","brown","brush","bubble", | |
| "buddy","budget","buffalo","build","bulb","bulk","bullet","bundle","bunker","burden","burger","burst", | |
| "bus","business","busy","butter","buyer","buzz","cabbage","cabin","cable","cactus","cage","cake","call", | |
| "calm","camera","camp","can","canal","cancel","candy","cannon","canoe","canvas","canyon","capable", | |
| "capital","captain","car","carbon","card","cargo","carpet","carry","cart","case","cash","casino", | |
| "castle","casual","cat","catalog","catch","category","cattle","caught","cause","caution","cave","ceiling", | |
| "celery","cement","census","century","cereal","certain","chair","chalk","champion","change","chaos", | |
| "chapter","charge","chase","chat","cheap","check","cheese","chef","cherry","chest","chicken","chief", | |
| "child","chimney","choice","choose","chronic","chuckle","chunk","churn","cigar","cinnamon","circle", | |
| "citizen","city","civil","claim","clap","clarify","claw","clay","clean","clerk","clever","click","client", | |
| "cliff","climb","clinic","clip","clock","clog","close","cloth","cloud","clown","club","clump","cluster", | |
| "clutch","coach","coast","coconut","code","coffee","coil","coin","collect","color","column","combine", | |
| "come","comfort","comic","common","company","concert","conduct","confirm","congress","connect","consider", | |
| "control","convince","cook","cool","copper","copy","coral","core","corn","correct","cost","cotton", | |
| "couch","could","council","count","country","couple","course","cousin","cover","coyote","crack","cradle", | |
| "craft","cram","crane","crash","crater","crawl","crazy","cream","credit","creek","crew","cricket","crime", | |
| "crisp","critic","crop","cross","crouch","crowd","crucial","cruel","cruise","crumble","crunch","crush", | |
| "cry","crystal","cube","culture","cup","cupboard","curious","current","curtain","curve","cushion","custom", | |
| "cute","cycle","dad","damage","damp","dance","danger","daring","dash","daughter","dawn","day","deal", | |
| "debate","debris","decade","december","decide","decline","decorate","decrease","deer","defense","define", | |
| "defy","degree","delay","deliver","demand","demise","denial","dentist","deny","depart","depend","deposit", | |
| "depth","deputy","derive","describe","desert","design","desk","despair","destroy","detail","detect", | |
| "develop","device","devote","diagram","dial","diamond","diary","dice","diesel","diet","differ","digital", | |
| "dignity","dilemma","dinner","dinosaur","direct","dirt","disagree","discover","disease","dish","dismiss", | |
| "disorder","display","distance","divert","divide","divorce","dizzy","doctor","document","dog","doll", | |
| "dolphin","domain","donate","donkey","donor","door","dose","double","dove","draft","dragon","drama", | |
| "drastic","draw","dream","dress","drift","drill","drink","drip","drive","drop","drum","dry","duck", | |
| "dumb","dune","during","dust","dutch","duty","dwarf","dynamic","eager","eagle","early","earn","earth", | |
| "easily","east","easy","echo","ecology","economy","edge","edit","educate","effort","egg","eight","either", | |
| "elbow","elder","electric","elegant","element","elephant","elevator","elite","else","embark","embody", | |
| "embrace","emerge","emotion","employ","empty","enable","enact","end","endless","enemy","energy","enforce", | |
| "engage","engine","enhance","enjoy","enlist","enough","enrich","enroll","ensure","enter","entire", | |
| "entry","envelope","episode","equal","equip","era","erase","erode","erosion","error","erupt","escape", | |
| "essay","estate","eternal","ethics","evidence","evil","evoke","evolve","exact","example","excess", | |
| "exchange","excite","exclude","excuse","execute","exercise","exhaust","exhibit","exile","exist","exit", | |
| "exotic","expand","expect","expire","explain","expose","express","extend","extra","eye","eyebrow","fabric", | |
| "face","faculty","fade","faint","faith","fall","false","fame","family","famous","fan","fancy","fantasy", | |
| "farm","fashion","fat","fatal","father","fatigue","fault","favorite","feature","february","federal","fee", | |
| "feed","feel","female","fence","festival","fetch","fever","few","fiber","fiction","field","figure", | |
| "file","film","filter","final","find","fine","finger","finish","fire","firm","first","fiscal","fish", | |
| "fit","fitness","fix","flag","flame","flash","flat","flavor","flee","flight","flip","float","flock", | |
| "floor","flower","fluid","flush","fly","foam"," |