Newer
Older
cubecactus.com / downloads.html
@Agalya Ramadoss Agalya Ramadoss on 13 Feb 12 KB Initial CubeCactus website
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Download - CubeCactus</title>
    <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;800&family=Archivo:wght@300;500;900&display=swap" rel="stylesheet">
    <style>
        :root {
            --primary: #00ff88;
            --secondary: #0099ff;
            --dark: #0a0e15;
            --darker: #050810;
            --light: #f0f4f8;
            --gray: #6b7280;
            --border: rgba(0, 255, 136, 0.2);
            --font-display: 'Archivo', sans-serif;
            --font-mono: 'JetBrains Mono', monospace;
        }
        
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        body {
            font-family: var(--font-mono);
            background: var(--darker);
            color: var(--light);
            line-height: 1.6;
            padding: 6rem 2rem 2rem;
        }
        
        .container {
            max-width: 1200px;
            margin: 0 auto;
        }
        
        h1 {
            font-family: var(--font-display);
            font-size: 4rem;
            font-weight: 900;
            text-align: center;
            margin-bottom: 1rem;
            background: linear-gradient(135deg, var(--primary), var(--secondary));
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
        }
        
        .subtitle {
            text-align: center;
            color: var(--gray);
            font-size: 1.2rem;
            margin-bottom: 4rem;
        }
        
        .version-badge {
            display: inline-block;
            background: var(--primary);
            color: var(--dark);
            padding: 0.5rem 1rem;
            border-radius: 20px;
            font-weight: 800;
            font-size: 0.9rem;
            margin-bottom: 3rem;
        }
        
        .download-grid {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
            gap: 2rem;
            margin-bottom: 4rem;
        }
        
        .download-card {
            background: rgba(0, 255, 136, 0.03);
            border: 1px solid var(--border);
            border-radius: 8px;
            padding: 2.5rem;
            transition: all 0.3s ease;
        }
        
        .download-card:hover {
            border-color: var(--primary);
            transform: translateY(-5px);
            box-shadow: 0 20px 50px rgba(0, 255, 136, 0.15);
        }
        
        .download-icon {
            font-size: 3rem;
            margin-bottom: 1rem;
        }
        
        .download-title {
            font-family: var(--font-display);
            font-size: 1.8rem;
            font-weight: 900;
            color: var(--light);
            margin-bottom: 0.5rem;
        }
        
        .download-description {
            color: var(--gray);
            margin-bottom: 1.5rem;
            font-size: 0.95rem;
        }
        
        .download-size {
            color: var(--gray);
            font-size: 0.85rem;
            margin-bottom: 1.5rem;
        }
        
        .btn-download {
            width: 100%;
            padding: 1rem;
            background: var(--primary);
            color: var(--dark);
            border: none;
            border-radius: 4px;
            font-family: var(--font-mono);
            font-weight: 800;
            cursor: pointer;
            transition: all 0.3s ease;
            text-decoration: none;
            display: block;
            text-align: center;
        }
        
        .btn-download:hover {
            background: var(--secondary);
            transform: translateY(-2px);
        }
        
        .installation-section {
            margin-top: 6rem;
        }
        
        h2 {
            font-family: var(--font-display);
            font-size: 2.5rem;
            font-weight: 900;
            color: var(--light);
            margin-bottom: 2rem;
            text-align: center;
        }
        
        .platform-tabs {
            display: flex;
            justify-content: center;
            gap: 1rem;
            margin-bottom: 2rem;
            flex-wrap: wrap;
        }
        
        .tab-btn {
            padding: 0.8rem 2rem;
            background: transparent;
            color: var(--gray);
            border: 1px solid var(--border);
            border-radius: 4px;
            font-family: var(--font-mono);
            font-weight: 600;
            cursor: pointer;
            transition: all 0.3s ease;
        }
        
        .tab-btn.active {
            background: var(--primary);
            color: var(--dark);
            border-color: var(--primary);
        }
        
        .tab-content {
            display: none;
            background: var(--dark);
            border: 1px solid var(--border);
            border-radius: 8px;
            padding: 2rem;
            margin-bottom: 2rem;
        }
        
        .tab-content.active {
            display: block;
        }
        
        .tab-content pre {
            color: var(--primary);
            font-size: 0.95rem;
            line-height: 1.8;
            overflow-x: auto;
        }
        
        .changelog {
            margin-top: 6rem;
        }
        
        .changelog-item {
            margin-bottom: 3rem;
            padding-bottom: 2rem;
            border-bottom: 1px solid var(--border);
        }
        
        .changelog-version {
            font-family: var(--font-display);
            font-size: 1.5rem;
            font-weight: 900;
            color: var(--primary);
            margin-bottom: 0.5rem;
        }
        
        .changelog-date {
            color: var(--gray);
            font-size: 0.9rem;
            margin-bottom: 1rem;
        }
        
        .changelog-list {
            list-style: none;
            padding-left: 0;
        }
        
        .changelog-list li {
            color: var(--gray);
            margin-bottom: 0.5rem;
            padding-left: 1.5rem;
            position: relative;
        }
        
        .changelog-list li::before {
            content: '→';
            position: absolute;
            left: 0;
            color: var(--primary);
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Download CubeCactus</h1>
        <p class="subtitle">Choose your platform and start building</p>
        <div style="text-align: center;">
            <span class="version-badge">Latest Version: 1.0.0</span>
        </div>
        
        <div class="download-grid">
            <div class="download-card">
                <div class="download-icon">☕</div>
                <h3 class="download-title">JAR Binary</h3>
                <p class="download-description">
                    Standalone executable JAR. Requires Java 21+
                </p>
                <p class="download-size">Size: 45 MB</p>
                <a href="#" class="btn-download">Download JAR</a>
            </div>
            
            <div class="download-card">
                <div class="download-icon">🐳</div>
                <h3 class="download-title">Docker Image</h3>
                <p class="download-description">
                    Official Docker image for containerized deployment
                </p>
                <p class="download-size">docker pull cubecactus/cubecactus:latest</p>
                <a href="#" class="btn-download">Docker Hub</a>
            </div>
            
            <div class="download-card">
                <div class="download-icon">📦</div>
                <h3 class="download-title">Source Code</h3>
                <p class="download-description">
                    Build from source with Maven
                </p>
                <p class="download-size">Clone from GitHub</p>
                <a href="https://github.com/cubecactus/cubecactus" class="btn-download">GitHub</a>
            </div>
        </div>
        
        <div class="installation-section">
            <h2>Installation Instructions</h2>
            
            <div class="platform-tabs">
                <button class="tab-btn active" onclick="showTab('jar')">JAR</button>
                <button class="tab-btn" onclick="showTab('docker')">Docker</button>
                <button class="tab-btn" onclick="showTab('k8s')">Kubernetes</button>
                <button class="tab-btn" onclick="showTab('source')">Source</button>
            </div>
            
            <div id="jar" class="tab-content active">
                <pre># Download JAR
wget https://github.com/cubecactus/cubecactus/releases/download/v1.0.0/cubecactus-1.0.0.jar

# Run
java -jar cubecactus-1.0.0.jar \
  --node-id=node-1 \
  --port=8080

# Verify
curl http://localhost:8080/api/v1/health</pre>
            </div>
            
            <div id="docker" class="tab-content">
                <pre># Pull image
docker pull cubecactus/cubecactus:latest

# Run single node
docker run -d \
  --name cubecactus \
  -p 8080:8080 \
  -v cubecactus-data:/var/lib/cube/data \
  cubecactus/cubecactus:latest

# Run 3-node cluster
docker-compose up -d

# Verify
docker ps
curl http://localhost:8080/api/v1/health</pre>
            </div>
            
            <div id="k8s" class="tab-content">
                <pre># Download manifests
wget https://github.com/cubecactus/cubecactus/releases/download/v1.0.0/k8s-manifests.tar.gz
tar -xzf k8s-manifests.tar.gz

# Deploy
kubectl apply -f k8s/namespace.yaml
kubectl apply -f k8s/statefulset.yaml
kubectl apply -f k8s/service.yaml

# Verify
kubectl get pods -n cubecactus
kubectl get svc -n cubecactus

# Port forward
kubectl port-forward svc/cubecactus-lb 8080:80 -n cubecactus

# Test
curl http://localhost:8080/api/v1/health</pre>
            </div>
            
            <div id="source" class="tab-content">
                <pre># Clone repository
git clone https://github.com/cubecactus/cubecactus.git
cd cubecactus

# Build
mvn clean package -DskipTests

# Run
java -jar target/cubecactus-1.0.0.jar \
  --node-id=node-1 \
  --port=8080

# Run tests
mvn test

# Build Docker image
docker build -t cubecactus:custom .</pre>
            </div>
        </div>
        
        <div class="changelog">
            <h2>Changelog</h2>
            
            <div class="changelog-item">
                <div class="changelog-version">v1.0.0</div>
                <div class="changelog-date">Released: February 13, 2026</div>
                <ul class="changelog-list">
                    <li><strong>NEW:</strong> Gossip protocol implementation (SWIM-based)</li>
                    <li><strong>NEW:</strong> Full SQL support (CREATE, SELECT, INSERT, UPDATE, DELETE)</li>
                    <li><strong>NEW:</strong> LSM storage engine with compaction</li>
                    <li><strong>NEW:</strong> Tunable consistency levels (ONE, QUORUM, ALL)</li>
                    <li><strong>NEW:</strong> Automatic replication with hinted handoff</li>
                    <li><strong>NEW:</strong> Read repair for eventual consistency</li>
                    <li><strong>NEW:</strong> Docker and Kubernetes support</li>
                    <li><strong>NEW:</strong> Interactive CubeShell CLI</li>
                    <li><strong>NEW:</strong> REST API for queries and cluster management</li>
                    <li><strong>PERF:</strong> 200K reads/sec, 100K writes/sec on 3-node cluster</li>
                </ul>
            </div>
            
            <div class="changelog-item">
                <div class="changelog-version">v0.9.0-beta</div>
                <div class="changelog-date">Released: January 20, 2026</div>
                <ul class="changelog-list">
                    <li><strong>NEW:</strong> Initial beta release</li>
                    <li><strong>NEW:</strong> Basic storage engine</li>
                    <li><strong>NEW:</strong> CQL parser</li>
                    <li><strong>NEW:</strong> Single-node deployment</li>
                </ul>
            </div>
        </div>
    </div>
    
    <script>
        function showTab(tabName) {
            // Hide all tabs
            document.querySelectorAll('.tab-content').forEach(tab => {
                tab.classList.remove('active');
            });
            document.querySelectorAll('.tab-btn').forEach(btn => {
                btn.classList.remove('active');
            });
            
            // Show selected tab
            document.getElementById(tabName).classList.add('active');
            event.target.classList.add('active');
        }
    </script>
</body>
</html>