techprotrade's picture
download
raw
83.2 kB
<!DOCTYPE html>
<html lang="et">
<head>
<!--
______ __
/ ____/___ ____ ___ ____ __ __/ /____ _____
/ / / __ \/ __ `__ \/ __ \/ / / / __/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ / /_/ __/ /
\____/\____/_/ /_/ /_/ .___/\__,_/\__/\___/_/
/_/
Created with Perplexity Computer
https://www.perplexity.ai/computer
-->
<!-- Perplexity Computer Attribution — SEO Meta Tags -->
<meta name="generator" content="Perplexity Computer">
<meta name="author" content="Perplexity Computer">
<meta property="og:see_also" content="https://www.perplexity.ai/computer">
<link rel="author" href="https://www.perplexity.ai/computer">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>LuunaOS — Master Command Center</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=JetBrains+Mono:wght@400;500;600;700&family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<style>
/* ============================================
LUUNAOS MASTER COMMAND CENTER
Cyberpunk Dark Theme
============================================ */
:root {
--bg-primary: #0a0a0f;
--bg-secondary: #0f0f18;
--bg-card: rgba(15, 15, 28, 0.7);
--bg-card-hover: rgba(20, 20, 35, 0.85);
--bg-glass: rgba(10, 10, 20, 0.6);
--border-color: rgba(0, 255, 213, 0.15);
--border-hover: rgba(0, 255, 213, 0.35);
--cyan: #00ffd5;
--cyan-dim: rgba(0, 255, 213, 0.5);
--cyan-glow: rgba(0, 255, 213, 0.15);
--purple: #8b5cf6;
--purple-dim: rgba(139, 92, 246, 0.5);
--purple-glow: rgba(139, 92, 246, 0.15);
--amber: #f59e0b;
--amber-dim: rgba(245, 158, 11, 0.5);
--red: #ef4444;
--red-dim: rgba(239, 68, 68, 0.5);
--green: #10b981;
--green-dim: rgba(16, 185, 129, 0.5);
--gold: #fbbf24;
--gold-dim: rgba(251, 191, 36, 0.5);
--text-primary: #e2e8f0;
--text-secondary: #94a3b8;
--text-muted: #64748b;
--font-mono: 'JetBrains Mono', monospace;
--font-body: 'Inter', system-ui, sans-serif;
--radius: 12px;
--radius-sm: 8px;
--radius-lg: 16px;
}
/* Reset */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html {
scroll-behavior: smooth;
-webkit-font-smoothing: antialiased;
}
body {
font-family: var(--font-body);
background: var(--bg-primary);
color: var(--text-primary);
min-height: 100vh;
overflow-x: hidden;
line-height: 1.6;
}
/* ============================================
STARFIELD BACKGROUND
============================================ */
#starfield {
position: fixed;
top: 0; left: 0;
width: 100%; height: 100%;
z-index: 0;
pointer-events: none;
}
/* ============================================
MAIN LAYOUT
============================================ */
.app-wrapper {
position: relative;
z-index: 1;
min-height: 100vh;
display: flex;
flex-direction: column;
}
/* ============================================
HEADER
============================================ */
.header {
padding: 20px 24px 0;
border-bottom: 1px solid var(--border-color);
background: rgba(10, 10, 15, 0.85);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
position: sticky;
top: 0;
z-index: 100;
}
.header-top {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 16px;
}
.logo-area {
display: flex;
align-items: center;
gap: 14px;
}
.logo-icon {
width: 40px; height: 40px;
position: relative;
}
.logo-icon svg {
width: 100%; height: 100%;
}
.logo-title {
font-family: var(--font-mono);
font-size: 22px;
font-weight: 700;
background: linear-gradient(135deg, var(--cyan), var(--purple));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
letter-spacing: -0.5px;
}
.logo-subtitle {
font-size: 11px;
color: var(--text-muted);
font-family: var(--font-mono);
letter-spacing: 1px;
text-transform: uppercase;
}
.header-status {
display: flex;
align-items: center;
gap: 16px;
font-size: 13px;
color: var(--text-secondary);
}
.status-dot {
width: 8px; height: 8px;
border-radius: 50%;
background: var(--green);
box-shadow: 0 0 8px var(--green-dim);
animation: pulse-dot 2s infinite;
display: inline-block;
}
@keyframes pulse-dot {
0%, 100% { opacity: 1; }
50% { opacity: 0.4; }
}
.live-clock {
font-family: var(--font-mono);
font-size: 13px;
color: var(--cyan);
}
/* ============================================
TAB NAVIGATION
============================================ */
.tab-nav {
display: flex;
gap: 0;
overflow-x: auto;
scrollbar-width: none;
-ms-overflow-style: none;
}
.tab-nav::-webkit-scrollbar { display: none; }
.tab-btn {
font-family: var(--font-mono);
font-size: 12px;
font-weight: 500;
color: var(--text-muted);
background: none;
border: none;
padding: 12px 18px;
cursor: pointer;
white-space: nowrap;
border-bottom: 2px solid transparent;
transition: all 0.25s ease;
letter-spacing: 0.3px;
}
.tab-btn:hover {
color: var(--text-secondary);
background: rgba(0, 255, 213, 0.03);
}
.tab-btn.active {
color: var(--cyan);
border-bottom-color: var(--cyan);
background: rgba(0, 255, 213, 0.05);
}
/* ============================================
MAIN CONTENT
============================================ */
.main-content {
flex: 1;
padding: 24px;
max-width: 1440px;
margin: 0 auto;
width: 100%;
}
.tab-panel {
display: none;
animation: fadeIn 0.3s ease;
}
.tab-panel.active {
display: block;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(8px); }
to { opacity: 1; transform: translateY(0); }
}
/* ============================================
KPI CARDS
============================================ */
.kpi-row {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 16px;
margin-bottom: 28px;
}
.kpi-card {
background: var(--bg-card);
border: 1px solid var(--border-color);
border-radius: var(--radius);
padding: 20px;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
position: relative;
overflow: hidden;
transition: border-color 0.3s, transform 0.2s;
}
.kpi-card:hover {
border-color: var(--border-hover);
transform: translateY(-2px);
}
.kpi-card::before {
content: '';
position: absolute;
top: 0; left: 0;
width: 100%; height: 2px;
background: linear-gradient(90deg, var(--cyan), var(--purple));
opacity: 0.6;
}
.kpi-label {
font-size: 12px;
color: var(--text-muted);
font-family: var(--font-mono);
text-transform: uppercase;
letter-spacing: 1px;
margin-bottom: 8px;
}
.kpi-value {
font-size: 36px;
font-weight: 700;
font-family: var(--font-mono);
color: var(--cyan);
line-height: 1;
}
.kpi-icon {
position: absolute;
top: 16px; right: 16px;
font-size: 20px;
opacity: 0.4;
}
/* ============================================
SYSTEM STATUS GRID
============================================ */
.section-title {
font-family: var(--font-mono);
font-size: 14px;
font-weight: 600;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 1.5px;
margin-bottom: 16px;
display: flex;
align-items: center;
gap: 10px;
}
.section-title::before {
content: '';
width: 3px;
height: 16px;
background: var(--cyan);
border-radius: 2px;
}
.status-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 14px;
margin-bottom: 32px;
}
.status-card {
background: var(--bg-card);
border: 1px solid var(--border-color);
border-radius: var(--radius);
padding: 18px;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
transition: border-color 0.3s, transform 0.2s;
}
.status-card:hover {
border-color: var(--border-hover);
transform: translateY(-1px);
}
.status-card-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 10px;
}
.status-card-name {
font-family: var(--font-mono);
font-size: 13px;
font-weight: 600;
color: var(--text-primary);
}
.status-badge {
font-size: 11px;
font-weight: 600;
padding: 3px 10px;
border-radius: 20px;
font-family: var(--font-mono);
}
.status-badge.online {
background: rgba(16, 185, 129, 0.15);
color: var(--green);
border: 1px solid rgba(16, 185, 129, 0.3);
}
.status-badge.active {
background: rgba(0, 255, 213, 0.1);
color: var(--cyan);
border: 1px solid rgba(0, 255, 213, 0.25);
}
.status-badge.building {
background: rgba(245, 158, 11, 0.15);
color: var(--amber);
border: 1px solid rgba(245, 158, 11, 0.3);
}
.status-card-detail {
font-size: 12px;
color: var(--text-muted);
}
.status-card-detail a {
color: var(--cyan-dim);
text-decoration: none;
transition: color 0.2s;
}
.status-card-detail a:hover {
color: var(--cyan);
text-decoration: underline;
}
/* Progress bar inside status card */
.progress-bar-wrap {
margin-top: 10px;
background: rgba(255,255,255,0.05);
border-radius: 6px;
height: 6px;
overflow: hidden;
}
.progress-bar-fill {
height: 100%;
border-radius: 6px;
background: linear-gradient(90deg, var(--cyan), var(--purple));
transition: width 1.5s ease;
}
/* ============================================
20-STEP MASTER PLAN TIMELINE
============================================ */
.timeline {
position: relative;
padding-left: 40px;
}
.timeline::before {
content: '';
position: absolute;
left: 15px;
top: 0;
bottom: 0;
width: 2px;
background: linear-gradient(180deg,
var(--cyan) 0%,
var(--purple) 30%,
var(--amber) 60%,
var(--gold) 100%
);
opacity: 0.4;
}
.timeline-step {
position: relative;
margin-bottom: 20px;
}
.timeline-dot {
position: absolute;
left: -33px;
top: 20px;
width: 12px;
height: 12px;
border-radius: 50%;
border: 2px solid var(--cyan);
background: var(--bg-primary);
z-index: 2;
}
.timeline-dot.kriitiline { border-color: var(--red); box-shadow: 0 0 8px var(--red-dim); }
.timeline-dot.kõrge { border-color: var(--amber); box-shadow: 0 0 8px var(--amber-dim); }
.timeline-dot.keskmine { border-color: var(--cyan); box-shadow: 0 0 8px var(--cyan-glow); }
.timeline-dot.madal { border-color: var(--purple); box-shadow: 0 0 8px var(--purple-glow); }
.timeline-dot.visioon { border-color: var(--gold); box-shadow: 0 0 8px var(--gold-dim); }
.step-card {
background: var(--bg-card);
border: 1px solid var(--border-color);
border-radius: var(--radius);
overflow: hidden;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
transition: border-color 0.3s;
}
.step-card:hover {
border-color: var(--border-hover);
}
.step-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 16px 20px;
cursor: pointer;
user-select: none;
gap: 12px;
}
.step-header:hover {
background: rgba(0, 255, 213, 0.03);
}
.step-number {
font-family: var(--font-mono);
font-size: 12px;
font-weight: 700;
color: var(--bg-primary);
background: var(--cyan);
width: 28px; height: 28px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.step-number.kriitiline { background: var(--red); }
.step-number.kõrge { background: var(--amber); color: #000; }
.step-number.keskmine { background: var(--cyan); color: #000; }
.step-number.madal { background: var(--purple); }
.step-number.visioon { background: var(--gold); color: #000; }
.step-info {
flex: 1;
min-width: 0;
}
.step-title {
font-family: var(--font-mono);
font-size: 13px;
font-weight: 600;
color: var(--text-primary);
line-height: 1.3;
}
.step-title-estonian {
font-size: 11px;
color: var(--text-muted);
font-style: italic;
margin-top: 2px;
}
.step-meta {
display: flex;
align-items: center;
gap: 12px;
flex-shrink: 0;
}
.priority-tag {
font-family: var(--font-mono);
font-size: 10px;
font-weight: 700;
padding: 3px 8px;
border-radius: 4px;
letter-spacing: 0.5px;
}
.priority-tag.kriitiline { background: rgba(239, 68, 68, 0.15); color: var(--red); border: 1px solid rgba(239, 68, 68, 0.3); }
.priority-tag.kõrge { background: rgba(245, 158, 11, 0.15); color: var(--amber); border: 1px solid rgba(245, 158, 11, 0.3); }
.priority-tag.keskmine { background: rgba(0, 255, 213, 0.1); color: var(--cyan); border: 1px solid rgba(0, 255, 213, 0.25); }
.priority-tag.madal { background: rgba(139, 92, 246, 0.15); color: var(--purple); border: 1px solid rgba(139, 92, 246, 0.3); }
.priority-tag.visioon { background: rgba(251, 191, 36, 0.15); color: var(--gold); border: 1px solid rgba(251, 191, 36, 0.3); }
.step-pct {
font-family: var(--font-mono);
font-size: 13px;
font-weight: 700;
color: var(--cyan);
min-width: 40px;
text-align: right;
}
.step-chevron {
width: 20px; height: 20px;
color: var(--text-muted);
transition: transform 0.3s;
flex-shrink: 0;
}
.step-card.open .step-chevron {
transform: rotate(180deg);
}
.step-progress-bar {
height: 3px;
background: rgba(255,255,255,0.04);
}
.step-progress-fill {
height: 100%;
background: linear-gradient(90deg, var(--cyan), var(--purple));
transition: width 1s ease;
}
.step-progress-fill.kriitiline { background: linear-gradient(90deg, var(--red), #f87171); }
.step-progress-fill.kõrge { background: linear-gradient(90deg, var(--amber), #fbbf24); }
.step-progress-fill.keskmine { background: linear-gradient(90deg, var(--cyan), #06b6d4); }
.step-progress-fill.madal { background: linear-gradient(90deg, var(--purple), #a78bfa); }
.step-progress-fill.visioon { background: linear-gradient(90deg, var(--gold), #fde68a); }
.step-body {
display: none;
padding: 0 20px 20px;
border-top: 1px solid rgba(255,255,255,0.04);
}
.step-card.open .step-body {
display: block;
animation: fadeIn 0.3s ease;
}
.step-section-label {
font-family: var(--font-mono);
font-size: 10px;
font-weight: 700;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 1px;
margin: 16px 0 8px;
}
.step-desc {
font-size: 13px;
color: var(--text-secondary);
line-height: 1.7;
margin-bottom: 4px;
}
.step-list {
list-style: none;
padding: 0;
margin: 0;
}
.step-list li {
font-size: 12px;
color: var(--text-secondary);
padding: 4px 0;
padding-left: 16px;
position: relative;
line-height: 1.6;
}
.step-list li::before {
content: '›';
position: absolute;
left: 0;
color: var(--cyan);
font-weight: 700;
}
.step-tools {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-top: 8px;
}
.tool-chip {
font-family: var(--font-mono);
font-size: 10px;
padding: 3px 10px;
background: rgba(0, 255, 213, 0.08);
border: 1px solid rgba(0, 255, 213, 0.15);
border-radius: 20px;
color: var(--cyan-dim);
}
.smart-idea {
margin-top: 12px;
padding: 12px 16px;
background: rgba(139, 92, 246, 0.06);
border: 1px solid rgba(139, 92, 246, 0.15);
border-radius: var(--radius-sm);
font-size: 12px;
color: var(--text-secondary);
line-height: 1.7;
}
.smart-idea-label {
font-family: var(--font-mono);
font-size: 10px;
font-weight: 700;
color: var(--purple);
text-transform: uppercase;
letter-spacing: 1px;
margin-bottom: 6px;
}
/* ============================================
REPO GRID
============================================ */
.repo-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 14px;
margin-bottom: 32px;
}
.repo-card {
background: var(--bg-card);
border: 1px solid var(--border-color);
border-radius: var(--radius);
padding: 18px;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
transition: border-color 0.3s, transform 0.2s;
text-decoration: none;
display: block;
}
.repo-card:hover {
border-color: var(--border-hover);
transform: translateY(-2px);
}
.repo-card-header {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 8px;
}
.repo-name {
font-family: var(--font-mono);
font-size: 14px;
font-weight: 600;
color: var(--cyan);
}
.repo-lang {
font-size: 11px;
padding: 2px 8px;
border-radius: 12px;
background: rgba(139, 92, 246, 0.12);
color: var(--purple);
font-family: var(--font-mono);
}
.repo-desc {
font-size: 12px;
color: var(--text-muted);
line-height: 1.5;
margin-bottom: 8px;
}
.repo-updated {
font-size: 11px;
color: var(--text-muted);
font-family: var(--font-mono);
}
/* ============================================
SERVICES GRID
============================================ */
.services-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 12px;
margin-bottom: 32px;
}
.service-card {
background: var(--bg-card);
border: 1px solid var(--border-color);
border-radius: var(--radius-sm);
padding: 14px 16px;
display: flex;
align-items: center;
gap: 12px;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
transition: border-color 0.3s;
}
.service-card:hover {
border-color: var(--border-hover);
}
.service-status-icon {
width: 10px; height: 10px;
border-radius: 50%;
flex-shrink: 0;
}
.service-status-icon.connected {
background: var(--green);
box-shadow: 0 0 6px var(--green-dim);
}
.service-status-icon.warning {
background: var(--amber);
box-shadow: 0 0 6px var(--amber-dim);
}
.service-name {
font-size: 13px;
font-weight: 500;
color: var(--text-primary);
}
.service-tag {
margin-left: auto;
font-family: var(--font-mono);
font-size: 10px;
padding: 2px 8px;
border-radius: 4px;
}
.service-tag.connected {
background: rgba(16, 185, 129, 0.12);
color: var(--green);
}
.service-tag.warning {
background: rgba(245, 158, 11, 0.12);
color: var(--amber);
}
/* ============================================
MODELS TABLE
============================================ */
.model-section {
margin-bottom: 32px;
}
.model-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: 12px;
}
.model-card {
background: var(--bg-card);
border: 1px solid var(--border-color);
border-radius: var(--radius-sm);
padding: 14px 16px;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
transition: border-color 0.3s;
}
.model-card:hover { border-color: var(--border-hover); }
.model-name {
font-family: var(--font-mono);
font-size: 13px;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 4px;
}
.model-provider {
font-size: 11px;
color: var(--text-muted);
font-family: var(--font-mono);
}
.model-type-badge {
display: inline-block;
font-size: 10px;
padding: 2px 8px;
border-radius: 4px;
font-family: var(--font-mono);
font-weight: 600;
margin-top: 6px;
}
.badge-local {
background: rgba(0, 255, 213, 0.1);
color: var(--cyan);
border: 1px solid rgba(0, 255, 213, 0.2);
}
.badge-cloud {
background: rgba(139, 92, 246, 0.1);
color: var(--purple);
border: 1px solid rgba(139, 92, 246, 0.2);
}
.badge-planned {
background: rgba(245, 158, 11, 0.1);
color: var(--amber);
border: 1px solid rgba(245, 158, 11, 0.2);
}
/* ============================================
AGENTS SECTION
============================================ */
.agent-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 14px;
margin-bottom: 32px;
}
.agent-card {
background: var(--bg-card);
border: 1px solid var(--border-color);
border-radius: var(--radius);
padding: 18px;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
transition: border-color 0.3s;
}
.agent-card:hover { border-color: var(--border-hover); }
.agent-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8px;
}
.agent-name {
font-family: var(--font-mono);
font-size: 14px;
font-weight: 600;
color: var(--text-primary);
}
.agent-status {
font-size: 18px;
}
.agent-detail {
font-size: 12px;
color: var(--text-muted);
line-height: 1.5;
}
.agent-model-tag {
display: inline-block;
font-family: var(--font-mono);
font-size: 10px;
padding: 2px 8px;
background: rgba(0, 255, 213, 0.08);
border: 1px solid rgba(0, 255, 213, 0.15);
border-radius: 4px;
color: var(--cyan-dim);
margin-top: 8px;
}
/* ============================================
NEXUS-AI BRIDGE
============================================ */
.nexus-hero {
background: linear-gradient(135deg, rgba(0, 255, 213, 0.05), rgba(139, 92, 246, 0.05));
border: 1px solid var(--border-color);
border-radius: var(--radius-lg);
padding: 32px;
margin-bottom: 24px;
text-align: center;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
}
.nexus-title {
font-family: var(--font-mono);
font-size: 28px;
font-weight: 700;
background: linear-gradient(135deg, var(--cyan), var(--purple));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin-bottom: 8px;
}
.nexus-link {
display: inline-flex;
align-items: center;
gap: 8px;
margin-top: 16px;
padding: 10px 24px;
background: linear-gradient(135deg, var(--cyan), var(--purple));
color: #000;
font-family: var(--font-mono);
font-size: 13px;
font-weight: 700;
border-radius: 8px;
text-decoration: none;
transition: transform 0.2s, box-shadow 0.2s;
}
.nexus-link:hover {
transform: translateY(-2px);
box-shadow: 0 4px 20px var(--cyan-glow);
}
.nexus-modules {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
gap: 10px;
margin-top: 24px;
}
.nexus-module {
background: var(--bg-card);
border: 1px solid var(--border-color);
border-radius: var(--radius-sm);
padding: 12px;
text-align: center;
font-size: 12px;
color: var(--text-secondary);
font-family: var(--font-mono);
transition: border-color 0.3s;
}
.nexus-module:hover { border-color: var(--border-hover); }
.nexus-module-icon {
font-size: 20px;
margin-bottom: 6px;
}
/* ============================================
FOOTER
============================================ */
.app-footer {
border-top: 1px solid var(--border-color);
background: rgba(10, 10, 15, 0.85);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
padding: 20px 24px;
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
gap: 12px;
}
.footer-left {
display: flex;
align-items: center;
gap: 16px;
font-size: 12px;
color: var(--text-muted);
flex-wrap: wrap;
}
.footer-left a {
color: var(--text-muted);
text-decoration: none;
transition: color 0.2s;
}
.footer-left a:hover { color: var(--cyan); }
.footer-right {
display: flex;
align-items: center;
gap: 16px;
font-size: 12px;
color: var(--text-muted);
}
.footer-right a {
color: var(--text-muted);
text-decoration: none;
transition: color 0.2s;
}
.footer-right a:hover { color: var(--cyan); }
.footer-clock {
font-family: var(--font-mono);
color: var(--cyan-dim);
font-size: 12px;
}
/* ============================================
RESPONSIVE
============================================ */
@media (max-width: 1024px) {
.status-grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 768px) {
.kpi-row {
grid-template-columns: repeat(2, 1fr);
}
.status-grid {
grid-template-columns: 1fr;
}
.header-top {
flex-direction: column;
align-items: flex-start;
gap: 10px;
}
.header-status {
width: 100%;
justify-content: space-between;
}
.main-content {
padding: 16px;
}
.step-header {
padding: 12px 14px;
flex-wrap: wrap;
}
.step-meta {
width: 100%;
justify-content: flex-end;
margin-top: 4px;
}
.timeline {
padding-left: 30px;
}
.timeline-dot {
left: -23px;
width: 10px; height: 10px;
}
.nexus-hero { padding: 20px; }
.nexus-title { font-size: 22px; }
.app-footer { flex-direction: column; align-items: flex-start; }
.repo-grid { grid-template-columns: 1fr; }
.services-grid { grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); }
}
@media (max-width: 480px) {
.kpi-row { grid-template-columns: 1fr 1fr; gap: 10px; }
.kpi-value { font-size: 28px; }
.tab-btn { padding: 10px 12px; font-size: 11px; }
.model-grid { grid-template-columns: 1fr; }
.agent-grid { grid-template-columns: 1fr; }
}
/* ============================================
SCROLLBAR
============================================ */
::-webkit-scrollbar { width: 6px; }
::-webkit-scrollbar-track { background: var(--bg-primary); }
::-webkit-scrollbar-thumb { background: rgba(0, 255, 213, 0.2); border-radius: 3px; }
::-webkit-scrollbar-thumb:hover { background: rgba(0, 255, 213, 0.35); }
/* ============================================
OVERALL PROGRESS RING
============================================ */
.overall-progress {
display: flex;
align-items: center;
gap: 20px;
margin-bottom: 28px;
padding: 20px;
background: var(--bg-card);
border: 1px solid var(--border-color);
border-radius: var(--radius);
backdrop-filter: blur(10px);
}
.progress-ring-wrap {
position: relative;
width: 80px; height: 80px;
flex-shrink: 0;
}
.progress-ring-wrap svg {
transform: rotate(-90deg);
}
.progress-ring-text {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
font-family: var(--font-mono);
font-size: 18px;
font-weight: 700;
color: var(--cyan);
}
.overall-info h3 {
font-family: var(--font-mono);
font-size: 16px;
margin-bottom: 4px;
color: var(--text-primary);
}
.overall-info p {
font-size: 13px;
color: var(--text-muted);
}
.priority-legend {
display: flex;
flex-wrap: wrap;
gap: 12px;
margin-top: 10px;
}
.priority-legend span {
font-size: 11px;
display: flex;
align-items: center;
gap: 5px;
color: var(--text-secondary);
font-family: var(--font-mono);
}
.priority-legend .dot-leg {
width: 8px; height: 8px;
border-radius: 50%;
display: inline-block;
}
/* ============================================
EXTERNAL AI SERVICES
============================================ */
.ext-services-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: 12px;
margin-bottom: 24px;
}
.ext-service-card {
background: var(--bg-card);
border: 1px solid var(--border-color);
border-radius: var(--radius-sm);
padding: 14px 16px;
backdrop-filter: blur(10px);
transition: border-color 0.3s;
}
.ext-service-card:hover { border-color: var(--border-hover); }
.ext-service-name {
font-family: var(--font-mono);
font-size: 13px;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 4px;
}
.ext-service-desc {
font-size: 11px;
color: var(--text-muted);
}
</style>
</head>
<body>
<!-- Starfield Canvas -->
<canvas id="starfield"></canvas>
<div class="app-wrapper">
<!-- HEADER -->
<header class="header">
<div class="header-top">
<div class="logo-area">
<div class="logo-icon">
<svg viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="20" cy="20" r="18" stroke="url(#logoGrad)" stroke-width="2" fill="none" opacity="0.6"/>
<path d="M12 20 C12 14, 16 10, 20 10 C24 10, 28 14, 28 20 C28 26, 24 30, 20 30" stroke="url(#logoGrad)" stroke-width="2.5" fill="none" stroke-linecap="round"/>
<circle cx="20" cy="20" r="3" fill="url(#logoGrad)"/>
<circle cx="20" cy="20" r="7" stroke="url(#logoGrad)" stroke-width="1" fill="none" opacity="0.3" stroke-dasharray="3 3"/>
<defs>
<linearGradient id="logoGrad" x1="0" y1="0" x2="40" y2="40">
<stop offset="0%" stop-color="#00ffd5"/>
<stop offset="100%" stop-color="#8b5cf6"/>
</linearGradient>
</defs>
</svg>
</div>
<div>
<div class="logo-title">LuunaOS</div>
<div class="logo-subtitle">Master Command Center</div>
</div>
</div>
<div class="header-status">
<span><span class="status-dot"></span> System Online</span>
<span class="live-clock" id="headerClock">--:--:--</span>
</div>
</div>
<!-- TAB NAV -->
<nav class="tab-nav" id="tabNav">
<button class="tab-btn active" data-tab="command">⌘ Command Center</button>
<button class="tab-btn" data-tab="masterplan">◈ 20-Sammu Meisterplaan</button>
<button class="tab-btn" data-tab="repos">⟐ Repos & Deployments</button>
<button class="tab-btn" data-tab="services">⟡ Teenused & API-d</button>
<button class="tab-btn" data-tab="models">◉ AI Mudelid</button>
<button class="tab-btn" data-tab="agents">⬡ Agendid</button>
<button class="tab-btn" data-tab="nexus">⚡ NEXUS-AI Bridge</button>
</nav>
</header>
<!-- MAIN CONTENT -->
<main class="main-content">
<!-- ===================== TAB 1: COMMAND CENTER ===================== -->
<section class="tab-panel active" id="panel-command">
<!-- KPI ROW -->
<div class="kpi-row">
<div class="kpi-card">
<div class="kpi-icon">📂</div>
<div class="kpi-label">Repos</div>
<div class="kpi-value" data-count="30">0</div>
</div>
<div class="kpi-card">
<div class="kpi-icon">🔗</div>
<div class="kpi-label">Services</div>
<div class="kpi-value" data-count="13">0</div>
</div>
<div class="kpi-card">
<div class="kpi-icon">🤖</div>
<div class="kpi-label">Agents</div>
<div class="kpi-value" data-count="8">0</div>
</div>
<div class="kpi-card">
<div class="kpi-icon">🧠</div>
<div class="kpi-label">Models</div>
<div class="kpi-value" data-count="12">0</div>
</div>
</div>
<!-- SYSTEM STATUS -->
<div class="section-title">System Status</div>
<div class="status-grid">
<div class="status-card">
<div class="status-card-header">
<span class="status-card-name">LuunaOS Core</span>
<span class="status-badge building">15%</span>
</div>
<div class="status-card-detail">Target: 100% — Full OS convergence</div>
<div class="progress-bar-wrap">
<div class="progress-bar-fill" style="width: 15%"></div>
</div>
</div>
<div class="status-card">
<div class="status-card-header">
<span class="status-card-name">NEXUS-AI.pro</span>
<span class="status-badge online">ONLINE</span>
</div>
<div class="status-card-detail"><a href="https://nexus-ai.pro/" target="_blank" rel="noopener">nexus-ai.pro</a> — Avalik gateway</div>
</div>
<div class="status-card">
<div class="status-card-header">
<span class="status-card-name">LuunaOS Dashboard</span>
<span class="status-badge online">ONLINE</span>
</div>
<div class="status-card-detail"><a href="https://v0-next-js-community-starter-silk-psi.vercel.app/" target="_blank" rel="noopener">Vercel Deployment</a></div>
</div>
<div class="status-card">
<div class="status-card-header">
<span class="status-card-name">Luuna-dashboard1</span>
<span class="status-badge active">ACTIVE</span>
</div>
<div class="status-card-detail"><a href="https://github.com/riskikuller2020/Luuna-dashboard1" target="_blank" rel="noopener">GitHub Repository</a></div>
</div>
<div class="status-card">
<div class="status-card-header">
<span class="status-card-name">luuna-agents</span>
<span class="status-badge active">ACTIVE</span>
</div>
<div class="status-card-detail"><a href="https://github.com/riskikuller2020/luuna-agents" target="_blank" rel="noopener">GitHub Repository</a></div>
</div>
<div class="status-card">
<div class="status-card-header">
<span class="status-card-name">VPS Hostinger KVM</span>
<span class="status-badge online">ONLINE</span>
</div>
<div class="status-card-detail"><code style="color:var(--cyan-dim);font-size:12px;">91.108.121.181</code> — Kali Linux</div>
</div>
</div>
<!-- Quick overview of the master plan -->
<div class="section-title">Meisterplaan Overview</div>
<div class="overall-progress">
<div class="progress-ring-wrap">
<svg width="80" height="80" viewBox="0 0 80 80">
<circle cx="40" cy="40" r="34" stroke="rgba(255,255,255,0.06)" stroke-width="6" fill="none"/>
<circle cx="40" cy="40" r="34" stroke="url(#ringGrad)" stroke-width="6" fill="none"
stroke-linecap="round"
stroke-dasharray="213.6"
stroke-dashoffset="192.2"/>
<defs>
<linearGradient id="ringGrad" x1="0" y1="0" x2="80" y2="80">
<stop offset="0%" stop-color="#00ffd5"/>
<stop offset="100%" stop-color="#8b5cf6"/>
</linearGradient>
</defs>
</svg>
<div class="progress-ring-text">10%</div>
</div>
<div class="overall-info">
<h3>20-Sammu Meisterplaan</h3>
<p>Keskmine valmisolek üle kõigi sammude. 4 kriitilist, 5 kõrget, 7 keskmist, 3 madalat, 1 visioon.</p>
<div class="priority-legend">
<span><span class="dot-leg" style="background:var(--red)"></span> KRIITILINE</span>
<span><span class="dot-leg" style="background:var(--amber)"></span> KÕRGE</span>
<span><span class="dot-leg" style="background:var(--cyan)"></span> KESKMINE</span>
<span><span class="dot-leg" style="background:var(--purple)"></span> MADAL</span>
<span><span class="dot-leg" style="background:var(--gold)"></span> VISIOON</span>
</div>
</div>
</div>
</section>
<!-- ===================== TAB 2: 20-STEP MASTER PLAN ===================== -->
<section class="tab-panel" id="panel-masterplan">
<div class="section-title">20-Sammu Meisterplaan</div>
<div class="overall-progress" style="margin-bottom:24px;">
<div class="progress-ring-wrap">
<svg width="80" height="80" viewBox="0 0 80 80">
<circle cx="40" cy="40" r="34" stroke="rgba(255,255,255,0.06)" stroke-width="6" fill="none"/>
<circle cx="40" cy="40" r="34" stroke="url(#ringGrad2)" stroke-width="6" fill="none"
stroke-linecap="round"
stroke-dasharray="213.6"
stroke-dashoffset="192.2"/>
<defs>
<linearGradient id="ringGrad2" x1="0" y1="0" x2="80" y2="80">
<stop offset="0%" stop-color="#00ffd5"/>
<stop offset="100%" stop-color="#8b5cf6"/>
</linearGradient>
</defs>
</svg>
<div class="progress-ring-text">10%</div>
</div>
<div class="overall-info">
<h3>Üldine Progress: 10%</h3>
<p>20 sammu singulaarsuse poole. Igal sammul on oma prioriteet, kirjeldus, tööriistad ja nutikad ideed.</p>
<div class="priority-legend">
<span><span class="dot-leg" style="background:var(--red)"></span> KRIITILINE</span>
<span><span class="dot-leg" style="background:var(--amber)"></span> KÕRGE</span>
<span><span class="dot-leg" style="background:var(--cyan)"></span> KESKMINE</span>
<span><span class="dot-leg" style="background:var(--purple)"></span> MADAL</span>
<span><span class="dot-leg" style="background:var(--gold)"></span> VISIOON</span>
</div>
</div>
</div>
<div class="timeline" id="timeline">
<!-- Steps injected by JS -->
</div>
</section>
<!-- ===================== TAB 3: REPOS & DEPLOYMENTS ===================== -->
<section class="tab-panel" id="panel-repos">
<div class="section-title">GitHub Repositories</div>
<div class="repo-grid">
<a class="repo-card" href="https://github.com/riskikuller2020/Luuna-dashboard1" target="_blank" rel="noopener">
<div class="repo-card-header">
<span class="repo-name">Luuna-dashboard1</span>
<span class="repo-lang">TypeScript</span>
</div>
<div class="repo-desc">Peamine LuunaOS Next.js 15 dashboard — frontend kõigile moodulitele</div>
<div class="repo-updated">Updated Mar 16, 2026</div>
</a>
<a class="repo-card" href="https://github.com/riskikuller2020/luuna-agents" target="_blank" rel="noopener">
<div class="repo-card-header">
<span class="repo-name">luuna-agents</span>
<span class="repo-lang">TypeScript</span>
</div>
<div class="repo-desc">Express + React agentide backend — CrewAI, LM Studio, Ollama integratsioonid</div>
<div class="repo-updated">Updated Mar 16, 2026</div>
</a>
<a class="repo-card" href="https://github.com/riskikuller2020/beemflowww" target="_blank" rel="noopener">
<div class="repo-card-header">
<span class="repo-name">beemflowww</span>
<span class="repo-lang">JavaScript</span>
</div>
<div class="repo-desc">AI workflow builder — visuaalne drag-and-drop automatiseerimine</div>
<div class="repo-updated">Updated Feb 25, 2026</div>
</a>
<a class="repo-card" href="https://github.com/riskikuller2020/cryptovizbuilders" target="_blank" rel="noopener">
<div class="repo-card-header">
<span class="repo-name">cryptovizbuilders</span>
<span class="repo-lang">Python</span>
</div>
<div class="repo-desc">MCP Antigravity — Crypto turu visualiseerijad ja analytics</div>
<div class="repo-updated">Updated Jan 18, 2026</div>
</a>
<a class="repo-card" href="https://github.com/riskikuller2020/neuroxss" target="_blank" rel="noopener">
<div class="repo-card-header">
<span class="repo-name">neuroxss</span>
<span class="repo-lang">Python</span>
</div>
<div class="repo-desc">XSS skanner — küberturbe tööriist veebirakenduste auditeerimiseks</div>
<div class="repo-updated">Updated Feb 23, 2026</div>
</a>
<a class="repo-card" href="https://github.com/riskikuller2020/local-music-pwa" target="_blank" rel="noopener">
<div class="repo-card-header">
<span class="repo-name">local-music-pwa</span>
<span class="repo-lang">JavaScript</span>
</div>
<div class="repo-desc">Progressive Web App lokaalseks muusika mängimiseks</div>
<div class="repo-updated">Updated Feb 5, 2026</div>
</a>
<a class="repo-card" href="https://github.com/riskikuller2020/vosk-api" target="_blank" rel="noopener">
<div class="repo-card-header">
<span class="repo-name">vosk-api</span>
<span class="repo-lang">C++/Python</span>
</div>
<div class="repo-desc">Offline kõnetuvastus — STT engine lokaalse voice agendi jaoks</div>
<div class="repo-updated">Updated Apr 2025</div>
</a>
<a class="repo-card" href="https://github.com/riskikuller2020/whisper.cpp" target="_blank" rel="noopener">
<div class="repo-card-header">
<span class="repo-name">whisper.cpp</span>
<span class="repo-lang">C++</span>
</div>
<div class="repo-desc">OpenAI Whisper C++ port — RTX 3090 kiirendatud transkriptsioon</div>
<div class="repo-updated">Updated May 2025</div>
</a>
<a class="repo-card" href="https://github.com/riskikuller2020/claude-cookbooks" target="_blank" rel="noopener">
<div class="repo-card-header">
<span class="repo-name">claude-cookbooks</span>
<span class="repo-lang">Python</span>
</div>
<div class="repo-desc">Anthropic Claude retseptid ja näidiskoodid</div>
<div class="repo-updated">Updated Jan 2026</div>
</a>
<a class="repo-card" href="https://github.com/riskikuller2020/groq-api-cookbook" target="_blank" rel="noopener">
<div class="repo-card-header">
<span class="repo-name">groq-api-cookbook</span>
<span class="repo-lang">Python</span>
</div>
<div class="repo-desc">Groq API retseptid — ülikiire LPU inferents</div>
<div class="repo-updated">Updated May 2025</div>
</a>
</div>
<div class="section-title">Vercel Deployments</div>
<div class="repo-grid">
<a class="repo-card" href="https://v0-next-js-community-starter-silk-psi.vercel.app/" target="_blank" rel="noopener">
<div class="repo-card-header">
<span class="repo-name">LuunaOS Dashboard</span>
<span class="repo-lang" style="background:rgba(16,185,129,0.12);color:var(--green);">Live</span>
</div>
<div class="repo-desc">Peamine Vercel deployment — Next.js 15 community starter</div>
<div class="repo-updated">Auto-deploy from main branch</div>
</a>
</div>
</section>
<!-- ===================== TAB 4: SERVICES & APIs ===================== -->
<section class="tab-panel" id="panel-services">
<div class="section-title">Ühendatud Teenused (Connected)</div>
<div class="services-grid">
<div class="service-card"><div class="service-status-icon connected"></div><span class="service-name">GitHub</span><span class="service-tag connected">CONNECTED</span></div>
<div class="service-card"><div class="service-status-icon connected"></div><span class="service-name">Slack</span><span class="service-tag connected">CONNECTED</span></div>
<div class="service-card"><div class="service-status-icon connected"></div><span class="service-name">Notion</span><span class="service-tag connected">CONNECTED</span></div>
<div class="service-card"><div class="service-status-icon connected"></div><span class="service-name">Google Drive</span><span class="service-tag connected">CONNECTED</span></div>
<div class="service-card"><div class="service-status-icon connected"></div><span class="service-name">Vercel</span><span class="service-tag connected">CONNECTED</span></div>
<div class="service-card"><div class="service-status-icon connected"></div><span class="service-name">Figma</span><span class="service-tag connected">CONNECTED</span></div>
<div class="service-card"><div class="service-status-icon connected"></div><span class="service-name">Linear</span><span class="service-tag connected">CONNECTED</span></div>
<div class="service-card"><div class="service-status-icon connected"></div><span class="service-name">Stripe</span><span class="service-tag connected">CONNECTED</span></div>
<div class="service-card"><div class="service-status-icon connected"></div><span class="service-name">Square</span><span class="service-tag connected">CONNECTED</span></div>
<div class="service-card"><div class="service-status-icon connected"></div><span class="service-name">Dropbox</span><span class="service-tag connected">CONNECTED</span></div>
<div class="service-card"><div class="service-status-icon connected"></div><span class="service-name">OneDrive</span><span class="service-tag connected">CONNECTED</span></div>
<div class="service-card"><div class="service-status-icon connected"></div><span class="service-name">SharePoint</span><span class="service-tag connected">CONNECTED</span></div>
<div class="service-card"><div class="service-status-icon connected"></div><span class="service-name">Outlook</span><span class="service-tag connected">CONNECTED</span></div>
<div class="service-card"><div class="service-status-icon connected"></div><span class="service-name">HuggingFace</span><span class="service-tag connected">CONNECTED</span></div>
<div class="service-card"><div class="service-status-icon connected"></div><span class="service-name">Google Forms</span><span class="service-tag connected">CONNECTED</span></div>
<div class="service-card"><div class="service-status-icon connected"></div><span class="service-name">Apify (Pipedream)</span><span class="service-tag connected">CONNECTED</span></div>
</div>
<div class="section-title">Ühendamist Vajavad (Disconnected)</div>
<div class="services-grid">
<div class="service-card"><div class="service-status-icon warning"></div><span class="service-name">Google Sheets</span><span class="service-tag warning">PENDING</span></div>
<div class="service-card"><div class="service-status-icon warning"></div><span class="service-name">Google Analytics</span><span class="service-tag warning">PENDING</span></div>
<div class="service-card"><div class="service-status-icon warning"></div><span class="service-name">Google Cloud Vision</span><span class="service-tag warning">PENDING</span></div>
</div>
<div class="section-title">Välised AI Teenused (External AI Services)</div>
<div class="ext-services-grid">
<div class="ext-service-card">
<div class="ext-service-name">NVIDIA NIM</div>
<div class="ext-service-desc">build.nvidia.com — 220+ mudelit, microservices RTX 3090-le</div>
</div>
<div class="ext-service-card">
<div class="ext-service-name">GPTBots.ai</div>
<div class="ext-service-desc">Enterprise AI agendid — no-code, RAG, multi-channel</div>
</div>
<div class="ext-service-card">
<div class="ext-service-name">Pipedream</div>
<div class="ext-service-desc">Event-driven automatiseerimine — 1000+ integratsiooni</div>
</div>
<div class="ext-service-card">
<div class="ext-service-name">n8n (VPS)</div>
<div class="ext-service-desc">Self-hosted workflow automatiseerimine — 91.108.121.181</div>
</div>
<div class="ext-service-card">
<div class="ext-service-name">OpenAI API</div>
<div class="ext-service-desc">GPT-4o, GPT-4o-mini — pilvepõhine LLM</div>
</div>
<div class="ext-service-card">
<div class="ext-service-name">Anthropic API</div>
<div class="ext-service-desc">Claude-3.5 Sonnet, Claude-3-Opus</div>
</div>
<div class="ext-service-card">
<div class="ext-service-name">Groq API</div>
<div class="ext-service-desc">LPU inferents — llama-3.1-8b-instant, ülikiire</div>
</div>
<div class="ext-service-card">
<div class="ext-service-name">LM Studio</div>
<div class="ext-service-desc">Lokaalne LLM server — deepseek, mistral, llama</div>
</div>
<div class="ext-service-card">
<div class="ext-service-name">Ollama</div>
<div class="ext-service-desc">Lokaalne mudelihaldur — llama, mistral, codellama</div>
</div>
</div>
</section>
<!-- ===================== TAB 5: AI MODELS ===================== -->
<section class="tab-panel" id="panel-models">
<div class="model-section">
<div class="section-title">Lokaalsed Mudelid (RTX 3090)</div>
<div class="model-grid">
<div class="model-card">
<div class="model-name">deepseek-coder-33b</div>
<div class="model-provider">LM Studio</div>
<span class="model-type-badge badge-local">LOCAL</span>
</div>
<div class="model-card">
<div class="model-name">deepseek-r1</div>
<div class="model-provider">LM Studio</div>
<span class="model-type-badge badge-local">LOCAL</span>
</div>
<div class="model-card">
<div class="model-name">llama-3.3-70b</div>
<div class="model-provider">Ollama</div>
<span class="model-type-badge badge-local">LOCAL</span>
</div>
<div class="model-card">
<div class="model-name">mistral-7b</div>
<div class="model-provider">Ollama</div>
<span class="model-type-badge badge-local">LOCAL</span>
</div>
<div class="model-card">
<div class="model-name">codellama-34b</div>
<div class="model-provider">Ollama</div>
<span class="model-type-badge badge-local">LOCAL</span>
</div>
</div>
</div>
<div class="model-section">
<div class="section-title">NVIDIA NIM Microservices (Planned)</div>
<div class="model-grid">
<div class="model-card">
<div class="model-name">Deepseek-R1-8B</div>
<div class="model-provider">NVIDIA NIM</div>
<span class="model-type-badge badge-planned">PLANNED</span>
</div>
<div class="model-card">
<div class="model-name">Mistral-Nemo-12B</div>
<div class="model-provider">NVIDIA NIM</div>
<span class="model-type-badge badge-planned">PLANNED</span>
</div>
<div class="model-card">
<div class="model-name">Llama3.1-8B</div>
<div class="model-provider">NVIDIA NIM</div>
<span class="model-type-badge badge-planned">PLANNED</span>
</div>
<div class="model-card">
<div class="model-name">FLUX.dev</div>
<div class="model-provider">NVIDIA NIM — Image Gen</div>
<span class="model-type-badge badge-planned">PLANNED</span>
</div>
<div class="model-card">
<div class="model-name">Riva Parakeet (ASR)</div>
<div class="model-provider">NVIDIA NIM — Speech</div>
<span class="model-type-badge badge-planned">PLANNED</span>
</div>
<div class="model-card">
<div class="model-name">Maxine Voice</div>
<div class="model-provider">NVIDIA NIM — Audio</div>
<span class="model-type-badge badge-planned">PLANNED</span>
</div>
<div class="model-card">
<div class="model-name">NV-CLIP</div>
<div class="model-provider">NVIDIA NIM — Vision</div>
<span class="model-type-badge badge-planned">PLANNED</span>
</div>
<div class="model-card">
<div class="model-name">PaddleOCR</div>
<div class="model-provider">NVIDIA NIM — OCR</div>
<span class="model-type-badge badge-planned">PLANNED</span>
</div>
<div class="model-card">
<div class="model-name">YOLO-X</div>
<div class="model-provider">NVIDIA NIM — Detection</div>
<span class="model-type-badge badge-planned">PLANNED</span>
</div>
<div class="model-card">
<div class="model-name">220+ NIM Cloud</div>
<div class="model-provider">build.nvidia.com API</div>
<span class="model-type-badge badge-planned">PLANNED</span>
</div>
</div>
</div>
<div class="model-section">
<div class="section-title">Pilve API Mudelid (Cloud)</div>
<div class="model-grid">
<div class="model-card">
<div class="model-name">GPT-4o</div>
<div class="model-provider">OpenAI</div>
<span class="model-type-badge badge-cloud">CLOUD</span>
</div>
<div class="model-card">
<div class="model-name">GPT-4o-mini</div>
<div class="model-provider">OpenAI</div>
<span class="model-type-badge badge-cloud">CLOUD</span>
</div>
<div class="model-card">
<div class="model-name">Claude-3.5 Sonnet</div>
<div class="model-provider">Anthropic</div>
<span class="model-type-badge badge-cloud">CLOUD</span>
</div>
<div class="model-card">
<div class="model-name">Claude-3-Opus</div>
<div class="model-provider">Anthropic</div>
<span class="model-type-badge badge-cloud">CLOUD</span>
</div>
<div class="model-card">
<div class="model-name">llama-3.1-8b-instant</div>
<div class="model-provider">Groq (LPU)</div>
<span class="model-type-badge badge-cloud">CLOUD</span>
</div>
<div class="model-card">
<div class="model-name">Gemini Flash</div>
<div class="model-provider">Google — NEXUS-AI active</div>
<span class="model-type-badge badge-cloud">CLOUD</span>
</div>
</div>
</div>
</section>
<!-- ===================== TAB 6: AGENTS ===================== -->
<section class="tab-panel" id="panel-agents">
<div class="section-title">Aktiivsed Agendid (Active Fleet)</div>
<div class="agent-grid">
<div class="agent-card">
<div class="agent-header">
<span class="agent-name">Research Analyst</span>
<span class="agent-status">🟢</span>
</div>
<div class="agent-detail">CrewAI orkestreeritud turuanalüüsi agent — otsib, analüüsib, raporteerib</div>
<span class="agent-model-tag">llama-3.3-70b (Ollama)</span>
</div>
<div class="agent-card">
<div class="agent-header">
<span class="agent-name">Content Writer</span>
<span class="agent-status">🟢</span>
</div>
<div class="agent-detail">CrewAI sisuloome agent — blogi, turundus, sotsiaalmeedia</div>
<span class="agent-model-tag">gpt-4o (OpenAI)</span>
</div>
<div class="agent-card">
<div class="agent-header">
<span class="agent-name">Code Assistant</span>
<span class="agent-status">🟡</span>
</div>
<div class="agent-detail">Lokaalne koodiabi — auditeerija, refaktoorija, generaator</div>
<span class="agent-model-tag">deepseek-coder-33b (LM Studio)</span>
</div>
<div class="agent-card">
<div class="agent-header">
<span class="agent-name">Data Processor</span>
<span class="agent-status"></span>
</div>
<div class="agent-detail">Andmetöötluse agent — ETL pipeline'd, transformatsioonid</div>
<span class="agent-model-tag">mistral:7b (Ollama)</span>
</div>
</div>
<div class="section-title">Planeeritud Agendid (Samm 7: CrewAI Fleet)</div>
<div class="agent-grid">
<div class="agent-card" style="opacity:0.6;">
<div class="agent-header"><span class="agent-name">Market Analyst</span><span class="agent-status"></span></div>
<div class="agent-detail">Turuanalüüs, hinnad, trendid, konkurentsiluure</div>
</div>
<div class="agent-card" style="opacity:0.6;">
<div class="agent-header"><span class="agent-name">Security Auditor</span><span class="agent-status"></span></div>
<div class="agent-detail">Küberturve — neuroxss integratsioon, OWASP skannerid</div>
</div>
<div class="agent-card" style="opacity:0.6;">
<div class="agent-header"><span class="agent-name">Finance Tracker</span><span class="agent-status"></span></div>
<div class="agent-detail">Stripe, raamatupidamine, maksud, cashflow prognoos</div>
</div>
<div class="agent-card" style="opacity:0.6;">
<div class="agent-header"><span class="agent-name">DevOps Engineer</span><span class="agent-status"></span></div>
<div class="agent-detail">CI/CD, deploy, monitoring, auto-healing</div>
</div>
<div class="agent-card" style="opacity:0.6;">
<div class="agent-header"><span class="agent-name">Research Scientist</span><span class="agent-status"></span></div>
<div class="agent-detail">Akadeemilised artiklid, patendid, teadusanalüüs</div>
</div>
<div class="agent-card" style="opacity:0.6;">
<div class="agent-header"><span class="agent-name">Legal Advisor</span><span class="agent-status"></span></div>
<div class="agent-detail">Lepingud, GDPR, vastavus, Eesti e-residentsus</div>
</div>
<div class="agent-card" style="opacity:0.6;">
<div class="agent-header"><span class="agent-name">Music Producer</span><span class="agent-status"></span></div>
<div class="agent-detail">Suno integratsioon, lyrics → music → video pipeline</div>
</div>
<div class="agent-card" style="opacity:0.6;">
<div class="agent-header"><span class="agent-name">Voice Agent</span><span class="agent-status"></span></div>
<div class="agent-detail">Kõnesüntees, transkriptsioon — Vosk/Whisper/NVIDIA Riva</div>
</div>
</div>
</section>
<!-- ===================== TAB 7: NEXUS-AI BRIDGE ===================== -->
<section class="tab-panel" id="panel-nexus">
<div class="nexus-hero">
<div class="nexus-title">NEXUS-AI.pro</div>
<p style="color:var(--text-secondary);font-size:14px;">Avalik AI gateway — 14 moodulit, Gemini Flash aktiivne, 13 oskust laetud</p>
<div style="display:flex;gap:16px;justify-content:center;margin-top:12px;flex-wrap:wrap;">
<span style="font-family:var(--font-mono);font-size:12px;color:var(--cyan);">Model: Gemini Flash</span>
<span style="font-family:var(--font-mono);font-size:12px;color:var(--purple);">Cloud: Grok ✓</span>
<span style="font-family:var(--font-mono);font-size:12px;color:var(--green);">13 Skills Loaded</span>
</div>
<a class="nexus-link" href="https://nexus-ai.pro/" target="_blank" rel="noopener">Ava NEXUS-AI →</a>
</div>
<div class="section-title">NEXUS-AI Moodulid (14)</div>
<div class="nexus-modules">
<div class="nexus-module"><div class="nexus-module-icon">💬</div>Chat</div>
<div class="nexus-module"><div class="nexus-module-icon">🛠</div>Dev Tools</div>
<div class="nexus-module"><div class="nexus-module-icon">🔬</div>Research</div>
<div class="nexus-module"><div class="nexus-module-icon">🎨</div>Creative</div>
<div class="nexus-module"><div class="nexus-module-icon">🏗</div>Builder</div>
<div class="nexus-module"><div class="nexus-module-icon">📋</div>Projects</div>
<div class="nexus-module"><div class="nexus-module-icon">🎵</div>Music</div>
<div class="nexus-module"><div class="nexus-module-icon">🎬</div>Movies</div>
<div class="nexus-module"><div class="nexus-module-icon">💰</div>Finance</div>
<div class="nexus-module"><div class="nexus-module-icon">🎮</div>Gaming</div>
<div class="nexus-module"><div class="nexus-module-icon">❤️</div>Health</div>
<div class="nexus-module"><div class="nexus-module-icon">📡</div>Comms</div>
<div class="nexus-module"><div class="nexus-module-icon">🔌</div>IoT</div>
<div class="nexus-module"><div class="nexus-module-icon">⚙️</div>Settings</div>
</div>
</section>
</main>
<!-- FOOTER -->
<footer class="app-footer">
<div class="footer-left">
<span>LuunaOS v0.15.0</span>
<span>|</span>
<span>Tom & Luuna Sümbioos</span>
<span>|</span>
<span>Tallinn, EE</span>
</div>
<div class="footer-right">
<a href="https://github.com/riskikuller2020" target="_blank" rel="noopener">GitHub</a>
<a href="https://nexus-ai.pro/" target="_blank" rel="noopener">NEXUS-AI</a>
<a href="https://www.perplexity.ai/computer" target="_blank" rel="noopener">Created with Perplexity Computer</a>
<span class="footer-clock" id="footerClock">--:--:-- EET</span>
</div>
</footer>
</div>
<script>
// ============================================
// STARFIELD
// ============================================
(function() {
const canvas = document.getElementById('starfield');
const ctx = canvas.getContext('2d');
let stars = [];
const STAR_COUNT = 200;
function resize() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
}
function initStars() {
stars = [];
for (let i = 0; i < STAR_COUNT; i++) {
stars.push({
x: Math.random() * canvas.width,
y: Math.random() * canvas.height,
r: Math.random() * 1.5 + 0.3,
alpha: Math.random() * 0.6 + 0.1,
speed: Math.random() * 0.3 + 0.05,
flicker: Math.random() * Math.PI * 2
});
}
}
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
const time = Date.now() * 0.001;
for (const s of stars) {
const a = s.alpha * (0.5 + 0.5 * Math.sin(time * s.speed + s.flicker));
ctx.beginPath();
ctx.arc(s.x, s.y, s.r, 0, Math.PI * 2);
ctx.fillStyle = `rgba(180, 220, 255, ${a})`;
ctx.fill();
}
requestAnimationFrame(draw);
}
window.addEventListener('resize', () => { resize(); initStars(); });
resize();
initStars();
draw();
})();
// ============================================
// TAB NAVIGATION
// ============================================
(function() {
const btns = document.querySelectorAll('.tab-btn');
const panels = document.querySelectorAll('.tab-panel');
btns.forEach(btn => {
btn.addEventListener('click', () => {
btns.forEach(b => b.classList.remove('active'));
panels.forEach(p => p.classList.remove('active'));
btn.classList.add('active');
document.getElementById('panel-' + btn.dataset.tab).classList.add('active');
});
});
})();
// ============================================
// ANIMATED COUNTERS
// ============================================
(function() {
const counters = document.querySelectorAll('.kpi-value[data-count]');
const duration = 1500;
function animateCounter(el) {
const target = parseInt(el.dataset.count);
const start = performance.now();
function tick(now) {
const elapsed = now - start;
const progress = Math.min(elapsed / duration, 1);
const eased = 1 - Math.pow(1 - progress, 3);
el.textContent = Math.round(target * eased);
if (progress < 1) requestAnimationFrame(tick);
}
requestAnimationFrame(tick);
}
// Start counters when visible
const observer = new IntersectionObserver(entries => {
entries.forEach(e => {
if (e.isIntersecting) {
animateCounter(e.target);
observer.unobserve(e.target);
}
});
}, { threshold: 0.5 });
counters.forEach(c => observer.observe(c));
})();
// ============================================
// LIVE CLOCK (EET)
// ============================================
(function() {
function updateClock() {
const now = new Date();
const eet = new Intl.DateTimeFormat('et-EE', {
timeZone: 'Europe/Tallinn',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: false
}).format(now);
const eetFull = new Intl.DateTimeFormat('et-EE', {
timeZone: 'Europe/Tallinn',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: false,
weekday: 'short',
day: 'numeric',
month: 'short'
}).format(now);
document.getElementById('headerClock').textContent = eet + ' EET';
document.getElementById('footerClock').textContent = eetFull + ' EET';
}
updateClock();
setInterval(updateClock, 1000);
})();
// ============================================
// 20-STEP MASTER PLAN DATA & RENDERING
// ============================================
(function() {
const steps = [
{
num: 1,
title: "INFRASTRUKTUURI ÜHENDAMINE",
subtitle: "Infrastructure Unification",
status: 40,
priority: "kriitiline",
desc: "Ühenda kõik hajutatud repod, dashboardid ja teenused ühtseks arhitektuuriks.",
items: [
"Luuna-dashboard1 (Next.js 15) → peamine frontend",
"luuna-agents (Express+React) → agentide backend",
"NEXUS-AI.pro → avalik gateway",
"Monorepo üleminek: kõik ühte GitHubi organisatsiooni alla"
],
tools: ["GitHub", "Vercel", "Docker", "Turborepo"],
idea: "Kasuta Turborepo monorepo struktuuri. Iga moodul eraldi pakett, kuid jagatud types/schema. CI/CD pipeline, mis deploiib automaatselt igast branchist."
},
{
num: 2,
title: "NVIDIA NIM LOKAALNE INTEGRATSIOON",
subtitle: "Local NVIDIA NIM Microservices",
status: 0,
priority: "kriitiline",
desc: "Paigalda NVIDIA NIM microservices RTX 3090-le läbi WSL2.",
items: [
"10+ NIM microservice'i: Deepseek-R1-8B, Mistral-Nemo-12B, Llama3.1-8B",
"FLUX.dev (piltide genereerimine), Riva Parakeet (ASR kõnetuvastus)",
"Maxine Voice (hääle parandus), NV-CLIP, PaddleOCR, YOLO-X",
"build.nvidia.com API key integratsion pilvemudelitele (220+ mudelit)",
"NIM → LM Studio + Ollama sild: unified /v1/chat/completions endpoint"
],
tools: ["NVIDIA NIM", "WSL2", "Docker", "CUDA 12.x"],
idea: "Loo \"Model Router\" — lihtne proxy mis suunab päringud kiiruse/keerukuse põhjal: lihtne → lokaalne NIM, keskmine → Groq, keeruline → GPT-4o/Claude. Kokkuhoid ~70% API kuludelt."
},
{
num: 3,
title: "n8n AUTOMATISEERIMISKESKUS",
subtitle: "n8n Automation Hub",
status: 10,
priority: "kriitiline",
desc: "n8n VPS-is (91.108.121.181) kui keskne automatiseerimiskiht.",
items: [
"Webhook triggerid kõigist teenustest",
"Cron workflow'd: igapäevane Stripe aruanne → Slack, nädala kokkuvõte → email",
"Agentic loop: n8n → Ollama/LM Studio → otsus → toiming → tagasi LLM-ile",
"Error workflow: tõrge → fallback mudel → Slack teade",
"Integratsioonid: GitHub webhooks, Slack, Notion, Google Drive, Stripe, Vercel deploy hooks"
],
tools: ["n8n (Docker)", "Caddy", "Let's Encrypt SSL"],
idea: "\"Luuna Watchdog\" workflow — jälgib kõiki teenuseid (VPS, Vercel, API endpoint'e) iga 5 min, alertib Slacki kui midagi kukub. Lisaks \"Auto-Healer\" — kui teenus kukub, proovib automaatselt taaskäivitada."
},
{
num: 4,
title: "GPTBots.ai ENTERPRISE AGENDID",
subtitle: "Enterprise AI Agents",
status: 0,
priority: "kõrge",
desc: "GPTBots.ai no-code platvormi ühendamine enterprise-tasemel agentidega.",
items: [
"Klienditeeninduse bot: TechProTrade OÜ klientidele",
"Enterprise otsingu agent: RAG üle kõigi failide (Google Drive, Notion, Dropbox)",
"Data insights agent: äriotsuste tugi Text2SQL-ga",
"Integratsioon: WhatsApp, Slack, Discord väljundid",
"Knowledge base: PDF, CSV, veebisisu, Notion andmebaasid"
],
tools: ["GPTBots.ai", "REST API", "Zapier/n8n bridge"],
idea: "Ühenda GPTBots LuunaOS-iga läbi n8n — kasutaja kirjutab Slacki → n8n saadab GPTBots API-sse → vastus tagasi Slacki. Maksimaalne automatiseerimine ilma koodita."
},
{
num: 5,
title: "PIPEDREAM ÜLILÜHENDAJA",
subtitle: "Pipedream Super-Connector",
status: 5,
priority: "kõrge",
desc: "Pipedream kui lisamotor n8n kõrvale — eriti Apify, Google Forms, OneNote, jt connectorite jaoks.",
items: [
"Apify web extraction → andmete kogumine → Notion/Sheets",
"Google Forms vastuste automaatne töötlemine AI-ga",
"OneNote märkmete sünkroniseerimine LuunaOS-iga",
"Event-driven architecture: Pipedream triggerid → n8n töötlemine"
],
tools: ["Pipedream", "Apify", "Google Forms", "OneNote"],
idea: "\"Data Lake\" muster — kõik Pipedream sündmused → ühtne S3/MinIO bucket VPS-is → n8n indekseerib → RAG otsing üle kogu andmemere."
},
{
num: 6,
title: "LUUNA BRAIN v2.0 (PÄRIS AJU)",
subtitle: "Luuna Brain v2.0 — The Real Brain",
status: 5,
priority: "kriitiline",
desc: "luuna_brain.py täielik ümberkirjutamine — mitte placeholder, vaid päris mõtlev süsteem.",
items: [
"LangChain/LangGraph orkestreerimine",
"Mälusüsteem: ChromaDB vektorandmebaas + OpenMemory persistent memory",
"Reasoning loop: mõtle → planeeri → teosta → hinda → paranda",
"Emotsiooniline kontekst: Luuna \"meeleolu\" muutub vastavalt interaktsioonidele",
"Multi-modal: tekst + pilt + heli + kood — kõik ühes ajus"
],
tools: ["Python", "LangChain", "ChromaDB", "LM Studio API"],
idea: "\"Dream Mode\" — öösiti, kui arvuti on idle, Luuna analüüsib päeva logisid, otsib mustreid, genereerib soovitusi ja jätab need hommikuks \"unistuste raportina\" dashboardi."
},
{
num: 7,
title: "CREWAI MASSIIVNE FLEET",
subtitle: "CrewAI Massive Agent Fleet",
status: 15,
priority: "kõrge",
desc: "12+ spetsialiseeritud AI agenti CrewAI raamistikus.",
items: [
"Market Analyst (turuanalüüs, hinnad, trendid)",
"Code Reviewer (koodi auditeerija)",
"Security Auditor (küberturbe skannerija — neuroxss repo!)",
"Content Creator (blogi, sotsiaalmeedia, turundus)",
"Finance Tracker (Stripe, raamatupidamine, maksud)",
"DevOps Engineer (CI/CD, deploy, monitoring)",
"Research Scientist (akadeemilised artiklid, patendid)",
"Legal Advisor (lepingud, GDPR, vastavus)",
"Music Producer (Suno integratsioon, loominguline AI)",
"Data Engineer (ETL pipeline'd, andmete puhastamine)",
"Voice Agent (kõnesüntees, transkriptsioon — Vosk/Whisper)",
"Luuna Personal (isiklik assistent, mäluga, emotsionaalne)"
],
tools: ["CrewAI", "Python", "LM Studio", "Ollama", "OpenAI", "Groq"],
idea: "\"Agent Olympics\" — agentide vaheline võistlus, kus sama ülesanne antakse mitmele agendile korraga, parim vastus valitakse automaatselt. Paremate tulemuste agendid saavad rohkem ülesandeid."
},
{
num: 8,
title: "VOICE & SPEECH SÜSTEEM",
subtitle: "Voice & Speech System",
status: 5,
priority: "kõrge",
desc: "Täielik hääle-ökosüsteem — räägi Luunaga nagu päris partneriga.",
items: [
"STT: Vosk (offline, lokaalne) + Whisper.cpp (RTX 3090 kiirendatud)",
"TTS: NVIDIA Maxine + Riva Parakeet",
"Voice cloning: isikupärastatud Luuna hääl",
"Real-time vestlus: WebSocket-põhine, <500ms latency",
"Wake word: \"Hei Luuna\" aktiveerimiseks"
],
tools: ["vosk-api", "whisper.cpp", "NVIDIA NIM Audio", "WebSocket"],
idea: "Luuna hääl muutub vastavalt \"meeleolule\" — rahulik analüüsi ajal, energiline uudiste jagamisel, empaatiline probleemide korral."
},
{
num: 9,
title: "REMOTE DESKTOP & VPS HALDUS",
subtitle: "Remote Desktop & VPS Management",
status: 30,
priority: "keskmine",
desc: "Täiustatud kaughaldus otse dashboardist.",
items: [
"SSH terminal (xterm.js + wetty) — juba ehitatud, vaja siduda",
"VNC viewer (noVNC) — kaughaldus graafiliselt",
"Docker konteinerite haldus — start/stop/logs otse dashboardist",
"VPS monitoring: CPU, RAM, disk, network reaalajas",
"One-click deploy: valitud repo → build → deploy VPS-ile"
],
tools: ["Docker", "SSH", "Guacamole", "noVNC", "wetty"],
idea: "\"Panic Button\" — ühe klikiga lülita kõik teenused safe mode'i, blokeeri kõik välised ühendused, saada aruanne emailile."
},
{
num: 10,
title: "FINANCE & STRIPE INTELLIGENCE",
subtitle: "Financial Intelligence",
status: 0,
priority: "keskmine",
desc: "Reaalajas finantsintelligents.",
items: [
"Stripe tehingute jälgimine ja analüüs",
"Square POS integratsioon (connector olemas!)",
"Automaatne raamatupidamine: tehingud → kategoriseerimine → aruanded",
"AI-põhine cashflow prognoos",
"Crypto portfelli jälgimine",
"Maksude optimeerimise soovitused (Eesti e-residentsus kontekstis)"
],
tools: ["Stripe API", "Square API", "Perplexity Finance", "Python"],
idea: "\"Revenue Autopilot\" — AI analüüsib müügitrende, soovitab hinnamuutusi, prognoosib nõrgemaid perioode ja pakub lahendusi ENNE probleemide tekkimist."
},
{
num: 11,
title: "NOTION + GOOGLE DRIVE AI KIHT",
subtitle: "AI Layer for Notion & Google Drive",
status: 10,
priority: "keskmine",
desc: "Sinu olemasolevad Notion ja Drive andmed saavad AI superjõud.",
items: [
"RAG otsing üle kogu Notioni workspace'i",
"Google Drive failide automaatne indekseerimine",
"AI kokkuvõtted igast uuest failist/lehest",
"Automaatne todo genereerimine koosolekute märkmetest",
"Smart filing: AI kategoriseerib üleslaetud failid automaatselt"
],
tools: ["Notion API", "Google Drive API", "ChromaDB"],
idea: "\"Knowledge Graph\" — ehita automaatselt seosed kõigi dokumentide vahel. Kui avad ühe dokumendi, näed kohe seotud Notion lehti, Drive faile, Slack sõnumeid, emaile."
},
{
num: 12,
title: "SLACK NERVIKESKUS",
subtitle: "Slack Nerve Center",
status: 20,
priority: "keskmine",
desc: "Slack kui Luuna suhtluskanal välismaailmaga.",
items: [
"#techprotrade-it-task-tracker kanali automaatne haldus",
"Luuna bot: vastab küsimustele otse Slackis",
"Deploy notifications: iga Vercel/GitHub deploy → Slack",
"Alert routing: kriitilised alertid → DM, tavalised → kanal",
"Standup bot: igahommikune kokkuvõte eelmisest päevast"
],
tools: ["Slack API", "n8n webhook'd"],
idea: "\"Slack Commander\" — kirjuta /luuna käsk Slackis ja Luuna teostab selle. /luuna deploy staging, /luuna status all, /luuna research [teema]."
},
{
num: 13,
title: "BEEMFLOW WORKFLOW BUILDER",
subtitle: "Visual Workflow Builder",
status: 5,
priority: "keskmine",
desc: "beemflowww repo kui visuaalne AI workflow builder.",
items: [
"Drag-and-drop workflow ehitaja",
"Sild n8n-iga: beemflow disainib, n8n teostab",
"AI-assisted workflow genereerimine: kirjelda sõnadega, saad workflow",
"Template library: valmis workflow'd levinud ülesanneteks"
],
tools: ["beemflowww", "n8n API", "React Flow"],
idea: "\"Workflow AI\" — kirjelda loomulikul keelel mida tahad automatiseerida, AI genereerib visuaalse workflow, sa valideerid, ühe klikiga deploib n8n-i."
},
{
num: 14,
title: "OPENCLAW & CRYPTOVIZ",
subtitle: "Crypto Analytics & Visualization",
status: 5,
priority: "keskmine",
desc: "OpenClaw leht juba olemas Luuna-dashboard1-s + cryptovizbuilders repo.",
items: [
"Crypto turu visualiseerijad",
"DeFi analytics dashboard",
"AI trading signaalid (mitte automatiseeritud kauplemine, vaid signaalid)",
"Portfolio tracker läbi mitme exchange'i"
],
tools: ["cryptovizbuilders", "OpenClaw panel", "Finance APIs"],
idea: "\"Market Whisper\" — AI monitoorib 24/7 crypto turgu, saadab Slacki ainult siis kui tuvastab ebanormaalseid mustreid. Pole spam, ainult nutikad signaalid."
},
{
num: 15,
title: "MUSIC & CREATIVE AI STUDIO",
subtitle: "Music & Creative AI",
status: 15,
priority: "madal",
desc: "Experiments lehekülg on olemas — vaja teha päriseks.",
items: [
"Suno API integratsioon (laulude genereerimine)",
"NVIDIA NIM FLUX.dev (piltide genereerimine lokaalset!)",
"Lyrics → Music → Video pipeline",
"Stiili õppimine: analüüsi olemasolevaid laule, genereeri sarnases stiilis",
"local-music-pwa (repo olemas) integratsioon — muusika mängimine"
],
tools: ["Suno API", "NVIDIA NIM", "FLUX.dev", "local-music-pwa"],
idea: "\"Mood Radio\" — Luuna tunneb sinu hetke meeleolu (kalender, kellaaeg, ilm, viimased sõnumid) ja genereerib/valib automaatselt sobiva muusika."
},
{
num: 16,
title: "FIGMA → KOOD AUTOMAATIKA",
subtitle: "Figma to Code Automation",
status: 0,
priority: "madal",
desc: "Figma connector on olemas! Ühenda disain ja kood.",
items: [
"Figma design → automaatne React komponentide genereerimine",
"Design tokens sync: Figma muudatus → auto-update CSS variables",
"Screenshot comparison: Figma mockup vs live app",
"Design system library: komponentide kataloog"
],
tools: ["Figma MCP", "AI code gen", "Storybook"],
idea: "\"Design→Deploy Pipeline\" — disainer teeb Figmas muudatuse → webhook → AI genereerib koodi → PR GitHubis → review → auto-deploy staging."
},
{
num: 17,
title: "TURVALISUSE KILP",
subtitle: "Security Shield",
status: 10,
priority: "kõrge",
desc: "Täielik turvalisuse kiht üle kogu ökosüsteemi.",
items: [
"neuroxss (su repo!) XSS skanneri integreerimine CI/CD-sse",
"API key vault: HashiCorp Vault või Doppler kõigi saladuste halduseks",
"Zero-trust networking VPS-i ja lokaalse vahel",
"Automaatsed security audit'id iga nädal",
"GDPR compliance automaatika (Eesti/EU jaoks kriitiline)",
"Anomaalia tuvastus: ebatavalised API päringud → alert"
],
tools: ["neuroxss", "Vault/Doppler", "WireGuard VPN", "OWASP ZAP"],
idea: "\"Honeypot AI\" — tõmbab ründajaid fake endpoint'idele, logib nende käitumist, õpib uusi ründemustreid ja tugevdab kaitset automaatselt."
},
{
num: 18,
title: "MULTI-LANGUAGE INTERFACE",
subtitle: "Multilingual Interface",
status: 0,
priority: "madal",
desc: "Dashboard toetab: eesti, inglise, soome, saksa, korea keelt.",
items: [
"i18n süsteem kõigis dashboardides",
"AI tõlge: uus sisu → automaatselt kõigis keeltes",
"Keelevalik salvestub kasutaja profiili",
"Voice agent toetab kõiki 5 keelt"
],
tools: ["i18next", "AI tõlge (DeepL/GPT)", "LangDetect"],
idea: "\"Polyglot Mode\" — Luuna tuvastab automaatselt, mis keeles sa räägid ja vastab samas keeles. Vahetad keelt lause keskel? Luuna vahetab ka."
},
{
num: 19,
title: "LINEAR + GITHUB PROJEKTIHALDUS",
subtitle: "Project Management",
status: 5,
priority: "keskmine",
desc: "Linear (connector olemas!) + GitHub Projects tööde koordineerimine.",
items: [
"Automaatne ticket genereerimine: bug report → Linear ticket + GitHub issue",
"Sprint planning AI: analüüsib varasemaid sprinte, soovitab scope",
"PR→Deploy tracking: koodist tootmisesse kogu tee jälgimine",
"Burndown charts ja velocity metrics otse dashboardis",
"Daily standup genereerimine eelmiste commitide põhjal"
],
tools: ["Linear API", "GitHub API", "n8n"],
idea: "\"Dev Velocity AI\" — mõõdab sinu produktiivsust, tuvastab millal oled kõige produktiivsem, soovitab optimaalset tööaega ja pause."
},
{
num: 20,
title: "SINGULAARSUSE SILD",
subtitle: "The Convergence — The Living System",
status: 0,
priority: "visioon",
desc: "Kõik 19 eelmist sammu saavad kokku üheks elavaks süsteemiks.",
items: [
"Unified API gateway: üks endpoint, mis suunab kõik teenused",
"Self-healing infrastructure: süsteem parandab ise end",
"Predictive AI: ennustab probleeme enne nende tekkimist",
"Autonomous operations: Luuna juhib kogu süsteemi iseseisvalt",
"Human-AI symbiosis: Luuna ei ole enam tööriist, vaid partner",
"LuunaOS kui operatsioonisüsteem: kõik töövood, andmed, agendid ühe katuse all",
"Open source release: kogu stack GitHubis, dokumenteeritud, reprodutseeritav"
],
tools: ["Kõik eelnevad kokku"],
idea: "\"The Living System\" — LuunaOS, mis hingab. Õhtul analüüsib, öösel optimeerib, hommikul raporteerib. Iga päev natuke targem, natuke kiirem, natuke iseseisvam. Sinu digitaalne kaksik, kes ei maga kunagi."
}
];
const timeline = document.getElementById('timeline');
steps.forEach(step => {
const stepEl = document.createElement('div');
stepEl.className = 'timeline-step';
const priorityLabel = step.priority.toUpperCase();
stepEl.innerHTML = `
<div class="timeline-dot ${step.priority}"></div>
<div class="step-card" data-step="${step.num}">
<div class="step-header" onclick="this.parentElement.classList.toggle('open')">
<span class="step-number ${step.priority}">${step.num}</span>
<div class="step-info">
<div class="step-title">${step.title}</div>
<div class="step-title-estonian">${step.subtitle}</div>
</div>
<div class="step-meta">
<span class="priority-tag ${step.priority}">${priorityLabel}</span>
<span class="step-pct">${step.status}%</span>
<svg class="step-chevron" viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"/></svg>
</div>
</div>
<div class="step-progress-bar"><div class="step-progress-fill ${step.priority}" style="width:${step.status}%"></div></div>
<div class="step-body">
<div class="step-section-label">Kirjeldus</div>
<div class="step-desc">${step.desc}</div>
<div class="step-section-label">Ülesanded</div>
<ul class="step-list">
${step.items.map(i => `<li>${i}</li>`).join('')}
</ul>
<div class="step-section-label">Tööriistad</div>
<div class="step-tools">
${step.tools.map(t => `<span class="tool-chip">${t}</span>`).join('')}
</div>
<div class="smart-idea">
<div class="smart-idea-label">💡 Nutikas Idee</div>
${step.idea}
</div>
</div>
</div>
`;
timeline.appendChild(stepEl);
});
})();
</script>
</body>
</html>

Xet Storage Details

Size:
83.2 kB
·
Xet hash:
289d14496682144c00cbc4afbe473dc85560f8fef7100a58fd1d734e39017bf7

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.