Show description
THERMO-eVTOL | Thermodynamic Computing for Autonomous Systems
THERMO-eVTOL | Thermodynamic Computing for Autonomous Systems
THERMO-eVTOL
Features
Architecture
Performance
GitHub
Documentation
THERMO-eVTOL
THERMODYNAMIC COMPUTING FOR AUTONOMOUS SYSTEMS
Next-generation multi-agent coordination platform leveraging energy-based models
and Boltzmann distributions for unprecedented autonomous vehicle orchestration.
Production-ready framework with distributed training, real-time monitoring,
and FAA-compliant safety protocols.
DEPLOY NOW
VIEW DEMO
99.7%
Collision Avoidance
1M+
Training Steps/Sec
256
Concurrent Agents
0.3ms
Decision Latency
CORE CAPABILITIES
🔥
Thermodynamic Decision Making
Leverages Boltzmann distributions and energy-based models for optimal
action sampling. Inspired by Extropic AI's THRML architecture for
probabilistic decision-making under uncertainty.
⚡
Block Gibbs Coordination
Advanced multi-agent coordination using Block Gibbs sampling to
partition agents into optimal coordination groups, enabling
scalable fleet management up to 256 concurrent vehicles.
🛡️
FAA Compliance Engine
Built-in compliance manager enforcing geofencing, altitude restrictions,
and separation requirements. Real-time validation against FAA Part 107
and emerging UAM regulations.
🌪️
Edge Case Injection
Comprehensive edge case manager simulating GPS failures, sensor
malfunctions, bird strikes, and adverse weather conditions for
robust training in failure scenarios.
📊
Real-Time Analytics
Production-grade monitoring dashboard with live simulation view,
training metrics, replay analysis, and performance profiling.
Streamlit-based interface with sub-second updates.
🚀
Distributed Training
Ray-based distributed training supporting PPO, DDPG, and custom
thermodynamic algorithms.…
THERMO-eVTOL | Thermodynamic Computing for Autonomous Systems
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>THERMO-eVTOL | Thermodynamic Computing for Autonomous Systems</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
:root {
--black: #000000;
--dark: #0a0a0a;
--grey: #888;
--light-grey: #ccc;
--white: #fff;
--accent: #00ffcc;
--danger: #ff0040;
--warning: #ffaa00;
--grid: #1a1a1a;
}
body {
font-family: 'SF Mono', 'Monaco', 'Inconsolata', monospace;
background: var(--black);
color: var(--light-grey);
overflow-x: hidden;
cursor: crosshair;
}
/* Custom Cursor */
.cursor-dot {
width: 4px;
height: 4px;
background: var(--accent);
position: fixed;
pointer-events: none;
z-index: 9999;
border-radius: 50%;
box-shadow: 0 0 10px var(--accent);
}
/* Grid Background */
.grid-bg {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image:
linear-gradient(var(--grid) 1px, transparent 1px),
linear-gradient(90deg, var(--grid) 1px, transparent 1px);
background-size: 50px 50px;
opacity: 0.3;
z-index: -1;
animation: grid-move 20s linear infinite;
}
@keyframes grid-move {
0% { transform: translate(0, 0); }
100% { transform: translate(50px, 50px); }
}
/* Navigation */
nav {
position: fixed;
top: 0;
width: 100%;
padding: 20px 50px;
background: rgba(0, 0, 0, 0.9);
border-bottom: 1px solid var(--grid);
backdrop-filter: blur(10px);
z-index: 1000;
}
.nav-container {
max-width: 1400px;
margin: 0 auto;
display: flex;
justify-content: space-between;
align-items: center;
}
.logo {
font-size: 24px;
font-weight: bold;
letter-spacing: 2px;
color: var(--white);
text-decoration: none;
position: relative;
}
.logo::before {
content: "";
position: absolute;
left: -20px;
top: 50%;
transform: translateY(-50%);
width: 10px;
height: 10px;
background: var(--accent);
box-shadow: 0 0 20px var(--accent);
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
.nav-links {
display: flex;
gap: 40px;
list-style: none;
}
.nav-links a {
color: var(--grey);
text-decoration: none;
font-size: 12px;
text-transform: uppercase;
letter-spacing: 1px;
transition: all 0.3s;
position: relative;
}
.nav-links a:hover {
color: var(--white);
}
.nav-links a::after {
content: "";
position: absolute;
bottom: -5px;
left: 0;
width: 0;
height: 1px;
background: var(--accent);
transition: width 0.3s;
}
.nav-links a:hover::after {
width: 100%;
}
/* Hero Section */
.hero {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
position: relative;
margin-top: 60px;
}
.hero-content {
text-align: center;
z-index: 10;
max-width: 1000px;
padding: 0 20px;
}
.hero-title {
font-size: clamp(40px, 8vw, 80px);
font-weight: 100;
letter-spacing: 8px;
color: var(--white);
margin-bottom: 20px;
opacity: 0;
animation: fadeInUp 1s forwards;
}
.hero-subtitle {
font-size: 16px;
color: var(--accent);
letter-spacing: 4px;
margin-bottom: 30px;
opacity: 0;
animation: fadeInUp 1s 0.3s forwards;
}
.hero-description {
font-size: 14px;
line-height: 1.8;
color: var(--grey);
margin-bottom: 40px;
opacity: 0;
animation: fadeInUp 1s 0.6s forwards;
}
@keyframes fadeInUp {
to {
opacity: 1;
transform: translateY(0);
}
from {
opacity: 0;
transform: translateY(30px);
}
}
/* CTA Buttons */
.cta-buttons {
display: flex;
gap: 20px;
justify-content: center;
opacity: 0;
animation: fadeInUp 1s 0.9s forwards;
}
.btn {
padding: 15px 40px;
border: 1px solid var(--grey);
background: transparent;
color: var(--white);
text-decoration: none;
font-size: 12px;
letter-spacing: 2px;
text-transform: uppercase;
cursor: pointer;
transition: all 0.3s;
position: relative;
overflow: hidden;
}
.btn::before {
content: "";
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: var(--accent);
transition: left 0.3s;
z-index: -1;
}
.btn:hover {
color: var(--black);
border-color: var(--accent);
}
.btn:hover::before {
left: 0;
}
.btn-secondary {
border-color: var(--grid);
color: var(--grey);
}
/* Floating Particles */
.particles {
position: absolute;
width: 100%;
height: 100%;
overflow: hidden;
}
.particle {
position: absolute;
width: 2px;
height: 2px;
background: var(--accent);
opacity: 0.5;
animation: float 10s infinite linear;
}
@keyframes float {
from {
transform: translateY(100vh) rotate(0deg);
opacity: 0;
}
10% {
opacity: 0.5;
}
90% {
opacity: 0.5;
}
to {
transform: translateY(-10vh) rotate(360deg);
opacity: 0;
}
}
/* Stats Section */
.stats {
padding: 100px 50px;
background: var(--black);
border-top: 1px solid var(--grid);
border-bottom: 1px solid var(--grid);
}
.stats-container {
max-width: 1200px;
margin: 0 auto;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 40px;
}
.stat-card {
text-align: center;
padding: 30px;
border: 1px solid var(--grid);
position: relative;
transition: all 0.3s;
}
.stat-card::before {
content: "";
position: absolute;
top: -1px;
left: -1px;
right: -1px;
bottom: -1px;
background: linear-gradient(45deg, var(--accent), transparent);
opacity: 0;
transition: opacity 0.3s;
z-index: -1;
}
.stat-card:hover {
transform: translateY(-5px);
border-color: var(--accent);
}
.stat-card:hover::before {
opacity: 0.3;
}
.stat-number {
font-size: 48px;
font-weight: 100;
color: var(--white);
margin-bottom: 10px;
}
.stat-label {
font-size: 12px;
text-transform: uppercase;
letter-spacing: 2px;
color: var(--grey);
}
/* Features Section */
.features {
padding: 100px 50px;
background: var(--black);
}
.features-container {
max-width: 1200px;
margin: 0 auto;
}
.section-title {
font-size: 36px;
font-weight: 100;
text-align: center;
margin-bottom: 60px;
color: var(--white);
letter-spacing: 4px;
}
.features-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
gap: 30px;
}
.feature-card {
padding: 40px;
border: 1px solid var(--grid);
position: relative;
overflow: hidden;
transition: all 0.3s;
}
.feature-card::after {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 2px;
background: linear-gradient(90deg, transparent, var(--accent), transparent);
animation: scan 3s infinite;
}
@keyframes scan {
0% { transform: translateX(-100%); }
100% { transform: translateX(100%); }
}
.feature-icon {
width: 40px;
height: 40px;
margin-bottom: 20px;
border: 1px solid var(--accent);
display: flex;
align-items: center;
justify-content: center;
font-size: 20px;
color: var(--accent);
}
.feature-title {
font-size: 18px;
margin-bottom: 15px;
color: var(--white);
letter-spacing: 1px;
}
.feature-description {
font-size: 13px;
line-height: 1.6;
color: var(--grey);
}
/* Tech Stack */
.tech-stack {
padding: 100px 50px;
background: var(--dark);
border-top: 1px solid var(--grid);
}
.tech-grid {
max-width: 1000px;
margin: 60px auto 0;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 20px;
}
.tech-item {
padding: 20px;
border: 1px solid var(--grid);
text-align: center;
font-size: 12px;
letter-spacing: 1px;
color: var(--grey);
transition: all 0.3s;
position: relative;
overflow: hidden;
}
.tech-item:hover {
color: var(--white);
border-color: var(--accent);
transform: scale(1.05);
}
/* Architecture Section */
.architecture {
padding: 100px 50px;
background: var(--black);
}
.arch-diagram {
max-width: 1200px;
margin: 60px auto;
padding: 40px;
border: 1px solid var(--grid);
position: relative;
}
.arch-layer {
padding: 30px;
margin: 20px 0;
border: 1px solid var(--grid);
position: relative;
transition: all 0.3s;
}
.arch-layer:hover {
border-color: var(--accent);
background: rgba(0, 255, 204, 0.02);
}
.arch-layer-title {
font-size: 16px;
color: var(--white);
margin-bottom: 10px;
letter-spacing: 2px;
}
.arch-layer-components {
display: flex;
flex-wrap: wrap;
gap: 15px;
margin-top: 15px;
}
.arch-component {
padding: 8px 15px;
border: 1px solid var(--grid);
font-size: 11px;
color: var(--grey);
letter-spacing: 1px;
}
/* Performance Metrics */
.metrics {
padding: 100px 50px;
background: var(--dark);
border-top: 1px solid var(--grid);
}
.metrics-container {
max-width: 1200px;
margin: 0 auto;
}
.metric-bars {
margin-top: 60px;
}
.metric-item {
margin-bottom: 40px;
}
.metric-header {
display: flex;
justify-content: space-between;
margin-bottom: 10px;
}
.metric-label {
font-size: 12px;
text-transform: uppercase;
letter-spacing: 2px;
color: var(--grey);
}
.metric-value {
font-size: 14px;
color: var(--white);
}
.metric-bar {
height: 4px;
background: var(--grid);
position: relative;
overflow: hidden;
}
.metric-fill {
height: 100%;
background: linear-gradient(90deg, var(--accent), var(--warning));
animation: fillBar 2s ease-out forwards;
box-shadow: 0 0 10px var(--accent);
}
@keyframes fillBar {
from { width: 0; }
}
/* Footer */
footer {
padding: 60px 50px 30px;
background: var(--black);
border-top: 1px solid var(--grid);
}
.footer-content {
max-width: 1200px;
margin: 0 auto;
display: grid;
grid-template-columns: 2fr 1fr 1fr 1fr;
gap: 40px;
margin-bottom: 40px;
}
.footer-section h3 {
font-size: 14px;
text-transform: uppercase;
letter-spacing: 2px;
color: var(--white);
margin-bottom: 20px;
}
.footer-section p {
font-size: 12px;
line-height: 1.8;
color: var(--grey);
}
.footer-links {
list-style: none;
}
.footer-links li {
margin-bottom: 10px;
}
.footer-links a {
font-size: 12px;
color: var(--grey);
text-decoration: none;
transition: color 0.3s;
}
.footer-links a:hover {
color: var(--accent);
}
.footer-bottom {
padding-top: 30px;
border-top: 1px solid var(--grid);
text-align: center;
font-size: 11px;
color: var(--grey);
}
/* Terminal Window */
.terminal {
max-width: 800px;
margin: 60px auto;
background: var(--black);
border: 1px solid var(--grid);
font-family: monospace;
}
.terminal-header {
padding: 10px 15px;
background: var(--dark);
border-bottom: 1px solid var(--grid);
display: flex;
align-items: center;
gap: 10px;
}
.terminal-dot {
width: 12px;
height: 12px;
border-radius: 50%;
background: var(--danger);
}
.terminal-dot:nth-child(2) {
background: var(--warning);
}
.terminal-dot:nth-child(3) {
background: var(--accent);
}
.terminal-body {
padding: 20px;
height: 300px;
overflow-y: auto;
font-size: 13px;
line-height: 1.6;
}
.terminal-line {
margin-bottom: 10px;
color: var(--grey);
}
.terminal-prompt {
color: var(--accent);
}
.terminal-output {
color: var(--white);
margin-left: 20px;
}
/* Responsive */
@media (max-width: 768px) {
.nav-links {
display: none;
}
.hero-title {
font-size: 36px;
letter-spacing: 4px;
}
.stats-container,
.features-grid,
.tech-grid {
grid-template-columns: 1fr;
}
.footer-content {
grid-template-columns: 1fr;
}
}
</style>
</head>
<body>
<div class="cursor-dot" id="cursor"></div>
<div class="grid-bg"></div>
<nav>
<div class="nav-container">
<a href="#" class="logo">THERMO-eVTOL</a>
<ul class="nav-links">
<li><a href="#features">Features</a></li>
<li><a href="#architecture">Architecture</a></li>
<li><a href="#metrics">Performance</a></li>
<li><a href="https://github.com" target="_blank">GitHub</a></li>
<li><a href="#">Documentation</a></li>
</ul>
</div>
</nav>
<section class="hero">
<div class="particles" id="particles"></div>
<div class="hero-content">
<h1 class="hero-title">THERMO-eVTOL</h1>
<p class="hero-subtitle">THERMODYNAMIC COMPUTING FOR AUTONOMOUS SYSTEMS</p>
<p class="hero-description">
Next-generation multi-agent coordination platform leveraging energy-based models
and Boltzmann distributions for unprecedented autonomous vehicle orchestration.
Production-ready framework with distributed training, real-time monitoring,
and FAA-compliant safety protocols.
</p>
<div class="cta-buttons">
<a href="#" class="btn">DEPLOY NOW</a>
<a href="#" class="btn btn-secondary">VIEW DEMO</a>
</div>
</div>
</section>
<section class="stats">
<div class="stats-container">
<div class="stat-card">
<div class="stat-number">99.7%</div>
<div class="stat-label">Collision Avoidance</div>
</div>
<div class="stat-card">
<div class="stat-number">1M+</div>
<div class="stat-label">Training Steps/Sec</div>
</div>
<div class="stat-card">
<div class="stat-number">256</div>
<div class="stat-label">Concurrent Agents</div>
</div>
<div class="stat-card">
<div class="stat-number">0.3ms</div>
<div class="stat-label">Decision Latency</div>
</div>
</div>
</section>
<section class="features" id="features">
<div class="features-container">
<h2 class="section-title">CORE CAPABILITIES</h2>
<div class="features-grid">
<div class="feature-card">
<div class="feature-icon">🔥</div>
<h3 class="feature-title">Thermodynamic Decision Making</h3>
<p class="feature-description">
Leverages Boltzmann distributions and energy-based models for optimal
action sampling. Inspired by Extropic AI's THRML architecture for
probabilistic decision-making under uncertainty.
</p>
</div>
<div class="feature-card">
<div class="feature-icon">⚡</div>
<h3 class="feature-title">Block Gibbs Coordination</h3>
<p class="feature-description">
Advanced multi-agent coordination using Block Gibbs sampling to
partition agents into optimal coordination groups, enabling
scalable fleet management up to 256 concurrent vehicles.
</p>
</div>
<div class="feature-card">
<div class="feature-icon">🛡️</div>
<h3 class="feature-title">FAA Compliance Engine</h3>
<p class="feature-description">
Built-in compliance manager enforcing geofencing, altitude restrictions,
and separation requirements. Real-time validation against FAA Part 107
and emerging UAM regulations.
</p>
</div>
<div class="feature-card">
<div class="feature-icon">🌪️</div>
<h3 class="feature-title">Edge Case Injection</h3>
<p class="feature-description">
Comprehensive edge case manager simulating GPS failures, sensor
malfunctions, bird strikes, and adverse weather conditions for
robust training in failure scenarios.
</p>
</div>
<div class="feature-card">
<div class="feature-icon">📊</div>
<h3 class="feature-title">Real-Time Analytics</h3>
<p class="feature-description">
Production-grade monitoring dashboard with live simulation view,
training metrics, replay analysis, and performance profiling.
Streamlit-based interface with sub-second updates.
</p>
</div>
<div class="feature-card">
<div class="feature-icon">🚀</div>
<h3 class="feature-title">Distributed Training</h3>
<p class="feature-description">
Ray-based distributed training supporting PPO, DDPG, and custom
thermodynamic algorithms. Automatic scaling across GPU clusters
with PufferLib vectorization.
</p>
</div>
</div>
</div>
</section>
<section class="tech-stack">
<div class="features-container">
<h2 class="section-title">TECHNOLOGY STACK</h2>
<div class="tech-grid">
<div class="tech-item">JAX</div>
<div class="tech-item">RAY</div>
<div class="tech-item">PUFFERLIB</div>
<div class="tech-item">PETTINGZOO</div>
<div class="tech-item">DOCKER</div>
<div class="tech-item">KUBERNETES</div>
<div class="tech-item">STREAMLIT</div>
<div class="tech-item">MYSQL</div>
<div class="tech-item">GITHUB ACTIONS</div>
<div class="tech-item">AWS/GCP</div>
<div class="tech-item">TENSORBOARD</div>
<div class="tech-item">PROMETHEUS</div>
</div>
</div>
</section>
<section class="architecture" id="architecture">
<div class="features-container">
<h2 class="section-title">SYSTEM ARCHITECTURE</h2>
<div class="arch-diagram">
<div class="arch-layer">
<div class="arch-layer-title">THERMODYNAMIC CORE</div>
<div class="arch-layer-components">
<span class="arch-component">BOLTZMANN SAMPLER</span>
<span class="arch-component">ENERGY MINIMIZER</span>
<span class="arch-component">GIBBS COORDINATOR</span>
<span class="arch-component">ENTROPY OPTIMIZER</span>
</div>
</div>
<div class="arch-layer">
<div class="arch-layer-title">SIMULATION ENGINE</div>
<div class="arch-layer-components">
<span class="arch-component">PHYSICS SIMULATOR</span>
<span class="arch-component">SENSOR MODELS</span>
<span class="arch-component">WEATHER SYSTEM</span>
<span class="arch-component">EDGE CASE INJECTOR</span>
</div>
</div>
<div class="arch-layer">
<div class="arch-layer-title">DISTRIBUTED COMPUTE</div>
<div class="arch-layer-components">
<span class="arch-component">RAY CLUSTER</span>
<span class="arch-component">GPU SCHEDULER</span>
<span class="arch-component">MODEL REGISTRY</span>
<span class="arch-component">CHECKPOINT MANAGER</span>
</div>
</div>
<div class="arch-layer">
<div class="arch-layer-title">MONITORING & CONTROL</div>
<div class="arch-layer-components">
<span class="arch-component">REAL-TIME DASHBOARD</span>
<span class="arch-component">METRICS COLLECTOR</span>
<span class="arch-component">REPLAY SYSTEM</span>
<span class="arch-component">ALERT MANAGER</span>
</div>
</div>
</div>
</div>
</section>
<section class="metrics" id="metrics">
<div class="metrics-container">
<h2 class="section-title">PERFORMANCE METRICS</h2>
<div class="metric-bars">
<div class="metric-item">
<div class="metric-header">
<span class="metric-label">Training Efficiency</span>
<span class="metric-value">97%</span>
</div>
<div class="metric-bar">
<div class="metric-fill" style="width: 97%"></div>
</div>
</div>
<div class="metric-item">
<div class="metric-header">
<span class="metric-label">Scalability Factor</span>
<span class="metric-value">94%</span>
</div>
<div class="metric-bar">
<div class="metric-fill" style="width: 94%"></div>
</div>
</div>
<div class="metric-item">
<div class="metric-header">
<span class="metric-label">Safety Compliance</span>
<span class="metric-value">100%</span>
</div>
<div class="metric-bar">
<div class="metric-fill" style="width: 100%"></div>
</div>
</div>
<div class="metric-item">
<div class="metric-header">
<span class="metric-label">Resource Utilization</span>
<span class="metric-value">89%</span>
</div>
<div class="metric-bar">
<div class="metric-fill" style="width: 89%"></div>
</div>
</div>
</div>
</div>
</section>
<section class="features">
<div class="features-container">
<h2 class="section-title">DEPLOYMENT STATUS</h2>
<div class="terminal">
<div class="terminal-header">
<div class="terminal-dot"></div>
<div class="terminal-dot"></div>
<div class="terminal-dot"></div>
</div>
<div class="terminal-body" id="terminal-output">
<div class="terminal-line">
<span class="terminal-prompt">$</span> kubectl get pods -n thermo-evtol
</div>
<div class="terminal-line terminal-output">
NAME READY STATUS RESTARTS<br>
simulator-7b9d8c4f5-xvn2k 1/1 Running 0<br>
trainer-6f5c7d9b8-mq3p7 1/1 Running 0<br>
dashboard-8c4b5f6d3-kl9h2 1/1 Running 0<br>
ray-head-5d7f9c8b2-vt4r8 1/1 Running 0
</div>
<div class="terminal-line">
<span class="terminal-prompt">$</span> ./scripts/metrics.sh --realtime
</div>
<div class="terminal-line terminal-output">
[METRICS] Active Agents: 128<br>
[METRICS] Decisions/sec: 3,247,891<br>
[METRICS] GPU Utilization: 94%<br>
[METRICS] Collision Events: 0<br>
[METRICS] Compliance Rate: 100%
</div>
<div class="terminal-line">
<span class="terminal-prompt">$</span> echo "System operational. All checks passed."
</div>
</div>
</div>
</div>
</section>
<footer>
<div class="footer-content">
<div class="footer-section">
<h3>THERMO-eVTOL</h3>
<p>
Advanced autonomous systems platform leveraging thermodynamic
computing principles for next-generation urban air mobility.
Research-grade framework with production-ready deployment.
</p>
</div>
<div class="footer-section">
<h3>Resources</h3>
<ul class="footer-links">
<li><a href="#">Documentation</a></li>
<li><a href="#">API Reference</a></li>
<li><a href="#">Research Papers</a></li>
<li><a href="#">Tutorials</a></li>
</ul>
</div>
<div class="footer-section">
<h3>Deploy</h3>
<ul class="footer-links">
<li><a href="#">AWS Setup</a></li>
<li><a href="#">GCP Setup</a></li>
<li><a href="#">Docker Hub</a></li>
<li><a href="#">Helm Charts</a></li>
</ul>
</div>
<div class="footer-section">
<h3>Connect</h3>
<ul class="footer-links">
<li><a href="#">GitHub</a></li>
<li><a href="#">Discord</a></li>
<li><a href="#">Research Lab</a></li>
<li><a href="#">Contact</a></li>
</ul>
</div>
</div>
<div class="footer-bottom">
© 2025 THERMO-eVTOL | Built with thermodynamic precision
</div>
</footer>
<script>
// Custom cursor
document.addEventListener('mousemove', (e) => {
const cursor = document.getElementById('cursor');
cursor.style.left = e.clientX + 'px';
cursor.style.top = e.clientY + 'px';
});
// Generate particles
function createParticle() {
const particle = document.createElement('div');
particle.className = 'particle';
particle.style.left = Math.random() * 100 + '%';
particle.style.animationDelay = Math.random() * 10 + 's';
particle.style.animationDuration = (10 + Math.random() * 10) + 's';
return particle;
}
const particlesContainer = document.getElementById('particles');
if (particlesContainer) {
for (let i = 0; i < 30; i++) {
particlesContainer.appendChild(createParticle());
}
}
// Smooth scrolling
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
if (target) {
target.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
});
});
// Terminal typing effect
const terminalLines = [
{ prompt: '$', command: ' docker-compose up -d --scale trainer=4', delay: 1000 },
{ output: '[+] Running 5/5\n ✔ Network thermo-evtol_default Created\n ✔ Container mysql Started\n ✔ Container ray-head Started\n ✔ Container simulator Started\n ✔ Container trainer-1...4 Started', delay: 1500 },
{ prompt: '$', command: ' python -m thermo_evtol.train --config advanced', delay: 2000 },
{ output: '[INFO] Initializing ThermodynamicCoordinator...\n[INFO] Loading 128 agents into environment...\n[INFO] Starting distributed training on 4 GPUs...\n[INFO] Energy optimization: ACTIVE\n[INFO] Gibbs sampling rate: 1000Hz', delay: 2500 }
];
let terminalIndex = 0;
function typeTerminal() {
if (terminalIndex < terminalLines.length) {
const line = terminalLines[terminalIndex];
setTimeout(() => {
const terminal = document.getElementById('terminal-output');
if (terminal) {
const lineDiv = document.createElement('div');
lineDiv.className = 'terminal-line';
if (line.prompt) {
lineDiv.innerHTML = `<span class="terminal-prompt">${line.prompt}</span>${line.command}`;
} else if (line.output) {
lineDiv.className += ' terminal-output';
lineDiv.innerHTML = line.output.replace(/\n/g, '<br>');
}
terminal.appendChild(lineDiv);
terminal.scrollTop = terminal.scrollHeight;
}
terminalIndex++;
typeTerminal();
}, line.delay);
}
}
// Start terminal animation when page loads
window.addEventListener('load', () => {
setTimeout(typeTerminal, 2000);
});
// Intersection Observer for animations
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -100px 0px'
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.opacity = '1';
entry.target.style.transform = 'translateY(0)';
}
});
}, observerOptions);
// Observe feature cards
document.querySelectorAll('.feature-card, .stat-card, .tech-item').forEach(card => {
card.style.opacity = '0';
card.style.transform = 'translateY(20px)';
card.style.transition = 'all 0.6s cubic-bezier(0.4, 0, 0.2, 1)';
observer.observe(card);
});
// Add glitch effect on logo hover
const logo = document.querySelector('.logo');
if (logo) {
logo.addEventListener('mouseenter', () => {
logo.style.animation = 'glitch 0.3s infinite';
});
logo.addEventListener('mouseleave', () => {
logo.style.animation = 'none';
});
}
// Add glitch keyframes dynamically
const style = document.createElement('style');
style.textContent = `
@keyframes glitch {
0% { text-shadow: 2px 2px 0 var(--accent), -2px -2px 0 var(--danger); }
25% { text-shadow: -2px 2px 0 var(--accent), 2px -2px 0 var(--danger); }
50% { text-shadow: 2px -2px 0 var(--accent), -2px 2px 0 var(--danger); }
75% { text-shadow: -2px -2px 0 var(--accent), 2px 2px 0 var(--danger); }
100% { text-shadow: 2px 2px 0 var(--accent), -2px -2px 0 var(--danger); }
}
`;
document.head.appendChild(style);
// Performance metrics animation trigger
const metricsSection = document.querySelector('.metrics');
const metricBars = document.querySelectorAll('.metric-fill');
let metricsAnimated = false;
const metricsObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting && !metricsAnimated) {
metricsAnimated = true;
metricBars.forEach((bar, index) => {
setTimeout(() => {
bar.style.animation = 'fillBar 2s ease-out forwards';
}, index * 200);
});
}
});
}, { threshold: 0.5 });
if (metricsSection) {
metricsObserver.observe(metricsSection);
}
// Add matrix rain effect on button click
document.querySelectorAll('.btn').forEach(button => {
button.addEventListener('click', (e) => {
e.preventDefault();
const ripple = document.createElement('div');
ripple.style.position = 'absolute';
ripple.style.width = '20px';
ripple.style.height = '20px';
ripple.style.background = 'var(--accent)';
ripple.style.borderRadius = '50%';
ripple.style.transform = 'translate(-50%, -50%)';
ripple.style.pointerEvents = 'none';
ripple.style.animation = 'ripple 0.6s ease-out';
const rect = button.getBoundingClientRect();
ripple.style.left = (e.clientX - rect.left) + 'px';
ripple.style.top = (e.clientY - rect.top) + 'px';
button.style.position = 'relative';
button.style.overflow = 'hidden';
button.appendChild(ripple);
setTimeout(() => ripple.remove(), 600);
});
});
// Add ripple animation
const rippleStyle = document.createElement('style');
rippleStyle.textContent = `
@keyframes ripple {
to {
width: 200px;
height: 200px;
opacity: 0;
}
}
`;
document.head.appendChild(rippleStyle);
</script>
</body>
</html>