Skip to content

Instantly share code, notes, and snippets.

@kakashi-1337
Created July 3, 2025 17:24
Show Gist options
  • Save kakashi-1337/11621b3420d533c976c0aa859387ed76 to your computer and use it in GitHub Desktop.
Save kakashi-1337/11621b3420d533c976c0aa859387ed76 to your computer and use it in GitHub Desktop.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GuiTools Dashboard - Multi-Tool Security Platform</title>
<!-- ProjectDiscovery CSS Files -->
<link rel="stylesheet" href="https://cloud.projectdiscovery.io/_next/static/css/edac949dc43b31dd.css?dpl=dpl_Eam15VfhospDqwe8JSSqsatXPUeE">
<link rel="stylesheet" href="https://cloud.projectdiscovery.io/_next/static/css/946ce838c0a30211.css?dpl=dpl_Eam15VfhospDqwe8JSSqsatXPUeE">
<!--link rel="stylesheet" href="resources/css/946ce838c0a30211.css?dpl=dpl_Eam15VfhospDqwe8JSSqsatXPUeE">
<link rel="stylesheet" href="resources/css/edac949dc43b31dd.css?dpl=dpl_Eam15VfhospDqwe8JSSqsatXPUeE"/-->
<style>
/* Custom overrides and additions for our dashboard */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background: #0a0a0b;
color: #e4e4e7;
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
overflow-x: hidden;
}
.app-container {
min-height: 100vh;
display: flex;
flex-direction: column;
}
/* Custom Top Navigation */
.custom-nav {
background: rgba(10, 10, 11, 0.95);
backdrop-filter: blur(20px);
border-bottom: 1px solid rgba(39, 39, 42, 0.4);
padding: 8px 20px;
display: flex;
justify-content: space-between;
align-items: center;
position: sticky;
top: 0;
z-index: 100;
}
.logo-section {
display: flex;
align-items: center;
gap: 10px;
}
.logo {
width: 24px;
height: 24px;
background: linear-gradient(135deg, #00f5d4 0%, #00d4aa 100%);
border-radius: 6px;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
color: #000;
font-size: 12px;
}
.app-title {
font-size: 14px;
font-weight: 600;
color: #ffffff;
}
.user-section {
display: flex;
gap: 8px;
align-items: center;
}
.user-btn {
padding: 6px 12px;
background: rgba(39, 39, 42, 0.5);
border: 1px solid rgba(63, 63, 70, 0.5);
border-radius: 4px;
color: #e4e4e7;
cursor: pointer;
transition: all 0.3s ease;
font-size: 12px;
text-decoration: none;
}
.user-btn:hover {
background: rgba(0, 245, 212, 0.1);
border-color: #00f5d4;
transform: translateY(-1px);
}
/* Main Layout */
.main-layout {
display: flex;
flex: 1;
min-height: calc(100vh - 120px);
}
/* Sidebar */
.custom-sidebar {
width: 240px;
background: rgba(17, 17, 18, 0.8);
backdrop-filter: blur(20px);
border-right: 1px solid rgba(39, 39, 42, 0.4);
padding: 16px;
overflow-y: auto;
}
/* Collapsible Menu Sections */
.nav-section {
margin-bottom: 20px;
}
.nav-title {
font-size: 10px;
text-transform: uppercase;
color: #71717a;
margin-bottom: 8px;
font-weight: 600;
letter-spacing: 0.5px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: space-between;
padding: 4px 0;
transition: all 0.3s ease;
user-select: none;
}
.nav-title:hover {
color: #00f5d4;
}
.nav-title .collapse-icon {
font-size: 10px;
transition: transform 0.3s ease;
}
.nav-section.collapsed .collapse-icon {
transform: rotate(-90deg);
}
.nav-items {
max-height: 500px;
overflow: hidden;
transition: max-height 0.3s ease;
}
.nav-section.collapsed .nav-items {
max-height: 0;
}
.nav-item {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 10px;
border-radius: 4px;
cursor: pointer;
transition: all 0.3s ease;
margin-bottom: 2px;
color: #a1a1aa;
font-size: 13px;
}
.nav-item:hover {
background: rgba(39, 39, 42, 0.6);
color: #00f5d4;
}
.nav-item.active {
background: rgba(0, 245, 212, 0.1);
border: 1px solid rgba(0, 245, 212, 0.2);
color: #00f5d4;
}
.nav-icon {
width: 14px;
height: 14px;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
}
/* Content Area */
.content-area {
flex: 1;
padding: 20px;
overflow-y: auto;
}
.page-header {
margin-bottom: 20px;
}
.page-title {
font-size: 20px;
font-weight: 600;
color: #ffffff;
margin-bottom: 4px;
}
.page-subtitle {
color: #71717a;
font-size: 13px;
}
/* Tools Grid */
.tools-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 16px;
margin-bottom: 20px;
}
.tool-card {
background: rgba(39, 39, 42, 0.6);
border: 1px solid rgba(63, 63, 70, 0.3);
border-radius: 8px;
padding: 16px;
transition: all 0.4s ease;
cursor: pointer;
backdrop-filter: blur(20px);
}
.tool-card:hover {
border-color: rgba(0, 245, 212, 0.4);
transform: translateY(-2px);
box-shadow: 0 8px 32px rgba(0, 245, 212, 0.1);
}
.tool-header {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 12px;
}
.tool-icon {
width: 32px;
height: 32px;
background: linear-gradient(135deg, #00f5d4 0%, #00d4aa 100%);
border-radius: 6px;
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
color: #000;
}
.tool-info h3 {
color: #ffffff;
font-size: 14px;
margin-bottom: 2px;
font-weight: 600;
}
.tool-info p {
color: #71717a;
font-size: 12px;
}
.tool-stats {
display: flex;
gap: 16px;
margin-top: 12px;
}
.stat {
text-align: center;
flex: 1;
}
.stat-value {
font-size: 16px;
font-weight: 600;
color: #00f5d4;
}
.stat-label {
font-size: 10px;
color: #71717a;
text-transform: uppercase;
}
/* Tool Detail Forms with Glow Animation */
.tool-detail {
background: rgba(39, 39, 42, 0.6);
border: 1px solid rgba(63, 63, 70, 0.3);
border-radius: 8px;
padding: 16px;
margin-bottom: 16px;
backdrop-filter: blur(20px);
position: relative;
overflow: hidden;
}
.tool-detail::before {
content: '';
position: absolute;
top: -2px;
left: -2px;
right: -2px;
bottom: -2px;
background: linear-gradient(45deg,
transparent,
rgba(0, 245, 212, 0.1),
rgba(59, 130, 246, 0.1),
rgba(168, 85, 247, 0.1),
rgba(236, 72, 153, 0.1),
transparent
);
border-radius: 8px;
z-index: -1;
animation: borderGlow 3s linear infinite;
}
.tool-detail::after {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg,
transparent,
rgba(0, 245, 212, 0.03),
transparent
);
animation: shimmer 2s infinite;
}
.tool-controls {
display: flex;
gap: 12px;
margin-bottom: 16px;
flex-wrap: wrap;
}
.input-group {
display: flex;
flex-direction: column;
gap: 4px;
min-width: 160px;
}
.input-label {
color: #e4e4e7;
font-size: 12px;
font-weight: 500;
}
.input-field {
background: rgba(17, 17, 18, 0.8);
border: 1px solid rgba(63, 63, 70, 0.5);
border-radius: 4px;
padding: 8px 10px;
color: #e4e4e7;
font-size: 12px;
transition: all 0.3s ease;
}
.input-field:focus {
outline: none;
border-color: #00f5d4;
box-shadow: 0 0 0 2px rgba(0, 245, 212, 0.1);
}
.btn-primary {
background: linear-gradient(135deg, #00f5d4, #00d4aa);
color: #000;
border: none;
padding: 8px 16px;
border-radius: 4px;
font-weight: 600;
cursor: pointer;
transition: all 0.3s ease;
font-size: 12px;
}
.btn-primary:hover {
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0, 245, 212, 0.3);
}
.results-area {
background: rgba(10, 10, 11, 0.8);
border: 1px solid rgba(63, 63, 70, 0.3);
border-radius: 4px;
padding: 12px;
min-height: 160px;
font-family: 'Courier New', monospace;
font-size: 11px;
color: #e4e4e7;
overflow-y: auto;
}
/* Scan Results Table Styling */
.scan-results-container {
background: rgba(39, 39, 42, 0.6);
border: 1px solid rgba(63, 63, 70, 0.3);
border-radius: 8px;
padding: 16px;
margin-bottom: 16px;
backdrop-filter: blur(20px);
}
.scan-summary {
background: rgba(17, 17, 18, 0.8);
border-radius: 8px;
padding: 16px;
margin-bottom: 16px;
border-left: 3px solid #00f5d4;
}
.summary-text {
color: #e4e4e7;
font-size: 13px;
margin-bottom: 8px;
}
.severity-indicators {
display: flex;
gap: 16px;
margin-top: 12px;
}
.severity-indicator {
display: flex;
align-items: center;
gap: 6px;
font-size: 11px;
}
.severity-dot {
width: 8px;
height: 8px;
border-radius: 50%;
}
.severity-dot.critical { background: #ef4444; }
.severity-dot.high { background: #f97316; }
.severity-dot.medium { background: #eab308; }
.severity-dot.low { background: #3b82f6; }
.severity-dot.unknown { background: #6b7280; }
.scan-table {
width: 100%;
border-collapse: collapse;
font-size: 11px;
}
.scan-table th {
background: rgba(17, 17, 18, 0.6);
color: #71717a;
padding: 10px 8px;
text-align: left;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
border-bottom: 1px solid rgba(63, 63, 70, 0.3);
}
.scan-table td {
padding: 10px 8px;
border-bottom: 1px solid rgba(63, 63, 70, 0.2);
color: #e4e4e7;
}
.scan-table tr:hover {
background: rgba(0, 245, 212, 0.05);
}
.scan-name {
display: flex;
align-items: center;
gap: 8px;
}
.scan-status {
width: 8px;
height: 8px;
border-radius: 50%;
background: #10b981;
}
.severity-breakdown {
display: flex;
gap: 4px;
}
.severity-count {
padding: 2px 6px;
border-radius: 10px;
font-size: 9px;
font-weight: 600;
min-width: 16px;
text-align: center;
}
.severity-count.critical { background: rgba(239, 68, 68, 0.2); color: #f87171; }
.severity-count.high { background: rgba(249, 115, 22, 0.2); color: #fb923c; }
.severity-count.medium { background: rgba(234, 179, 8, 0.2); color: #fbbf24; }
.severity-count.low { background: rgba(59, 130, 246, 0.2); color: #60a5fa; }
.severity-count.zero { background: rgba(107, 114, 128, 0.2); color: #9ca3af; }
/* Activity Section */
.activity-section {
background: rgba(39, 39, 42, 0.6);
border: 1px solid rgba(63, 63, 70, 0.3);
border-radius: 8px;
padding: 16px;
backdrop-filter: blur(20px);
}
.section-title {
font-size: 16px;
font-weight: 600;
color: #ffffff;
margin-bottom: 12px;
display: flex;
align-items: center;
gap: 8px;
}
.activity-list {
display: flex;
flex-direction: column;
gap: 8px;
}
.activity-item {
display: flex;
align-items: center;
gap: 12px;
padding: 8px;
background: rgba(17, 17, 18, 0.6);
border-radius: 4px;
transition: all 0.3s ease;
}
.activity-item:hover {
background: rgba(0, 245, 212, 0.05);
transform: translateX(2px);
}
.activity-dot {
width: 6px;
height: 6px;
background: #00f5d4;
border-radius: 50%;
animation: pulse 2s infinite;
}
.activity-text {
flex: 1;
color: #e4e4e7;
font-size: 12px;
}
.activity-time {
color: #71717a;
font-size: 11px;
}
/* Success/Status Button Colors */
.status-success {
background: #dc2626 !important;
color: white !important;
}
.status-success:hover {
background: #b91c1c !important;
box-shadow: 0 4px 12px rgba(220, 38, 38, 0.3) !important;
}
/* Nuclei-specific styles */
.nuclei-header {
text-align: center;
margin-bottom: 24px;
padding: 20px;
}
.nuclei-title {
font-size: 12px;
text-transform: uppercase;
color: #71717a;
margin-bottom: 12px;
letter-spacing: 1px;
}
.nuclei-stats {
display: flex;
justify-content: center;
gap: 32px;
margin-bottom: 24px;
}
.nuclei-stat {
text-align: center;
}
.nuclei-stat-number {
font-size: 24px;
font-weight: 700;
color: #ffffff;
}
.nuclei-stat-label {
font-size: 11px;
color: #71717a;
}
.dashboard-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
margin-bottom: 20px;
}
.dashboard-card {
background: rgba(39, 39, 42, 0.6);
border: 1px solid rgba(63, 63, 70, 0.3);
border-radius: 8px;
padding: 16px;
backdrop-filter: blur(20px);
transition: all 0.3s ease;
}
.dashboard-card:hover {
border-color: rgba(0, 245, 212, 0.4);
}
.card-title {
font-size: 14px;
font-weight: 600;
color: #ffffff;
margin-bottom: 8px;
}
.card-subtitle {
font-size: 11px;
color: #71717a;
margin-bottom: 12px;
}
.chart-container {
height: 120px;
background: rgba(17, 17, 18, 0.6);
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
position: relative;
overflow: hidden;
}
.area-chart {
width: 100%;
height: 100%;
position: relative;
}
.chart-line {
fill: none;
stroke: #00f5d4;
stroke-width: 2;
opacity: 0.8;
}
.chart-area {
fill: url(#chartGradient);
opacity: 0.3;
}
.toggle-container {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 16px;
}
.toggle-switch {
width: 44px;
height: 24px;
background: #00f5d4;
border-radius: 12px;
position: relative;
cursor: pointer;
transition: all 0.3s ease;
}
.toggle-switch.inactive {
background: rgba(63, 63, 70, 0.5);
}
.toggle-handle {
width: 20px;
height: 20px;
background: #ffffff;
border-radius: 50%;
position: absolute;
top: 2px;
right: 2px;
transition: all 0.3s ease;
}
.toggle-switch.inactive .toggle-handle {
right: 22px;
}
.tags-section {
margin-bottom: 20px;
}
.tags-header {
font-size: 10px;
color: #71717a;
margin-bottom: 12px;
text-transform: uppercase;
letter-spacing: 0.5px;
display: flex;
align-items: center;
gap: 6px;
}
.tags-grid {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.tag {
padding: 4px 10px;
background: rgba(39, 39, 42, 0.6);
border: 1px solid rgba(63, 63, 70, 0.3);
border-radius: 12px;
color: #e4e4e7;
font-size: 11px;
cursor: pointer;
transition: all 0.3s ease;
}
.tag:hover {
background: rgba(0, 245, 212, 0.1);
border-color: #00f5d4;
}
.vuln-list {
display: flex;
flex-direction: column;
gap: 12px;
}
.vuln-card {
background: rgba(39, 39, 42, 0.6);
border: 1px solid rgba(63, 63, 70, 0.3);
border-radius: 8px;
padding: 16px;
transition: all 0.3s ease;
}
.vuln-card:hover {
border-color: rgba(0, 245, 212, 0.4);
}
.vuln-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 8px;
}
.severity-badge {
padding: 2px 8px;
border-radius: 10px;
font-size: 9px;
font-weight: 600;
text-transform: uppercase;
}
.severity-critical {
background: rgba(239, 68, 68, 0.2);
color: #f87171;
border: 1px solid rgba(239, 68, 68, 0.3);
}
.severity-medium {
background: rgba(245, 158, 11, 0.2);
color: #fbbf24;
border: 1px solid rgba(245, 158, 11, 0.3);
}
.cve-id {
color: #71717a;
font-family: 'Courier New', monospace;
font-size: 10px;
}
.vuln-title {
color: #ffffff;
font-size: 13px;
font-weight: 600;
margin-bottom: 6px;
}
.vuln-description {
color: #a1a1aa;
line-height: 1.4;
margin-bottom: 12px;
font-size: 11px;
}
.vuln-tags {
display: flex;
gap: 6px;
flex-wrap: wrap;
}
.vuln-tag {
padding: 2px 6px;
background: rgba(0, 245, 212, 0.1);
border: 1px solid rgba(0, 245, 212, 0.2);
border-radius: 8px;
color: #00f5d4;
font-size: 9px;
}
/* Assets Overview Styles */
.assets-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 16px;
margin-bottom: 20px;
}
.asset-card {
background: rgba(39, 39, 42, 0.6);
border: 1px solid rgba(63, 63, 70, 0.3);
border-radius: 8px;
padding: 16px;
backdrop-filter: blur(20px);
}
.asset-number {
font-size: 28px;
font-weight: 700;
color: #ffffff;
margin-bottom: 4px;
}
.asset-label {
font-size: 11px;
color: #71717a;
}
.chart-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 16px;
margin-bottom: 20px;
}
.chart-card {
background: rgba(39, 39, 42, 0.6);
border: 1px solid rgba(63, 63, 70, 0.3);
border-radius: 8px;
padding: 16px;
backdrop-filter: blur(20px);
min-height: 200px;
}
.chart-card-title {
font-size: 12px;
font-weight: 600;
color: #ffffff;
margin-bottom: 4px;
}
.chart-card-subtitle {
font-size: 10px;
color: #71717a;
margin-bottom: 16px;
}
.donut-chart {
width: 120px;
height: 120px;
margin: 0 auto;
position: relative;
}
.donut-center {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
text-align: center;
}
.donut-number {
font-size: 24px;
font-weight: 700;
color: #ffffff;
}
.donut-label {
font-size: 9px;
color: #71717a;
}
.no-data {
display: flex;
align-items: center;
justify-content: center;
height: 120px;
color: #71717a;
font-size: 11px;
}
/* Status Bar */
.status-bar {
background: rgba(17, 17, 18, 0.95);
backdrop-filter: blur(20px);
border-top: 1px solid rgba(39, 39, 42, 0.4);
padding: 6px 20px;
display: flex;
justify-content: space-between;
align-items: center;
position: sticky;
bottom: 0;
z-index: 100;
}
.status-group {
display: flex;
align-items: center;
gap: 16px;
}
.status-item {
display: flex;
align-items: center;
gap: 6px;
font-size: 11px;
color: #71717a;
transition: all 0.3s ease;
}
.status-item:hover {
color: #00f5d4;
}
.status-value {
color: #e4e4e7;
font-weight: 600;
margin-left: 2px;
}
.status-bar-chart {
width: 30px;
height: 8px;
background: rgba(63, 63, 70, 0.3);
border-radius: 2px;
position: relative;
overflow: hidden;
}
.status-bar-fill {
height: 100%;
background: linear-gradient(90deg, #00f5d4, #00d4aa);
border-radius: 2px;
transition: width 0.5s ease;
}
.network-indicator {
display: flex;
gap: 1px;
align-items: end;
}
.network-bar {
width: 2px;
background: #00f5d4;
border-radius: 1px;
animation: networkPulse 2s infinite ease-in-out;
}
.network-bar:nth-child(1) { height: 3px; animation-delay: 0s; }
.network-bar:nth-child(2) { height: 6px; animation-delay: 0.2s; }
.network-bar:nth-child(3) { height: 4px; animation-delay: 0.4s; }
.network-bar:nth-child(4) { height: 8px; animation-delay: 0.6s; }
/* View States */
.view {
display: none;
}
.view.active {
display: block;
}
/* Mobile Menu */
.mobile-menu-btn {
display: none;
background: none;
border: none;
color: #e4e4e7;
font-size: 18px;
cursor: pointer;
padding: 8px;
border-radius: 4px;
}
.mobile-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
z-index: 40;
display: none;
}
/* Animations */
@keyframes borderGlow {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
@keyframes shimmer {
0% { left: -100%; }
100% { left: 100%; }
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
@keyframes networkPulse {
0%, 100% {
opacity: 0.3;
transform: scaleY(0.5);
}
50% {
opacity: 1;
transform: scaleY(1);
}
}
/* Responsive Design */
@media (max-width: 768px) {
.custom-nav {
padding: 6px 12px;
}
.mobile-menu-btn {
display: block;
}
.custom-sidebar {
position: fixed;
left: -240px;
top: 50px;
height: calc(100vh - 50px);
z-index: 50;
transition: left 0.3s ease;
}
.custom-sidebar.mobile-open {
left: 0;
}
.content-area {
padding: 12px;
margin-left: 0;
}
.main-layout {
flex-direction: column;
}
.tools-grid {
grid-template-columns: 1fr;
gap: 12px;
}
.tool-controls {
flex-direction: column;
}
.input-group {
min-width: auto;
}
.status-bar {
padding: 4px 12px;
flex-wrap: wrap;
gap: 8px;
}
.status-group {
gap: 12px;
}
.mobile-overlay.active {
display: block;
}
.page-title {
font-size: 18px;
}
.page-subtitle {
font-size: 12px;
}
}
</style>
</head>
<body>
<div class="app-container">
<!-- Top Navigation -->
<nav class="custom-nav">
<div class="logo-section">
<button class="mobile-menu-btn" onclick="toggleMobileMenu()">≡</button>
<div class="logo">◆</div>
<div class="app-title">GuiTools Dashboard</div>
</div>
<div class="user-section">
<button class="user-btn">Settings</button>
<button class="user-btn">Help</button>
<button class="user-btn">⚡ Pro</button>
</div>
</nav>
<div class="main-layout">
<!-- Mobile Overlay -->
<div class="mobile-overlay" onclick="toggleMobileMenu()"></div>
<!-- Sidebar -->
<aside class="custom-sidebar" id="sidebar">
<div class="nav-section">
<h4 class="nav-title" onclick="toggleSection(this)">
Overview
<span class="collapse-icon">▼</span>
</h4>
<div class="nav-items">
<div class="nav-item active" onclick="showView('dashboard')">
<div class="nav-icon">◆</div>
<span>Dashboard</span>
</div>
<div class="nav-item" onclick="showView('analytics')">
<div class="nav-icon">▲</div>
<span>Analytics</span>
</div>
</div>
</div>
<div class="nav-section">
<h4 class="nav-title" onclick="toggleSection(this)">
Nuclei
<span class="collapse-icon">▼</span>
</h4>
<div class="nav-items">
<div class="nav-item" onclick="showView('nuclei-templates')">
<div class="nav-icon">◉</div>
<span>Templates Feed</span>
</div>
<div class="nav-item" onclick="showView('nuclei-scanner')">
<div class="nav-icon">◐</div>
<span>Scanner</span>
</div>
<div class="nav-item" onclick="showView('assets-overview')">
<div class="nav-icon">◆</div>
<span>Assets Overview</span>
</div>
</div>
</div>
<div class="nav-section">
<h4 class="nav-title" onclick="toggleSection(this)">
Security Tools
<span class="collapse-icon">▼</span>
</h4>
<div class="nav-items">
<div class="nav-item" onclick="showView('network-scanner')">
<div class="nav-icon">●</div>
<span>Network Scanner</span>
</div>
<div class="nav-item" onclick="showView('port-scanner')">
<div class="nav-icon">◇</div>
<span>Port Scanner</span>
</div>
<div class="nav-item">
<div class="nav-icon">■</div>
<span>Vulnerability Scanner</span>
</div>
<div class="nav-item">
<div class="nav-icon">▼</div>
<span>SSL Checker</span>
</div>
</div>
</div>
<div class="nav-section">
<h4 class="nav-title" onclick="toggleSection(this)">
Development
<span class="collapse-icon">▼</span>
</h4>
<div class="nav-items">
<div class="nav-item">
<div class="nav-icon">▶</div>
<span>API Tester</span>
</div>
<div class="nav-item">
<div class="nav-icon">{ }</div>
<span>JSON Formatter</span>
</div>
<div class="nav-item">
<div class="nav-icon">64</div>
<span>Base64 Tools</span>
</div>
<div class="nav-item">
<div class="nav-icon">#</div>
<span>Hash Generator</span>
</div>
</div>
</div>
<div class="nav-section">
<h4 class="nav-title" onclick="toggleSection(this)">
System
<span class="collapse-icon">▼</span>
</h4>
<div class="nav-items">
<div class="nav-item">
<div class="nav-icon">⚙</div>
<span>Process Monitor</span>
</div>
<div class="nav-item">
<div class="nav-icon">□</div>
<span>File Manager</span>
</div>
<div class="nav-item">
<div class="nav-icon">$</div>
<span>Terminal</span>
</div>
</div>
</div>
</aside>
<!-- Main Content -->
<main class="content-area">
<!-- Dashboard View -->
<div class="view active" id="dashboard">
<div class="page-header">
<h1 class="page-title">Dashboard</h1>
<p class="page-subtitle">Quick access to your most used tools and recent activity</p>
</div>
<div class="tools-grid">
<div class="tool-card" onclick="showView('network-scanner')">
<div class="tool-header">
<div class="tool-icon">◉</div>
<div class="tool-info">
<h3>Network Scanner</h3>
<p>Discover devices on your network</p>
</div>
</div>
<div class="tool-stats">
<div class="stat">
<div class="stat-value">247</div>
<div class="stat-label">Scans</div>
</div>
<div class="stat">
<div class="stat-value">15</div>
<div class="stat-label">Devices</div>
</div>
</div>
</div>
<div class="tool-card" onclick="showView('port-scanner')">
<div class="tool-header">
<div class="tool-icon">◈</div>
<div class="tool-info">
<h3>Port Scanner</h3>
<p>Check open ports and services</p>
</div>
</div>
<div class="tool-stats">
<div class="stat">
<div class="stat-value">89</div>
<div class="stat-label">Scans</div>
</div>
<div class="stat">
<div class="stat-value">12</div>
<div class="stat-label">Open</div>
</div>
</div>
</div>
<div class="tool-card" onclick="showView('nuclei-scanner')">
<div class="tool-header">
<div class="tool-icon">◆</div>
<div class="tool-info">
<h3>Nuclei Scanner</h3>
<p>Vulnerability scanning with templates</p>
</div>
</div>
<div class="tool-stats">
<div class="stat">
<div class="stat-value">34</div>
<div class="stat-label">Scans</div>
</div>
<div class="stat">
<div class="stat-value">3</div>
<div class="stat-label">Issues</div>
</div>
</div>
</div>
<div class="tool-card">
<div class="tool-header">
<div class="tool-icon">▲</div>
<div class="tool-info">
<h3>API Tester</h3>
<p>Test REST APIs and endpoints</p>
</div>
</div>
<div class="tool-stats">
<div class="stat">
<div class="stat-value">156</div>
<div class="stat-label">Requests</div>
</div>
<div class="stat">
<div class="stat-value">94%</div>
<div class="stat-label">Success</div>
</div>
</div>
</div>
</div>
<div class="activity-section">
<h2 class="section-title">Recent Activity</h2>
<div class="activity-list">
<div class="activity-item">
<div class="activity-dot"></div>
<div class="activity-text">Nuclei scan completed on example.com</div>
<div class="activity-time">2 minutes ago</div>
</div>
<div class="activity-item">
<div class="activity-dot"></div>
<div class="activity-text">Port scan found 3 open ports on target</div>
<div class="activity-time">5 minutes ago</div>
</div>
<div class="activity-item">
<div class="activity-dot status-success"></div>
<div class="activity-text">Templates updated - 15 new templates</div>
<div class="activity-time">12 minutes ago</div>
</div>
<div class="activity-item">
<div class="activity-dot"></div>
<div class="activity-text">JSON validation completed successfully</div>
<div class="activity-time">18 minutes ago</div>
</div>
</div>
</div>
</div>
<!-- Nuclei Templates Feed View -->
<div class="view" id="nuclei-templates">
<div class="nuclei-header">
<div class="nuclei-title">Real-Time Nuclei Templates Feed</div>
<div class="nuclei-stats">
<div class="nuclei-stat">
<div class="nuclei-stat-number">10853</div>
<div class="nuclei-stat-label">Templates</div>
</div>
<div class="nuclei-stat">
<div class="nuclei-stat-number">111</div>
<div class="nuclei-stat-label">In last 30 days</div>
</div>
</div>
</div>
<div class="dashboard-grid">
<div class="dashboard-card">
<div class="card-title">Template Activity</div>
<div class="card-subtitle">Jun 25 — 7 templates</div>
<div class="chart-container">
<svg class="area-chart" viewBox="0 0 300 80">
<defs>
<linearGradient id="chartGradient" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#00f5d4;stop-opacity:0.3" />
<stop offset="100%" style="stop-color:#00f5d4;stop-opacity:0" />
</linearGradient>
</defs>
<path class="chart-area" d="M0,60 L30,55 L60,45 L90,50 L120,35 L150,40 L180,25 L210,30 L240,20 L270,25 L300,15 L300,80 L0,80 Z" />
<path class="chart-line" d="M0,60 L30,55 L60,45 L90,50 L120,35 L150,40 L180,25 L210,30 L240,20 L270,25 L300,15" />
</svg>
</div>
</div>
<div class="dashboard-card">
<div class="card-title">Real-time AutoScan</div>
<div class="card-subtitle">Automatically scan your infrastructure when new Nuclei templates are released</div>
<div class="toggle-container">
<div class="toggle-switch" onclick="toggleAutoScan(this)">
<div class="toggle-handle"></div>
</div>
</div>
</div>
</div>
<div class="tags-section">
<h4 class="tags-header">● TOP PRODUCTS</h4>
<div class="tags-grid">
<div class="tag">Coldfusion</div>
<div class="tag">Experience Manager</div>
<div class="tag">Gitlab</div>
<div class="tag">Rukovoditel</div>
<div class="tag">Xwiki</div>
</div>
</div>
<div class="tags-section">
<h4 class="tags-header">■ TOP VENDORS</h4>
<div class="tags-grid">
<div class="tag">Adobe</div>
<div class="tag">Apache</div>
<div class="tag">Atlassian</div>
<div class="tag">Oracle</div>
<div class="tag">Vmware</div>
</div>
</div>
<div class="tags-section">
<h4 class="tags-header">◆ TYPE</h4>
<div class="tags-grid">
<div class="tag">XSS</div>
<div class="tag">SQLI</div>
<div class="tag">RCE</div>
<div class="tag">CVE</div>
<div class="tag">KEV</div>
<div class="tag">SSRF</div>
</div>
</div>
<div class="tool-detail">
<input type="text" class="input-field" placeholder="Search vulnerabilities" style="width: 100%; margin-bottom: 16px;">
</div>
<div class="vuln-list">
<div class="vuln-card">
<div class="vuln-header">
<div class="severity-badge severity-medium">MEDIUM</div>
<div class="cve-id">CVE-2025-47813</div>
</div>
<h3 class="vuln-title">Wing FTP Server <= 7.4.3 - Path Disclosure via Overlong UID Cookie</h3>
<p class="vuln-description">Wing FTP Server versions prior to 7.4.4 are vulnerable to an authenticated information disclosure vulnerability (CVE-2025-47813). The vulnerability occurs due to improper validation of the 'UID' session cookie in the /login/ok.html... read more</p>
<div class="vuln-tags">
<div class="vuln-tag">UNRELEASED</div>
<div class="vuln-tag">#FTPSERVER</div>
</div>
</div>
<div class="vuln-card">
<div class="vuln-header">
<div class="severity-badge severity-critical">CRITICAL</div>
<div class="cve-id">CVE-2025-47812</div>
</div>
<h3 class="vuln-title">Wing FTP Server <= 7.4.3 - Remote Code Execution</h3>
<p class="vuln-description">Wing FTP Server versions prior to 7.4.4 are vulnerable to an unauthenticated remote code execution (RCE) flaw (CVE-2025-47812). The vulnerability arises from improper NULL byte handling in the 'username' parameter during... read more</p>
<div class="vuln-tags">
<div class="vuln-tag">UNRELEASED</div>
<div class="vuln-tag">#FTPSERVER</div>
</div>
</div>
<div class="vuln-card">
<div class="vuln-header">
<div class="severity-badge severity-critical">CRITICAL</div>
<div class="cve-id">CVE-2024-51978</div>
</div>
<h3 class="vuln-title">Brother Printers - Authentication Bypass via Default Admin Password</h3>
<p class="vuln-description">By leaking a target device's serial number, a remote attacker can generate the target device's default administrator password. The target device may leak its serial number via unauthenticated HTTP, HTTPS, IPP... read more</p>
<div class="vuln-tags">
<div class="vuln-tag">KEV</div>
<div class="vuln-tag">#BROTHER</div>
</div>
</div>
</div>
</div>
<!-- Nuclei Scanner View -->
<!-- Add this button to your dashboard.html for testing -->
<div id="debug-section" style="position: fixed; top: 10px; right: 10px; background: #333; color: white; padding: 10px; border-radius: 5px; z-index: 9999;">
<h4>Debug Panel</h4>
<button id="debug-test-scan" style="margin: 5px; padding: 5px 10px;">Test Scan</button>
<button id="debug-check-api" style="margin: 5px; padding: 5px 10px;">Check API</button>
<div id="debug-output" style="margin-top: 10px; font-family: monospace; font-size: 12px; max-height: 200px; overflow-y: auto;"></div>
</div>
<script>
// Debug Test Script - Add this to the end of your dashboard.html
document.addEventListener('DOMContentLoaded', function() {
console.log('🧪 Debug panel loaded');
const debugOutput = document.getElementById('debug-output');
const logDebug = (message) => {
console.log(message);
if (debugOutput) {
debugOutput.innerHTML += `${new Date().toLocaleTimeString()}: ${message}<br>`;
debugOutput.scrollTop = debugOutput.scrollHeight;
}
};
// Test API availability
document.getElementById('debug-check-api')?.addEventListener('click', () => {
logDebug('🔍 Checking electronAPI...');
if (typeof window.electronAPI === 'undefined') {
logDebug('❌ window.electronAPI is undefined');
return;
}
logDebug('✅ window.electronAPI exists');
logDebug(`Methods: ${Object.keys(window.electronAPI).join(', ')}`);
// Test a simple call
window.electronAPI.getSystemStats()
.then(stats => {
logDebug(`✅ getSystemStats works: CPU ${stats.cpu}%, RAM ${stats.memory}%`);
})
.catch(err => {
logDebug(`❌ getSystemStats failed: ${err.message}`);
});
});
// Test simple scan
document.getElementById('debug-test-scan')?.addEventListener('click', async () => {
logDebug('🚀 Starting debug test scan...');
if (!window.electronAPI) {
logDebug('❌ electronAPI not available');
return;
}
try {
const testOptions = {
target: 'https://httpbin.org',
tags: '',
severity: 'All Severities',
concurrency: 5,
customTemplates: '',
outputFormat: 'jsonl'
};
logDebug(`📋 Test options: ${JSON.stringify(testOptions)}`);
logDebug('📡 Calling startNucleiScan...');
const result = await window.electronAPI.startNucleiScan(testOptions);
logDebug(`✅ Scan result: ${JSON.stringify(result)}`);
} catch (error) {
logDebug(`❌ Scan error: ${error.message}`);
logDebug(`Stack: ${error.stack}`);
}
});
});
</script>
<div class="view" id="nuclei-scanner">
<div class="page-header">
<h1 class="page-title">Nuclei Scanner</h1>
<p class="page-subtitle">Fast and customizable vulnerability scanner powered by community templates</p>
</div>
<div class="tool-detail">
<div class="tool-controls">
<div class="input-group">
<label class="input-label">Target URL/Domain</label>
<input type="text" class="input-field" placeholder="https://example.com" value="">
</div>
<div class="input-group">
<label class="input-label">Template Tags</label>
<input type="text" class="input-field" placeholder="cve,rce,sqli" value="">
</div>
<div class="input-group">
<label class="input-label">Severity</label>
<select class="input-field">
<option>All Severities</option>
<option>Critical</option>
<option>High</option>
<option>Medium</option>
<option>Low</option>
</select>
</div>
<div class="input-group">
<label class="input-label">Concurrency</label>
<input type="number" class="input-field" value="25" min="1" max="100">
</div>
<div style="display: flex; align-items: end; gap: 8px;">
<button class="btn-primary" onclick="startNucleiScan()">Start Scan</button>
<button class="user-btn" onclick="updateTemplates()">Update Templates</button>
</div>
</div>
<div class="tool-controls">
<div class="input-group" style="flex: 1;">
<label class="input-label">Custom Templates Path</label>
<input type="text" class="input-field" placeholder="/path/to/custom/templates" value="">
</div>
<div class="input-group">
<label class="input-label">Output Format</label>
<select class="input-field">
<option>JSON</option>
<option>YAML</option>
<option>Table</option>
<option>Markdown</option>
</select>
</div>
<div style="display: flex; align-items: end;">
<button class="user-btn">Load Config</button>
</div>
</div>
<div class="results-area" style="min-height: 300px;">
<div style="color: #00f5d4; margin-bottom: 12px;">[INF] Current nuclei version: v3.2.8 (latest)</div>
<div style="color: #00f5d4; margin-bottom: 12px;">[INF] Loading templates...</div>
<div>[INF] Templates loaded: 10853</div>
<div>[INF] Targets loaded: 1</div>
<div style="color: #888; margin-top: 12px;">Ready to scan. Click 'Start Scan' to begin vulnerability assessment.</div>
<div style="margin-top: 20px; padding-top: 12px; border-top: 1px solid rgba(63, 63, 70, 0.3);">
<div style="color: #fbbf24; margin-bottom: 8px;">[WRN] Template statistics:</div>
<div style="margin-left: 12px;">
<div>Critical: 1,247 templates</div>
<div>High: 2,891 templates</div>
<div>Medium: 4,562 templates</div>
<div>Low: 2,153 templates</div>
</div>
</div>
</div>
<!-- Scan Results Container -->
<div class="scan-results-container" style="display: none;" id="scan-results">
<div class="scan-summary">
<div class="summary-text">You have <strong>12</strong> open vulnerabilities.</div>
<div class="summary-text"><strong>12 new</strong> in the last 30 days.</div>
<div class="severity-indicators">
<div class="severity-indicator">
<div class="severity-dot critical"></div>
<span>0 Critical</span>
</div>
<div class="severity-indicator">
<div class="severity-dot high"></div>
<span>0 High</span>
</div>
<div class="severity-indicator">
<div class="severity-dot medium"></div>
<span>0 Medium</span>
</div>
<div class="severity-indicator">
<div class="severity-dot low"></div>
<span>12 Low</span>
</div>
<div class="severity-indicator">
<div class="severity-dot unknown"></div>
<span>0 Unknown</span>
</div>
</div>
</div>
<table class="scan-table">
<thead>
<tr>
<th>SCAN NAME</th>
<th>SEVERITY BREAKDOWN</th>
<th>TEMPLATES</th>
<th>ASSETS</th>
<th>DURATION</th>
<th>LAST UPDATED</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div class="scan-name">
<div class="scan-status"></div>
<span>Free monthly scan of example.com</span>
</div>
</td>
<td>
<div class="severity-breakdown">
<span class="severity-count zero">0</span>
<span class="severity-count zero">0</span>
<span class="severity-count zero">0</span>
<span class="severity-count low">12</span>
<span class="severity-count zero">0</span>
</div>
</td>
<td>5.29k templates</td>
<td>6 assets</td>
<td>7m 37s</td>
<td>2d ago</td>
</tr>
<tr>
<td>
<div class="scan-name">
<div class="scan-status"></div>
<span>Free monthly scan of test.com</span>
</div>
</td>
<td>
<div class="severity-breakdown">
<span class="severity-count zero">0</span>
<span class="severity-count zero">0</span>
<span class="severity-count zero">0</span>
<span class="severity-count low">10</span>
<span class="severity-count zero">0</span>
</div>
</td>
<td>5.19k templates</td>
<td>6 assets</td>
<td>7m 40s</td>
<td>1mo ago</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<!-- Assets Overview View -->
<div class="view" id="assets-overview">
<div class="page-header">
<h1 class="page-title">Assets Overview</h1>
<p class="page-subtitle">Exposure insights across all your discovered assets</p>
<button class="btn-primary" style="float: right; margin-top: -40px;">Start Discovery</button>
</div>
<div class="assets-grid">
<div class="asset-card">
<div style="display: flex; align-items: center; gap: 8px; margin-bottom: 8px;">
<span style="color: #71717a;">◆</span>
<span style="color: #ffffff; font-weight: 600; font-size: 12px;">Assets</span>
</div>
<div class="asset-number">13</div>
<div class="asset-label">Unique total assets with internet exposure</div>
</div>
<div class="asset-card">
<div style="display: flex; align-items: center; gap: 8px; margin-bottom: 8px;">
<span style="color: #f87171;">●</span>
<span style="color: #ffffff; font-weight: 600; font-size: 12px;">Vulnerabilities</span>
</div>
<div class="asset-number">12</div>
<div class="asset-label">Detected exploitable vulnerabilities</div>
</div>
<div class="asset-card">
<div style="display: flex; align-items: center; gap: 8px; margin-bottom: 8px;">
<span style="color: #71717a;">◐</span>
<span style="color: #ffffff; font-weight: 600; font-size: 12px;">Technologies</span>
</div>
<div class="asset-number">3</div>
<div class="asset-label">Unique tech stacks identified across assets</div>
</div>
</div>
<div class="chart-grid">
<div class="chart-card">
<div class="chart-card-title">Exposed assets over time</div>
<div class="chart-card-subtitle">Visualizes the number of exposed assets over time</div>
<div class="no-data">No data available</div>
</div>
<div class="chart-card">
<div class="chart-card-title">Open vulnerabilities over time</div>
<div class="chart-card-subtitle">Visualizes the number of open vulnerabilities over time</div>
<div class="chart-container">
<svg class="area-chart" viewBox="0 0 200 80">
<defs>
<linearGradient id="vulnGradient" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#3b82f6;stop-opacity:0.3" />
<stop offset="100%" style="stop-color:#3b82f6;stop-opacity:0" />
</linearGradient>
</defs>
<path class="chart-area" d="M0,60 L25,55 L50,45 L75,40 L100,35 L125,30 L150,25 L175,20 L200,15 L200,80 L0,80 Z" style="fill: url(#vulnGradient)" />
<path class="chart-line" d="M0,60 L25,55 L50,45 L75,40 L100,35 L125,30 L150,25 L175,20 L200,15" style="stroke: #3b82f6" />
</svg>
</div>
</div>
<div class="chart-card">
<div class="chart-card-title">Exposed technologies over time</div>
<div class="chart-card-subtitle">Visualizes the number of exposed technologies over time</div>
<div class="no-data">No data available</div>
</div>
</div>
<div class="chart-grid">
<div class="chart-card">
<div class="chart-card-title">Technology distribution</div>
<div class="chart-card-subtitle">Identifies and categorizes the top 10 technologies</div>
<div class="donut-chart">
<svg width="120" height="120" viewBox="0 0 120 120">
<circle cx="60" cy="60" r="40" fill="none" stroke="#00f5d4" stroke-width="20"
stroke-dasharray="125.6 251.2" stroke-dashoffset="0" transform="rotate(-90 60 60)" />
<circle cx="60" cy="60" r="40" fill="none" stroke="#3b82f6" stroke-width="20"
stroke-dasharray="62.8 314" stroke-dashoffset="-125.6" transform="rotate(-90 60 60)" />
</svg>
<div class="donut-center">
<div class="donut-number">3</div>
<div class="donut-label">Unique Technologies</div>
</div>
</div>
</div>
<div class="chart-card">
<div class="chart-card-title">Webserver distribution</div>
<div class="chart-card-subtitle">Analyzes the top 10 types of web servers discovered</div>
<div class="donut-chart">
<svg width="120" height="120" viewBox="0 0 120 120">
<circle cx="60" cy="60" r="40" fill="none" stroke="#00f5d4" stroke-width="20"
stroke-dasharray="157 94.2" stroke-dashoffset="0" transform="rotate(-90 60 60)" />
<circle cx="60" cy="60" r="40" fill="none" stroke="#3b82f6" stroke-width="20"
stroke-dasharray="94.2 157" stroke-dashoffset="-157" transform="rotate(-90 60 60)" />
</svg>
<div class="donut-center">
<div class="donut-number">4</div>
<div class="donut-label">Unique Web Servers</div>
</div>
</div>
</div>
<div class="chart-card">
<div class="chart-card-title">Port distribution</div>
<div class="chart-card-subtitle">Highlights the top 10 open ports discovered</div>
<div class="donut-chart">
<svg width="120" height="120" viewBox="0 0 120 120">
<circle cx="60" cy="60" r="40" fill="none" stroke="#00f5d4" stroke-width="20"
stroke-dasharray="188.4 62.8" stroke-dashoffset="0" transform="rotate(-90 60 60)" />
<circle cx="60" cy="60" r="40" fill="none" stroke="#3b82f6" stroke-width="20"
stroke-dasharray="62.8 188.4" stroke-dashoffset="-188.4" transform="rotate(-90 60 60)" />
</svg>
<div class="donut-center">
<div class="donut-number">3</div>
<div class="donut-label">Unique Ports</div>
</div>
</div>
</div>
</div>
<div class="chart-grid">
<div class="chart-card">
<div class="chart-card-title">CNAME distribution</div>
<div class="chart-card-subtitle">Classifies domains by their top 10 respective</div>
<div class="donut-chart">
<svg width="120" height="120" viewBox="0 0 120 120">
<circle cx="60" cy="60" r="40" fill="none" stroke="#f87171" stroke-width="20"
stroke-dasharray="75.36 175.84" stroke-dashoffset="0" transform="rotate(-90 60 60)" />
<circle cx="60" cy="60" r="40" fill="none" stroke="#00f5d4" stroke-width="20"
stroke-dasharray="87.92 163.28" stroke-dashoffset="-75.36" transform="rotate(-90 60 60)" />
<circle cx="60" cy="60" r="40" fill="none" stroke="#3b82f6" stroke-width="20"
stroke-dasharray="87.92 163.28" stroke-dashoffset="-163.28" transform="rotate(-90 60 60)" />
</svg>
<div class="donut-center">
<div class="no-data" style="font-size: 9px;">No data available</div>
</div>
</div>
</div>
<div class="chart-card">
<div class="chart-card-title">Page title distribution</div>
<div class="chart-card-subtitle">Organizes assets based on the top 10 webpage</div>
<div class="donut-chart">
<svg width="120" height="120" viewBox="0 0 120 120">
<circle cx="60" cy="60" r="40" fill="none" stroke="#00f5d4" stroke-width="20"
stroke-dasharray="125.6 125.6" stroke-dashoffset="0" transform="rotate(-90 60 60)" />
<circle cx="60" cy="60" r="40" fill="none" stroke="#3b82f6" stroke-width="20"
stroke-dasharray="125.6 125.6" stroke-dashoffset="-125.6" transform="rotate(-90 60 60)" />
</svg>
<div class="donut-center">
<div class="donut-number">3</div>
<div class="donut-label">Unique Titles</div>
</div>
</div>
</div>
<div class="chart-card">
<div class="chart-card-title">Status code distribution</div>
<div class="chart-card-subtitle">Summarizes insights into the top 10 HTTP status</div>
<div class="donut-chart">
<svg width="120" height="120" viewBox="0 0 120 120">
<circle cx="60" cy="60" r="40" fill="none" stroke="#00f5d4" stroke-width="20"
stroke-dasharray="188.4 62.8" stroke-dashoffset="0" transform="rotate(-90 60 60)" />
<circle cx="60" cy="60" r="40" fill="none" stroke="#3b82f6" stroke-width="20"
stroke-dasharray="62.8 188.4" stroke-dashoffset="-188.4" transform="rotate(-90 60 60)" />
</svg>
<div class="donut-center">
<div class="donut-number">2</div>
<div class="donut-label">Unique Status Codes</div>
</div>
</div>
</div>
</div>
</div>
<!-- Network Scanner View -->
<div class="view" id="network-scanner">
<div class="page-header">
<h1 class="page-title">Network Scanner</h1>
<p class="page-subtitle">Discover devices and services on your network</p>
</div>
<div class="tool-detail">
<div class="tool-controls">
<div class="input-group">
<label class="input-label">Target Network</label>
<input type="text" class="input-field" placeholder="192.168.1.0/24" value="192.168.1.0/24">
</div>
<div class="input-group">
<label class="input-label">Scan Type</label>
<select class="input-field">
<option>Ping Sweep</option>
<option>TCP Connect</option>
<option>UDP Scan</option>
</select>
</div>
<div class="input-group">
<label class="input-label">Timeout (ms)</label>
<input type="number" class="input-field" value="1000">
</div>
<div style="display: flex; align-items: end;">
<button class="btn-primary">Start Scan</button>
</div>
</div>
<div class="results-area">
<div style="color: #00f5d4; margin-bottom: 12px;">Scanning 192.168.1.0/24...</div>
<div>192.168.1.1 ✓ Online [Router/Gateway]</div>
<div>192.168.1.10 ✓ Online [Unknown Device]</div>
<div>192.168.1.15 ✓ Online [Windows PC]</div>
<div>192.168.1.25 ✓ Online [MacBook Pro]</div>
<div>192.168.1.50 ✓ Online [Printer]</div>
<div style="color: #71717a; margin-top: 12px;">Scan completed in 2.3 seconds. Found 5 active devices.</div>
</div>
</div>
</div>
<!-- Port Scanner View -->
<div class="view" id="port-scanner">
<div class="page-header">
<h1 class="page-title">Port Scanner</h1>
<p class="page-subtitle">Check for open ports and running services</p>
</div>
<div class="tool-detail">
<div class="tool-controls">
<div class="input-group">
<label class="input-label">Target Host</label>
<input type="text" class="input-field" placeholder="192.168.1.1" value="example.com">
</div>
<div class="input-group">
<label class="input-label">Port Range</label>
<input type="text" class="input-field" placeholder="1-1000" value="1-1000">
</div>
<div class="input-group">
<label class="input-label">Scan Type</label>
<select class="input-field">
<option>TCP Connect</option>
<option>TCP SYN</option>
<option>UDP</option>
</select>
</div>
<div style="display: flex; align-items: end;">
<button class="btn-primary">Start Scan</button>
</div>
</div>
<div class="results-area">
<div style="color: #00f5d4; margin-bottom: 12px;">Scanning example.com (ports 1-1000)...</div>
<div>Port 22/tcp ✓ OPEN SSH</div>
<div>Port 80/tcp ✓ OPEN HTTP</div>
<div>Port 443/tcp ✓ OPEN HTTPS</div>
<div>Port 993/tcp ✓ OPEN IMAPS</div>
<div style="color: #666;">Port 21/tcp ✗ CLOSED FTP</div>
<div style="color: #666;">Port 23/tcp ✗ CLOSED Telnet</div>
<div style="color: #71717a; margin-top: 12px;">Scan completed. 4 open ports found out of 1000 scanned.</div>
</div>
</div>
</div>
<!-- Analytics View -->
<div class="view" id="analytics">
<div class="page-header">
<h1 class="page-title">Analytics</h1>
<p class="page-subtitle">Usage statistics and performance metrics</p>
</div>
<div class="tools-grid">
<div class="tool-card">
<div class="tool-header">
<div class="tool-icon">▲</div>
<div class="tool-info">
<h3>Tool Usage</h3>
<p>Most frequently used tools</p>
</div>
</div>
<div class="results-area" style="min-height: 120px; background: rgba(17, 17, 18, 0.6);">
<div>1. Nuclei Scanner - 247 uses</div>
<div>2. Network Scanner - 156 uses</div>
<div>3. Port Scanner - 89 uses</div>
<div>4. Hash Generator - 67 uses</div>
</div>
</div>
<div class="tool-card">
<div class="tool-header">
<div class="tool-icon">◐</div>
<div class="tool-info">
<h3>Performance</h3>
<p>Average execution times</p>
</div>
</div>
<div class="results-area" style="min-height: 120px; background: rgba(17, 17, 18, 0.6);">
<div>Nuclei Scan: 45.2s avg</div>
<div>Network Scan: 2.3s avg</div>
<div>Port Scan: 15.7s avg</div>
<div>SSL Check: 1.2s avg</div>
</div>
</div>
</div>
</div>
</main>
</div>
<!-- Status Bar -->
<div class="status-bar">
<div class="status-group">
<div class="status-item">
<span>●</span>
<span>Network:</span>
<span class="status-value">24.7 MB/s</span>
<div class="network-indicator">
<div class="network-bar"></div>
<div class="network-bar"></div>
<div class="network-bar"></div>
<div class="network-bar"></div>
</div>
</div>
<div class="status-item">
<span>◐</span>
<span>CPU:</span>
<span class="status-value">23%</span>
<div class="status-bar-chart">
<div class="status-bar-fill" style="width: 23%"></div>
</div>
</div>
<div class="status-item">
<span>■</span>
<span>RAM:</span>
<span class="status-value">67%</span>
<div class="status-bar-chart">
<div class="status-bar-fill" style="width: 67%"></div>
</div>
</div>
</div>
<div class="status-group">
<div class="status-item">
<span>◇</span>
<span>C: 45GB free</span>
</div>
<div class="status-item">
<span>⚡</span>
<span>Power: AC</span>
</div>
<div class="status-item">
<span>◷</span>
<span id="current-time">12:34 PM</span>
</div>
</div>
</div>
</div>
<script>
function toggleSection(element) {
const section = element.closest('.nav-section');
section.classList.toggle('collapsed');
}
function toggleAutoScan(element) {
element.classList.toggle('inactive');
}
function updateTemplates() {
const resultsArea = document.querySelector('#nuclei-scanner .results-area');
resultsArea.innerHTML = `
<div style="color: #00f5d4; margin-bottom: 12px;">[INF] Updating nuclei templates...</div>
<div style="color: #fbbf24;">[WRN] Downloading templates from GitHub...</div>
<div>[INF] Templates downloaded: 10853</div>
<div>[INF] New templates: 15</div>
<div style="color: #00f5d4; margin-top: 12px;">[INF] Templates updated successfully!</div>
`;
}
function startNucleiScan() {
const resultsArea = document.querySelector('#nuclei-scanner .results-area');
const scanResults = document.getElementById('scan-results');
const targetInput = document.querySelector('#nuclei-scanner input[placeholder="https://example.com"]');
const target = targetInput.value || 'https://example.com';
resultsArea.innerHTML = `
<div style="color: #00f5d4; margin-bottom: 12px;">[INF] Starting Nuclei scan on ${target}</div>
<div>[INF] Loading templates...</div>
<div>[INF] Templates loaded: 10853</div>
<div>[INF] Starting scan with 25 concurrent threads</div>
<div style="color: #888; margin-top: 12px; animation: pulse 2s infinite;">● Scanning in progress...</div>
`;
// Show scan results after 3 seconds
setTimeout(() => {
resultsArea.innerHTML += `
<div style="color: #f87171; margin-top: 12px;">[CRITICAL] CVE-2023-12345 detected on ${target}</div>
<div style="color: #fbbf24;">[HIGH] SQL Injection vulnerability found</div>
<div style="color: #fbbf24;">[MEDIUM] Exposed .git directory</div>
<div style="color: #00f5d4; margin-top: 12px;">[INF] Scan completed. 3 vulnerabilities found.</div>
`;
// Show the beautiful scan results table
scanResults.style.display = 'block';
}, 3000);
}
function showView(viewName) {
// Hide all views
const views = document.querySelectorAll('.view');
views.forEach(view => view.classList.remove('active'));
// Show selected view
const targetView = document.getElementById(viewName);
if (targetView) {
targetView.classList.add('active');
}
// Update nav items
const navItems = document.querySelectorAll('.nav-item');
navItems.forEach(item => item.classList.remove('active'));
// Find and activate the corresponding nav item
const clickedItem = event?.target?.closest?.('.nav-item');
if (clickedItem) {
clickedItem.classList.add('active');
}
// Close mobile menu if open
if (window.innerWidth <= 768) {
toggleMobileMenu();
}
}
function toggleMobileMenu() {
const sidebar = document.getElementById('sidebar');
const overlay = document.querySelector('.mobile-overlay');
sidebar.classList.toggle('mobile-open');
overlay.classList.toggle('active');
}
// Update time
function updateTime() {
const now = new Date();
const timeString = now.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'});
document.getElementById('current-time').textContent = timeString;
}
// Update system stats
function updateSystemStats() {
// Simulate real-time CPU usage
const cpuElement = document.querySelector('.status-item:nth-child(2) .status-value');
const cpuBar = document.querySelector('.status-item:nth-child(2) .status-bar-fill');
const newCpu = Math.floor(Math.random() * 40) + 10;
cpuElement.textContent = newCpu + '%';
cpuBar.style.width = newCpu + '%';
// Simulate network activity
const networkElement = document.querySelector('.status-item:nth-child(1) .status-value');
const newNetwork = (Math.random() * 50 + 5).toFixed(1);
networkElement.textContent = newNetwork + ' MB/s';
// Simulate RAM usage
const ramElement = document.querySelector('.status-item:nth-child(3) .status-value');
const ramBar = document.querySelector('.status-item:nth-child(3) .status-bar-fill');
const newRam = Math.floor(Math.random() * 30) + 50;
ramElement.textContent = newRam + '%';
ramBar.style.width = newRam + '%';
}
// Initialize
document.addEventListener('DOMContentLoaded', function() {
updateTime();
setInterval(updateTime, 1000);
setInterval(updateSystemStats, 3000);
// Close mobile menu when clicking outside
document.addEventListener('click', function(e) {
const sidebar = document.getElementById('sidebar');
const mobileBtn = document.querySelector('.mobile-menu-btn');
if (window.innerWidth <= 768 &&
!sidebar.contains(e.target) &&
!mobileBtn.contains(e.target) &&
sidebar.classList.contains('mobile-open')) {
toggleMobileMenu();
}
});
});
// Handle window resize
window.addEventListener('resize', function() {
if (window.innerWidth > 768) {
const sidebar = document.getElementById('sidebar');
const overlay = document.querySelector('.mobile-overlay');
sidebar.classList.remove('mobile-open');
overlay.classList.remove('active');
}
});
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment