diff --git a/website/assets/css/site-header.css b/website/assets/css/site-header.css index 8e3341b9..acdc6d63 100644 --- a/website/assets/css/site-header.css +++ b/website/assets/css/site-header.css @@ -21,10 +21,18 @@ body.dark { --global-header-cta-text: #0f172a; } +body.light { + --global-header-bg: rgba(255, 255, 255, 0.97); + --global-header-border: rgba(15, 23, 42, 0.08); + --global-header-text: #111827; + --global-header-muted: #6b7280; + --global-header-pill: rgba(37, 99, 235, 0.07); + --global-header-pill-hover: rgba(37, 99, 235, 0.15); + --global-header-accent: #2563eb; + --global-header-cta-text: #fff; +} .global-header { - height: 90px; - box-sizing: border-box; position: sticky; top: 0; width: 100%; @@ -35,13 +43,13 @@ body.dark { } .global-header__inner { - max-width: 1160px; + max-width: 1200px; margin: 0 auto; - padding: 0 1.25rem; - height: 100%; + padding: 0.85rem 1.25rem; display: flex; align-items: center; gap: 1.25rem; + flex-wrap: wrap; justify-content: space-between; } @@ -127,10 +135,27 @@ body.dark { flex-wrap: wrap; } +.global-dark-toggle { + border: 1px solid var(--global-header-border); + background: transparent; + color: var(--global-header-text); + padding: 0.35rem 0.9rem; + border-radius: 999px; + font-size: 0.9rem; + display: inline-flex; + align-items: center; + gap: 0.35rem; + cursor: pointer; + transition: all 0.2s ease; +} +.global-dark-toggle:hover { + border-color: var(--global-header-accent); + color: var(--global-header-accent); +} .global-subnav { - max-width: 1160px; + max-width: 1200px; margin: 0 auto; padding: 0 1.25rem 0.75rem; display: flex; @@ -159,18 +184,10 @@ body.dark { color: var(--global-header-accent); } - @media (max-width: 960px) { - .global-header { - height: auto; - min-height: 90px; - padding: 1rem 0; - } - .global-header__inner { flex-direction: column; align-items: flex-start; - height: auto; } .global-header__actions { @@ -182,6 +199,7 @@ body.dark { width: 100%; } } + @media (max-width: 640px) { .global-brand__text span { font-size: 1rem; diff --git a/website/assets/js/global-header.js b/website/assets/js/global-header.js index dddb80ec..23ffc93a 100644 --- a/website/assets/js/global-header.js +++ b/website/assets/js/global-header.js @@ -1,12 +1,4 @@ (function () { - // Always enforce dark theme - document.documentElement.setAttribute('data-theme', 'dark'); - document.documentElement.classList.add('dark'); - - // Clean up any old user preferences - if (localStorage.getItem('theme')) localStorage.removeItem('theme'); - if (localStorage.getItem('exchangeTheme')) localStorage.removeItem('exchangeTheme'); - const NAV_ITEMS = [ { key: 'home', label: 'Home', href: '/' }, { key: 'explorer', label: 'Explorer', href: '/explorer/' }, @@ -15,6 +7,8 @@ { key: 'docs', label: 'Docs', href: '/docs/index.html' }, ]; + const CTA = { label: 'Launch Marketplace', href: '/marketplace/' }; + function determineActiveKey(pathname) { if (pathname.startsWith('/explorer')) return 'explorer'; if (pathname.startsWith('/marketplace')) return 'marketplace'; @@ -42,11 +36,64 @@ +
+ + ${CTA.label} +
`; } + function getCurrentTheme() { + if (document.documentElement.hasAttribute('data-theme')) { + return document.documentElement.getAttribute('data-theme'); + } + if (document.documentElement.classList.contains('dark')) return 'dark'; + if (document.body && document.body.classList.contains('light')) return 'light'; + return 'light'; + } + + function updateToggleLabel(theme) { + const emojiEl = document.querySelector('.global-dark-toggle__emoji'); + const textEl = document.querySelector('.global-dark-toggle__text'); + if (!emojiEl || !textEl) return; + if (theme === 'dark') { + emojiEl.textContent = '🌙'; + textEl.textContent = 'Dark'; + } else { + emojiEl.textContent = '☀️'; + textEl.textContent = 'Light'; + } + } + + function bindThemeToggle() { + const toggle = document.querySelector('[data-role="global-theme-toggle"]'); + if (!toggle) return; + + toggle.addEventListener('click', () => { + if (typeof window.toggleDarkMode === 'function') { + window.toggleDarkMode(); + } else if (typeof window.toggleTheme === 'function') { + window.toggleTheme(); + } else { + const isDark = document.documentElement.classList.toggle('dark'); + if (isDark) { + document.documentElement.setAttribute('data-theme', 'dark'); + } else { + document.documentElement.removeAttribute('data-theme'); + } + } + + setTimeout(() => updateToggleLabel(getCurrentTheme()), 0); + }); + + updateToggleLabel(getCurrentTheme()); + } + function initHeader() { const activeKey = determineActiveKey(window.location.pathname); const headerHTML = buildHeader(activeKey); @@ -59,6 +106,8 @@ } else { document.body.insertAdjacentHTML('afterbegin', headerHTML); } + + bindThemeToggle(); } if (document.readyState === 'loading') { diff --git a/website/assets/js/main.js b/website/assets/js/main.js index e84f7103..c89e3a62 100644 --- a/website/assets/js/main.js +++ b/website/assets/js/main.js @@ -37,6 +37,78 @@ document.querySelectorAll('.feature-card, .arch-component').forEach(el => { observer.observe(el); }); +// Dark mode functionality with enhanced persistence and system preference detection +function toggleDarkMode() { + const currentTheme = document.documentElement.getAttribute('data-theme'); + const newTheme = currentTheme === 'dark' ? 'light' : 'dark'; + setTheme(newTheme); +} + +function setTheme(theme) { + // Apply theme immediately + document.documentElement.setAttribute('data-theme', theme); + + // Save to localStorage for persistence + localStorage.setItem('theme', theme); + + // Update button display if it exists + updateThemeButton(theme); + + // Send analytics event + if (window.analytics) { + window.analytics.track('theme_changed', { theme }); + } +} + +function updateThemeButton(theme) { + const emoji = document.getElementById('darkModeEmoji'); + const text = document.getElementById('darkModeText'); + + if (emoji && text) { + if (theme === 'dark') { + emoji.textContent = '🌙'; + text.textContent = 'Dark'; + } else { + emoji.textContent = '☀️'; + text.textContent = 'Light'; + } + } +} + +function getPreferredTheme() { + // 1. Check localStorage first (user preference) + const saved = localStorage.getItem('theme'); + if (saved) { + return saved; + } + + // 2. Check system preference + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + return 'dark'; + } + + // 3. Default to dark (AITBC brand preference) + return 'dark'; +} + +function initializeTheme() { + const theme = getPreferredTheme(); + setTheme(theme); + + // Listen for system preference changes + if (window.matchMedia) { + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => { + // Only auto-switch if user hasn't manually set a preference + if (!localStorage.getItem('theme')) { + setTheme(e.matches ? 'dark' : 'light'); + } + }); + } +} + +// Initialize theme immediately (before DOM loads) +initializeTheme(); + // Touch gesture support for mobile navigation class TouchNavigation { constructor() { @@ -46,53 +118,190 @@ class TouchNavigation { this.touchEndY = 0; this.minSwipeDistance = 50; this.maxVerticalDistance = 100; - - this.initializeTouchEvents(); + + // Get all major sections for navigation + this.sections = ['hero', 'features', 'architecture', 'achievements', 'documentation']; + this.currentSectionIndex = 0; + + this.bindEvents(); + this.setupMobileOptimizations(); } - - initializeTouchEvents() { - document.addEventListener('touchstart', (e) => { - this.touchStartX = e.changedTouches[0].screenX; - this.touchStartY = e.changedTouches[0].screenY; - }, { passive: true }); - - document.addEventListener('touchend', (e) => { - this.touchEndX = e.changedTouches[0].screenX; - this.touchEndY = e.changedTouches[0].screenY; - this.handleSwipe(); - }, { passive: true }); + + bindEvents() { + document.addEventListener('touchstart', this.handleTouchStart.bind(this), { passive: false }); + document.addEventListener('touchmove', this.handleTouchMove.bind(this), { passive: false }); + document.addEventListener('touchend', this.handleTouchEnd.bind(this), { passive: false }); } - - handleSwipe() { - const xDiff = this.touchEndX - this.touchStartX; - const yDiff = Math.abs(this.touchEndY - this.touchStartY); - - // Ensure swipe is mostly horizontal - if (yDiff > this.maxVerticalDistance) return; - - if (Math.abs(xDiff) > this.minSwipeDistance) { - if (xDiff > 0) { - // Swipe Right - potentially open menu or go back - this.onSwipeRight(); + + handleTouchStart(e) { + this.touchStartX = e.touches[0].clientX; + this.touchStartY = e.touches[0].clientY; + } + + handleTouchMove(e) { + // Prevent scrolling when detecting horizontal swipes + const touchCurrentX = e.touches[0].clientX; + const touchCurrentY = e.touches[0].clientY; + const deltaX = Math.abs(touchCurrentX - this.touchStartX); + const deltaY = Math.abs(touchCurrentY - this.touchStartY); + + // If horizontal movement is greater than vertical, prevent default scrolling + if (deltaX > deltaY && deltaX > 10) { + e.preventDefault(); + } + } + + handleTouchEnd(e) { + this.touchEndX = e.changedTouches[0].clientX; + this.touchEndY = e.changedTouches[0].clientY; + + const deltaX = this.touchEndX - this.touchStartX; + const deltaY = Math.abs(this.touchEndY - this.touchStartY); + + // Only process swipe if vertical movement is minimal + if (deltaY < this.maxVerticalDistance && Math.abs(deltaX) > this.minSwipeDistance) { + if (deltaX > 0) { + this.swipeRight(); } else { - // Swipe Left - potentially close menu or go forward - this.onSwipeLeft(); + this.swipeLeft(); } } } - - onSwipeRight() { - // Can be implemented if a side menu is added - // console.log('Swiped right'); + + swipeLeft() { + // Navigate to next section + const nextIndex = Math.min(this.currentSectionIndex + 1, this.sections.length - 1); + this.navigateToSection(nextIndex); } - - onSwipeLeft() { - // Can be implemented if a side menu is added - // console.log('Swiped left'); + + swipeRight() { + // Navigate to previous section + const prevIndex = Math.max(this.currentSectionIndex - 1, 0); + this.navigateToSection(prevIndex); + } + + navigateToSection(index) { + const sectionId = this.sections[index]; + const element = document.getElementById(sectionId); + + if (element) { + this.currentSectionIndex = index; + element.scrollIntoView({ + behavior: 'smooth', + block: 'start' + }); + + // Update URL hash without triggering scroll + history.replaceState(null, null, `#${sectionId}`); + } + } + + setupMobileOptimizations() { + // Add touch-friendly interactions + this.setupTouchButtons(); + this.setupScrollOptimizations(); + this.setupMobileMenu(); + } + + setupTouchButtons() { + // Make buttons more touch-friendly + const buttons = document.querySelectorAll('button, .cta-button, .nav-button'); + buttons.forEach(button => { + button.addEventListener('touchstart', () => { + button.style.transform = 'scale(0.98)'; + }, { passive: true }); + + button.addEventListener('touchend', () => { + button.style.transform = ''; + }, { passive: true }); + }); + } + + setupScrollOptimizations() { + // Improve momentum scrolling on iOS + if ('webkitOverflowScrolling' in document.body.style) { + document.body.style.webkitOverflowScrolling = 'touch'; + } + + // Add smooth scrolling for anchor links with touch feedback + document.querySelectorAll('a[href^="#"]').forEach(link => { + link.addEventListener('touchstart', () => { + link.style.opacity = '0.7'; + }, { passive: true }); + + link.addEventListener('touchend', () => { + link.style.opacity = ''; + }, { passive: true }); + }); + } + + setupMobileMenu() { + // Create mobile menu toggle if nav is hidden on mobile + const nav = document.querySelector('nav'); + if (nav && window.innerWidth < 768) { + this.createMobileMenu(); + } + } + + createMobileMenu() { + // Create hamburger menu for mobile + const header = document.querySelector('header'); + if (!header) return; + + const mobileMenuBtn = document.createElement('button'); + mobileMenuBtn.className = 'mobile-menu-btn'; + mobileMenuBtn.innerHTML = '☰'; + mobileMenuBtn.setAttribute('aria-label', 'Toggle mobile menu'); + + const nav = document.querySelector('nav'); + if (nav) { + nav.style.display = 'none'; + + mobileMenuBtn.addEventListener('click', () => { + const isOpen = nav.style.display !== 'none'; + nav.style.display = isOpen ? 'none' : 'flex'; + mobileMenuBtn.innerHTML = isOpen ? '☰' : '✕'; + }); + + // Close menu when clicking outside + document.addEventListener('click', (e) => { + if (!header.contains(e.target)) { + nav.style.display = 'none'; + mobileMenuBtn.innerHTML = '☰'; + } + }); + + header.appendChild(mobileMenuBtn); + } + } + + updateCurrentSection() { + // Update current section based on scroll position + const scrollY = window.scrollY + window.innerHeight / 2; + + this.sections.forEach((sectionId, index) => { + const element = document.getElementById(sectionId); + if (element) { + const rect = element.getBoundingClientRect(); + const elementTop = rect.top + window.scrollY; + const elementBottom = elementTop + rect.height; + + if (scrollY >= elementTop && scrollY < elementBottom) { + this.currentSectionIndex = index; + } + } + }); } } -// Initialize touch navigation when DOM is loaded +// Initialize touch navigation when DOM is ready document.addEventListener('DOMContentLoaded', () => { new TouchNavigation(); + + // Update current section on scroll + window.addEventListener('scroll', () => { + if (window.touchNav) { + window.touchNav.updateCurrentSection(); + } + }, { passive: true }); }); diff --git a/website/assets/js/web-vitals.js b/website/assets/js/web-vitals.js index 22de3a37..e32a4625 100644 --- a/website/assets/js/web-vitals.js +++ b/website/assets/js/web-vitals.js @@ -5,24 +5,176 @@ 'use strict'; function sendToAnalytics(metric) { + const safeEntries = Array.isArray(metric.entries) ? metric.entries : []; const safeValue = Number.isFinite(metric.value) ? Math.round(metric.value) : 0; + const safeDelta = Number.isFinite(metric.delta) ? Math.round(metric.delta) : 0; - // In production we log to console. The /api/web-vitals endpoint was removed - // to reduce unnecessary network noise as we are not running a telemetry backend. - console.log(`[Web Vitals] ${metric.name}: ${safeValue}`); - } - - // Load web-vitals from CDN - const script = document.createElement('script'); - script.src = 'https://unpkg.com/web-vitals@3/dist/web-vitals.iife.js'; - script.onload = function() { - if (window.webVitals) { - window.webVitals.onCLS(sendToAnalytics); - window.webVitals.onFID(sendToAnalytics); - window.webVitals.onLCP(sendToAnalytics); - window.webVitals.onFCP(sendToAnalytics); - window.webVitals.onTTFB(sendToAnalytics); + const data = { + name: metric.name, + value: safeValue, + id: metric.id || 'unknown', + delta: safeDelta, + entries: safeEntries.map(e => ({ + name: e.name, + startTime: e.startTime, + duration: e.duration + })), + url: window.location.href, + timestamp: new Date().toISOString() + }; + + const payload = JSON.stringify(data); + + // Send to analytics endpoint + if (navigator.sendBeacon) { + const blob = new Blob([payload], { type: 'application/json' }); + const ok = navigator.sendBeacon('/api/web-vitals', blob); + if (!ok) { + fetch('/api/web-vitals', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: payload, + keepalive: true + }).catch(() => {}); + } + } else { + fetch('/api/web-vitals', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: payload, + keepalive: true + }).catch(() => {}); } - }; - document.head.appendChild(script); + + // Also log to console in development + console.log(`[Web Vitals] ${metric.name}: ${metric.value}`, metric); + } + + // Largest Contentful Paint (LCP) + function observeLCP() { + try { + const observer = new PerformanceObserver((list) => { + const entries = list.getEntries(); + const lastEntry = entries[entries.length - 1]; + sendToAnalytics({ + name: 'LCP', + value: lastEntry.renderTime || lastEntry.loadTime, + id: lastEntry.id, + delta: 0, + entries: entries + }); + }); + observer.observe({ entryTypes: ['largest-contentful-paint'] }); + } catch (e) {} + } + + // First Input Delay (FID) + function observeFID() { + try { + const observer = new PerformanceObserver((list) => { + const entries = list.getEntries(); + entries.forEach(entry => { + sendToAnalytics({ + name: 'FID', + value: entry.processingStart - entry.startTime, + id: entry.id, + delta: 0, + entries: [entry] + }); + }); + }); + observer.observe({ entryTypes: ['first-input'] }); + } catch (e) {} + } + + // Cumulative Layout Shift (CLS) + function observeCLS() { + try { + let clsValue = 0; + const observer = new PerformanceObserver((list) => { + try { + const entries = list.getEntries(); + entries.forEach(entry => { + if (!entry.hadRecentInput) { + clsValue += entry.value; + } + }); + sendToAnalytics({ + name: 'CLS', + value: clsValue, + id: 'cls', + delta: 0, + entries: entries + }); + } catch (e) { + // CLS measurement failed, but don't crash the whole script + console.log('CLS measurement error:', e.message); + } + }); + + // Try to observe layout-shift, but handle if it's not supported + try { + observer.observe({ entryTypes: ['layout-shift'] }); + } catch (e) { + console.log('Layout-shift observation not supported:', e.message); + // CLS will not be measured, but other metrics will still work + } + } catch (e) { + console.log('CLS observer setup failed:', e.message); + } + } + + // Time to First Byte (TTFB) + function measureTTFB() { + try { + const nav = performance.getEntriesByType('navigation')[0]; + if (nav) { + sendToAnalytics({ + name: 'TTFB', + value: nav.responseStart, + id: 'ttfb', + delta: 0, + entries: [nav] + }); + } + } catch (e) {} + } + + // First Contentful Paint (FCP) + function observeFCP() { + try { + const observer = new PerformanceObserver((list) => { + const entries = list.getEntries(); + entries.forEach(entry => { + if (entry.name === 'first-contentful-paint') { + sendToAnalytics({ + name: 'FCP', + value: entry.startTime, + id: entry.id, + delta: 0, + entries: [entry] + }); + } + }); + }); + observer.observe({ entryTypes: ['paint'] }); + } catch (e) {} + } + + // Initialize when page loads + if (document.readyState === 'complete') { + observeLCP(); + observeFID(); + observeCLS(); + observeFCP(); + measureTTFB(); + } else { + window.addEventListener('load', () => { + observeLCP(); + observeFID(); + observeCLS(); + observeFCP(); + measureTTFB(); + }); + } })(); diff --git a/website/docs/api.html b/website/docs/api.html index b0211f7e..ce339ca9 100644 --- a/website/docs/api.html +++ b/website/docs/api.html @@ -1,16 +1,11 @@ - + API Documentation - AITBC - + - - - - -
@@ -179,14 +174,14 @@
https://aitbc.bubuit.net/api

For development:

-
http://localhost:8000
+
http://localhost:18000

WebSocket API

Real-time updates are available through WebSocket connections:

-
ws://aitbc.bubuit.net:8015/ws
+
ws://aitbc.bubuit.net:18001/ws

Subscribe to events:

{
@@ -203,6 +198,6 @@
         
     
     
-    
+    
 
 
diff --git a/website/docs/blockchain-node.html b/website/docs/blockchain-node.html
index 04b5b324..f26a0d29 100644
--- a/website/docs/blockchain-node.html
+++ b/website/docs/blockchain-node.html
@@ -1,16 +1,11 @@
 
-
+
 
     
     
     Blockchain Node - AITBC Documentation
-    
+    
     
-    
-    
-    
-    
-    
 
 
     
@@ -193,6 +188,6 @@ python -m aitbc_chain.node
// Add any interactive functionality here - + diff --git a/website/docs/browser-wallet.html b/website/docs/browser-wallet.html index 5d91c233..9a8fcf39 100644 --- a/website/docs/browser-wallet.html +++ b/website/docs/browser-wallet.html @@ -3,17 +3,12 @@ Redirecting to AITBC Wallet... - + - - - - -

Redirecting to AITBC Browser Wallet

- + diff --git a/website/docs/clients.html b/website/docs/clients.html index 187b0166..45efb68f 100644 --- a/website/docs/clients.html +++ b/website/docs/clients.html @@ -1,17 +1,12 @@ - + Client Documentation - AITBC - + - - - - - - +
@@ -443,6 +438,6 @@ curl -X GET https://aitbc.bubuit.net/api/v1/jobs/JOB_ID \

© 2026 AITBC. All rights reserved.

- + diff --git a/website/docs/components.html b/website/docs/components.html index d12fa27f..20f1404e 100644 --- a/website/docs/components.html +++ b/website/docs/components.html @@ -1,16 +1,11 @@ - + Platform Components - AITBC Documentation - + - - - - -
@@ -199,6 +194,6 @@ // Add any interactive functionality here - + diff --git a/website/docs/coordinator-api.html b/website/docs/coordinator-api.html index e482109c..dc3bb6b3 100644 --- a/website/docs/coordinator-api.html +++ b/website/docs/coordinator-api.html @@ -1,16 +1,11 @@ - + Coordinator API - AITBC Documentation - + - - - - -
@@ -245,6 +240,6 @@ sudo journalctl -u aitbc-coordinator -f // Add any interactive functionality here - + diff --git a/website/docs/css/docs.css b/website/docs/css/docs.css index 883bf255..a4b1691c 100644 --- a/website/docs/css/docs.css +++ b/website/docs/css/docs.css @@ -30,6 +30,22 @@ --code-text: #e6edf3; } +/* Light mode */ +body.light { + --primary-color: #2563eb; + --secondary-color: #7c3aed; + --accent-color: #0ea5e9; + --success-color: #10b981; + --warning-color: #f59e0b; + --danger-color: #ef4444; + --text-dark: #1f2937; + --text-light: #6b7280; + --bg-light: #f9fafb; + --bg-white: #ffffff; + --border-color: #e5e7eb; + --code-bg: #1f2937; + --code-text: #e5e7eb; +} /* ============================================ Base Styles @@ -223,7 +239,7 @@ nav { ============================================ */ main { - margin-top: 90px; + margin-top: 80px; padding: 40px 0; } diff --git a/website/docs/developers.html b/website/docs/developers.html index 4201af7f..73da4254 100644 --- a/website/docs/developers.html +++ b/website/docs/developers.html @@ -1,17 +1,12 @@ - + Developer Documentation - AITBC - + - - - - - - +
@@ -505,6 +500,6 @@ def test_create_feature_invalid():

© 2026 AITBC. All rights reserved.

- + diff --git a/website/docs/explorer-web.html b/website/docs/explorer-web.html index 260d2fdb..65d365b7 100644 --- a/website/docs/explorer-web.html +++ b/website/docs/explorer-web.html @@ -1,16 +1,11 @@ - + Explorer Web - AITBC Documentation - + - - - - -
@@ -203,6 +198,6 @@ npm test - + diff --git a/website/docs/flowchart.html b/website/docs/flowchart.html index eb16be66..ab6c14bd 100644 --- a/website/docs/flowchart.html +++ b/website/docs/flowchart.html @@ -1,16 +1,11 @@ - + System Flow - AITBC Documentation - + - - - - -
@@ -54,7 +49,7 @@
Ollama
-
(aitbc-cli.sh) → (client.py) → (port 8000) → (RPC:8006) → (port 8015) → (port 11434)
+
(aitbc-cli.sh) → (client.py) → (port 18000) → (RPC:26657) → (port 18001) → (port 11434)
@@ -92,7 +87,7 @@
  • Bash script (aitbc-cli.sh) parses arguments
  • Sets environment variables:
  • @@ -120,7 +115,7 @@

    HTTP Request:

    POST /v1/jobs
    -Host: 127.0.0.1:8000
    +Host: 127.0.0.1:18000
     Content-Type: application/json
     X-Api-Key: ${CLIENT_API_KEY}
     
    @@ -131,7 +126,7 @@ X-Api-Key: ${CLIENT_API_KEY}
     }
    -

    Coordinator Service (Port 8000):

    +

    Coordinator Service (Port 18000):

    1. Receives HTTP request
    2. Validates API key and job parameters
    3. @@ -185,9 +180,9 @@ X-Api-Key: ${CLIENT_API_KEY}
    -

    Coordinator → Miner (Port 8010):

    +

    Coordinator → Miner Daemon (Port 18001):

    POST /v1/jobs/assign
    -Host: 127.0.0.1:8010
    +Host: 127.0.0.1:18001
     Content-Type: application/json
     X-Api-Key: ${ADMIN_API_KEY}
     
    @@ -203,7 +198,7 @@ X-Api-Key: ${ADMIN_API_KEY}
                     

    6. Miner Processing

    -

    Miner Daemon (Port 8015):

    +

    Miner Daemon (Port 18001):

    1. Receives job assignment
    2. Updates job status to running
    3. @@ -250,9 +245,9 @@ Content-Type: application/json

      8. Result Submission to Coordinator

      -

      Miner → Coordinator (Port 8000):

      +

      Miner → Coordinator (Port 18000):

      POST /v1/jobs/job_123456/complete
      -Host: 127.0.0.1:8000
      +Host: 127.0.0.1:18000
       Content-Type: application/json
       X-Miner-Key: ${MINER_API_KEY}
       
      @@ -308,7 +303,7 @@ X-Miner-Key: ${MINER_API_KEY}
                       

      HTTP Request:

      GET /v1/jobs/job_123456
      -Host: 127.0.0.1:8000
      +Host: 127.0.0.1:18000
       X-Api-Key: ${CLIENT_API_KEY}

      Response:

      @@ -358,19 +353,19 @@ Cost: 0.25 AITBC
      Coordinator - 8000 + 18000 HTTP/REST Job management, API gateway Blockchain Node - 8006 + 26657 JSON-RPC Transaction processing, consensus Miner Daemon - 8010 + 18001 HTTP/REST Job execution, GPU management @@ -389,12 +384,12 @@ Cost: 0.25 AITBC

      Message Flow Timeline

      0s: User submits CLI command └─> 0.1s: Python client called - └─> 0.2s: HTTP POST to Coordinator (port 8000) + └─> 0.2s: HTTP POST to Coordinator (port 18000) └─> 0.3s: Coordinator validates and creates job - └─> 0.4s: RPC to Blockchain (port 8006) + └─> 0.4s: RPC to Blockchain (port 26657) └─> 0.5s: Transaction in mempool └─> 1.0s: Job queued for miner - └─> 2.0s: Miner assigned (port 8010) + └─> 2.0s: Miner assigned (port 18001) └─> 2.1s: Miner accepts job └─> 2.2s: Ollama request (port 11434) └─> 14.7s: Inference complete (12.5s processing) @@ -486,6 +481,6 @@ Cost: 0.25 AITBC
      - + diff --git a/website/docs/full-documentation.html b/website/docs/full-documentation.html index 4ba85512..a1905597 100644 --- a/website/docs/full-documentation.html +++ b/website/docs/full-documentation.html @@ -1,16 +1,11 @@ - + Full Documentation - AITBC - + - - - - -
      @@ -648,6 +643,6 @@ gosec ./... - + diff --git a/website/docs/index.html b/website/docs/index.html index fe4454e1..316c0e25 100644 --- a/website/docs/index.html +++ b/website/docs/index.html @@ -1,12 +1,12 @@ - + - - - - + + + + Documentation - AITBC @@ -227,6 +227,6 @@ }); - + diff --git a/website/docs/marketplace-web.html b/website/docs/marketplace-web.html index 17fce3d6..952e2caf 100644 --- a/website/docs/marketplace-web.html +++ b/website/docs/marketplace-web.html @@ -1,16 +1,11 @@ - + Marketplace Web - AITBC Documentation - + - - - - -
      @@ -125,8 +120,8 @@ npm run preview

      Environment Configuration

      # .env.local
      -VITE_API_URL=http://localhost:8000
      -VITE_WS_URL=ws://localhost:8015
      +VITE_API_URL=http://localhost:18000
      +VITE_WS_URL=ws://localhost:18001
       VITE_NETWORK=mainnet
       VITE_MOCK_DATA=false
    @@ -175,7 +170,7 @@ POST /v1/jobs } // WebSocket for live updates -ws://localhost:8015/ws +ws://localhost:18001/ws

    Blockchain RPC

    // Get transaction status
    @@ -260,6 +255,6 @@ docker run -d \
             
         
         
    -    
    +    
     
     
    diff --git a/website/docs/miners.html b/website/docs/miners.html
    index d8ffb132..bdda8efb 100644
    --- a/website/docs/miners.html
    +++ b/website/docs/miners.html
    @@ -1,17 +1,12 @@
     
    -
    +
     
         
         
         Miner Documentation - AITBC
    -    
    +    
         
    -        
    -    
    -    
    -    
    -    
    -
    +    
     
         
    @@ -375,6 +370,6 @@ nano ~/.aitbc/miner.toml // Initialize calculator calculateProfit(); - + diff --git a/website/docs/pool-hub.html b/website/docs/pool-hub.html index 3d169b14..f5d425f1 100644 --- a/website/docs/pool-hub.html +++ b/website/docs/pool-hub.html @@ -1,16 +1,11 @@ - + Pool Hub - AITBC Documentation - + - - - - -
    @@ -259,6 +254,6 @@ GET /metrics
    - + diff --git a/website/docs/trade-exchange.html b/website/docs/trade-exchange.html index e73ba980..d8e17419 100644 --- a/website/docs/trade-exchange.html +++ b/website/docs/trade-exchange.html @@ -1,16 +1,11 @@ - + Trade Exchange - AITBC Documentation - + - - - - -
    @@ -259,6 +254,6 @@ BITCOIN_RPC_PASS=password // Add any interactive functionality here - + diff --git a/website/docs/wallet-daemon.html b/website/docs/wallet-daemon.html index ee556545..c49599d0 100644 --- a/website/docs/wallet-daemon.html +++ b/website/docs/wallet-daemon.html @@ -1,16 +1,11 @@ - + Wallet Daemon - AITBC Documentation - + - - - - -
    @@ -209,6 +204,6 @@ console.log('Balance:', balance); - + diff --git a/website/index.html b/website/index.html index 6968e8e7..d958d4d8 100644 --- a/website/index.html +++ b/website/index.html @@ -22,7 +22,7 @@ @@ -51,6 +51,13 @@ Exchange Docs +
    + + Launch Marketplace +
    @@ -128,37 +135,6 @@ - - -
    -
    -

    OpenClaw Agent Ecosystem

    -
    -
    -
    - -
    -

    Autonomous Negotiation

    -

    Agents use isolated smart contract wallets to bid for GPU compute time independently based on task priority.

    -
    -
    -
    - -
    -

    Multi-Modal Fusion

    -

    Seamlessly process text, image, audio, and video via high-speed WebSocket streams on global edge nodes.

    -
    -
    -
    - -
    -

    Decentralized Memory

    -

    Agents utilize IPFS/Filecoin for scalable, off-chain RAG vector embeddings, secured by on-chain ZK-Proofs.

    -
    -
    -
    -
    -
    @@ -291,21 +267,27 @@
    -
    +
    🔄
    -

    Phase 8 - Global Expansion Complete

    -

    Multi-region edge nodes, Geographic load balancing, Dispute resolution contracts

    +

    Stage 8 - Current Focus

    +

    Research consortium, sharding prototypes, ZK applications, and global expansion

    -
    🔄
    +
    9
    -

    Q2-Q3 2026 - Current Focus

    -

    OpenClaw Autonomous Economics, Decentralized AI Memory, Developer Ecosystem Grants

    +

    Stage 9 - Moonshot Initiatives

    +

    Decentralized infrastructure, AI automation, and global standards

    +
    +
    10
    +
    +

    Stage 10 - Stewardship

    +

    Open governance, educational programs, and long-term preservation

    +
    - +