1 Commits

Author SHA1 Message Date
3ac2f8ede7 refactor: remove comparison table section from home page 2025-11-07 12:13:12 +01:00
154 changed files with 1580 additions and 4725 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 431 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 895 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 723 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

View File

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" aria-label="GitHub" viewBox="0 0 512 512" id="github">
<rect width="512" height="512" fill="#1B1817" rx="15%"></rect>
<path fill="#fff" d="M335 499c14 0 12 17 12 17H165s-2-17 12-17c13 0 16-6 16-12l-1-50c-71 16-86-28-86-28-12-30-28-37-28-37-24-16 1-16 1-16 26 2 40 26 40 26 22 39 59 28 74 22 2-17 9-28 16-35-57-6-116-28-116-126 0-28 10-51 26-69-3-6-11-32 3-67 0 0 21-7 70 26 42-12 86-12 128 0 49-33 70-26 70-26 14 35 6 61 3 67 16 18 26 41 26 69 0 98-60 120-117 126 10 8 18 24 18 48l-1 70c0 6 3 12 16 12z"></path>
</svg>

Before

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 286 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 286 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

View File

@@ -1,4 +1,4 @@
import { HashRouter, Routes, Route } from 'react-router-dom'; import { BrowserRouter, Routes, Route } from 'react-router-dom';
import { Layout } from './components/Layout'; import { Layout } from './components/Layout';
import { lazy, Suspense } from 'react'; import { lazy, Suspense } from 'react';
@@ -13,7 +13,7 @@ const GpuPage = lazy(() => import('./pages/gpu/GpuPage'));
function App() { function App() {
return ( return (
<HashRouter> <BrowserRouter>
<Suspense fallback={<div>Loading...</div>}> <Suspense fallback={<div>Loading...</div>}>
<Routes> <Routes>
<Route path="/" element={<Layout />}> <Route path="/" element={<Layout />}>
@@ -28,7 +28,7 @@ function App() {
</Route> </Route>
</Routes> </Routes>
</Suspense> </Suspense>
</HashRouter> </BrowserRouter>
) )
} }

View File

@@ -3,9 +3,9 @@ import clsx from 'clsx'
const baseStyles = { const baseStyles = {
solid: solid:
'inline-flex justify-center rounded-full py-2 px-5 text-base font-semibold transition-colors', 'inline-flex justify-center rounded-full py-2 px-4 text-sm font-semibold transition-colors',
outline: outline:
'inline-flex justify-center bg-transparent rounded-full border py-[calc(--spacing(2)-1px)] px-[calc(--spacing(5)-1px)] text-base transition-colors', 'inline-flex justify-center rounded-full border py-[calc(--spacing(2)-1px)] px-[calc(--spacing(4)-1px)] text-sm transition-colors',
} }
const variantStyles = { const variantStyles = {
@@ -17,7 +17,7 @@ const variantStyles = {
green: 'bg-green-500 text-white hover:bg-green-600', green: 'bg-green-500 text-white hover:bg-green-600',
}, },
outline: { outline: {
cyan: 'border-cyan-500 text-cyan-500', cyan: 'border-cyan-500 text-cyan-500 hover:bg-cyan-50',
gray: 'border-gray-300 text-gray-700 hover:border-cyan-500 active:border-cyan-500', gray: 'border-gray-300 text-gray-700 hover:border-cyan-500 active:border-cyan-500',
white: 'border-gray-300 text-white hover:border-cyan-500 active:border-cyan-500', white: 'border-gray-300 text-white hover:border-cyan-500 active:border-cyan-500',
}, },

View File

@@ -3,12 +3,12 @@ import { Container } from './Container'
export function Footer() { export function Footer() {
return ( return (
<footer className=""> <footer className="border-t border-gray-200">
<Container> <Container>
<div className="flex flex-col items-start justify-between gap-y-12 pt-16 pb-6 lg:flex-row lg:items-center lg:py-8"> <div className="flex flex-col items-start justify-between gap-y-12 pt-16 pb-6 lg:flex-row lg:items-center lg:py-8">
<div> <div>
<div className="flex items-center text-gray-900"> <div className="flex items-center text-gray-900">
<img src="/images/logomark.svg" alt="Mycelium Logomark" className="h-15 w-15 flex-none" /> <img src="/src/images/logomark.svg" alt="Mycelium Logomark" className="h-15 w-15 flex-none" />
<div className="ml-4"> <div className="ml-4">
<p className="text-base font-semibold">Project Mycelium</p> <p className="text-base font-semibold">Project Mycelium</p>
<p className="mt-1 text-sm">Unleash the Power of Decentralization</p> <p className="mt-1 text-sm">Unleash the Power of Decentralization</p>
@@ -31,7 +31,7 @@ export function Footer() {
</div> </div>
<div className="group relative -mx-4 flex items-center self-stretch p-4 transition-colors hover:bg-gray-100 sm:self-auto sm:rounded-2xl lg:mx-0 lg:self-auto lg:p-6"> <div className="group relative -mx-4 flex items-center self-stretch p-4 transition-colors hover:bg-gray-100 sm:self-auto sm:rounded-2xl lg:mx-0 lg:self-auto lg:p-6">
<div className="relative flex h-16 w-16 flex-none items-center justify-center"> <div className="relative flex h-16 w-16 flex-none items-center justify-center">
<img src="/images/github.svg" alt="GitHub" className="h-16 w-16" /> <img src="/src/images/github.svg" alt="GitHub" className="h-16 w-16" />
</div> </div>
<div className="ml-4 lg:w-72"> <div className="ml-4 lg:w-72">
<p className="text-base font-semibold text-gray-900"> <p className="text-base font-semibold text-gray-900">
@@ -46,7 +46,7 @@ export function Footer() {
</div> </div>
</div> </div>
</div> </div>
<div className="flex flex-col items-center border-t border-gray-100 pt-8 pb-12 md:flex-row-reverse md:justify-between md:pt-6"> <div className="flex flex-col items-center border-t border-gray-200 pt-8 pb-12 md:flex-row-reverse md:justify-between md:pt-6">
<p className="mt-6 text-sm text-gray-500 md:mt-0"> <p className="mt-6 text-sm text-gray-500 md:mt-0">
&copy; Copyright{' '} &copy; Copyright{' '}
<a href="https://www.threefold.io" target="_blank" rel="noopener noreferrer" className="hover:text-cyan-500 transition-colors"> <a href="https://www.threefold.io" target="_blank" rel="noopener noreferrer" className="hover:text-cyan-500 transition-colors">

View File

@@ -1,12 +1,10 @@
import { useState } from 'react'
import { Link, useLocation } from 'react-router-dom' import { Link, useLocation } from 'react-router-dom'
import { Dropdown } from './ui/Dropdown' import { Dropdown } from './ui/Dropdown'
import { ChevronDownIcon } from '@heroicons/react/20/solid' import { ChevronDownIcon } from '@heroicons/react/20/solid'
import { Container } from './Container' import { Container } from './Container'
import { Button } from './Button' import { Button } from './Button'
import pmyceliumLogo from '../images/logos/logo_1.png' import pmyceliumLogo from '../images/logos/logo_1.png'
import { Dialog } from '@headlessui/react'
import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline'
const cloudNavItems = [ const cloudNavItems = [
{ name: 'Cloud', href: '/cloud' }, { name: 'Cloud', href: '/cloud' },
@@ -17,7 +15,6 @@ const cloudNavItems = [
export function Header() { export function Header() {
const location = useLocation() const location = useLocation()
const [mobileMenuOpen, setMobileMenuOpen] = useState(false)
const getCurrentPageName = () => { const getCurrentPageName = () => {
const currentPath = location.pathname; const currentPath = location.pathname;
@@ -29,9 +26,9 @@ export function Header() {
}; };
return ( return (
<header className="bg-white"> <header>
<nav className="border-b border-gray-100"> <nav>
<Container className="flex bg-transparent justify-between py-4"> <Container className="relative z-50 flex justify-between py-4">
<div className="relative z-10 flex items-center gap-16"> <div className="relative z-10 flex items-center gap-16">
<Link to="/" aria-label="Home"> <Link to="/" aria-label="Home">
<img src={pmyceliumLogo} alt="Mycelium" className="h-8 w-auto" /> <img src={pmyceliumLogo} alt="Mycelium" className="h-8 w-auto" />
@@ -69,94 +66,15 @@ export function Header() {
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
> >
Deploy Now Start Deployment
</Button> </Button>
<Button to="/download" variant="solid" color="cyan"> <Button to="/download" variant="solid" color="cyan">
Get Mycelium Connector Get Mycelium Connector
</Button> </Button>
</div> </div>
<div className="lg:hidden">
<button
type="button"
className="-m-2.5 inline-flex items-center justify-center rounded-md p-2.5 text-gray-700 hover:text-cyan-500 transition-colors"
onClick={() => setMobileMenuOpen(true)}
>
<span className="sr-only">Open main menu</span>
<Bars3Icon className="h-6 w-6" aria-hidden="true" />
</button>
</div>
</div> </div>
</Container> </Container>
</nav> </nav>
<Dialog as="div" className="lg:hidden" open={mobileMenuOpen} onClose={setMobileMenuOpen}>
<div className="fixed inset-0 z-10" />
<Dialog.Panel className="fixed inset-y-0 right-0 z-10 w-full overflow-y-auto bg-white px-6 py-6 sm:max-w-sm sm:ring-1 sm:ring-gray-900/10">
<div className="flex items-center justify-between">
<Link to="#" className="-m-1.5 p-1.5">
<span className="sr-only">Mycelium</span>
<img
className="h-8 w-auto"
src={pmyceliumLogo}
alt=""
/>
</Link>
<button
type="button"
className="-m-2.5 rounded-md p-2.5 text-gray-700 hover:text-cyan-500 transition-colors"
onClick={() => setMobileMenuOpen(false)}
>
<span className="sr-only">Close menu</span>
<XMarkIcon className="h-6 w-6" aria-hidden="true" />
</button>
</div>
<div className="mt-6 flow-root">
<div className="-my-6 divide-y divide-gray-500/10">
<div className="space-y-2 py-6">
{cloudNavItems.map((item) => (
<Link
key={item.name}
to={item.href}
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50"
onClick={() => setMobileMenuOpen(false)}
>
{item.name}
</Link>
))}
<Link
to="/network"
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50"
onClick={() => setMobileMenuOpen(false)}
>
Network
</Link>
<Link
to="/agents"
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50"
onClick={() => setMobileMenuOpen(false)}
>
Agents
</Link>
</div>
<div className="py-6">
<Button
to="https://myceliumcloud.tf"
variant="outline"
as="a"
target="_blank"
rel="noopener noreferrer"
className="w-full"
onClick={() => setMobileMenuOpen(false)}
>
Start Deployment
</Button>
<Button to="/download" variant="solid" color="cyan" className="mt-4 w-full" onClick={() => setMobileMenuOpen(false)}>
Get Mycelium Connector
</Button>
</div>
</div>
</div>
</Dialog.Panel>
</Dialog>
</header> </header>
) )
} }

View File

@@ -5,14 +5,12 @@ import { Header } from './Header'
export function Layout() { export function Layout() {
return ( return (
<div className="bg-[#fdfdfd] antialiased relative" style={{ fontFamily: 'var(--font-inter)' }}> <div className="bg-white antialiased" style={{ fontFamily: 'var(--font-inter)' }}>
<div className="relative z-10"> <Header />
<Header /> <main className="">
<main> <Outlet />
<Outlet /> </main>
</main> <Footer />
<Footer />
</div>
</div> </div>
) )
} }

View File

@@ -59,7 +59,7 @@ export default function FeaturesSectionDemo() {
}, },
]; ];
return ( return (
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 relative z-10 py-8 max-w-7xl mx-auto"> <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 relative z-10 py-10 max-w-7xl mx-auto">
{features.map((feature, index) => ( {features.map((feature, index) => (
<Feature key={feature.title} {...feature} index={index} /> <Feature key={feature.title} {...feature} index={index} />
))} ))}
@@ -81,7 +81,7 @@ const Feature = ({
return ( return (
<div <div
className={cn( className={cn(
"flex flex-col lg:border-r py-8 relative group/feature dark:border-neutral-800", "flex flex-col lg:border-r py-10 relative group/feature dark:border-neutral-800",
(index === 0 || index === 4) && "lg:border-l dark:border-neutral-800", (index === 0 || index === 4) && "lg:border-l dark:border-neutral-800",
index < 4 && "lg:border-b dark:border-neutral-800" index < 4 && "lg:border-b dark:border-neutral-800"
)} )}

View File

@@ -40,7 +40,7 @@ export default function FeaturesSectionDemo() {
}, },
]; ];
return ( return (
<div className="relative z-20 py-8 lg:py-40 max-w-7xl mx-auto"> <div className="relative z-20 py-10 lg:py-40 max-w-7xl mx-auto">
<div className="px-8"> <div className="px-8">
<h4 className="text-3xl lg:text-5xl lg:leading-tight max-w-5xl mx-auto text-center tracking-tight font-medium text-black dark:text-white"> <h4 className="text-3xl lg:text-5xl lg:leading-tight max-w-5xl mx-auto text-center tracking-tight font-medium text-black dark:text-white">
Packed with thousands of features Packed with thousands of features

View File

@@ -62,7 +62,7 @@ export const Carousel = ({ items, initialScroll = 0 }: CarouselProps) => {
return ( return (
<div className="relative w-full"> <div className="relative w-full">
<div <div
className="flex w-full overflow-x-scroll overscroll-x-auto scroll-smooth py-8 [scrollbar-width:none] md:py-20" className="flex w-full overflow-x-scroll overscroll-x-auto scroll-smooth py-10 [scrollbar-width:none] md:py-20"
ref={carouselRef} ref={carouselRef}
onScroll={checkScrollability} onScroll={checkScrollability}
> >
@@ -135,7 +135,7 @@ export const Card = ({
layoutId={layout ? `card-${card.title}` : undefined} layoutId={layout ? `card-${card.title}` : undefined}
className="relative z-10 flex h-104 w-80 flex-col justify-between overflow-hidden rounded-3xl p-8 md:h-120 md:w-96" className="relative z-10 flex h-104 w-80 flex-col justify-between overflow-hidden rounded-3xl p-8 md:h-120 md:w-96"
> >
<div className="flex h-2/5 flex-col justify-center py-4 px-4"> <div className="flex h-2/5 flex-col justify-center py-6 px-4">
<motion.p <motion.p
layoutId={layout ? `category-${card.category}` : undefined} layoutId={layout ? `category-${card.category}` : undefined}
className="text-left font-sans font-semibold text-cyan-500 uppercase tracking-wider text-xs md:text-sm" className="text-left font-sans font-semibold text-cyan-500 uppercase tracking-wider text-xs md:text-sm"

View File

@@ -8,7 +8,7 @@ const DarkCard = React.forwardRef<
<div <div
ref={ref} ref={ref}
className={cn( className={cn(
"border border-white/10 bg-white/3 p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 rounded-xl hover:bg-white/6 hover:scale-105 hover:shadow-lg hover:shadow-cyan-500/15", "border border-white/10 bg-white/3 p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 rounded-3xl hover:bg-white/6 hover:scale-105 hover:shadow-lg hover:shadow-cyan-500/15",
className className
)} )}
{...props} {...props}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1002 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

View File

@@ -6,7 +6,9 @@
line-height: 1.5; line-height: 1.5;
font-weight: 400; font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87); color: rgba(255, 255, 255, 0.87);
background-color: #242424;
font-synthesis: none; font-synthesis: none;
text-rendering: optimizeLegibility; text-rendering: optimizeLegibility;
@@ -58,6 +60,7 @@ button:focus-visible {
@media (prefers-color-scheme: light) { @media (prefers-color-scheme: light) {
:root { :root {
color: #213547; color: #213547;
background-color: #ffffff;
} }
a:hover { a:hover {
color: #747bff; color: #747bff;

View File

@@ -1,75 +0,0 @@
import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader } from '@/components/Texts'
const components = [
{
component: 'Long-Term Memory (FungiStor)',
purpose: 'Durable, distributed memory with erasure-coded resilience',
backedBy: 'Mycelium Storage',
},
{
component: 'Active Retrieval (HeroDB)',
purpose: 'Fast multimodal vector + keyword retrieval',
backedBy: 'Compute + Storage',
},
{
component: 'Secure Agent Workspaces (MOS Sandboxes)',
purpose: 'Ephemeral, isolated execution for agent actions',
backedBy: 'Mycelium Compute',
},
{
component: 'Private Communication (Mycelium Mesh)',
purpose: 'Peer-to-peer encrypted network',
backedBy: 'Mycelium Network',
},
{
component: 'Verifiable Execution (Deterministic Deploy)',
purpose: 'Ensure the code running is exactly what you signed',
backedBy: 'The Stack',
},
{
component: 'Agent Coordination Engine (coming online next)',
purpose: 'Orchestrate multi-step workflows and tool use',
backedBy: 'Hero Orchestrator',
},
]
export function AgentComponents() {
return (
<section className="bg-white py-24 sm:py-32">
<Container>
<div className="mx-auto max-w-3xl text-center">
<Eyebrow>AGENT COMPONENTS</Eyebrow>
<SectionHeader as="h2" className="mt-6 text-gray-900">
The Building Blocks of Sovereign Agents
</SectionHeader>
</div>
<div className="mx-auto mt-16 max-w-6xl overflow-x-auto">
<table className="w-full table-auto border-collapse text-left text-sm text-gray-700">
<thead>
<tr className="bg-cyan-50 border-b border-gray-100">
<th className="py-3 px-4 font-semibold text-gray-900">Component</th>
<th className="py-3 px-4 font-semibold text-gray-900">Purpose</th>
<th className="py-3 px-4 font-semibold text-gray-900">Backed By</th>
</tr>
</thead>
<tbody>
{components.map((item) => (
<tr
key={item.component}
className="border-b border-gray-100 hover:bg-cyan-50/40 transition"
>
<td className="py-4 px-4 font-medium text-gray-900">{item.component}</td>
<td className="py-4 px-4">{item.purpose}</td>
<td className="py-4 px-4 text-cyan-700 font-medium">{item.backedBy}</td>
</tr>
))}
</tbody>
</table>
</div>
</Container>
</section>
)
}

View File

@@ -1,43 +1,33 @@
'use client' 'use client'
import { Button } from '@/components/Button' import { Button } from '../../components/Button'
import { Eyebrow, H3 } from '@/components/Texts' import { Eyebrow, SectionHeader, P, H3 } from '../../components/Texts'
export function AgentHeroAlt() { export function AgentHeroAlt() {
return ( return (
<div className=""> <div className="relative bg-white lg:mt-10 mt-0">
{/* Boxed container */} <div className="relative h-80 overflow-hidden bg-transparent md:absolute md:right-0 md:h-full md:w-1/3 lg:w-2/3">
<div <img
className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-100 bg-white overflow-hidden bg-contain bg-right bg-no-repeat" alt=""
style={{ backgroundImage: "url('/images/agents.webp')", backgroundSize: "contain" }} src="/images/agents.png"
> className="size-full object-cover"
{/* Inner padding */} />
<div className="px-6 py-16 lg:py-16">
<div className="max-w-2xl lg:pl-6"> </div>
<Eyebrow>MYCELIUM AGENTS</Eyebrow> <div className="relative mx-auto max-w-7xl py-24 sm:py-32 lg:px-8">
<H3 as="h1" className="mt-4"> <div className="pr-6 pl-6 md:mr-auto md:w-2/3 md:pr-16 lg:w-1/2 lg:pl-0 lg:pr-24 xl:pr-32">
Sovereign AI Agents, Coming Soon. <Eyebrow className="text-base/7 font-semibold text-cyan-500">AGENT</Eyebrow>
</H3> <H3 as="h1" className="mt-2 text-gray-900">Sovereign AI Agents, Coming Soon.</H3>
<p className="mt-6 text-lg"> <P className="mt-6 text-gray-600">
The Agent layer will allow you to run autonomous, policy-governed AI that operates on infrastructure you control, with private memory, verifiable execution, and coordination across your personal or organizational environment. Hero is the autonomous agent layer for the Mycelium platformtrusted, policy-aware AI that runs on infrastructure you control and remembers what matters.
</p> </P>
<p className="mt-4 lg:text-base italic text-gray-600 text-sm"> <div className="mt-8">
Works Alone. Works Together. Use Agents on top of any Mycelium Cloud deployment or pair them with the Mycelium Network for private, encrypted collaboration across users and systems. <Button href="#" variant="solid" color="cyan">
</p> Join the Waitlist
<div className="mt-10 flex items-center gap-x-6"> </Button>
<Button href="#" variant="solid" color="cyan">
Follow Deployment
</Button>
<Button href="#" variant="outline">
Explore Docs <span aria-hidden="true"></span>
</Button>
</div>
</div> </div>
</div> </div>
</div> </div>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-100" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div>
</div> </div>
) )
} }

View File

@@ -2,9 +2,9 @@
import { useId, useState } from 'react' import { useId, useState } from 'react'
import { Button } from '@/components/Button' import { Button } from '../../components/Button'
import { Container } from '@/components/Container' import { Container } from '../../components/Container'
import ContactForm from '../../../components/ContactForm' import ContactForm from '../../components/ContactForm'
function BackgroundIllustration(props: React.ComponentPropsWithoutRef<'div'>) { function BackgroundIllustration(props: React.ComponentPropsWithoutRef<'div'>) {
const id = useId() const id = useId()

View File

@@ -4,8 +4,6 @@ import { GallerySection } from './GallerySection'
import { Companies } from './Companies' import { Companies } from './Companies'
import { BentoSection } from './BentoSection' import { BentoSection } from './BentoSection'
import { AgentHeroAlt } from './AgentHeroAlt' import { AgentHeroAlt } from './AgentHeroAlt'
import { CallToAction } from './CallToAction'
import { AgentComponents } from './AgentComponents'
export default function AgentsPage() { export default function AgentsPage() {
return ( return (
@@ -29,14 +27,6 @@ export default function AgentsPage() {
<AnimatedSection> <AnimatedSection>
<BentoSection /> <BentoSection />
</AnimatedSection> </AnimatedSection>
<AnimatedSection>
<AgentComponents />
</AnimatedSection>
<AnimatedSection>
<CallToAction />
</AnimatedSection>
</div> </div>
) )
} }

View File

@@ -1,6 +1,6 @@
import { motion } from 'framer-motion' import { motion } from 'framer-motion'
import { Container } from '@/components/Container' import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P, CT, CP } from '@/components/Texts' import { Eyebrow, SectionHeader, P, CT, CP } from '../../components/Texts'
const items = [ const items = [
{ {
@@ -19,7 +19,7 @@ const items = [
title: 'MOS Sandboxes', title: 'MOS Sandboxes',
subtitle: 'Secure Agent Workspaces', subtitle: 'Secure Agent Workspaces',
description: 'Attested, signed workspaces spin up ≈5s worldwide—ready to execute. Hardware isolation and scoped egress: run hard, tear down clean, zero residue.', description: 'Attested, signed workspaces spin up ≈5s worldwide—ready to execute. Hardware isolation and scoped egress: run hard, tear down clean, zero residue.',
video: '/videos/herodb.mp4', video: '/videos/sandbox.mp4',
}, },
{ {
title: 'Mycelium Mesh', title: 'Mycelium Mesh',

View File

@@ -1,59 +0,0 @@
import { CircleBackground } from '../../components/CircleBackground'
import { Container } from '@/components/Container'
import { Button } from '@/components/Button'
export function CallToAction() {
return (
<section
id="get-started"
className="relative overflow-hidden bg-gray-900 py-20 sm:py-28"
>
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2">
<CircleBackground color="#06b6d4" className="animate-spin-slower" />
</div>
<Container className="relative">
<div className="mx-auto max-w-2xl text-center">
<h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-white sm:text-4xl">
Start Building the Future of Sovereign AI
</h2>
<p className="mt-6 text-lg text-gray-300">
Use todays components models, storage, compute, mesh
and step into agents as they arrive.
</p>
<div className="mt-10 flex flex-wrap justify-center gap-x-6 gap-y-4">
<Button
as="a"
to="/deploy"
variant="solid"
color="white"
>
Deploy a Model
</Button>
<Button
as="a"
to="/host"
variant="outline"
color="white"
>
Host a Node
</Button>
<Button
as="a"
to="https://threefold.info/mycelium_network/docs/"
target="_blank"
rel="noreferrer"
variant="outline"
color="white"
>
Follow Development
</Button>
</div>
</div>
</Container>
</section>
)
}

View File

@@ -55,12 +55,12 @@ export function DeploySection() {
transition={{ duration: 0.6, ease: "easeOut", delay: 0.1 }} transition={{ duration: 0.6, ease: "easeOut", delay: 0.1 }}
className="mx-auto max-w-5xl text-center" className="mx-auto max-w-5xl text-center"
> >
<Eyebrow color="accent">Deployment</Eyebrow> <Eyebrow color="accent">Get Started</Eyebrow>
<SectionHeader className="text-3xl font-medium tracking-tight" color="light"> <SectionHeader className="text-3xl font-medium tracking-tight" color="light">
Run LLMs and Agent Workloads privately, today. Deploy Scalable LLMs and AI Agents
</SectionHeader> </SectionHeader>
<P className="mt-6" color="light"> <P className="mt-6" color="light">
Even before the full Agent layer launches, you can deploy models and retrieval pipelines using Mycelium Cloud. Launch and scale intelligence on your own terms. Mycelium Cloud makes it simple to deploy models, integrate knowledge, and run everything on a network you control.
</P> </P>
</motion.div> </motion.div>
<motion.ul <motion.ul

View File

@@ -53,13 +53,14 @@ export function GallerySection() {
<FadeIn transition={{ duration: 0.8, delay: 0.1 }}> <FadeIn transition={{ duration: 0.8, delay: 0.1 }}>
<div className="mx-auto max-w-5xl lg:mt-12"> <div className="mx-auto max-w-5xl lg:mt-12">
<Eyebrow color="accent">Use Cases</Eyebrow> <Eyebrow color="accent">Use Cases</Eyebrow>
<SectionHeader className="text-center" color="dark">What Agents Will Enable</SectionHeader> <SectionHeader className="text-center" color="dark">Agents with Endless Possibilities.</SectionHeader>
</div> </div>
</FadeIn> </FadeIn>
<FadeIn transition={{ duration: 0.8, delay: 0.2 }}> <FadeIn transition={{ duration: 0.8, delay: 0.2 }}>
<div className="mx-auto max-w-4xl mt-6 lg:px-0 px-4"> <div className="mx-auto max-w-4xl mt-6 lg:px-0 px-4">
<P className="text-center" color="dark"> <P className="text-center" color="dark">
The Agent layer is the coordination layer that sits on top of the Mycelium Stack, combining memory, execution, and secure communication into a single intelligence plane. Your private agent coordinates a team of specialists that spin up on demand, collaborate across your world, and deliver end-to-end results.
Many agents, one intelligenceyours.
</P> </P>
</div> </div>
</FadeIn> </FadeIn>

View File

@@ -1,55 +0,0 @@
"use client";
import { Container } from "@/components/Container";
import { Button } from "@/components/Button";
export function CallToAction() {
return (
<section className="relative overflow-hidden bg-gray-900">
{/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl bg-[#090909] mx-auto py-6 border border-t-0 border-b-0 border-gray-700"></div>
<div className="w-full border-t border-l border-r border-gray-700" />
{/* ✅ Main boxed area */}
<div
id="get-started"
className="relative py-18 max-w-7xl mx-auto bg-[#090909] border border-t-0 border-b-0 border-gray-700"
>
<Container className="relative">
<div className="mx-auto max-w-3xl text-center">
<h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-white sm:text-4xl">
Choose How You Want to Start
</h2>
<p className="mt-6 text-lg text-gray-300">
Host your own node to contribute capacity or deploy workloads using the Mycelium Cloud.
You dont need to host before deploying, and you dont need to deploy before hosting.
</p>
{/* ✅ Two cards, stacked center with spacing */}
<div className="mt-10 flex flex-wrap justify-center gap-x-10 gap-y-8">
<div className="flex flex-col items-center text-center max-w-xs">
<Button to="/host" variant="solid" color="cyan" className="mt-4">
Host a Node
</Button>
</div>
<div className="flex flex-col items-center text-center max-w-xs">
<Button to="/cloud" variant="outline" color="white" className="mt-4">
Start Deploying
</Button>
</div>
</div>
</div>
</Container>
</div>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-700" />
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-700 bg-transparent" />
</section>
);
}

View File

@@ -1,90 +1,92 @@
'use client'; import { Container } from '../../components/Container'
import { Eyebrow, H3, P } from '../../components/Texts'
import { Container } from '@/components/Container' const architectureSections = [
import { Eyebrow, H3, P } from '@/components/Texts'
import { Button } from '@/components/Button'
import { MeshNetworkIcon } from './animations/MeshNetworkIcon'
import { SovereignComputer } from './animations/SovereignComputer'
import { DeterministicOrchestration } from './animations/DeterministicOrchestration'
const architecture = [
{ {
title: 'Mesh Networking Layer', title: 'Decentralized Infrastructure',
description: description:
'Every node receives a cryptographic network identity and secure routing path.', 'Clusters launch across the ThreeFold Grid with direct node access and encrypted connectivity.',
icon: <MeshNetworkIcon className="mb-4" />, // ✅ stored as const JSX bullets: [
'Unique Mycelium IP addresses assigned to every node.',
'Peer-to-peer mesh networking links services across nodes.',
'End-to-end encryption keeps traffic sealed inside the fabric.',
'No public IP exposure—everything is addressable via Mycelium IPs.',
],
}, },
{ {
title: 'Sovereign Compute Layer', title: 'Network Flow',
description: description:
'Workloads run on hardware you authorize, no shared control, no exposed surfaces.', 'Traffic moves through the Mycelium mesh, maintaining sovereignty without sacrificing reach.',
icon: <SovereignComputer className="mb-4" />, bullets: [
'User requests enter through the encrypted Mycelium network.',
'Traffic routes directly to cluster nodes without intermediate hops.',
'Services answer over the same mesh—no ingress controller required.',
'Operational visibility without exposing public attack surface.',
],
}, },
{ {
title: 'Deterministic Orchestration', title: 'Kubernetes Management',
description: description:
'K3s clusters deploy predictably, verifiably, and remain drift-free.', 'Lightweight K3s orchestration delivers HA clusters with automated lifecycle management.',
icon: <DeterministicOrchestration className="mb-4" />, bullets: [
'Full K3s deployment and lifecycle management built-in.',
'IPv6-native networking ensures deterministic service discovery.',
'Multi-master topologies with automatic failover for resilience.',
'Drift-free upgrades orchestrated through smart contracts.',
],
}, },
] ]
export function CloudArchitecture() { export function CloudArchitecture() {
return ( return (
<section className="bg-[#121212] w-full max-w-8xl mx-auto"> <section className="bg-white py-24 lg:py-32">
<Container>
{/* ✅ Top horizontal spacer like HomeHosting */} <div className="mx-auto max-w-5xl text-center">
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800 bg-transparent" /> <Eyebrow>
<div className="w-full border-t border-l border-r border-gray-800" /> Technical Architecture
</Eyebrow>
{/* ✅ Boxed container with matching spacing */} <H3 className="mt-6 text-gray-900">
<div className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-800 bg-[#111111] py-12"> Built on a Sovereign, Encrypted Delivery Mesh.
<Container> </H3>
<div className="mx-auto max-w-4xl sm:text-center"> <P className="mt-6 text-gray-600">
<Eyebrow className="text-cyan-400">ARCHITECTURE</Eyebrow> Mycelium Cloud rides on the ThreeFold Grid, pairing encrypted mesh
networking with deterministic K3s orchestration. Every layer is
<H3 className="text-3xl lg:text-4xl font-medium tracking-tight text-white"> designed to keep workloads sovereign, observable, and effortless to
How Mycelium Cloud Works operate.
</H3> </P>
</div>
<P className="mt-6 text-lg text-gray-300"> <div className="mt-16 grid gap-8 lg:grid-cols-3">
Mycelium Cloud runs Kubernetes on a global encrypted mesh, with {architectureSections.map((section) => (
identity, routing, and state verified at the protocol level. <div
</P> key={section.title}
</div> className="flex h-full flex-col rounded-3xl border border-slate-200 bg-gray-50/25 p-8 shadow-sm transition hover:-translate-y-1 hover:border-cyan-300 hover:shadow-lg "
>
{/* ✅ Card layout spacing & grid match HomeHosting */} <div className="flex items-center gap-3">
<ul <span className="inline-flex size-10 items-center justify-center rounded-full bg-cyan-500/10 text-base font-semibold uppercase tracking-[0.3em] text-cyan-600">
role="list"
className="mx-auto mt-12 grid max-w-2xl grid-cols-1 gap-6 text-sm </span>
sm:grid-cols-2 lg:max-w-none lg:grid-cols-3 md:gap-y-10 " <h3 className="text-xl font-semibold text-gray-900">
> {section.title}
{architecture.map((layer) => ( </h3>
<li </div>
key={layer.title} <p className="mt-4 text-sm leading-relaxed text-gray-600">
className="rounded-xl border border-gray-800 bg-[#111]/60 p-6 hover:transform-[scale(1.05)]" {section.description}
> </p>
{layer.icon} {/* ✅ this now works */} <ul className="mt-6 space-y-3 text-sm text-gray-600">
<h3 className="text-lg font-semibold text-white">{layer.title}</h3> {section.bullets.map((bullet) => (
<p className="mt-2 text-gray-400 leading-snug">{layer.description}</p> <li
</li> key={bullet}
))} className="flex items-start gap-3 rounded-2xl border border-cyan-100 bg-cyan-50/60 p-3 leading-relaxed"
</ul> >
<span className="mt-1 inline-block size-2 rounded-full bg-cyan-500" />
{/* ✅ Matching button spacing and layout */} <span>{bullet}</span>
<div className="mx-auto mt-12 flex justify-center gap-6"> </li>
<Button variant="solid" color="cyan" href="/start"> ))}
Get Started </ul>
</Button> </div>
<Button variant="outline" color="white" href="/docs"> ))}
Explore Docs </div>
</Button> </Container>
</div>
</Container>
</div>
{/* ✅ bottom border + bottom spacer to match */}
<div className="w-full border-b border-gray-800" />
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800 bg-transparent" />
</section> </section>
) )
} }

View File

@@ -1,61 +0,0 @@
"use client";
import { Container } from "@/components/Container";
import { H3, P, Eyebrow } from "@/components/Texts";
export function CloudBluePrint() {
const logos = [
{ src: '/images/logo/cryptpad.png', href: 'https://cryptpad.fr' },
{ src: '/images/logo/gitea.png', href: 'https://about.gitea.com' },
{ src: '/images/logo/lifekit.png', href: '#' }, // No link available
{ src: '/images/logo/matrix.png', href: 'https://matrix.org' },
{ src: '/images/logo/nextcloud.png', href: 'https://nextcloud.com' },
{ src: '/images/logo/stalwart.png', href: 'https://stalw.art' },
];
return (
<section className="w-full max-w-8xl mx-auto bg-transparent">
{/* ✅ Boxed container */}
<div className="max-w-7xl bg-white mx-auto py-12 border border-t-0 border-b-0 border-gray-100">
<Container>
<div className="mx-auto max-w-4xl sm:text-center">
<Eyebrow className="text-cyan-500">Featured Blueprint</Eyebrow>
<H3 className="text-3xl lg:text-4xl font-medium tracking-tight text-gray-900 mt-2">
Your Personal Sovereign Cloud Workspace
</H3>
<P className="mt-6 text-lg text-gray-600">
Digital Me is an example environment built to demonstrate whats possible on top of the Mycelium Stack a full personal cloud you can deploy, customize, or extend. Your files, communication, apps, and optional AI agent, all running privately on infrastructure you choose.
</P>
</div>
{/* ✅ 3x2 logo grid */}
<div className="mt-12 grid grid-cols-3 gap-x-8 gap-y-12">
{logos.map((logo, i) => (
<div key={i} className="flex justify-center">
<a
href={logo.href}
target="_blank"
rel="noopener noreferrer"
className="transition-transform duration-300 hover:scale-105"
>
<img
src={logo.src}
alt={`Logo ${i + 1}`}
className="max-h-12 w-auto object-contain"
/>
</a>
</div>
))}
</div>
</Container>
</div>
{/* ✅ Bottom line + bottom spacer */}
<div className="w-full border-b border-gray-100" />
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-100 bg-transparent" />
</section>
);
}

View File

@@ -1,5 +1,5 @@
import { Container } from '@/components/Container' import { Container } from '../../components/Container'
import { Button } from '@/components/Button' import { Button } from '../../components/Button'
export function CloudCTA() { export function CloudCTA() {
return ( return (

View File

@@ -354,7 +354,7 @@ function CloudFeaturesMobile() {
> >
<div <div
className={clsx( className={clsx(
'relative transform overflow-hidden rounded-2xl bg-gray-800 px-5 py-4 outline-2 transition-colors', 'relative transform overflow-hidden rounded-2xl bg-gray-800 px-5 py-6 outline-2 transition-colors',
activeIndex === featureIndex activeIndex === featureIndex
? 'outline-transparent' // Remove outline for active mobile slide ? 'outline-transparent' // Remove outline for active mobile slide
: 'outline-transparent hover:outline-cyan-500', : 'outline-transparent hover:outline-cyan-500',
@@ -415,7 +415,7 @@ export function CloudFeatures() {
A Decentralized Cloud that Operates Itself A Decentralized Cloud that Operates Itself
</SectionHeader> </SectionHeader>
<P color="light" className="mt-6"> <P color="light" className="mt-6">
Mycelium Cloud runs Kubernetes on a sovereign, self-healing network with compute, storage, and networking built in, so you dont need external cloud dependencies. Mycelium Cloud runs Kubernetes on a sovereign, self-healing network. Storage, networking, and compute are all integrated.
</P> </P>
</div> </div>
</Container> </Container>

View File

@@ -1,283 +0,0 @@
'use client'
import { Fragment, useEffect, useRef, useState } from 'react'
import { Tab, TabGroup, TabList, TabPanel, TabPanels } from '@headlessui/react'
import clsx from 'clsx'
import {
type MotionProps,
type Variant,
AnimatePresence,
motion,
} from 'framer-motion'
import { useDebouncedCallback } from 'use-debounce'
import {
Eyebrow,
FeatureDescription,
FeatureTitle,
MobileFeatureTitle,
P,
SectionHeader,
} from '@/components/Texts'
import { Container } from '@/components/Container'
import reservenodeimg from '/images/cloud/reserve.png'
import billingImg from '/images/cloud/billing.png'
import kubeconfigImg from '/images/cloud/kubeconfig.png'
/* Feature Data */
const features = [
{
name: 'Decentralized Kubernetes',
description:
"Reserve a node and deploy sovereign Kubernetes clusters on decentralized infrastructure.",
screen: () => (
<img
src={reservenodeimg}
className="rounded-xl shadow-xl ring-1 ring-gray-300"
/>
),
},
{
name: 'Manage Your Cluster',
description:
'Manage your cluster with ease, with a simple and intuitive interface.',
screen: () => (
<img
src={kubeconfigImg}
className="rounded-xl shadow-xl ring-1 ring-gray-300"
/>
),
},
{
name: 'Personalised Billings & Accounts',
description:
'Easily manage your cluster billing and accounts with personalised configurations.',
screen: () => (
<img
src={billingImg}
className="rounded-xl shadow-xl ring-1 ring-gray-300"
/>
),
},
]
interface CustomAnimationProps {
isForwards: boolean
changeCount: number
}
const maxZIndex = 2147483647
const bodyVariantBackwards: Variant = {
opacity: 0.4,
scale: 0.8,
zIndex: 0,
filter: 'blur(4px)',
transition: { duration: 0.4 },
}
const bodyAnimation: MotionProps = {
initial: 'initial',
animate: 'animate',
exit: 'exit',
variants: {
initial: (custom: CustomAnimationProps) =>
custom.isForwards
? {
y: '100%',
zIndex: maxZIndex - custom.changeCount,
transition: { duration: 0.4 },
}
: bodyVariantBackwards,
animate: (custom: CustomAnimationProps) => ({
y: '0%',
opacity: 1,
scale: 1,
zIndex: maxZIndex / 2 - custom.changeCount,
filter: 'blur(0px)',
transition: { duration: 0.4 },
}),
exit: (custom: CustomAnimationProps) =>
custom.isForwards
? bodyVariantBackwards
: {
y: '100%',
zIndex: maxZIndex - custom.changeCount,
transition: { duration: 0.4 },
},
},
}
function usePrevious<T>(value: T) {
const ref = useRef<T>()
useEffect(() => {
ref.current = value
}, [value])
return ref.current
}
/* Desktop Component */
function CloudFeaturesDesktop() {
let [changeCount, setChangeCount] = useState(0)
let [selectedIndex, setSelectedIndex] = useState(0)
let prevIndex = usePrevious(selectedIndex)
let isForwards = prevIndex === undefined ? true : selectedIndex > prevIndex
let onChange = useDebouncedCallback(
(selectedIndex: number) => {
setSelectedIndex(selectedIndex)
setChangeCount((changeCount) => changeCount + 1)
},
100,
{ leading: true },
)
return (
<TabGroup
vertical
className="grid grid-cols-12 items-center gap-10"
selectedIndex={selectedIndex}
onChange={onChange}
>
<TabList className="col-span-6 space-y-6 pl-4 lg:pl-6">
{features.map((feature, featureIndex) => (
<div
key={feature.name}
className={clsx(
'relative rounded-2xl outline-2 transition-all duration-300 ease-in-out hover:scale-105 hover:bg-gray-100',
selectedIndex === featureIndex
? 'outline-cyan-500'
: 'outline-transparent hover:outline-cyan-500',
)}
>
{featureIndex === selectedIndex && (
<motion.div
layoutId="activeBackground"
className="absolute inset-0 bg-white shadow"
initial={{ borderRadius: 16 }}
/>
)}
<div className="relative z-10 p-8">
<FeatureTitle as="h3" className="text-gray-900">
<Tab className="text-left data-selected:not-data-focus:outline-hidden">
<span className="absolute inset-0 rounded-2xl" />
{feature.name}
</Tab>
</FeatureTitle>
<FeatureDescription className="mt-2 text-gray-600">
{feature.description}
</FeatureDescription>
</div>
</div>
))}
</TabList>
<div className="relative col-span-6">
<TabPanels as={Fragment}>
<AnimatePresence
initial={false}
custom={{ isForwards, changeCount }}
>
{features.map((feature, featureIndex) =>
selectedIndex === featureIndex ? (
<TabPanel
static
key={feature.name + changeCount}
className="col-start-1 row-start-1 flex focus:outline-offset-32 data-selected:not-data-focus:outline-hidden"
>
<motion.div
{...bodyAnimation}
custom={{ isForwards, changeCount }}
className="w-full flex justify-center"
>
<feature.screen />
</motion.div>
</TabPanel>
) : null,
)}
</AnimatePresence>
</TabPanels>
</div>
</TabGroup>
)
}
/* Mobile Version */
function CloudFeaturesMobile() {
return (
<>
<div className="flex snap-x overflow-x-auto space-x-4 pb-4 scrollbar-hide">
{features.map((feature, i) => (
<div key={i} className="w-full flex-none snap-center px-4">
<div className="rounded-2xl bg-white shadow ring-1 ring-gray-200 p-6">
<div className="w-full max-w-[366px] mx-auto">
<feature.screen />
</div>
<div className="mt-6">
<MobileFeatureTitle className="text-gray-900">
{feature.name}
</MobileFeatureTitle>
<FeatureDescription className="mt-2 text-gray-600">
{feature.description}
</FeatureDescription>
</div>
</div>
</div>
))}
</div>
</>
)
}
/* ✅ FINAL LIGHT MODE EXPORT — BOXED CONTAINER + BORDERS MATCHING CloudHeroNew */
export function CloudFeaturesLight() {
return (
<div className="">
{/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div>
<div className="w-full border-t border-l border-r border-gray-100" />
{/* ✅ Boxed container (border-x only) */}
<div className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-100 bg-white">
<section className="px-6 py-16 lg:py-16">
<Container>
<div className="max-w-4xl mx-auto items-center text-center">
<Eyebrow color="accent">Platform Overview</Eyebrow>
<SectionHeader className="mt-2 text-gray-900">
A Decentralized Cloud that Operates Itself
</SectionHeader>
<P className="mt-6 text-gray-600">
Mycelium Cloud runs Kubernetes on a sovereign, self-healing network
with compute, storage, and networking built in so you dont need
external cloud dependencies.
</P>
</div>
</Container>
<div className="hidden md:block mt-12">
<CloudFeaturesDesktop />
</div>
<div className="md:hidden mt-12">
<CloudFeaturesMobile />
</div>
</section>
</div>
{/* ✅ Bottom horizontal line */}
<div className="w-full border-b border-gray-100" />
{/* ✅ Bottom spacer matching hero */}
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div>
</div>
)
}

View File

@@ -1,5 +1,5 @@
import { Container } from '@/components/Container' import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P, Small } from '@/components/Texts' import { Eyebrow, SectionHeader, P, Small } from '../../components/Texts'
type Step = { type Step = {
number: string number: string

View File

@@ -1,8 +1,8 @@
import { useId } from 'react' import { useId } from 'react'
import { Button } from '@/components/Button' import { Button } from '../../components/Button'
import { Container } from '@/components/Container' import { Container } from '../../components/Container'
import { Eyebrow, H2, P, H5 } from '@/components/Texts' import { Eyebrow, H2, P, H5 } from '../../components/Texts'
function BackgroundIllustration(props: React.ComponentPropsWithoutRef<'div'>) { function BackgroundIllustration(props: React.ComponentPropsWithoutRef<'div'>) {
const id = useId() const id = useId()

View File

@@ -1,6 +1,6 @@
'use client' 'use client'
import { Button } from '@/components/Button' import { Button } from '../../components/Button'
export function CloudHeroAlt() { export function CloudHeroAlt() {
return ( return (

View File

@@ -1,51 +1,45 @@
import { H3, Eyebrow } from "@/components/Texts" import { H3, H5, Eyebrow } from "../../components/Texts"
import { Button } from "@/components/Button" import { Button } from "../../components/Button"
export function CloudHeroNew({ onGetStartedClick = () => {} }: { onGetStartedClick?: () => void }) {
export function CloudHeroNew() {
return ( return (
<div className=""> <div
{/* Boxed container */} className="relative bg-cover lg:bg-contain bg-right bg-no-repeat"
<div style={{ backgroundImage: "url('/images/cloudhero4.webp')" }}
className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-100 bg-white overflow-hidden bg-contain bg-right bg-no-repeat" >
style={{ backgroundImage: "url('/images/cloudhero4.webp')", backgroundSize: "contain" }} <div className="mx-auto max-w-7xl lg:px-8">
> <div className="px-6 pt-12 pb-24 sm:pb-32 lg:col-span-5 lg:px-0 lg:pt-40 lg:pb-48 xl:col-span-5">
{/* Inner padding */} <div className="mx-auto max-w-2xl lg:mx-0">
<div className="px-6 py-16 lg:py-16">
<div className="max-w-2xl lg:pl-6">
<Eyebrow> <Eyebrow>
Mycelium Cloud Mycelium Cloud
</Eyebrow> </Eyebrow>
<H3 className="mt-4"> <H3 className="mt-4">
Run Kubernetes on the Sovereign Agentic Cloud Run Kubernetes on the Sovereign Agentic Cloud
</H3> </H3>
<p className="mt-6 text-lg"> <H5 className="mt-8 text-lg text-gray-600">
Mycelium Cloud turns the ThreeFold Grid into a programmable substrate for K3s.
</H5>
<H5 className="mt-4 text-lg text-gray-600">
Deploy K3s clusters on a global, self-healing mesh network. Deploy K3s clusters on a global, self-healing mesh network.
Your workloads run on sovereign, encrypted infrastructure, without centralized cloud control. Your workloads run on sovereign, encrypted infrastructure, without centralized cloud control.
</p> </H5>
<p className="mt-4 lg:text-base italic text-gray-600 text-sm">
Works Alone. Works Together.
Mycelium Cloud can run on any network fabric, or pair with Mycelium Network
for sovereign connectivity.
</p>
<div className="mt-10 flex items-center gap-x-6"> <div className="mt-10 flex items-center gap-x-6">
<Button <Button
onClick={onGetStartedClick} to="#"
variant="solid" variant="solid"
className=""
color="cyan" color="cyan"
> >
Get started Get started
</Button> </Button>
<Button to="#" variant="outline"> <Button to="#" variant="outline">
Documentation <span aria-hidden="true"></span> Explore Docs <span aria-hidden="true"> </span>
</Button> </Button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-100" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div>
</div> </div>
) )
} }

View File

@@ -4,32 +4,28 @@ import {
ServerIcon, ServerIcon,
ShieldCheckIcon, ShieldCheckIcon,
} from '@heroicons/react/24/outline' } from '@heroicons/react/24/outline'
import { CP, CT, Eyebrow, H3 } from '@/components/Texts' import { CP, CT, Eyebrow, H3, P } from '../../components/Texts'
const features = [ const features = [
{ {
Eyebrow: 'DevOps / Cloud teams',
name: 'Kubernetes Clusters', name: 'Kubernetes Clusters',
description: 'Deterministic K3s workloads across sovereign hardware.', description: 'Deploy and scale containerized apps across your own hardware.',
icon: ServerIcon, icon: ServerIcon,
}, },
{ {
Eyebrow: 'Security & infrastructure', name: 'AI Agents & LLM Runtimes',
name: 'Encrypted Mesh Networking', description: 'Run open-source models locally, securely, and offline.',
description: 'No public ingress, no exposed attack surface, zero-trust routing.', icon: ArrowPathIcon,
icon: ShieldCheckIcon,
}, },
{ {
Eyebrow: 'Data-driven teams',
name: 'S3-Compatible Storage', name: 'S3-Compatible Storage',
description: 'Distributed storage with erasure coding and residency control.', description: 'Your own personal over-the-network drive, encrypted end-to-end.',
icon: CloudArrowUpIcon, icon: CloudArrowUpIcon,
}, },
{ {
Eyebrow: 'AI / ML workloads', name: 'Mesh VPN & Zero-Trust Networking',
name: 'GPU-Ready', description: 'Securely connect all your devices and remote locations.',
description: 'Scale inference & training on demand.', icon: ShieldCheckIcon,
icon: ArrowPathIcon,
}, },
] ]
@@ -37,8 +33,13 @@ export function CloudHosting() {
return ( return (
<div className="relative bg-white py-24 lg:py-32"> <div className="relative bg-white py-24 lg:py-32">
<div className="mx-auto max-w-md px-6 text-center sm:max-w-3xl lg:max-w-7xl lg:px-8"> <div className="mx-auto max-w-md px-6 text-center sm:max-w-3xl lg:max-w-7xl lg:px-8">
<Eyebrow>CAPABILITIES</Eyebrow> <Eyebrow>DEPLOY</Eyebrow>
<H3 className="mt-2">What You Can Run on Mycelium Cloud</H3> <H3 className="mt-2">What You Can Run on Mycelium Cloud</H3>
<P className="mx-auto mt-5 max-w-prose">
Turn your own machines into real, production-grade infrastructure. Mycelium handles the networking,
orchestration, and security layers, so you can deploy services the same way you would on public cloud without
giving your data or control to anyone.
</P>
<div className="mt-16"> <div className="mt-16">
<div className="grid grid-cols-1 gap-12 lg:grid-cols-4"> <div className="grid grid-cols-1 gap-12 lg:grid-cols-4">
{features.map((feature) => ( {features.map((feature) => (
@@ -47,7 +48,6 @@ export function CloudHosting() {
<span className="absolute -top-6 left-1/2 -translate-x-1/2 transform rounded-xl bg-cyan-500 hover:bg-cyan-400 p-3 shadow-lg"> <span className="absolute -top-6 left-1/2 -translate-x-1/2 transform rounded-xl bg-cyan-500 hover:bg-cyan-400 p-3 shadow-lg">
<feature.icon aria-hidden="true" className="size-8 text-white" /> <feature.icon aria-hidden="true" className="size-8 text-white" />
</span> </span>
<Eyebrow>{feature.Eyebrow}</Eyebrow>
<CT as="h3" className="mt-4"> <CT as="h3" className="mt-4">
{feature.name} {feature.name}
</CT> </CT>

View File

@@ -1,105 +0,0 @@
'use client'
import {
Disclosure,
DisclosureButton,
DisclosurePanel,
} from '@headlessui/react'
import { MinusIcon, PlusIcon } from '@heroicons/react/24/outline'
import { Eyebrow, H3, H4 } from "@/components/Texts"
const product = {
subtitle: 'capabilities',
name: 'What You Can Run on Mycelium Cloud',
description: '<p>Host nodes, deploy workloads, or build private AI systems, all on infrastructure you own and control.</p>',
details: [
{
name: 'Kubernetes Clusters',
description: 'Deterministic K3s workloads across sovereign hardware.',
},
{
name: 'Encrypted Mesh Networking',
description: 'No public ingress, no exposed attack surface, zero-trust routing.',
},
{
name: 'S3-Compatible Storage',
description: 'Distributed storage with erasure coding and residency control.',
},
{
name: 'GPU-Ready',
description: 'Scale inference & training on demand.',
},
],
}
// ✅ keep your product + relatedProducts data above here …
export function CloudHostingNew() {
return (
<div className="bg-[#121212] text-white">
{/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl bg-[#111111] mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div>
<div className="w-full border-t border-l border-r border-gray-800" />
{/* ✅ MAIN CONTENT */}
<main className="mx-auto max-w-7xl px-6 lg:px-12 py-12 border border-t-0 border-b-0 border-gray-800">
<div className="mx-auto max-w-2xl lg:max-w-none">
{/* ✅ Product Section */}
<div className="lg:grid lg:grid-cols-5 lg:items-start lg:gap-x-8">
{/* ✅ Image */}
<div className="lg:col-span-2 lg:mt-8 mt-2">
<img alt="Mycelium Cloud" src="/images/cloudhosting.webp" className="aspect-square w-full object-cover" />
</div>
{/* ✅ Product info */}
<div className="mt-8 px-4 sm:px-0 lg:mt-0 lg:col-span-3">
<Eyebrow>{product.subtitle}</Eyebrow>
<H4 className=" text-white">{product.name}</H4>
<div className="mt-4 text-gray-300 text-xl"
dangerouslySetInnerHTML={{ __html: product.description }}
/>
{/* ✅ Details accordion */}
<section className="mt-6">
<div className="divide-y divide-gray-800 border-t border-cyan-500">
{product.details.map((detail) => (
<Disclosure key={detail.name} as="div">
<H3>
<DisclosureButton className="group flex w-full items-center justify-between py-6 text-left">
<span className="text-lg tracking-normal font-medium text-white">
{detail.name}
</span>
<span className="ml-6 flex items-center">
<PlusIcon className="block h-6 w-6 text-gray-500 group-open:hidden" />
<MinusIcon className="hidden h-6 w-6 text-indigo-400 group-open:block" />
</span>
</DisclosureButton>
</H3>
<DisclosurePanel className="pb-6">
<p className="text-gray-400 text-base tracking-normal">{detail.description}</p>
</DisclosurePanel>
</Disclosure>
))}
</div>
</section>
</div>
</div>
</div>
</main>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-800" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div>
</div>
)
}

View File

@@ -1,6 +1,6 @@
import { CircleBackground } from '@/components/CircleBackground' import { CircleBackground } from '../../components/CircleBackground'
import { Container } from '@/components/Container' import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P, Small } from '@/components/Texts' import { Eyebrow, SectionHeader, P, Small } from '../../components/Texts'
const focusAreas = [ const focusAreas = [
{ {

View File

@@ -1,12 +1,12 @@
import { AnimatedSection } from '../../components/AnimatedSection' import { AnimatedSection } from '../../components/AnimatedSection'
import { CloudArchitecture } from './CloudArchitecture' import { CloudArchitecture } from './CloudArchitecture'
import { CloudFeatures } from './CloudFeatures'
import { CloudGettingStarted } from './CloudGettingStarted'
import { CloudUseCases } from './CloudUseCases' import { CloudUseCases } from './CloudUseCases'
import { SecurityPillars } from './SecurityPillars'
import { CloudCTA } from './CloudCTA'
import { CloudHeroNew } from './CloudHeroNew' import { CloudHeroNew } from './CloudHeroNew'
import { CloudBluePrint } from './CloudBluePrint' import { CloudHosting } from './CloudHosting'
import { CallToAction } from './CalltoAction'
import { CloudHostingNew } from './CloudHostingNew'
import { CloudFeaturesLight } from './CloudFeaturesLight'
export default function CloudPage() { export default function CloudPage() {
return ( return (
@@ -17,27 +17,28 @@ export default function CloudPage() {
</AnimatedSection> </AnimatedSection>
<AnimatedSection> <AnimatedSection>
<CloudHostingNew /> <CloudHosting />
</AnimatedSection> </AnimatedSection>
<AnimatedSection> <AnimatedSection>
<CloudFeaturesLight /> <CloudFeatures />
</AnimatedSection> </AnimatedSection>
<AnimatedSection> <AnimatedSection>
<CloudArchitecture /> <CloudArchitecture />
</AnimatedSection> </AnimatedSection>
<AnimatedSection>
<CloudGettingStarted />
</AnimatedSection>
<AnimatedSection> <AnimatedSection>
<CloudUseCases /> <CloudUseCases />
</AnimatedSection> </AnimatedSection>
<AnimatedSection> <AnimatedSection>
<CloudBluePrint /> <SecurityPillars />
</AnimatedSection> </AnimatedSection>
<AnimatedSection> <AnimatedSection>
<CallToAction /> <CloudCTA />
</AnimatedSection> </AnimatedSection>
</> </>
) )

View File

@@ -1,111 +1,90 @@
"use client"; import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P, Small } from '../../components/Texts'
import { Container } from '@/components/Container'
import { Eyebrow, H3, P, Small } from '@/components/Texts'
const useCases = [ const useCases = [
{ {
title: 'Enterprise & Private Kubernetes', title: 'AI / ML Training',
description: description:
'Production-grade K3s clusters with full workload ownership and residency control. Deploy apps and internal services without vendor lock-in or exposed surfaces.', 'Run GPU-accelerated workloads for deep learning, data science, and inference on demand.',
bullets: [ bullets: ['GPU acceleration', 'Scalable compute', 'Cost optimization'],
'High availability + failover',
'Encrypted, mesh-native networking',
'Compliance-ready governance & policy control',
],
}, },
{ {
title: 'Edge & Distributed Deployments', title: 'Enterprise Kubernetes',
description: description:
'Place compute close to where data is created. Run clusters globally across home labs, offices, data centers, or edge locations.', 'Operate production-grade clusters with complete control and no vendor lock-in.',
bullets: [ bullets: ['High availability', 'Security', 'Compliance'],
'Low-latency execution',
'Mesh-routed connectivity',
'Autonomous healing across region',
],
}, },
{ {
title: 'AI / ML & Agent Workloads', title: 'Edge & IoT',
description: description:
'Run inference, training, and autonomous AI systems on sovereign compute. GPU orchestration, private vector storage, and model execution without handing data to hyperscalers.', 'Leverage global nodes for low-latency workloads and connected device deployments.',
bullets: ['Low latency', 'Global distribution', 'Real-time processing'],
},
{
title: 'DigitalMe Blueprint',
description:
'Launch a full digital workspace on Mycelium Cloud with pre-integrated services.',
bullets: [ bullets: [
'Scales across nodes', 'Cryptpad • Encrypted collaboration',
'Supports open-source & fine-tuned models', 'Elements • Matrix chat',
'Built for agentic automation + RAG', 'Stallwart • Mail, calendar, contacts',
'Gitea • Git hosting',
'Nextcloud • File storage and sync',
'LiveKit / Jitsi • Real-time video',
'Single Sign-On backed by Gitea',
], ],
}, },
] ]
export function CloudUseCases() { export function CloudUseCases() {
return ( return (
<section className="w-full max-w-8xl mx-auto bg-transparent"> <section className="bg-white py-24 sm:py-32">
<Container>
{/* ✅ Top horizontal line with spacing */} <div className="mx-auto max-w-3xl text-center">
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div> <Eyebrow>
<div className="w-full border-t border-l border-r border-gray-100" /> Use Cases
</Eyebrow>
{/* ✅ Inner boxed container */} <SectionHeader as="h2" className="mt-6 text-gray-900">
<div className="max-w-7xl bg-white mx-auto py-12 border border-t-0 border-b-0 border-gray-100"> Built for intelligent workloads across every edge.
<Container> </SectionHeader>
<div className="mx-auto max-w-4xl sm:text-center"> <P className="mt-6 text-gray-600">
<Eyebrow className="text-cyan-500">USE CASES</Eyebrow> Mycelium Cloud unifies compute, storage, and networking so teams can
launch anything from GPU inference farms to global collaboration
<H3 className="text-3xl lg:text-4xl font-medium tracking-tight text-gray-900"> suites with deterministic outcomes.
Built for intelligent workloads across every edge. </P>
</H3> </div>
<div className="mt-16 grid gap-8 lg:grid-cols-2">
<P className="mt-6 text-lg text-gray-600"> {useCases.map((useCase) => (
Mycelium Cloud unifies compute, storage, and networking so teams can <div
launch anything from GPU inference farms to global collaboration suites key={useCase.title}
with deterministic outcomes. className="flex h-full flex-col rounded-3xl border border-slate-200 bg-white p-8 shadow-sm transition hover:-translate-y-1 hover:border-cyan-300 hover:shadow-lg"
</P> >
</div> <div className="flex items-center justify-between">
<h3 className="text-xl font-semibold text-gray-900">
{/* ✅ 3 columns on desktop */} {useCase.title}
<ul </h3>
role="list" <Small className="text-xs uppercase tracking-[0.3em] text-cyan-500">
className="mx-auto mt-12 grid max-w-2xl grid-cols-1 gap-6 Scenario
sm:grid-cols-2 lg:max-w-none lg:grid-cols-3 md:gap-y-10" </Small>
> </div>
{useCases.map((useCase) => ( <p className="mt-4 text-sm leading-relaxed text-gray-600">
<li {useCase.description}
key={useCase.title} </p>
className="rounded-md border border-gray-100 bg-white p-6 transition-all duration-300 <ul className="mt-6 space-y-3 text-sm text-gray-600">
hover:scale-105 hover:border-cyan-500 hover:shadow-lg hover:shadow-cyan-500/20 flex flex-col" {useCase.bullets.map((bullet) => (
> <li
<div className="flex items-center justify-between"> key={bullet}
<h3 className="font-semibold text-gray-900"> className="flex items-start gap-3 rounded-2xl border border-cyan-100 bg-cyan-50/60 p-3 leading-relaxed"
{useCase.title} >
</h3> <span className="mt-1 inline-block size-2 rounded-full bg-cyan-500" />
<Small className="uppercase tracking-[0.25em] text-cyan-500"> <span>{bullet}</span>
Scenario </li>
</Small> ))}
</div> </ul>
</div>
<p className="mt-4 text-gray-700 leading-snug"> ))}
{useCase.description} </div>
</p> </Container>
<ul className="mt-6 space-y-3 text-sm text-gray-600">
{useCase.bullets.map((bullet) => (
<li
key={bullet}
className="flex items-start gap-3 rounded-2xl border border-cyan-100 bg-cyan-50/60 p-3 leading-relaxed"
>
<span className="mt-1 inline-block size-2 rounded-full bg-cyan-500" />
<span>{bullet}</span>
</li>
))}
</ul>
</li>
))}
</ul>
</Container>
</div>
{/* ✅ Bottom horizontal line + spacing */}
<div className="w-full border-b border-gray-100" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div>
</section> </section>
) )
} }

View File

@@ -1,4 +1,4 @@
import { Container } from '@/components/Container' import { Container } from '../../components/Container'
const computeFeatures = [ const computeFeatures = [
{ {

View File

@@ -1,6 +1,6 @@
import { CircleBackground } from '@/components/CircleBackground' import { CircleBackground } from '../../components/CircleBackground'
import { Container } from '@/components/Container' import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P, Small } from '@/components/Texts' import { Eyebrow, SectionHeader, P, Small } from '../../components/Texts'
const differentiators = [ const differentiators = [
{ {

View File

@@ -1,103 +0,0 @@
"use client";
import { motion, useReducedMotion } from "framer-motion";
import clsx from "clsx";
export function DeterministicOrchestration({ className }: { className?: string }) {
const prefersReducedMotion = useReducedMotion();
// Hex coordinates (simple honeycomb layout)
const hexes = [
{ x: 60, y: 25 },
{ x: 100, y: 25 },
{ x: 140, y: 25 },
{ x: 40, y: 65 },
{ x: 80, y: 65 },
{ x: 120, y: 65 },
{ x: 160, y: 65 },
{ x: 60, y: 105 },
{ x: 100, y: 105 },
{ x: 140, y: 105 },
];
// simple hex path generator
const hexPath = (cx: number, cy: number, r = 14) => {
const p = (a: number) => ({
x: cx + r * Math.cos((Math.PI / 180) * a),
y: cy + r * Math.sin((Math.PI / 180) * a),
});
const pts = [30, 90, 150, 210, 270, 330].map((a) => p(a));
return `M ${pts[0].x} ${pts[0].y} L ${pts[1].x} ${pts[1].y} L ${pts[2].x} ${pts[2].y}
L ${pts[3].x} ${pts[3].y} L ${pts[4].x} ${pts[4].y} L ${pts[5].x} ${pts[5].y} Z`;
};
return (
<div
className={clsx(
"w-full h-24 flex items-center justify-center bg-[#0a0a0a]",
className
)}
aria-hidden="true"
role="img"
>
<svg viewBox="0 0 200 140" className="w-full h-full" fill="none">
{/* Hex outlines */}
{hexes.map((h, i) => (
<motion.path
key={i}
d={hexPath(h.x, h.y)}
stroke="#4B5563" // gray-600
strokeWidth={1.6}
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.6, delay: 0.03 * i }}
/>
))}
{/* Deterministic sequence highlight — hexes fill in predictable order */}
{hexes.map((h, i) => (
<motion.path
key={`fill-${i}`}
d={hexPath(h.x, h.y)}
fill="#00b8db"
initial={{ opacity: 0 }}
animate={{
opacity:
prefersReducedMotion
? 1
: [0, 1, 1, 0], // flash on, stay, fade
}}
transition={{
duration: 1.2,
delay: i * 0.12,
repeat: prefersReducedMotion ? 0 : Infinity,
repeatDelay: 0.6,
ease: "easeInOut",
}}
/>
))}
{/* Optional center stability indicator */}
<motion.circle
cx={100}
cy={65}
r={5}
fill="#00b8db"
initial={{ scale: 0.8, opacity: 0 }}
animate={{
opacity: 1,
scale: prefersReducedMotion ? 1 : [1, 1.15, 1],
}}
transition={{
duration: 1.6,
repeat: prefersReducedMotion ? 0 : Infinity,
repeatType: "mirror",
ease: [0.22, 1, 0.36, 1],
}}
/>
</svg>
</div>
);
}

View File

@@ -1,112 +0,0 @@
"use client";
import { motion, useReducedMotion } from "framer-motion";
import clsx from "clsx";
export function MeshNetworkIcon({ className }: { className?: string }) {
const prefersReducedMotion = useReducedMotion();
const nodes = [
{ x: 50, y: 25 },
{ x: 120, y: 25 },
{ x: 150, y: 65 },
{ x: 120, y: 100 },
{ x: 60, y: 100 },
{ x: 30, y: 65 },
{ x: 90, y: 55 }, // center-ish node
];
// Lines between nodes (pairs of indices)
const links: [number, number][] = [
[0, 6], [6, 1],
[1, 2], [2, 3],
[3, 6], [6, 4],
[4, 5], [5, 0],
];
return (
<div
className={clsx(
"w-full h-24 flex items-center justify-center bg-[#0a0a0a]",
className
)}
aria-hidden="true"
role="img"
>
<svg
viewBox="0 0 180 120"
className="w-full h-full"
fill="none"
>
{/* Lines */}
{links.map(([a, b], i) => (
<motion.line
key={i}
x1={nodes[a].x}
y1={nodes[a].y}
x2={nodes[b].x}
y2={nodes[b].y}
stroke="#4B5563" /* gray-600 */
strokeWidth={1.5}
initial={{ pathLength: 0, opacity: 0 }}
animate={{ pathLength: 1, opacity: 1 }}
transition={{
delay: 0.1 * i,
duration: 0.5,
ease: [0.22, 1, 0.36, 1],
}}
/>
))}
{/* Nodes */}
{nodes.map((n, i) => (
<motion.circle
key={i}
cx={n.x}
cy={n.y}
r={6}
fill="#00b8db" // cyan nodes
initial={{ scale: 0.8, opacity: 0 }}
animate={{
opacity: 1,
scale:
!prefersReducedMotion && i !== 6 // central node pulses more
? [1, 1.12, 1]
: 1,
}}
transition={{
duration: 1.4,
repeat: i !== 6 && !prefersReducedMotion ? Infinity : 0,
repeatType: "mirror",
ease: [0.22, 1, 0.36, 1],
delay: 0.05 * i,
}}
/>
))}
{/* Center node extra pulse */}
<motion.circle
cx={nodes[6].x}
cy={nodes[6].y}
r={10}
stroke="#00b8db"
strokeWidth={1}
fill="none"
initial={{ scale: 0 }}
animate={{
scale:
prefersReducedMotion
? 0
: [0.6, 1.3, 0.6],
opacity: [0.3, 0.8, 0.3],
}}
transition={{
duration: 1.8,
repeat: prefersReducedMotion ? 0 : Infinity,
repeatType: "mirror",
}}
/>
</svg>
</div>
);
}

View File

@@ -1,113 +0,0 @@
"use client";
import { motion, useReducedMotion } from "framer-motion";
import clsx from "clsx";
export function SovereignComputer({ className }: { className?: string }) {
const prefersReducedMotion = useReducedMotion();
return (
<div
className={clsx(
"w-full h-24 flex items-center justify-center bg-[#0a0a0a]",
className
)}
aria-hidden="true"
role="img"
>
<svg viewBox="0 0 180 120" className="w-full h-full" fill="none">
{/* Outer secure boundary (shield / isolation) */}
<motion.rect
x={40}
y={20}
width={100}
height={80}
rx={14}
stroke="#4B5563"
strokeWidth={2}
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.6 }}
/>
{/* Inner compute chip */}
<motion.rect
x={70}
y={45}
width={40}
height={30}
rx={4}
fill="#00b8db"
initial={{ scale: 0.8, opacity: 0 }}
animate={{
opacity: 1,
scale:
!prefersReducedMotion
? [1, 1.12, 1]
: 1,
}}
transition={{
duration: 1.6,
repeat: prefersReducedMotion ? 0 : Infinity,
repeatType: "mirror",
ease: [0.22, 1, 0.36, 1],
}}
/>
{/* Compute lines out → show isolation of data paths */}
{[
[90, 45, 90, 20],
[90, 75, 90, 100],
[70, 60, 40, 60],
[110, 60, 140, 60],
].map(([x1, y1, x2, y2], i) => (
<motion.line
key={i}
x1={x1}
y1={y1}
x2={x2}
y2={y2}
stroke="#4B5563"
strokeWidth={2}
initial={{ pathLength: 0, opacity: 0 }}
animate={{ pathLength: 1, opacity: 1 }}
transition={{
delay: 0.1 * i,
duration: 0.6,
ease: [0.22, 1, 0.36, 1],
}}
/>
))}
{/* Cyan data pulses traveling outward */}
{[
[90, 45, 90, 20],
[90, 75, 90, 100],
[70, 60, 40, 60],
[110, 60, 140, 60],
].map(([x1, y1, x2, y2], i) => (
<motion.circle
key={`pulse-${i}`}
cx={x1}
cy={y1}
r={3}
fill="#00b8db"
initial={{ opacity: 0 }}
animate={{
opacity: [0, 1, 0],
cx: [x1, x2],
cy: [y1, y2],
}}
transition={{
delay: 0.15 * i,
duration: 1.4,
repeat: prefersReducedMotion ? 0 : Infinity,
repeatType: "loop",
ease: "linear",
}}
/>
))}
</svg>
</div>
);
}

View File

@@ -1,55 +1,40 @@
"use client"; import { CircleBackground } from '../../components/CircleBackground'
import { Container } from '../../components/Container'
import { Container } from "@/components/Container"; import { Button } from '../../components/Button'
import { Button } from "@/components/Button";
export function CallToAction() { export function CallToAction() {
return ( return (
<section className="relative overflow-hidden bg-gray-900"> <section
{/* ✅ Top horizontal line with spacing */} id="get-started"
<div className="max-w-7xl bg-[#090909] mx-auto py-6 border border-t-0 border-b-0 border-gray-700"></div> className="relative overflow-hidden bg-gray-900 py-20 sm:py-28"
<div className="w-full border-t border-l border-r border-gray-700" /> >
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2">
{/* ✅ Main boxed area */} <CircleBackground color="#06b6d4" className="animate-spin-slower" />
<div
id="get-started"
className="relative py-18 max-w-7xl mx-auto bg-[#090909] border border-t-0 border-b-0 border-gray-700"
>
<Container className="relative">
<div className="mx-auto max-w-3xl text-center">
<h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-white sm:text-4xl">
Choose How You Want to Start
</h2>
<p className="mt-6 text-lg text-gray-300">
Host your own node to contribute capacity or deploy workloads using the Mycelium Cloud.
You dont need to host before deploying, and you dont need to deploy before hosting.
</p>
{/* ✅ Two cards, stacked center with spacing */}
<div className="mt-10 flex flex-wrap justify-center gap-x-10 gap-y-8">
<div className="flex flex-col items-center text-center max-w-xs">
<Button to="/host" variant="solid" color="cyan" className="mt-4">
Host a Node
</Button>
</div>
<div className="flex flex-col items-center text-center max-w-xs">
<Button to="/cloud" variant="outline" color="white" className="mt-4">
Start Deploying
</Button>
</div>
</div>
</div>
</Container>
</div> </div>
<Container className="relative">
{/* ✅ Bottom horizontal line with spacing */} <div className="mx-auto max-w-2xl text-center">
<div className="w-full border-b border-gray-700" /> <h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-white sm:text-4xl">
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-700 bg-transparent" /> Get Started Today
</h2>
<p className="mt-6 text-lg text-gray-300">
Download the Mycelium app and step into the future of secure, peer-to-peer networking; fast, private, and decentralized.
</p>
<div className="mt-10 flex flex-wrap justify-center gap-x-6 gap-y-4">
<Button to="/download" variant="solid" color="white">
Get Mycelium Connector
</Button>
<Button
to="https://threefold.info/mycelium_network/docs/"
as="a"
target="_blank"
variant="outline"
color="white"
>
Read Docs
</Button>
</div>
</div>
</Container>
</section> </section>
); )
} }

View File

@@ -1,125 +1,92 @@
"use client"; import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P } from '../../components/Texts'
import { Eyebrow, H3, P } from "@/components/Texts"; const architectureSections = [
import MeshNetworking from "./animations/Meshnetworking";
import Deterministic from "./animations/Deterministic";
import SovereignCompute from "./animations/SovereignCompute";
const deterministicCards = [
{ {
id: "core", title: 'Deterministic Computing',
eyebrow: "ARCHITECTURE",
title: "Deterministic by Design",
description: description:
"Every workload runs exactly as declared: no drift, no hidden state, no surpriseSecure connectivity across all nodes..", 'Every computational step is predictable and provable before it ever executes.',
animation: null, bullets: [
colSpan: "lg:col-span-3", 'Cryptographic verification precedes every operation.',
rowSpan: "lg:row-span-1", 'State determinism ensures identical results from identical inputs.',
custom: true, 'Tamper resistance surfaces any modification instantly.',
noBorder: true, 'Comprehensive audit trails verify the full execution history.',
],
}, },
{ {
id: "crypto", title: 'Stateless Infrastructure',
title: "Mesh Networking",
description: description:
"Secure connectivity across all nodes.", 'A global substrate that scales and recovers without hardware-bound state.',
animation: <MeshNetworking className="lg:-mt-12" />, // ✅ NEW bullets: [
colSpan: "lg:col-span-3", 'No persistent state coupled to specific hardware or regions.',
rowSpan: "lg:row-span-1", 'Global distribution makes compute available wherever it is needed.',
rounded: "lg:rounded-tr-4xl max-lg:rounded-t-4xl", 'Auto-scaling allocates the right resources at the right time.',
innerRounded: "lg:rounded-tr-[calc(2rem+1px)] max-lg:rounded-t-[calc(2rem+1px)]", 'Fault-tolerant orchestration provides automatic failover.',
],
}, },
{ {
id: "stateless", title: 'Zero-Image System',
title: "Deterministic Orchestration",
description: description:
"Workloads deploy and update predictably.", 'Metadata-first delivery keeps deployments lightweight and instantly repeatable.',
animation: <Deterministic className="lg:-mt-12" />, // ✅ NEW bullets: [
colSpan: "lg:col-span-3", 'Images represented as metadata instead of heavyweight artifacts.',
rowSpan: "lg:row-span-1", 'Instant deployment for rapid workload startup.',
rounded: "lg:rounded-bl-4xl max-lg:rounded-b-4xl", 'Efficient storage with minimal footprint for artifacts.',
innerRounded: "lg:rounded-bl-[calc(2rem+1px)] max-lg:rounded-b-[calc(2rem+1px)]", 'Bandwidth-optimized transfers shrink delivery times.',
],
}, },
{ ]
id: "healing",
title: "Automatic healing and recovery",
description:
"Self-repairing processes ensure workloads stay available and consistent.",
animation: <SovereignCompute />, // ✅ NEW
colSpan: "lg:col-span-3",
rowSpan: "lg:row-span-1",
rounded: "lg:rounded-br-4xl max-lg:rounded-b-4xl",
innerRounded: "lg:rounded-br-[calc(2rem+1px)] max-lg:rounded-b-[calc(2rem+1px)]",
},
];
export function ComputeArchitecture() { export function ComputeArchitecture() {
return ( return (
<section className="relative w-full bg-[#171717] overflow-hidden"> <section className="bg-gray-50 py-24 sm:py-32">
{/* ✅ Top horizontal line */} <Container>
<div className="max-w-7xl bg-[#171717] mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div> <div className="mx-auto max-w-3xl text-center">
<div className="w-full border-t border-l border-r border-gray-800" /> <Eyebrow className="tracking-[0.28em] uppercase text-cyan-500">
Technical Architecture
<div className="mx-auto bg-[#111111] max-w-2xl px-6 lg:max-w-7xl lg:px-10 border border-t-0 border-b-0 border-gray-800"> </Eyebrow>
<div className="grid grid-cols-1 gap-6 pt-6 lg:grid-cols-6 lg:grid-rows-2 pb-6"> <SectionHeader as="h2" className="mt-6 text-gray-900">
{deterministicCards.map((card) => ( Infrastructure engineered for provable outcomes.
</SectionHeader>
<P className="mt-6 text-gray-600">
Deterministic computing, stateless orchestration, and metadata-first
delivery combine to create a compute fabric you can trust with your
most sensitive workloads.
</P>
</div>
<div className="mt-16 grid gap-8 lg:grid-cols-3">
{architectureSections.map((section) => (
<div <div
key={card.id} key={section.title}
className={`relative ${card.colSpan} ${card.rowSpan} transition-transform duration-300 hover:scale-102`} className="flex h-full flex-col rounded-3xl border border-cyan-100 bg-white p-8 shadow-sm transition hover:-translate-y-1 hover:border-cyan-300 hover:shadow-lg"
> >
{/* ✅ Disable wrapper on first card */} <div className="flex items-center gap-3">
{!card.noBorder && ( <span className="inline-flex size-10 items-center justify-center rounded-full bg-cyan-500/10 text-sm font-semibold uppercase tracking-[0.25em] text-cyan-600">
<div
className={`absolute inset-0 rounded-md border border-gray-800 bg-[#111212] ${card.rounded}`} </span>
/> <h3 className="text-xl font-semibold text-gray-900">
)} {section.title}
</h3>
<div
className={`relative flex lg:h-90 flex-col overflow-hidden rounded-[calc(var(--radius-lg)+1px)] ${card.innerRounded}`}
>
{/* ✅ SVG Animation instead of images */}
{card.animation ? (
<div className="lg:h-64 h-48 w-full overflow-hidden bg-transparent flex items-center">
<div className="w-full h-full">
{card.animation}
</div>
</div>
) : (
<div className="h-48 w-full flex items-center justify-center bg-transparent" />
)}
<div className="px-8 pt-4 pb-6">
{card.custom ? (
<>
{card.eyebrow && <Eyebrow>{card.eyebrow}</Eyebrow>}
<H3 className="mt-2 text-white">{card.title}</H3>
<P className="mt-4 max-w-lg text-gray-200">{card.description}</P>
</>
) : (
<>
<p className="mt-1 text-lg font-medium lg:text-xl tracking-tight text-white">
{card.title}
</p>
<p className="mt-1 max-w-lg text-sm/6 text-gray-200">
{card.description}
</p>
</>
)}
</div>
</div> </div>
<p className="mt-4 text-sm leading-relaxed text-gray-600">
{!card.noBorder && ( {section.description}
<div </p>
className={`pointer-events-none absolute inset-0 rounded-lg shadow-sm outline outline-black/5 ${card.rounded}`} <ul className="mt-6 space-y-3 text-sm text-gray-600">
/> {section.bullets.map((bullet) => (
)} <li
key={bullet}
className="flex items-start gap-3 rounded-2xl border border-slate-200 bg-slate-50 p-3 leading-relaxed"
>
<span className="mt-1 inline-block size-2 rounded-full bg-cyan-500" />
<span>{bullet}</span>
</li>
))}
</ul>
</div> </div>
))} ))}
</div> </div>
</div> </Container>
<div className="w-full border-b border-gray-800" />
<div className="max-w-7xl mx-auto py-6 border-x border-gray-800 border-t-0 border-b-0" />
</section> </section>
); )
} }

View File

@@ -1,95 +0,0 @@
'use client';
import { Container } from '@/components/Container'
import { Eyebrow, H3, P } from '@/components/Texts'
import { Button } from '@/components/Button'
const capabilities = [
{
title: 'Containers & K3s',
description:
'Deploy services, web apps, and APIs with full Kubernetes compatibility.',
icon: (
<div className=" flex items-center justify-center">
<img src="/images/kubernetes.webp" alt="Kubernetes" className="h-full w-full object-cover" />
</div>
),
},
{
title: 'Virtual Machines',
description:
'Run legacy apps and specialized stacks with secure boot and attestation.',
icon: (
<div className="flex items-center justify-center">
<img src="/images/vm.webp" alt="Virtual Machines" className="h-full w-full object-cover" />
</div>
),
},
{
title: 'Native Linux Workloads',
description:
'Execute agents, batch jobs, and custom tooling statelessly across the grid.',
icon: (
<div className="flex items-center justify-center">
<img src="/images/linux.png" alt="Linux" className="h-full w-full object-cover" />
</div>
),
},
]
export function ComputeCapabilities() {
return (
<section className="bg-[#121212] w-full max-w-8xl mx-auto">
{/* Top horizontal spacer */}
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800 bg-transparent" />
<div className="w-full border-t border-l border-r border-gray-800" />
{/* Boxed container */}
<div className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-800 bg-[#111111] py-12">
<Container>
<div className="mx-auto max-w-4xl sm:text-center">
<Eyebrow className="text-cyan-400">CAPABILITIES</Eyebrow>
<H3 className="text-3xl lg:text-4xl font-medium tracking-tight text-white">
What You Can Run
</H3>
<P className="mt-6 text-lg text-gray-300">
Mycelium Compute supports multiple workload types on a single execution
fabric, from legacy VMs to modern Kubernetes clusters.
</P>
</div>
{/* Card layout */}
<ul
role="list"
className="mx-auto mt-12 grid max-w-2xl grid-cols-1 gap-6 text-sm sm:grid-cols-2 lg:max-w-none lg:grid-cols-3 md:gap-y-10"
>
{capabilities.map((capability) => (
<li
key={capability.title}
className="rounded-xl border border-gray-800 bg-[#111]/60 p-6 text-center lg:text-left"
>
{capability.icon}
<h3 className="text-lg font-semibold text-white">{capability.title}</h3>
<p className="mt-2 text-gray-400 leading-snug">{capability.description}</p>
</li>
))}
</ul>
{/* Button section */}
<div className="mx-auto mt-12 flex justify-center gap-6">
<Button variant="solid" color="cyan" href="#">
Get Started
</Button>
<Button variant="outline" color="white" href="#">
Explore Docs
</Button>
</div>
</Container>
</div>
{/* Bottom border + spacer */}
<div className="w-full border-b border-gray-800" />
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800 bg-transparent" />
</section>
)
}

View File

@@ -1,117 +0,0 @@
"use client";
import { useRef } from "react";
import { Eyebrow, CP, CT, H5 } from "@/components/Texts";
import { IoArrowBackOutline, IoArrowForwardOutline } from "react-icons/io5";
const capabilities = [
{
isIntro: true,
eyebrow: "CAPABILITIES",
title: "What You Can Run",
description:
"Mycelium Compute supports multiple workload types on a single execution fabric, from legacy VMs to modern Kubernetes clusters.",
},
{
title: "Containers & K3s",
description:
"Deploy services, web apps, and APIs with full Kubernetes compatibility.",
icon: (
<div className="flex items-center justify-center">
<img src="/images/kubernetes.webp" alt="Kubernetes" className="h-full w-full object-cover mb-2" />
</div>
),
},
{
title: "Virtual Machines",
description:
"Run legacy apps and specialized stacks with secure boot and attestation.",
icon: (
<div className="flex items-center justify-center">
<img src="/images/vm.webp" alt="Virtual Machines" className="h-full w-full object-cover mb-2" />
</div>
),
},
{
title: "Native Linux Workloads",
description:
"Execute agents, batch jobs, and custom tooling statelessly across the grid.",
icon: (
<div className="flex items-center justify-center">
<img src="/images/linux.png" alt="Linux" className="h-full w-full object-cover mb-2" />
</div>
),
},
];
export function ComputeCapabilitiesNew() {
const sliderRef = useRef<HTMLUListElement>(null);
const scrollLeft = () => sliderRef.current?.scrollBy({ left: -400, behavior: "smooth" });
const scrollRight = () => sliderRef.current?.scrollBy({ left: 400, behavior: "smooth" });
return (
<section className="bg-[#121212] w-full max-w-8xl mx-auto">
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800" />
<div className="w-full border-t border-l border-r border-gray-800" />
<div className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-800 bg-[#111111] overflow-hidden">
{/* Horizontal Slider — shows part of next card */}
<ul
ref={sliderRef}
className="flex overflow-x-auto snap-x snap-mandatory scroll-smooth no-scrollbar"
>
{capabilities.map((item, idx) => (
<li
key={idx}
className={`snap-start shrink-0 w-[85%] sm:w-[50%] lg:w-[33%] border border-gray-800 p-10 relative ${item.isIntro ? 'bg-[#1b1b1b]' : 'bg-[#111]/60'}`}
>
{/* First card with arrows */}
{item.isIntro ? (
<div className="flex flex-col justify-between h-full ">
<div>
<Eyebrow className="">{item.eyebrow}</Eyebrow>
<H5 className="text-white mt-4 lg:text-2xl text-xl">{item.title}</H5>
<p className="mt-4 text-gray-400 lg:text-lg text-sm leading-relaxed">{item.description}</p>
</div>
{/* Arrows inside first card */}
<div className="flex items-center gap-x-4 mt-2">
<a
href="#"
className="inline-flex items-center gap-1 text-cyan-400 hover:text-cyan-300 text-sm font-medium mr-auto"
>
Learn more
</a>
<button
onClick={scrollLeft}
className="h-8 w-8 flex items-center justify-center border border-gray-700 rounded-md hover:border-cyan-500 transition-colors"
>
<IoArrowBackOutline className="text-gray-300" size={16} />
</button>
<button
onClick={scrollRight}
className="h-8 w-8 flex items-center justify-center border border-gray-700 rounded-md hover:border-cyan-500 transition-colors"
>
<IoArrowForwardOutline className="text-gray-300" size={16} />
</button>
</div>
</div>
) : (
<>
{item.icon}
<CT className="text-lg font-semibold text-white mt-4">{item.title}</CT>
<CP className="mt-2 text-gray-400 leading-snug">{item.description}</CP>
</>
)}
</li>
))}
</ul>
</div>
<div className="w-full border-b border-gray-800" />
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800" />
</section>
);
}

View File

@@ -1,112 +0,0 @@
"use client";
import { useState } from "react";
const files = [
{
id: "train",
label: "train.py",
code: `from mycelium import GPUCluster, Dataset
# connect to private GPU cluster
cluster = GPUCluster("secure://my-node")
# load training data
data = Dataset.load("s3://models/private-dataset")
# run a reproducible training job
job = cluster.train(
model="resnet50",
dataset=data,
epochs=40,
deterministic=True
)
job.save("s3://models/checkpoints/resnet-private")`,
},
{
id: "deploy",
label: "deploy.yaml",
code: `apiVersion: mycelium/v1
kind: Service
metadata:
name: vector-api
spec:
image: registry.mycelium/vector:latest
replicas: 3
selfHeal: true
mesh: private
resources:
gpu: 1
cpu: 2
memory: 4Gi`,
},
{
id: "edge",
label: "edge.ts",
code: `import { EdgeClient } from "@mycelium/sdk"
// deploy inference to nearest node
const client = new EdgeClient()
await client.deploy({
model: "resnet-private",
region: "eu-home-nodes",
autoscale: true,
cache: "on-device"
})`,
},
];
export function ComputeCodeTabs() {
const [active, setActive] = useState("train");
const file = files.find((f) => f.id === active)!;
return (
<div className="sm:px-6 lg:px-0">
<div className="relative isolate overflow-hidden bg-cyan-600 px-6 pt-8 sm:mx-auto sm:max-w-2xl sm:rounded-3xl sm:pt-16 sm:pr-0 sm:pl-16 lg:mx-0 lg:max-w-none">
<div
aria-hidden="true"
className="absolute -inset-y-px -left-3 -z-10 w-full origin-bottom-left skew-x-[-30deg] bg-cyan-500 opacity-20 ring-1 ring-white ring-inset"
/>
<div className="mx-auto max-w-2xl sm:mx-0 sm:max-w-none">
<div className="w-screen overflow-hidden rounded-tl-xl bg-gray-900 ring-1 ring-white/10">
{/* FILE TABS */}
<div className="flex bg-gray-800/40 ring-1 ring-white/5">
<div className="-mb-px flex text-sm font-medium text-gray-400">
{files.map((f) => (
<button
key={f.id}
onClick={() => setActive(f.id)}
className={`px-4 py-2 border-r border-white/10 ${
active === f.id
? "border-b border-b-white/20 bg-white/5 text-white"
: ""
}`}
>
{f.label}
</button>
))}
</div>
</div>
{/* CODE BLOCK */}
<div className="px-6 pt-6 pb-14 font-mono text-xs leading-relaxed text-gray-200 whitespace-pre overflow-x-auto">
{file.code}
</div>
</div>
</div>
<div
aria-hidden="true"
className="pointer-events-none absolute inset-0 ring-1 ring-white/10 ring-inset sm:rounded-3xl"
/>
</div>
</div>
);
}

View File

@@ -1,54 +0,0 @@
import { CP, CT } from '@/components/Texts'
import {
ArrowPathIcon,
GlobeAltIcon,
ShieldCheckIcon,
} from '@heroicons/react/24/solid'
const stats = [
{
id: 1,
name: 'Cryptographically verified deployments',
value: 'Signed & Checksummed',
icon: ShieldCheckIcon,
},
{
id: 2,
name: 'Stateless execution that scales anywhere',
value: 'Global Scaling',
icon: GlobeAltIcon,
},
{
id: 3,
name: 'Automatic healing and recovery',
value: 'Self-Repairing',
icon: ArrowPathIcon,
},
]
export function ComputeDesign() {
return (
<div className="">
{/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div>
<div className="w-full border-t border-l border-r border-gray-100" />
{/* ✅ Top horizontal line with spacing */}
<div className="mx-auto max-w-7xl border-gray-100">
<dl className="grid grid-cols-1 gap-4 lg:gap-14 overflow-hidden text-center lg:grid-cols-3">
{stats.map((stat) => (
<div key={stat.id} className="flex flex-col items-center bg-gray-400/5 py-8 px-12 border border-gray-100 lg:border-t-0 lg:border-b-0">
<stat.icon className="h-8 w-8 fill-cyan-500 mb-4" aria-hidden="true" />
<CT className="">{stat.value}</CT>
<CP className="mt-1">{stat.name}</CP>
</div>
))}
</dl>
</div>
{/* ✅ Bottom horizontal line + spacing */}
<div className="w-full border-b border-gray-100" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div>
</div>
)
}

View File

@@ -1,5 +1,5 @@
import { Container } from '@/components/Container' import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P } from '@/components/Texts' import { Eyebrow, SectionHeader, P } from '../../components/Texts'
const codeSamples = [ const codeSamples = [
{ {

View File

@@ -1,5 +1,5 @@
import { Container } from '@/components/Container' import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P } from '@/components/Texts' import { Eyebrow, SectionHeader, P } from '../../components/Texts'
const differentiators = [ const differentiators = [
{ {

View File

@@ -1,101 +1,106 @@
import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P, Small } from '../../components/Texts'
import { Eyebrow, H3, P } from '@/components/Texts' const featureGroups = [
import { {
ArrowTrendingUpIcon, title: 'Deterministic Deployments',
ChatBubbleLeftRightIcon, description:
MagnifyingGlassIcon, 'Cryptographic verification ensures every workload deploys exactly as specified—no tampering, no drift.',
ServerStackIcon, listTitle: 'Benefits',
} from '@heroicons/react/24/solid' bullets: [
'Cryptographic verification of every workload component',
'Zero configuration drift across environments',
'Immediate detection of unauthorized changes',
'Complete reproducibility for every deployment',
],
},
{
title: 'Self-Managing & Stateless Infrastructure',
description:
'Infrastructure that scales and heals autonomously across the ThreeFold Grid with no manual intervention.',
listTitle: 'Capabilities',
bullets: [
'Autonomous operations that self-orchestrate workloads',
'Global scaling sewn into the fabric of the platform',
'Stateless design removes hardware dependencies',
'Self-healing recovery from failures and anomalies',
],
},
{
title: 'Smart Contract-Based Deployment',
description:
'Cryptographically signed contracts orchestrate every workload lifecycle with transparent, tamper-proof execution.',
listTitle: 'Benefits',
bullets: [
'Every deployment contract cryptographically signed',
'Fully auditable, transparent execution of operations',
'Tamper-proof orchestration that cannot be rewritten',
'Smart contracts automate the entire workload lifecycle',
],
},
{
title: 'Multi-Workload Compatibility with Secure Boot',
description:
'Run containers, VMs, and native Linux workloads anywhere with stateless secure boot and continuous verification.',
listTitle: 'Capabilities',
bullets: [
'Full compatibility with Kubernetes and Docker workloads',
'Securely run virtual machines with attested boot paths',
'Native Linux applications verified end-to-end',
'Continuous verification maintains trusted execution',
],
},
]
export function ComputeFeatures() { export function ComputeFeatures() {
return ( return (
<section className="w-full max-w-8xl mx-auto bg-transparent"> <section className="bg-white py-24 sm:py-32">
<Container>
{/* ✅ Top horizontal line with spacing */} <div className="mx-auto max-w-3xl text-center">
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div> <Eyebrow className="tracking-[0.28em] uppercase text-cyan-500">
<div className="w-full border-t border-l border-r border-gray-100" /> Core Features
<div className="mx-auto max-w-7xl px-6 bg-white lg:px-8 grid grid-cols-1 lg:grid-cols-2 gap-20 py-12 border border-t-0 border-b-0 border-gray-100">
{/* ✅ LEFT SIDE — Title + Intro */}
<div className="max-w-xl">
<Eyebrow className="">
Core Components
</Eyebrow> </Eyebrow>
<SectionHeader as="h2" className="mt-6 text-gray-900">
<H3 className="mt-6 "> Precision infrastructure that verifies itself.
Network Capabilities </SectionHeader>
</H3> <P className="mt-6 text-gray-600">
Every layer is designed for determinism, from how workloads are
<P className="mt-6 text-lg text-gray-600"> declared to the way they scale, protect, and govern themselves on
Built for resilience and autonomy, the Mycelium Network dynamically connects nodes the grid.
through intelligent routing, proxy discovery, and decentralized delivery.
</P>
<P className="mt-3 text-lg text-gray-600">
Each component from message passing to content distribution works in harmony
to create a fully self-healing, self-optimizing data mesh.
</P> </P>
</div> </div>
<div className="mt-16 grid gap-8 md:grid-cols-2">
{/* ✅ RIGHT SIDE — 4 items stacked with dividers */} {featureGroups.map((feature) => (
<div className="space-y-8"> <div
key={feature.title}
{/* 1 — Routing */} className="flex h-full flex-col rounded-3xl border border-slate-200 bg-white p-10 shadow-sm transition hover:-translate-y-1 hover:shadow-xl"
<div> >
<h3 className="text-lg font-semibold text-gray-950 flex items-center"> <div>
<ArrowTrendingUpIcon className="h-6 w-6 text-cyan-500 mr-3" /> <Small className="text-xs uppercase tracking-[0.3em] text-cyan-500">
Automatic routing & pathfinding {feature.listTitle}
</h3> </Small>
<p className="mt-2 text-gray-600 max-w-2xl"> <h3 className="mt-4 text-2xl font-semibold text-gray-900">
The Mycelium Network automatically discovers the shortest and fastest {feature.title}
routes between nodes, ensuring optimal data flow and network efficiency. </h3>
</p> <p className="mt-4 text-sm leading-relaxed text-gray-600">
<div className="mt-8 h-px w-full bg-cyan-500/50" /> {feature.description}
</div> </p>
</div>
{/* 2 — Distributed bus */} <ul className="mt-6 space-y-3 text-sm text-gray-600">
<div> {feature.bullets.map((bullet) => (
<h3 className="text-lg font-semibold text-gray-950 flex items-center"> <li
<ChatBubbleLeftRightIcon className="h-6 w-6 text-cyan-500 mr-3" /> key={bullet}
Distributed message bus className="flex items-start gap-3 rounded-2xl border border-cyan-100/40 bg-cyan-50/40 p-3 text-left leading-relaxed"
</h3> >
<p className="mt-2 text-gray-600 max-w-2xl"> <span className="mt-1 inline-block size-2 rounded-full bg-cyan-500" />
Nodes exchange information seamlessly through a resilient global <span>{bullet}</span>
message layer, enabling asynchronous decentralized communication. </li>
</p> ))}
<div className="mt-8 h-px w-full bg-cyan-500/50" /> </ul>
</div> </div>
))}
{/* 3 — Proxy detection */}
<div>
<h3 className="text-lg font-semibold text-gray-950 flex items-center">
<MagnifyingGlassIcon className="h-6 w-6 text-cyan-500 mr-3" />
Automatic proxy discovery
</h3>
<p className="mt-2 text-gray-600 max-w-2xl">
The network scans for open SOCKS5 proxies so devices can join and
connect without manual setup or configuration.
</p>
<div className="mt-8 h-px w-full bg-cyan-500/50" />
</div>
{/* 4 — Delivery / CDN */}
<div>
<h3 className="text-lg font-semibold text-gray-950 flex items-center">
<ServerStackIcon className="h-6 w-6 text-cyan-500 mr-3" />
Decentralized content distribution
</h3>
<p className="mt-2 text-gray-600 max-w-2xl">
Data can be served from distributed 0-DBs, forming a CDN-like delivery
layer that is faster and more resilient than centralized servers.
</p>
</div>
</div> </div>
</div> </Container>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-100" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div>
</section> </section>
) )
} }

View File

@@ -1,51 +1,38 @@
import { H3, Eyebrow } from "@/components/Texts" 'use client'
import { Button } from "@/components/Button"
export function ComputeHero({ onGetStartedClick = () => {} }: { onGetStartedClick?: () => void }) { import { Button } from '../../components/Button'
import { Eyebrow, SectionHeader, P, H3 } from '../../components/Texts'
export function ComputeHero() {
return ( return (
<div className=""> <div className="relative bg-white">
{/* Boxed container */} <div className="relative h-80 overflow-hidden bg-transparent md:absolute md:right-0 md:h-full md:w-1/3 lg:w-1/2">
<div <img
className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-100 bg-white overflow-hidden bg-contain bg-right bg-no-repeat" alt=""
style={{ backgroundImage: "url('/images/computehero.webp')", backgroundSize: "contain" }} src="/images/computehero.webp"
> className="size-full object-contain"
{/* Inner padding */} />
<div className="px-6 py-16 lg:py-16">
<div className="max-w-xl lg:pl-6"> </div>
<Eyebrow> <div className="relative mx-auto max-w-7xl py-12 lg:py-24 lg:px-8">
Mycelium Compute <div className="max-w-2xl pr-6 pl-6 md:mr-auto md:w-2/3 md:pr-16 lg:w-1/2 lg:pl-0 lg:pr-24">
</Eyebrow> <Eyebrow className="text-base/7 font-semibold text-cyan-500">COMPUTE</Eyebrow>
<H3 className="mt-4"> <H3 className="mt-2 text-gray-900">The pulse of Intelligence Runs Here.</H3>
Deterministic Compute You Control <P className="mt-6 text-gray-600">
</H3> Mycelium Compute brings predictable, sovereign performance free from lock-in, free from drift.
<p className="mt-6 text-lg"> Deploy any workload, anywhere, with cryptographic precision and zero compromise.
Run workloads on sovereign, self-verifying infrastructure. </P>
Mycelium Compute delivers predictable execution, zero drift, and automatic healing, whether youre running containers, VMs, agents, or full Kubernetes clusters. <P className="mt-6 text-gray-600">
</p> From micro-VMs to full clusters, every operation is deterministic, self-managing, and stateless by design.
<p className="mt-4 lg:text-base italic text-gray-600 text-sm"> Compute that verifies itself. Expands itself. Heals itself.
Works Alone. Works Together. </P>
Mycelium Compute can run on any network fabric, or pair with Mycelium Network <div className="mt-12">
for sovereign connectivity. <Button href="#" variant="solid" color="cyan">
</p> Experience Deterministic Compute
<div className="mt-10 flex items-center gap-x-6"> </Button>
<Button
onClick={onGetStartedClick}
variant="solid"
color="cyan"
>
Get started
</Button>
<Button to="#" variant="outline">
Documentation <span aria-hidden="true"></span>
</Button>
</div>
</div> </div>
</div> </div>
</div> </div>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-100" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div>
</div> </div>
) )
} }

View File

@@ -1,6 +1,6 @@
import { CircleBackground } from '../../components/CircleBackground' import { CircleBackground } from '../../components/CircleBackground'
import { Container } from '@/components/Container' import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P } from '@/components/Texts' import { Eyebrow, SectionHeader, P } from '../../components/Texts'
const overviewCards = [ const overviewCards = [
{ {
@@ -17,68 +17,51 @@ const overviewCards = [
export function ComputeOverview() { export function ComputeOverview() {
return ( return (
<section className="w-full max-w-8xl mx-auto bg-transparent"> <section className="relative overflow-hidden bg-gray-950 py-24 sm:py-32">
{/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div>
<div className="w-full border-t border-l border-r border-gray-100" />
{/* ✅ subtle light-mode background accents */}
<div className="pointer-events-none absolute inset-0"> <div className="pointer-events-none absolute inset-0">
<CircleBackground <CircleBackground
color="#06b6d4" color="#06b6d4"
className="absolute -top-40 left-1/2 h-[520px] w-[520px] -translate-x-1/2 opacity-20 blur-3xl" className="absolute -top-40 left-1/2 h-[520px] w-[520px] -translate-x-1/2 opacity-30 blur-3xl sm:opacity-40"
/> />
<CircleBackground <CircleBackground
color="#22d3ee" color="#22d3ee"
className="absolute bottom-[-18rem] left-[15%] h-[420px] w-[420px] opacity-15 blur-3xl" className="absolute bottom-[-18rem] left-[15%] h-[420px] w-[420px] opacity-25 blur-3xl sm:opacity-40"
/> />
<div className="absolute inset-0 bg-[radial-gradient(circle_at_top,_rgba(0,0,0,0.03),_transparent_55%)]" /> <div className="absolute inset-0 bg-[radial-gradient(circle_at_top,_rgba(15,118,110,0.1),_transparent_55%)]" />
</div> </div>
<Container className="relative">
<Container className="relative py-12 bg-white mx-auto s border border-t-0 border-b-0 border-gray-100">
<div className="mx-auto max-w-3xl text-center"> <div className="mx-auto max-w-3xl text-center">
<Eyebrow color="accent" className="tracking-[0.35em] uppercase"> <Eyebrow color="accent" className="tracking-[0.35em] uppercase">
Mycelium Compute Mycelium Compute
</Eyebrow> </Eyebrow>
<SectionHeader as="h2" color="light" className="mt-6 font-medium">
<SectionHeader
as="h2"
color="dark"
className="mt-6 font-medium text-gray-900"
>
Deterministic compute fabric for autonomous workloads. Deterministic compute fabric for autonomous workloads.
</SectionHeader> </SectionHeader>
<P color="lightSecondary" className="mt-6">
<P color="secondary" className="mt-6 text-gray-600">
Mycelium Compute delivers predictable, sovereign performancefree Mycelium Compute delivers predictable, sovereign performancefree
from lock-in and drift. Deploy any workload with cryptographic from lock-in and drift. Deploy any workload with cryptographic
precision, knowing the platform verifies, scales, and heals itself precision, knowing the platform verifies, scales, and heals itself
on your behalf. on your behalf.
</P> </P>
<P color="lightSecondary" className="mt-4">
<P color="secondary" className="mt-4 text-gray-600">
Deterministic. Self-managing. Stateless by design. Deterministic. Self-managing. Stateless by design.
</P> </P>
</div> </div>
{/* ✅ Light Mode Cards */}
<div className="mt-16 grid gap-6 lg:grid-cols-2"> <div className="mt-16 grid gap-6 lg:grid-cols-2">
{overviewCards.map((card) => ( {overviewCards.map((card) => (
<div <div
key={card.title} key={card.title}
className="group relative overflow-hidden rounded-md border border-gray-100 bg-white p-10 shadow-sm transition hover:-translate-y-1 hover:border-cyan-300 hover:shadow-lg" className="group relative overflow-hidden rounded-3xl border border-white/10 bg-white/[0.03] p-10 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/40 hover:bg-white/[0.06]"
> >
<div className="absolute inset-0 bg-gradient-to-br from-cyan-50 via-white to-cyan-100 opacity-0 transition group-hover:opacity-70" /> <div className="absolute inset-0 bg-gradient-to-br from-cyan-500/0 via-white/[0.04] to-cyan-300/10 opacity-0 transition group-hover:opacity-100" />
<div className="relative"> <div className="relative">
<p className="text-[0.7rem] font-semibold uppercase tracking-[0.35em] text-cyan-600"> <p className="text-[0.7rem] font-semibold uppercase tracking-[0.35em] text-cyan-300">
{card.label} {card.label}
</p> </p>
<h3 className="mt-4 text-xl font-semibold text-gray-900"> <h3 className="mt-4 text-xl font-semibold text-white">
{card.title} {card.title}
</h3> </h3>
<p className="mt-4 text-sm leading-relaxed text-gray-600"> <p className="mt-4 text-sm leading-relaxed text-gray-300">
{card.copy} {card.copy}
</p> </p>
</div> </div>
@@ -86,9 +69,6 @@ export function ComputeOverview() {
))} ))}
</div> </div>
</Container> </Container>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-100" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div>
</section> </section>
) )
} }

View File

@@ -1,13 +1,13 @@
import { AnimatedSection } from '../../components/AnimatedSection' import { AnimatedSection } from '../../components/AnimatedSection'
import { ComputeHero } from './ComputeHero' import { ComputeHero } from './ComputeHero'
import { ComputeFeatures } from './ComputeFeatures'
import { ComputeArchitecture } from './ComputeArchitecture'
import { ComputeUseCases } from './ComputeUseCases'
import { CallToAction } from './CallToAction'
import { ComputeDesign } from './ComputeDesign'
import { ComputeOverview } from './ComputeOverview' import { ComputeOverview } from './ComputeOverview'
import { ComputeCapabilitiesNew } from './ComputeCapabilitiesNew' import { ComputeFeatures } from './ComputeFeatures'
import { ComputeZeroImage } from './ComputeZeroImage'
import { ComputeArchitecture } from './ComputeArchitecture'
import { ComputeDeveloperExperience } from './ComputeDeveloperExperience'
import { ComputeUseCases } from './ComputeUseCases'
import { ComputeDifferentiators } from './ComputeDifferentiators'
import { CallToAction } from './CallToAction'
export default function ComputePage() { export default function ComputePage() {
return ( return (
@@ -15,31 +15,27 @@ export default function ComputePage() {
<AnimatedSection> <AnimatedSection>
<ComputeHero /> <ComputeHero />
</AnimatedSection> </AnimatedSection>
<AnimatedSection>
<ComputeCapabilitiesNew />
</AnimatedSection>
<AnimatedSection>
<ComputeDesign />
</AnimatedSection>
<AnimatedSection>
<ComputeArchitecture />
</AnimatedSection>
<AnimatedSection>
<ComputeFeatures />
</AnimatedSection>
<AnimatedSection>
<ComputeUseCases />
</AnimatedSection>
<AnimatedSection> <AnimatedSection>
<ComputeOverview /> <ComputeOverview />
</AnimatedSection> </AnimatedSection>
<AnimatedSection>
<ComputeFeatures />
</AnimatedSection>
<AnimatedSection>
<ComputeZeroImage />
</AnimatedSection>
<AnimatedSection>
<ComputeArchitecture />
</AnimatedSection>
<AnimatedSection>
<ComputeDeveloperExperience />
</AnimatedSection>
<AnimatedSection>
<ComputeUseCases />
</AnimatedSection>
<AnimatedSection>
<ComputeDifferentiators />
</AnimatedSection>
<AnimatedSection> <AnimatedSection>
<CallToAction /> <CallToAction />
</AnimatedSection> </AnimatedSection>

View File

@@ -1,137 +1,135 @@
"use client"; import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P } from '../../components/Texts'
import { useState } from "react"; const primaryUseCases = [
import { ComputeCodeTabs } from "./ComputeCodeTabs"; // ✅ Make sure path is correct
import { Eyebrow, H3, P } from "@/components/Texts";
const tabs = [
{ {
id: "ai", title: 'AI / ML Training',
label: "AI / ML TRAINING", bullets: [
content: [ 'Deterministic training pipelines for reproducible experiments.',
{ 'Cryptographically verified model artifacts end-to-end.',
item: "Reproducible pipelines", 'Autonomous scaling for distributed training runs.',
desc: "Build deterministic, version-locked training pipelines that produce the same result every time.", 'Zero-drift environments that remain consistent over time.',
},
{
item: "Private model execution",
desc: "Train sensitive models on hardware you control, keeping datasets and checkpoints off hyperscalers.",
},
{
item: "Scalable GPU orchestration",
desc: "Scale training and inference across decentralized GPU nodes with automated orchestration.",
},
], ],
}, },
{ {
id: "apps", title: 'Application Hosting',
label: "APPLICATION HOSTING", bullets: [
content: [ 'Transparent deployments with verifiable execution.',
{ 'Auto-scaling that allocates resources on demand.',
item: "Self-healing services", 'Instant global distribution across the ThreeFold Grid.',
desc: "Private, reliable services that repair automatically without cloud vendor lock-in.", 'Cryptographically secured runtime environments.',
},
{
item: "Zero cloud lock-in",
desc: "Deploy containers, VMs, or full Kubernetes clusters — migrate off AWS/GCP/Azure with no code changes.",
},
{
item: "Encrypted networking",
desc: "All services communicate through Mycelium Mesh — no VPNs, no exposed ports.",
},
], ],
}, },
{ {
id: "edge", title: 'Data Processing',
label: "DISTRIBUTED & EDGE COMPUTE", bullets: [
content: [ 'Deterministic pipelines that document every transformation.',
{ 'Secure computation with cryptographic verification.',
item: "Distributed workloads", 'Auto-scaling resources for fluctuating workloads.',
desc: "Run compute where data lives — homes, factories, hospitals, or remote regions.", 'Global processing placement to minimize latency.',
},
{
item: "Offline-first resilience",
desc: "Nodes keep working even with weak internet or outages — ideal for mission-critical edge.",
},
{
item: "Global deployment, local data",
desc: "Keep data in-country or on-prem for compliance, privacy, and regulated industries.",
},
], ],
}, },
]; {
title: 'Scientific Computing',
bullets: [
'Reproducible research environments for shared experiments.',
'Secure workloads with verifiable execution paths.',
'Dynamic scaling for compute-intensive tasks.',
'Global collaboration with sovereign resource control.',
],
},
]
const computeSpecific = [
{
title: 'Deterministic Training Environments',
bullets: [
'Reproducible ML experiments with identical conditions every run.',
'Verifiable computational research for scientific collaboration.',
'Auditable financial modelling workflows with traceable outputs.',
'Consistent IoT edge processing with predictable performance.',
],
},
{
title: 'Multi-Platform Application Hosting',
bullets: [
'Kubernetes orchestration with deterministic deployment pipelines.',
'Virtual machines launched with hardware-attested secure boot.',
'Native Linux workloads with cryptographic assurance.',
'Hybrid topologies mixing containers, VMs, and bare metal.',
],
},
{
title: 'Auto-Scaling Workloads',
bullets: [
'Demand-based scaling that reacts instantly to load.',
'Global distribution across the ThreeFold Grid.',
'Automated failover that restores services without intervention.',
'Cost optimization through intelligent resource allocation.',
],
},
]
export function ComputeUseCases() { export function ComputeUseCases() {
const [active, setActive] = useState("ai");
const current = tabs.find((t) => t.id === active)!;
return ( return (
<section className="relative w-full bg-[#171717] overflow-hidden"> <section className="bg-gray-950 py-24 sm:py-32">
{/* ✅ Top horizontal line with spacing */} <Container>
<div className="max-w-7xl bg-[#111111] mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div> <div className="mx-auto max-w-3xl text-center">
<div className="w-full border-t border-l border-r border-gray-800" /> <Eyebrow color="accent" className="tracking-[0.32em] uppercase">
<div className="max-w-7xl mx-auto px-6 lg:px-8 py-12 border border-t-0 border-b-0 border-gray-800 bg-[#111111] overflow-hidden">
{/* ✅ H3 on own row */}
<div className="mb-16">
<Eyebrow color="accent" className="">
Use Cases Use Cases
</Eyebrow> </Eyebrow>
<H3 color="white"> <SectionHeader as="h2" color="light" className="mt-6">
Built for Serious Workloads Purpose-built for reproducibility, security, and scale.
</H3> </SectionHeader>
<P className="max-w-3xl text-gray-400 mt-6"> <P color="lightSecondary" className="mt-6">
Mycelium Compute is a decentralized physical infrastructure network From sovereign AI training loops to globally distributed
(DePIN) for high-performance workloads. Run reproducible AI/ML applications, Mycelium Compute keeps environments verifiable and
pipelines, host self-healing applications, or deploy to the edge all self-orchestrating so teams can focus on building.
on a fabric thats more resilient and private than the cloud.
</P> </P>
</div> </div>
<div className="mt-16 grid gap-8 lg:grid-cols-2">
{/* ✅ Two-column layout */} <div className="space-y-6">
<div className="flex flex-col lg:flex-row gap-16"> {primaryUseCases.map((useCase) => (
<div
{/* ✅ Replace image with CodeTabs */} key={useCase.title}
<div className="w-full lg:w-1/2"> className="rounded-3xl border border-white/10 bg-white/5 p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-200/40 hover:bg-white/10"
<ComputeCodeTabs /> >
<h3 className="text-xl font-semibold text-white">
{useCase.title}
</h3>
<ul className="mt-4 space-y-3 text-sm text-gray-200">
{useCase.bullets.map((bullet) => (
<li key={bullet} className="flex items-start gap-3 leading-relaxed">
<span className="mt-1 inline-block size-2 rounded-full bg-cyan-400" />
<span>{bullet}</span>
</li>
))}
</ul>
</div>
))}
</div> </div>
<div className="space-y-6">
{/* ✅ Right side tabs & content */} {computeSpecific.map((useCase) => (
<div className="w-full lg:w-1/2 text-white"> <div
key={useCase.title}
{/* Tabs Nav */} className="rounded-3xl border border-cyan-400/20 bg-gradient-to-br from-cyan-500/10 via-cyan-500/5 to-transparent p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-200/40 hover:from-cyan-400/20 hover:via-cyan-400/10"
<div className="flex gap-6 border-b border-white/10 pb-2"> >
{tabs.map((tab) => ( <h3 className="text-xl font-semibold text-white">
<button {useCase.title}
key={tab.id} </h3>
onClick={() => setActive(tab.id)} <ul className="mt-4 space-y-3 text-sm text-cyan-100">
className={`text-sm font-medium tracking-wide pb-2 ${ {useCase.bullets.map((bullet) => (
active === tab.id <li key={bullet} className="flex items-start gap-3 leading-relaxed">
? "border-b-2 border-cyan-500 text-white" <span className="mt-1 inline-block size-2 rounded-full bg-white/80" />
: "text-gray-400 hover:text-white" <span>{bullet}</span>
}`} </li>
> ))}
{tab.label} </ul>
</button> </div>
))} ))}
</div>
{/* Tab Content */}
<div className="mt-6 space-y-6">
{current.content.map((c, i) => (
<div key={i} className="space-y-1">
<p className="text-base font-medium text-white">{c.item}</p>
<p className="text-sm text-gray-400 leading-relaxed">{c.desc}</p>
</div>
))}
</div>
</div> </div>
</div> </div>
</div> </Container>
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800" />
<div className="w-full border-b border-gray-800" />
</section> </section>
); )
} }

View File

@@ -1,5 +1,5 @@
import { Container } from '@/components/Container' import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P } from '@/components/Texts' import { Eyebrow, SectionHeader, P } from '../../components/Texts'
const zeroImageBenefits = [ const zeroImageBenefits = [
'Metadata-only artifacts replace heavy images for ultra-fast delivery.', 'Metadata-only artifacts replace heavy images for ultra-fast delivery.',
@@ -10,11 +10,11 @@ const zeroImageBenefits = [
export function ComputeZeroImage() { export function ComputeZeroImage() {
return ( return (
<section className="relative overflow-hidden bg-linear-to-b from-cyan-950 via-gray-950 to-gray-950 py-24 sm:py-32"> <section className="relative overflow-hidden bg-gradient-to-b from-cyan-950 via-gray-950 to-gray-950 py-24 sm:py-32">
<div className="pointer-events-none absolute inset-0"> <div className="pointer-events-none absolute inset-0">
<div className="absolute -top-32 right-1/4 h-72 w-72 rounded-full bg-cyan-500/30 blur-[120px]" /> <div className="absolute -top-32 right-1/4 h-72 w-72 rounded-full bg-cyan-500/30 blur-[120px]" />
<div className="absolute bottom-0 left-1/3 h-96 w-96 rounded-full bg-cyan-400/10 blur-[140px]" /> <div className="absolute bottom-0 left-1/3 h-96 w-96 rounded-full bg-cyan-400/10 blur-[140px]" />
<div className="absolute inset-0 bg-[radial-gradient(circle_at_left,rgba(8,145,178,0.18),transparent_55%)]" /> <div className="absolute inset-0 bg-[radial-gradient(circle_at_left,_rgba(8,145,178,0.18),_transparent_55%)]" />
</div> </div>
<Container className="relative"> <Container className="relative">
<div className="grid items-center gap-12 lg:grid-cols-[0.85fr_1.15fr]"> <div className="grid items-center gap-12 lg:grid-cols-[0.85fr_1.15fr]">

View File

@@ -1,189 +0,0 @@
"use client";
import { motion, useReducedMotion } from "framer-motion";
import clsx from "clsx";
type Props = {
className?: string;
accent?: string;
gridStroke?: string;
};
const W = 760;
const H = 420;
export default function Deterministic({
className,
accent = "#00b8db",
gridStroke = "#2b2a2a",
}: Props) {
const prefers = useReducedMotion();
const stages = [
{ x: 180, y: 180, w: 120, h: 80, label: "Build" },
{ x: 330, y: 180, w: 120, h: 80, label: "Package" },
{ x: 480, y: 180, w: 120, h: 80, label: "Deploy" },
];
// Packet path (deterministic flow)
const packetPath = `M ${stages[0].x + 120} ${stages[0].y + 40}
L ${stages[1].x + 0} ${stages[1].y + 40}
L ${stages[1].x + 120} ${stages[1].y + 40}
L ${stages[2].x + 0} ${stages[2].y + 40}`;
// tiny arrow for each transition
const arrows = [
`M ${stages[0].x + 120} ${stages[0].y + 40} L ${stages[1].x + 6} ${stages[1].y + 40}`,
`M ${stages[1].x + 120} ${stages[1].y + 40} L ${stages[2].x + 6} ${stages[2].y + 40}`
];
return (
<div
className={clsx("relative overflow-hidden", className)}
aria-hidden="true"
role="img"
aria-label="Deterministic orchestration: predictable deployments"
style={{ background: "transparent" }}
>
<svg viewBox={`0 0 ${W} ${H}`} className="w-full h-full">
{/* BACKGROUND GRID */}
<defs>
<pattern id="grid-orch" width="28" height="28" patternUnits="userSpaceOnUse">
<path d="M 28 0 L 0 0 0 28"
fill="none"
stroke={gridStroke}
strokeWidth="1"
opacity="0.45"
/>
</pattern>
{/* Soft glow for highlight */}
<filter id="orch-glow">
<feGaussianBlur stdDeviation="4" result="blur" />
<feMerge>
<feMergeNode in="blur" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
</defs>
<rect width={W} height={H} fill="url(#grid-orch)" />
{/* STAGE BOXES */}
{stages.map((s, i) => (
<motion.rect
key={`stage-${i}`}
x={s.x}
y={s.y}
width={s.w}
height={s.h}
rx={14}
fill="#0d0d0d"
stroke="#1a1a1a"
strokeWidth={2}
initial={{ opacity: 0 }}
animate={{ opacity: 0.9 }}
transition={{ duration: 0.6 + i * 0.1 }}
/>
))}
{/* Stage labels (subtle, not text-heavy) */}
{stages.map((s, i) => (
<motion.text
key={`label-${i}`}
x={s.x + s.w / 2}
y={s.y + s.h / 2 + 6}
fill="#9ca3af"
textAnchor="middle"
fontSize="14"
fontFamily="Inter, sans-serif"
initial={{ opacity: 0 }}
animate={{ opacity: 0.9 }}
transition={{ delay: 0.1 * i, duration: 0.6 }}
>
{s.label}
</motion.text>
))}
{/* CONSISTENT ORCHESTRATION LINES */}
{arrows.map((d, i) => (
<motion.path
key={`arrow-${i}`}
d={d}
stroke="#3a3a3a"
strokeWidth={4}
strokeLinecap="round"
fill="none"
initial={{ pathLength: 0, opacity: 0 }}
animate={{ pathLength: 1, opacity: 0.8 }}
transition={{ delay: 0.15 * i, duration: 0.8, ease: [0.22, 1, 0.36, 1] }}
/>
))}
{/* CYAN ACCENT OVERLAY ON LINES (predictable updates) */}
{arrows.map((d, i) => (
<motion.path
key={`arrow-accent-${i}`}
d={d}
stroke={accent}
strokeWidth={2}
strokeLinecap="round"
strokeDasharray="10"
fill="none"
initial={{ pathLength: 0, opacity: 0 }}
animate={{ pathLength: 1, opacity: 1 }}
transition={{
delay: 0.25 * i,
duration: 0.8,
ease: [0.22, 1, 0.36, 1]
}}
/>
))}
{/* MOVING PACKET SHOWING DETERMINISTIC FLOW */}
{!prefers && (
<motion.circle
r={6}
fill={accent}
filter="url(#orch-glow)"
style={{
offsetPath: `path('${packetPath}')`,
}}
initial={{ offsetDistance: "0%", opacity: 0 }}
animate={{
offsetDistance: ["0%", "100%"],
opacity: [0.2, 1, 0.2],
}}
transition={{
duration: 2.3,
repeat: Infinity,
repeatType: "loop",
ease: "linear",
}}
/>
)}
{/* FINAL CONFIRMATION PULSE AT DEPLOY STAGE */}
{!prefers && (
<motion.circle
cx={stages[2].x + stages[2].w / 2}
cy={stages[2].y + stages[2].h / 2}
r={24}
fill={accent}
opacity={0.1}
initial={{ scale: 0.9, opacity: 0 }}
animate={{ scale: [1, 1.15, 1], opacity: [0.05, 0.3, 0.05] }}
transition={{
duration: 1.8,
repeat: Infinity,
repeatType: "mirror",
ease: [0.22, 1, 0.36, 1],
}}
filter="url(#orch-glow)"
/>
)}
</svg>
</div>
);
}

View File

@@ -1,151 +0,0 @@
"use client";
import { motion, useReducedMotion } from "framer-motion";
import clsx from "clsx";
type Props = {
className?: string;
accent?: string;
stroke?: string;
};
const W = 760;
const H = 420;
export default function MeshNetworking({
className,
accent = "#00b8db",
stroke = "#4B5563",
}: Props) {
const prefersReduced = useReducedMotion();
// Nodes in a real mesh (hex pattern)
const nodes = [
{ x: 200, y: 120 },
{ x: 380, y: 100 },
{ x: 560, y: 120 },
{ x: 130, y: 240 },
{ x: 320, y: 240 },
{ x: 540, y: 240 },
{ x: 630, y: 240 },
{ x: 260, y: 340 },
{ x: 440, y: 340 },
];
// All connected pairs (mesh links)
const links = [
[0,1],[1,2],
[0,3],[1,4],[2,5],
[3,4],[4,5],[5,6],
[3,7],[4,7],[4,8],[5,8],
[7,8]
];
const drawLine = (i: number, j: number) => {
const a = nodes[i];
const b = nodes[j];
return `M ${a.x} ${a.y} L ${b.x} ${b.y}`;
};
return (
<div
className={clsx("relative overflow-hidden", className)}
aria-hidden="true"
role="img"
aria-label="Mesh networking topology"
style={{ background: "transparent" }} // ✅ transparent background
>
<svg viewBox={`0 0 ${W} ${H}`} className="w-full h-full">
{/* ✅ Subtle dark grid */}
<defs>
<pattern id="mesh-grid" width="28" height="28" patternUnits="userSpaceOnUse">
<path d="M 28 0 L 0 0 0 28" fill="none" stroke="#2b2a2a" strokeWidth="1" />
</pattern>
</defs>
<rect width={W} height={H} fill="url(#mesh-grid)" />
{/* ✅ Gray baseline mesh connections */}
{links.map(([i, j], idx) => (
<motion.path
key={`base-${idx}`}
d={drawLine(i, j)}
stroke={stroke}
strokeWidth={2}
strokeLinecap="round"
fill="none"
initial={{ pathLength: 0 }}
animate={{ pathLength: 1, opacity: 0.4 }}
transition={{
delay: 0.05 * idx,
duration: 0.6,
ease: [0.22, 1, 0.36, 1],
}}
/>
))}
{/* ✅ Cyan signal traveling across mesh diagonally */}
{!prefersReduced &&
links.map(([i, j], idx) => {
const path = drawLine(i, j);
return (
<motion.circle
key={`signal-${idx}`}
r={4}
fill={accent}
style={{ offsetPath: `path('${path}')` }}
initial={{ offsetDistance: "0%", opacity: 0 }}
animate={{
offsetDistance: ["0%", "100%"],
opacity: [0, 1, 0],
}}
transition={{
delay: idx * 0.15,
duration: 1.8,
repeat: Infinity,
repeatType: "loop",
ease: "linear",
}}
/>
);
})}
{/* ✅ Nodes with soft glow */}
{nodes.map((n, idx) => (
<g key={`node-${idx}`}>
<motion.circle
cx={n.x}
cy={n.y}
r={18}
fill="#0d0d0d"
stroke="#111"
strokeWidth={2}
initial={{ opacity: 0 }}
animate={{ opacity: 0.7 }}
transition={{ duration: 0.5 }}
/>
<motion.circle
cx={n.x}
cy={n.y}
r={10}
fill={accent}
initial={{ opacity: 0, scale: 0.8 }}
animate={{
opacity: 1,
scale: prefersReduced ? 1 : [1, 1.08, 1],
}}
transition={{
duration: 1.6,
repeat: prefersReduced ? 0 : Infinity,
repeatType: "mirror",
ease: [0.22, 1, 0.36, 1],
}}
/>
</g>
))}
</svg>
</div>
);
}

View File

@@ -1,236 +0,0 @@
"use client";
import { motion, useReducedMotion } from "framer-motion";
import clsx from "clsx";
type Props = {
className?: string;
accent?: string; // cyan highlight
gridStroke?: string; // grid color (default #2b2a2a as requested)
};
const W = 760;
const H = 420;
const Server = ({
x,
y,
w = 140,
h = 90,
rows = 3,
}: {
x: number;
y: number;
w?: number;
h?: number;
rows?: number;
}) => {
const rowH = (h - 24) / rows;
return (
<g>
{/* chassis */}
<rect x={x} y={y} width={w} height={h} rx={12} fill="#0d0d0d" stroke="#1a1a1a" strokeWidth={2} />
{/* bays */}
{Array.from({ length: rows }).map((_, i) => (
<g key={i}>
<rect
x={x + 12}
y={y + 12 + i * rowH}
width={w - 24}
height={rowH - 10}
rx={8}
fill="#111111"
stroke="#1f1f1f"
strokeWidth={1}
/>
{/* bay indicators */}
<rect x={x + 20} y={y + 22 + i * rowH} width={10} height={6} rx={2} fill="#16a34a" opacity={0.8} />
<rect x={x + 36} y={y + 22 + i * rowH} width={10} height={6} rx={2} fill="#9ca3af" opacity={0.6} />
<rect x={x + 52} y={y + 22 + i * rowH} width={10} height={6} rx={2} fill="#9ca3af" opacity={0.6} />
</g>
))}
{/* subtle top highlight */}
<rect x={x + 2} y={y + 2} width={w - 4} height={10} rx={5} fill="#0f0f0f" />
</g>
);
};
export default function SovereignCompute({
className,
accent = "#00b8db",
gridStroke = "#2b2a2a",
}: Props) {
const prefers = useReducedMotion();
// Positions
const left = { x: 140, y: 120 };
const mid = { x: 310, y: 150 };
const right= { x: 500, y: 120 };
// Shield position (trust boundary)
const shield = { cx: 600, cy: 250, r: 38 };
// Attestation paths from racks to shield
const pathFromLeft = `M ${left.x + 140} ${left.y + 45} C 330 150, 470 200, ${shield.cx - 50} ${shield.cy}`;
const pathFromMid = `M ${mid.x + 140} ${mid.y + 45} C 420 190, 500 215, ${shield.cx - 50} ${shield.cy}`;
const pathFromRight = `M ${right.x + 140} ${right.y + 45} C 520 180, 560 220, ${shield.cx - 50} ${shield.cy}`;
return (
<div
className={clsx("relative overflow-hidden", className)}
aria-hidden="true"
role="img"
aria-label="Sovereign compute: execution only on hardware you control"
style={{ background: "transparent" }}
>
<svg viewBox={`0 0 ${W} ${H}`} className="w-full h-full">
{/* GRID (transparent bg, subtle dark grid) */}
<defs>
<pattern id="grid-secure" width="28" height="28" patternUnits="userSpaceOnUse">
<path d="M 28 0 L 0 0 0 28" fill="none" stroke={gridStroke} strokeWidth="1" opacity="0.45" />
</pattern>
{/* soft glow filter for shield */}
<filter id="glow">
<feGaussianBlur stdDeviation="6" result="coloredBlur" />
<feMerge>
<feMergeNode in="coloredBlur" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
</defs>
<rect width={W} height={H} fill="url(#grid-secure)" />
{/* RACKS (hardware you control) */}
<Server x={left.x} y={left.y} />
<Server x={mid.x} y={mid.y} />
<Server x={right.x} y={right.y} />
{/* BASELINES for attestation links */}
{[pathFromLeft, pathFromMid, pathFromRight].map((d, i) => (
<motion.path
key={`base-${i}`}
d={d}
fill="none"
stroke="#303030"
strokeWidth={3}
strokeLinecap="round"
initial={{ pathLength: 0, opacity: 0 }}
animate={{ pathLength: 1, opacity: 0.6 }}
transition={{ delay: 0.15 * i, duration: 0.8, ease: [0.22, 1, 0.36, 1] }}
/>
))}
{/* MOVING ATTESTATION TOKENS (signatures/hashes) */}
{!prefers && [pathFromLeft, pathFromMid, pathFromRight].map((d, i) => (
<motion.circle
key={`token-${i}`}
r={5}
fill={accent}
style={{ offsetPath: `path('${d}')` }}
initial={{ offsetDistance: "0%", opacity: 0 }}
animate={{ offsetDistance: ["0%", "100%"], opacity: [0, 1, 0] }}
transition={{
delay: 0.25 * i,
duration: 2.0,
repeat: Infinity,
repeatType: "loop",
ease: "linear",
}}
/>
))}
{/* TRUST BOUNDARY + SHIELD (hardware attestation target) */}
<motion.circle
cx={shield.cx}
cy={shield.cy}
r={shield.r + 18}
fill="none"
stroke="#1f1f1f"
strokeWidth={2}
initial={{ opacity: 0 }}
animate={{ opacity: 0.9 }}
transition={{ duration: 0.6 }}
/>
{/* cyan halo */}
{!prefers && (
<motion.circle
cx={shield.cx}
cy={shield.cy}
r={shield.r + 6}
fill={accent}
opacity={0.12}
initial={{ scale: 0.95, opacity: 0 }}
animate={{ scale: [1, 1.12, 1], opacity: [0.1, 0.35, 0.1] }}
transition={{ duration: 1.8, repeat: Infinity, repeatType: "mirror", ease: [0.22, 1, 0.36, 1] }}
filter="url(#glow)"
/>
)}
{/* Shield outline */}
<motion.path
d={`M ${shield.cx} ${shield.cy - 30}
L ${shield.cx + 28} ${shield.cy - 15}
L ${shield.cx + 22} ${shield.cy + 24}
L ${shield.cx} ${shield.cy + 34}
L ${shield.cx - 22} ${shield.cy + 24}
L ${shield.cx - 28} ${shield.cy - 15}
Z`}
fill="none"
stroke={accent}
strokeWidth={3}
strokeLinecap="round"
strokeLinejoin="round"
initial={{ pathLength: 0, opacity: 0 }}
animate={{ pathLength: 1, opacity: 1 }}
transition={{ duration: 0.9, ease: [0.22, 1, 0.36, 1] }}
filter="url(#glow)"
/>
{/* Check mark (verified hardware) */}
<motion.path
d={`M ${shield.cx - 14} ${shield.cy + 6} L ${shield.cx - 2} ${shield.cy + 18} L ${shield.cx + 18} ${shield.cy - 6}`}
fill="none"
stroke={accent}
strokeWidth={4}
strokeLinecap="round"
strokeLinejoin="round"
initial={{ pathLength: 0 }}
animate={{ pathLength: 1 }}
transition={{ duration: 0.9, delay: 0.2, ease: [0.22, 1, 0.36, 1] }}
filter="url(#glow)"
/>
{/* LOCKED EXECUTION BOUNDARY (subtle arc) */}
<motion.path
d={`M ${shield.cx - 70} ${shield.cy + 46} Q ${shield.cx} ${shield.cy + 76} ${shield.cx + 70} ${shield.cy + 46}`}
fill="none"
stroke="#2e2e2e"
strokeWidth={2}
initial={{ pathLength: 0, opacity: 0 }}
animate={{ pathLength: 1, opacity: 0.6 }}
transition={{ duration: 0.8, delay: 0.3 }}
/>
{/* Cyan confirmation pulses emanating out (execution allowed) */}
{!prefers && [0, 1].map((i) => (
<motion.circle
key={`emit-${i}`}
cx={shield.cx}
cy={shield.cy}
r={shield.r + 12}
fill="none"
stroke={accent}
strokeWidth={2}
initial={{ opacity: 0, scale: 0.9 }}
animate={{ opacity: [0.0, 0.5, 0.0], scale: [1, 1.15, 1.3] }}
transition={{ duration: 1.8, delay: i * 0.3, repeat: Infinity, ease: [0.22, 1, 0.36, 1] }}
/>
))}
</svg>
</div>
);
}

View File

@@ -1,135 +0,0 @@
import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P } from '@/components/Texts'
const primaryUseCases = [
{
title: 'AI / ML Training',
bullets: [
'Deterministic training pipelines for reproducible experiments.',
'Cryptographically verified model artifacts end-to-end.',
'Autonomous scaling for distributed training runs.',
'Zero-drift environments that remain consistent over time.',
],
},
{
title: 'Application Hosting',
bullets: [
'Transparent deployments with verifiable execution.',
'Auto-scaling that allocates resources on demand.',
'Instant global distribution across the ThreeFold Grid.',
'Cryptographically secured runtime environments.',
],
},
{
title: 'Data Processing',
bullets: [
'Deterministic pipelines that document every transformation.',
'Secure computation with cryptographic verification.',
'Auto-scaling resources for fluctuating workloads.',
'Global processing placement to minimize latency.',
],
},
{
title: 'Scientific Computing',
bullets: [
'Reproducible research environments for shared experiments.',
'Secure workloads with verifiable execution paths.',
'Dynamic scaling for compute-intensive tasks.',
'Global collaboration with sovereign resource control.',
],
},
]
const computeSpecific = [
{
title: 'Deterministic Training Environments',
bullets: [
'Reproducible ML experiments with identical conditions every run.',
'Verifiable computational research for scientific collaboration.',
'Auditable financial modelling workflows with traceable outputs.',
'Consistent IoT edge processing with predictable performance.',
],
},
{
title: 'Multi-Platform Application Hosting',
bullets: [
'Kubernetes orchestration with deterministic deployment pipelines.',
'Virtual machines launched with hardware-attested secure boot.',
'Native Linux workloads with cryptographic assurance.',
'Hybrid topologies mixing containers, VMs, and bare metal.',
],
},
{
title: 'Auto-Scaling Workloads',
bullets: [
'Demand-based scaling that reacts instantly to load.',
'Global distribution across the ThreeFold Grid.',
'Automated failover that restores services without intervention.',
'Cost optimization through intelligent resource allocation.',
],
},
]
export function ComputeUseCases() {
return (
<section className="bg-gray-950 py-24 sm:py-32">
<Container>
<div className="mx-auto max-w-3xl text-center">
<Eyebrow color="accent" className="tracking-[0.32em] uppercase">
Use Cases
</Eyebrow>
<SectionHeader as="h2" color="light" className="mt-6">
Purpose-built for reproducibility, security, and scale.
</SectionHeader>
<P color="lightSecondary" className="mt-6">
From sovereign AI training loops to globally distributed
applications, Mycelium Compute keeps environments verifiable and
self-orchestrating so teams can focus on building.
</P>
</div>
<div className="mt-16 grid gap-8 lg:grid-cols-2">
<div className="space-y-6">
{primaryUseCases.map((useCase) => (
<div
key={useCase.title}
className="rounded-3xl border border-white/10 bg-white/5 p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-200/40 hover:bg-white/10"
>
<h3 className="text-xl font-semibold text-white">
{useCase.title}
</h3>
<ul className="mt-4 space-y-3 text-sm text-gray-200">
{useCase.bullets.map((bullet) => (
<li key={bullet} className="flex items-start gap-3 leading-relaxed">
<span className="mt-1 inline-block size-2 rounded-full bg-cyan-400" />
<span>{bullet}</span>
</li>
))}
</ul>
</div>
))}
</div>
<div className="space-y-6">
{computeSpecific.map((useCase) => (
<div
key={useCase.title}
className="rounded-3xl border border-cyan-400/20 bg-linear-to-br from-cyan-500/10 via-cyan-500/5 to-transparent p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-200/40 hover:from-cyan-400/20 hover:via-cyan-400/10"
>
<h3 className="text-xl font-semibold text-white">
{useCase.title}
</h3>
<ul className="mt-4 space-y-3 text-sm text-cyan-100">
{useCase.bullets.map((bullet) => (
<li key={bullet} className="flex items-start gap-3 leading-relaxed">
<span className="mt-1 inline-block size-2 rounded-full bg-white/80" />
<span>{bullet}</span>
</li>
))}
</ul>
</div>
))}
</div>
</div>
</Container>
</section>
)
}

View File

@@ -73,7 +73,7 @@ export function DownloadHero() {
{features.map((feature) => ( {features.map((feature) => (
<div <div
key={feature.name} key={feature.name}
className="flex flex-col rounded-lg border border-gray-100 p-8 shadow-sm transition-all duration-300 ease-in-out hover:scale-105 hover:border-cyan-500 hover:shadow-lg hover:shadow-cyan-500/20" className="flex flex-col rounded-lg border border-gray-200 p-8 shadow-sm transition-all duration-300 ease-in-out hover:scale-105 hover:border-cyan-500 hover:shadow-lg hover:shadow-cyan-500/20"
> >
<dt className="text-base font-semibold leading-7 text-gray-900"> <dt className="text-base font-semibold leading-7 text-gray-900">
<div className="mb-6 flex h-10 w-10 items-center justify-center"> <div className="mb-6 flex h-10 w-10 items-center justify-center">

View File

@@ -1,6 +1,6 @@
import { CircleBackground } from '../../components/CircleBackground' import { CircleBackground } from '../../components/CircleBackground'
import { Container } from '@/components/Container' import { Container } from '../../components/Container'
import { Button } from '@/components/Button' import { Button } from '../../components/Button'
export function CallToAction() { export function CallToAction() {
return ( return (
@@ -14,12 +14,11 @@ export function CallToAction() {
<Container className="relative"> <Container className="relative">
<div className="mx-auto max-w-2xl text-center"> <div className="mx-auto max-w-2xl text-center">
<h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-white sm:text-4xl"> <h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-white sm:text-4xl">
Choose How You Want to Start Bring sovereign GPU acceleration to production.
</h2> </h2>
<p className="mt-6 text-lg text-gray-300"> <p className="mt-6 text-lg text-gray-300">
Use GPUs through Mycelium Cloud, Work with the Mycelium team to deploy GPU workloads that remain
or contribute GPU nodes to the mesh and run your own workloads. verifiable, performant, and cost-transparent from edge to core.
</p> </p>
<div className="mt-10 flex flex-wrap justify-center gap-x-6 gap-y-4"> <div className="mt-10 flex flex-wrap justify-center gap-x-6 gap-y-4">
<Button <Button
@@ -30,7 +29,7 @@ or contribute GPU nodes to the mesh and run your own workloads.
target="_blank" target="_blank"
rel="noreferrer" rel="noreferrer"
> >
Deploy GPU Workloads Talk to our team
</Button> </Button>
<Button <Button
to="#gpu-architecture" to="#gpu-architecture"
@@ -38,7 +37,7 @@ or contribute GPU nodes to the mesh and run your own workloads.
variant="outline" variant="outline"
color="white" color="white"
> >
Host A GPU Node Review architecture
</Button> </Button>
</div> </div>
</div> </div>

View File

@@ -1,18 +1,28 @@
import { Container } from '@/components/Container' import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader } from '@/components/Texts' import { Eyebrow, SectionHeader, P } from '../../components/Texts'
const architecture = [ const architectureSections = [
{ {
title: 'Sovereign Compute Nodes', title: 'Distributed GPU Mesh',
description: 'GPUs hosted on hardware you trust.', description:
'A peer-to-peer fabric connects GPU nodes across the ThreeFold Grid, exposing them through the Mycelium network.',
bullets: [
'GPU nodes distributed globally for on-demand acceleration.',
'Mycelium network provides encrypted peer-to-peer connectivity.',
'Smart contract orchestration allocates and governs resources.',
'Real-time monitoring tracks utilization and health.',
],
}, },
{ {
title: 'Encrypted Mesh Networking', title: 'Performance Characteristics',
description: 'Secure, private connectivity to workloads.', description:
}, 'Consistency and transparency are built into the fabric so workloads behave predictably anywhere on the planet.',
{ bullets: [
title: 'Reservation & Verification Layer', 'Edge-to-core deployment flexibility for every workload profile.',
description: 'Guarantees GPU access and consistency.', 'Adaptive intelligence optimizes allocation automatically.',
'Deterministic performance guarantees availability when booked.',
'Transparent cost tracking for every GPU cycle consumed.',
],
}, },
] ]
@@ -21,24 +31,41 @@ export function GpuArchitecture() {
<section id="gpu-architecture" className="bg-white py-24 sm:py-32"> <section id="gpu-architecture" className="bg-white py-24 sm:py-32">
<Container> <Container>
<div className="mx-auto max-w-3xl text-center"> <div className="mx-auto max-w-3xl text-center">
<Eyebrow>ARCHITECTURE</Eyebrow> <Eyebrow>
Technical Architecture
</Eyebrow>
<SectionHeader as="h2" className="mt-6 text-gray-900"> <SectionHeader as="h2" className="mt-6 text-gray-900">
HOW IT WORKS A peer-to-peer mesh purpose-built for acceleration.
</SectionHeader> </SectionHeader>
<P className="mt-6 text-gray-600">
Mycelium GPU treats every node as part of a sovereign mesh. Encrypted
networking, smart contract orchestration, and transparent monitoring
ensure your workloads receive precisely the power they request.
</P>
</div> </div>
<div className="mt-16 grid gap-8 lg:grid-cols-2">
<div className="mx-auto mt-16 max-w-4xl space-y-6 lg:space-y-0 lg:grid lg:grid-cols-3 lg:gap-8"> {architectureSections.map((section) => (
{architecture.map((item) => (
<div <div
key={item.title} key={section.title}
className="rounded-3xl border border-slate-200 bg-white p-8 shadow-sm transition hover:-translate-y-1 hover:border-cyan-300 hover:shadow-lg" className="flex h-full flex-col rounded-3xl border border-slate-200 bg-white p-8 shadow-sm transition hover:-translate-y-1 hover:border-cyan-300 hover:shadow-lg"
> >
<h3 className="text-xl font-semibold text-gray-900"> <h3 className="text-xl font-semibold text-gray-900">
{item.title} {section.title}
</h3> </h3>
<p className="mt-3 text-sm leading-relaxed text-gray-600"> <p className="mt-4 text-sm leading-relaxed text-gray-600">
{item.description} {section.description}
</p> </p>
<ul className="mt-6 space-y-3 text-sm text-gray-600">
{section.bullets.map((bullet) => (
<li
key={bullet}
className="flex items-start gap-3 rounded-2xl border border-cyan-100 bg-cyan-50/60 p-3 leading-relaxed"
>
<span className="mt-1 inline-block size-2 rounded-full bg-cyan-500" />
<span>{bullet}</span>
</li>
))}
</ul>
</div> </div>
))} ))}
</div> </div>

View File

@@ -1,58 +0,0 @@
import {
SparklesIcon,
Cog6ToothIcon,
CubeTransparentIcon,
CpuChipIcon,
} from '@heroicons/react/24/solid'
import { Eyebrow, H3, CT, CP } from '@/components/Texts'
import { Container } from '@/components/Container'
const capabilities = [
{
name: 'AI / ML Inference & Training',
description: 'LLMs, embeddings, transformers, fine-tuning',
icon: SparklesIcon,
},
{
name: 'Acceleration in Kubernetes Workloads',
description: 'GPU-backed deployments on Mycelium Cloud',
icon: Cog6ToothIcon,
},
{
name: 'Rendering & Simulation',
description: 'Scientific visualization, VFX, real-time 3D',
icon: CubeTransparentIcon,
},
{
name: 'Agent Compute & RAG Pipelines',
description: 'Vector memory + model execution on sovereign hardware',
icon: CpuChipIcon,
},
]
export function GpuCapabilities() {
return (
<section className="bg-white py-24 sm:py-32">
<Container>
<div className="mx-auto max-w-3xl text-center">
<Eyebrow>CAPABILITIES</Eyebrow>
<H3 className="mt-4 text-gray-900">What You Can Run on Mycelium Cloud</H3>
</div>
<div className="mx-auto mt-16 max-w-5xl">
<dl className="grid grid-cols-1 gap-12 sm:grid-cols-2 lg:grid-cols-4">
{capabilities.map((feature) => (
<div key={feature.name} className="flex flex-col text-center">
<div className="mx-auto flex size-12 items-center justify-center rounded-xl bg-cyan-50">
<feature.icon className="size-6 text-cyan-600" aria-hidden="true" />
</div>
<CT className="mt-6 text-gray-900">{feature.name}</CT>
<CP className="mt-2 text-gray-600">{feature.description}</CP>
</div>
))}
</dl>
</div>
</Container>
</section>
)
}

View File

@@ -1,59 +0,0 @@
import { Container } from '@/components/Container'
import { Eyebrow, H3, CT } from '@/components/Texts'
import {
BoltIcon,
BanknotesIcon,
GlobeAltIcon,
ShieldCheckIcon,
} from '@heroicons/react/24/solid'
const benefits = [
{
name: 'Consistent, reserved GPU performance (no noisy neighbor effects)',
icon: BoltIcon,
},
{
name: 'Transparent cost (no markup, no surprise billing)',
icon: BanknotesIcon,
},
{
name: 'Run anywhere cloud, on-prem, edge, home lab',
icon: GlobeAltIcon,
},
{
name: 'Your data never leaves your control',
icon: ShieldCheckIcon,
},
]
export function GpuDesign() {
return (
<section className="bg-white py-24 sm:py-32">
<Container>
{/* Header */}
<div className="mx-auto max-w-3xl sm:text-center">
<Eyebrow>CORE VALUE</Eyebrow>
<H3 className="mt-4 text-gray-900">GPU Power You Actually Control</H3>
</div>
{/* Key Benefits */}
<div className="mx-auto mt-16 max-w-5xl">
<dl className="grid grid-cols-1 gap-12 sm:grid-cols-2 lg:grid-cols-2">
{benefits.map((benefit) => (
<div key={benefit.name} className="relative pl-12">
<benefit.icon
className="absolute left-0 top-1 size-6 text-cyan-600"
aria-hidden="true"
/>
<CT className="font-semibold text-gray-900">
{benefit.name}
</CT>
</div>
))}
</dl>
</div>
</Container>
</section>
)
}

View File

@@ -1,5 +1,5 @@
import { Container } from '@/components/Container' import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P } from '@/components/Texts' import { Eyebrow, SectionHeader, P } from '../../components/Texts'
const differentiators = [ const differentiators = [
{ {
@@ -52,7 +52,7 @@ export function GpuDifferentiators() {
{differentiators.map((item) => ( {differentiators.map((item) => (
<div <div
key={item.title} key={item.title}
className="rounded-3xl border border-white/10 bg-white/4 p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 hover:bg-white/8" className="rounded-3xl border border-white/10 bg-white/[0.04] p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 hover:bg-white/[0.08]"
> >
<h3 className="text-lg font-semibold text-white">{item.title}</h3> <h3 className="text-lg font-semibold text-white">{item.title}</h3>
<p className="mt-4 text-sm leading-relaxed text-gray-300"> <p className="mt-4 text-sm leading-relaxed text-gray-300">
@@ -61,7 +61,7 @@ export function GpuDifferentiators() {
</div> </div>
))} ))}
</div> </div>
<div className="mt-16 rounded-3xl border border-white/10 bg-white/3 p-8 text-left backdrop-blur-sm"> <div className="mt-16 rounded-3xl border border-white/10 bg-white/[0.03] p-8 text-left backdrop-blur-sm">
<h3 className="text-xl font-semibold text-white">Cost Efficiency</h3> <h3 className="text-xl font-semibold text-white">Cost Efficiency</h3>
<p className="mt-4 text-sm leading-relaxed text-gray-300"> <p className="mt-4 text-sm leading-relaxed text-gray-300">
Transparent economics makes capacity planning simple while keeping Transparent economics makes capacity planning simple while keeping

View File

@@ -1,5 +1,5 @@
import { Container } from '@/components/Container' import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P, Small } from '@/components/Texts' import { Eyebrow, SectionHeader, P, Small } from '../../components/Texts'
const steps = [ const steps = [
{ {
@@ -44,7 +44,7 @@ export function GpuGettingStarted() {
id="gpu-getting-started" id="gpu-getting-started"
className="relative overflow-hidden bg-gray-900 py-24 sm:py-32" className="relative overflow-hidden bg-gray-900 py-24 sm:py-32"
> >
<div className="absolute inset-0 bg-[radial-gradient(circle_at_top,rgba(34,211,238,0.12),transparent_60%)]" /> <div className="absolute inset-0 bg-[radial-gradient(circle_at_top,_rgba(34,211,238,0.12),_transparent_60%)]" />
<Container className="relative"> <Container className="relative">
<div className="mx-auto max-w-3xl text-center"> <div className="mx-auto max-w-3xl text-center">
<Eyebrow className="tracking-[0.32em] uppercase text-cyan-300"> <Eyebrow className="tracking-[0.32em] uppercase text-cyan-300">
@@ -63,7 +63,7 @@ export function GpuGettingStarted() {
{steps.map((step) => ( {steps.map((step) => (
<div <div
key={step.title} key={step.title}
className="flex h-full flex-col rounded-3xl border border-white/10 bg-white/3 p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 hover:bg-white/6" className="flex h-full flex-col rounded-3xl border border-white/10 bg-white/[0.03] p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 hover:bg-white/[0.06]"
> >
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<Small className="text-xs uppercase tracking-[0.4em] text-cyan-300"> <Small className="text-xs uppercase tracking-[0.4em] text-cyan-300">
@@ -91,7 +91,7 @@ export function GpuGettingStarted() {
</div> </div>
))} ))}
</div> </div>
<div className="mt-16 rounded-3xl border border-white/10 bg-white/3 p-6 text-center backdrop-blur-sm"> <div className="mt-16 rounded-3xl border border-white/10 bg-white/[0.03] p-6 text-center backdrop-blur-sm">
<p className="text-sm font-medium uppercase tracking-[0.3em] text-cyan-200"> <p className="text-sm font-medium uppercase tracking-[0.3em] text-cyan-200">
Basic Workflow Basic Workflow
</p> </p>

Some files were not shown because too many files have changed in this diff Show More