56 Commits

Author SHA1 Message Date
8d9f02a846 refactor: clean up unused imports and component exports
- Removed unused component imports across multiple pages (AgentHeroAlt, ComputeHero, CloudPage, GpuPage, StoragePage)
- Changed ComputeDesign export from default to named export for consistency
- Removed CloudDesign section from CloudPage layout
2025-11-04 17:15:07 +01:00
e16456bb94 feat: update GPU CTA section copy and button labels
- Changed heading from "Bring sovereign GPU acceleration to production" to "Choose How You Want to Start"
- Updated description to emphasize dual options: using Mycelium Cloud or contributing GPU nodes
- Renamed buttons to "Deploy GPU Workloads" and "Host A GPU Node" for clearer action paths
2025-11-04 17:03:50 +01:00
388654fcbd refactor: remove unused GPU page sections 2025-11-04 16:50:20 +01:00
865252274c feat: restructure GPU page layout and simplify content presentation
- Reordered sections to improve information flow (Capabilities → Design → Architecture → Overview)
- Simplified use cases and overview sections by removing redundant bullet points
- Added new GpuCapabilities and GpuDesign components with cleaner, more focused messaging
2025-11-04 16:50:15 +01:00
8b892c9432 feat: simplify GPU hero section messaging
- Replaced technical jargon with clearer value proposition focused on accessibility and control
- Streamlined copy to emphasize practical benefits (no waitlists, transparent pricing, flexible deployment)
- Updated CTA button labels for better clarity ("How it works" and "Explore Docs")
2025-11-04 16:43:37 +01:00
7f9023c631 feat: simplify storage page messaging and structure
- Streamlined call-to-action to focus on cloud vs. self-hosted options
- Condensed architecture and use cases sections to remove excessive detail
- Reorganized page component order and added new capability/design sections
2025-11-04 16:23:57 +01:00
f3456eb470 feat: update storage hero section messaging and CTAs
- Simplified headline to emphasize sovereignty, self-healing, and multi-protocol access
- Streamlined description to focus on core value proposition of encrypted, quantum-safe storage
- Updated button labels for clearer user navigation (Features → How It Works, Developer Flow → Explore Docs)
2025-11-04 16:12:07 +01:00
46272e939d feat: simplify compute and cloud page content
- Streamlined ComputeFeatures and ComputeUseCases to focus on high-level benefits rather than detailed bullet points
- Updated ComputeHero messaging to emphasize deterministic control and self-verification
- Revised CallToAction to clarify deployment vs hosting options
- Added CloudDesign and ComputeCapabilities/ComputeDesign sections to page layouts
2025-11-04 16:06:13 +01:00
0daabe56f5 feat: replace SecurityPillars with CloudBluePrint component and reorder sections
- Removed CloudGettingStarted section from the page
- Replaced SecurityPillars with new CloudBluePrint component
- Adjusted section ordering to improve page flow
2025-11-04 15:16:50 +01:00
85afc05c35 feat: update cloud use cases with enterprise and edge focus
- Reframed use cases to emphasize sovereignty, workload ownership, and distributed deployment
- Replaced AI/ML training and DigitalMe Blueprint sections with enterprise Kubernetes and AI/agent workloads
- Updated descriptions and feature bullets to highlight compliance, mesh networking, and autonomous capabilities
2025-11-04 15:16:43 +01:00
866e1df042 feat: add Cloud Blueprint landing section with logo showcase 2025-11-04 15:16:32 +01:00
28ea2ab49d feat: clarify cloud infrastructure independence in features section 2025-11-04 14:06:29 +01:00
1f11ca5319 feat: update cloud hosting capabilities section with audience-focused messaging
- Reorganized features to target specific user personas (DevOps, Security, Data, AI/ML teams)
- Updated feature descriptions to emphasize technical benefits and security posture
- Changed section eyebrow from "DEPLOY" to "CAPABILITIES" for clearer positioning
2025-11-04 14:05:27 +01:00
3e99e85e48 feat: enhance CloudHero messaging and formatting
- Added tagline "Works Alone. Works Together." with explanation of Mycelium Cloud's flexibility
- Simplified "Explore Docs" button text to "Documentation"
- Fixed indentation for improved code readability
2025-11-04 14:01:17 +01:00
b39694ea24 feat: update CTA button text from "Start Deployment" to "Get Started" 2025-11-04 13:35:53 +01:00
363b822d8b feat: refine benefits section messaging and ordering
- Reordered features to lead with "Unbreakable by Design" for stronger impact
- Simplified benefit descriptions for clarity and conciseness
- Updated section heading from "Why It Changes Everything" to "Why It Matters"
2025-11-04 13:35:22 +01:00
00802c7064 feat: reorder slider items and update ecosystem messaging
- Moved Compute/Storage/GPU to first position in slider
- Updated heading from "Mycelium Products" to "Mycelium Components"
- Changed description to emphasize Agents instead of "intelligent automation"
2025-11-04 13:33:53 +01:00
e45ca7c86f feat: reorder HomeSlider section before HomeBenefits 2025-11-04 13:33:47 +01:00
664897ee19 refactor: simplify StackSection description text 2025-11-04 13:31:29 +01:00
91d249f097 feat: update homepage content and section ordering
- Revised hosting section description to emphasize decentralized grid and user control
- Swapped order of StackSectionLight and HomeHostingDark sections
- Enhanced Kubernetes feature description with additional context
2025-11-04 13:29:37 +01:00
4ba88257eb feat: update hero section copy and CTAs
- Changed announcement banner to focus on enterprise scaling with "Book a call" CTA
- Simplified tagline to emphasize infrastructure ownership
- Updated primary CTA from "Get started" to "Start Hosting" and secondary to "Deploy in Cloud"
2025-11-04 13:26:26 +01:00
4c4a0c5dd1 feat: add hero video to public assets
- Added mhero.mp4 video file to public/videos directory for hero section display
- Video will be used as background media content in the landing page hero area
2025-11-04 12:54:59 +01:00
8817272932 refactor: improve hero components and naming consistency
- Renamed AgentsHeroAlt component to AgentHeroAlt for consistent singular naming
- Updated hero section padding and spacing for consistent layout across GPU and Storage pages
- Changed Storage hero image object-fit from cover to contain to match GPU hero styling
- Removed redundant padding classes (sm:py-32, xl:pr-32) from hero components
- Fixed indentation in AgentsPage component
2025-11-02 01:03:52 +01:00
6a882371f0 feat: update cloud and product page content and visuals
- Simplified cloud messaging to focus on sovereignty and self-healing capabilities
- Updated hero section copy across Cloud, Compute, GPU and Storage pages for clearer value proposition
- Added new CloudHosting component to Cloud page layout
- Changed hero images for GPU and Storage pages to improve visual consistency
- Adjusted layout spacing and typography in Compute hero section
- Streamlined cloud features description to be more concise an
2025-11-02 00:45:24 +01:00
4e8e714f37 feat: update homepage benefits messaging and value props
- Revised benefit titles and descriptions to better communicate core product values
- Changed "Sovereign" to "Sovereign by Default" to emphasize out-of-the-box functionality
- Replaced "Autonomous" with "Hackable & Open" to highlight developer-friendly nature
- Updated "Energy Efficient" to "Unbreakable by Design" focusing on resilience
- Combined cost and energy benefits into single value proposition for clearer messaging
2025-11-01 22:32:06 +01:00
01c3c226a9 feat: update product descriptions and streamline component list
- Updated main heading from "Components" to "Products" to better reflect offering
- Rewrote hero description to emphasize standalone and integrated usage of products
- Consolidated Compute, Storage, and GPU into a single "Resources" category
- Updated Network description to focus on mesh networking capabilities
- Modified Agents description to emphasize privacy and hardware ownership
- Removed individual entries for GPU, Compute, and Storage components
2025-11-01 22:26:26 +01:00
c7371ec21b feat: update homepage layout and visual styling
- Reorganized homepage sections by adding HomeHostingDark and HomeComparisonTable components
- Changed background color of slider section from #0b0b0b to #111111 for better contrast
- Updated card styling in CloudArchitecture to use semi-transparent gray background (bg-gray-50/25)
- Modified paragraph text styling to use leading-tight instead of leading-relaxed for better readability
- Reordered HomeBenefits section placement in the page flow
2025-11-01 22:19:07 +01:00
c15b110afe feat: adjust hero section width on homepage
- Reduced max-width of hero content container from max-w-3xl to max-w-2xl for better content alignment and readability
- Content width now matches design specifications for desktop breakpoints
2025-11-01 21:08:51 +01:00
3564b5cb0f feat: enhance homepage with smooth scroll navigation
- Added scroll-to-slider functionality when clicking "Get Started" button
- Modified AnimatedSection to support ref forwarding for scroll targeting
- Updated HomeAurora component to accept click handler prop
- Refined homepage hero text and description for clearer value proposition
- Changed button from link to click handler for better user interaction
2025-11-01 21:08:42 +01:00
51ef8dffb5 feat: enhance UI components and layout styling
- Updated FeatureDescription text size to be larger on desktop (lg:text-base)
- Added rounded corners (rounded-3xl) to DarkCard component
- Modified CloudArchitecture section with wider container (max-w-5xl) and updated heading styles
- Adjusted mobile feature navigation indicators with darker colors (bg-gray-600/700)
- Improved hero section typography using H2 and H5 components for better hierarchy
- Refined padding and background styling in CloudFeatures mobile
2025-11-01 21:02:35 +01:00
9d8f1a6919 refactor: replace MagicCard with DarkCard component
- Replaced MagicCard with new DarkCard component across apple-cards-carousel and HomeGlobe
- Updated card styling and layout in apple-cards-carousel to work with DarkCard
- Removed gradient and border styling from globe stats cards
- Adjusted padding and margin values to maintain consistent appearance
- Fixed spacing and alignment of chevron icon in cards
2025-10-31 15:35:45 +01:00
0f93199aa4 feat: redesign card carousel with modern layout and improved visuals
- Updated card component design from image background to structured layout with separate content and image sections
- Added dedicated image container with proper scaling and positioning for product images
- Refined typography with new styling for category, title and description text
- Increased gap between carousel cards from 4 to 6 units for better spacing
- Adjusted card dimensions and padding for better responsive behavior
- Update
2025-10-31 14:35:45 +01:00
57fa97cc70 feat: update home slider images to PNG format
- Added new PNG format images for network, agent, cloud, GPU, compute and storage sections
- Updated image source paths in HomeSlider component to reference new PNG files
- Replaced legacy .webp gallery images with dedicated page-specific images for better quality and consistency
2025-10-31 14:11:52 +01:00
fa7c524b18 feat: remove cloud overview section from landing page
- Removed CloudOverview component from CloudPage to streamline the user experience
- Simplified page layout to focus on hero section and features content
- Maintained AnimatedSection wrapper structure for remaining components
2025-10-31 05:02:26 +01:00
f1c388cbab refactor: reorganize cloud page component structure
- Moved CloudOverview component into its own AnimatedSection for consistent layout
- Reordered imports to match component rendering sequence
- Fixed spacing and removed empty line in component structure
2025-10-31 05:02:02 +01:00
ea3ee4d455 feat: add dynamic header navigation with current page tracking
- Added useLocation hook to detect and display current page in header dropdown
- Extracted cloud navigation items into separate constant for reusability
- Implemented getCurrentPageName function to determine active page based on URL path
- Updated dropdown button to dynamically show current section instead of static "Cloud" text
2025-10-31 04:58:58 +01:00
24f6da37ed feat: enhance cloud features UI with improved image styling
- Removed CircleBackground component and its instances from desktop and mobile views for cleaner design
- Updated image shadows from shadow-xl to shadow-2xl for stronger depth effect
- Modified image positioning with -ml-32 margin for better layout alignment in tablet and desktop views
- Removed unnecessary background animations to improve visual focus on feature screenshots
2025-10-31 04:55:30 +01:00
c861f15492 feat: update hero images and adjust cloud features layout
- Changed cloud hero background image from cloudhero3.webp to cloudhero4.webp for improved visual appeal
- Updated compute hero image path from hero.webp to cloudhero.webp for consistency
- Increased max width of cloud features container from max-w-none to max-w-3xl on large screens for better content readability
2025-10-31 04:50:11 +01:00
bfe3c1e4bd feat: redesign cloud features section with new UI and content
- Replaced mobile phone mockups with full-width desktop screenshots for cloud platform features
- Updated feature descriptions to focus on cloud/Kubernetes capabilities instead of network features
- Changed section layout to improve desktop view with left-aligned feature tabs
- Removed unused phone frame component and related mobile UI elements
- Updated image assets from jpg to png format and reorganized image paths
- Reordered page
2025-10-31 04:40:14 +01:00
26ae2f156a feat: add mobile app UI screenshots and enhance text components
- Added new app UI screenshots for cloud features (connector, billing, kubeconfig, reserve)
- Added new hero image (cloudhero3.webp) for cloud section
- Enhanced Texts component with new cyan color variant and default props support
- Updated Eyebrow component to use consistent styling with accent color and tracking
- Simplified CloudArchitecture component by removing redundant style props
- Completely rebuilt CloudFeatures component with
2025-10-31 04:04:44 +01:00
33c940c604 feat: update cloud page hero and home slider components
- Replaced CloudHero with new CloudHeroNew component on cloud page
- Added new cloud-related images (cloudhero.webp, cloudhero2.webp, k82.png) to public assets
- Enhanced HomeSlider section with Eyebrow component for "Ecosystem" label
- Updated HomeSlider heading text from "Discover the Mycelium Ecosystem" to "Discover the Mycelium Components"
2025-10-31 03:36:19 +01:00
0837a8313c refactor: remove unused text component imports
- Removed unused H2 import from HomeAurora.tsx
- Removed unused SectionHeader import from StackSection.tsx
- Cleaned up import statements to only include components being used
2025-10-31 03:10:39 +01:00
b311cb22a4 feat: improve text styling and layout in home sections
- Replaced custom paragraph tags with CP component for consistent text styling
- Updated leading value from [1.525] to relaxed for better readability
- Simplified feature descriptions while maintaining key messaging
- Streamlined header styling in Stack section and removed redundant text classes
- Standardized text color and spacing across sections for visual consistency
2025-10-31 03:09:47 +01:00
b987f1a072 feat: enhance card component styling and responsiveness
- Added subtle border to cards with 30% opacity gray color for improved visual definition
- Increased description text size from sm to base on mobile and lg on desktop for better readability
- Maintained hover and transition effects while improving visual hierarchy
- Ensured consistent spacing and alignment across card elements
2025-10-31 03:09:07 +01:00
dd4eba2215 feat: update UI styling and add new page images
- Added new WebP images for different pages (agent, cloud, compute, gpu, network, storage)
- Updated benefits section images with optimized WebP versions
- Enhanced text styling:
  - Increased paragraph font size to text-xl on large screens
  - Adjusted H5 line height for better readability
  - Updated card paragraph text size to text-base
- Refined visual design elements:
  - Changed cube stroke color to gray-600 for subtler appearance
  - Adjusted glow effects and gradients to
2025-10-31 03:01:17 +01:00
ea1ef853f1 feat: add hero image for landing page
- Added hero11.webp image file to public/images directory for use in website landing page
2025-10-31 01:38:26 +01:00
5b05dababb style: adjust eyebrow text tracking for better readability
- Changed tracking property from 'tracking-wide' to 'tracking-wider' to increase letter spacing in eyebrow text component
- Improves visual hierarchy and text legibility for uppercase headings
2025-10-31 01:36:16 +01:00
ab5ac43793 feat: update website design and assets
- Replaced multiple hero and background images with new optimized versions
- Removed unused image assets from public/images directory
- Updated typography styles:
  - Removed italic styling from various text components
  - Made eyebrow text uppercase
  - Adjusted H1 font size from 6xl to 5xl on mobile
- Redesigned HomeAurora component with new layout and background
- Added Mulish as primary font family in Tailwind config
- Updated text formatting and spacing
2025-10-31 01:36:08 +01:00
fb9250c365 feat: add Mulish font family to website
- Added Google Fonts stylesheet link to load Mulish font with weights 400, 500, and 700
- Included preconnect links for optimal font loading performance
2025-10-31 01:35:03 +01:00
04d08a4265 feat: update docs button text for improved UI clarity
- Shortened "Read Docs" button text to "Docs" for cleaner, more concise presentation in the CallToAction component
- Maintains same button styling and positioning while reducing visual clutter
2025-10-30 14:34:34 +01:00
07f76639d2 docs: update repository URL in README
- Fixed repository URL by removing underscore between "project" and "mycelium"
- Ensures correct link for accessing project repository
2025-10-30 13:06:25 +01:00
a59e09e8ed docs: update README with comprehensive project documentation
- Expanded project overview with detailed technology stack and dependencies
- Added deployment information for production and staging environments
- Included complete development setup instructions and contribution guidelines
- Added issue reporting process and contact information
- Updated file structure documentation with new component organization
- Included branding guidelines and font specifications
- Added links to project management
2025-10-30 13:05:40 +01:00
9f81561a86 refactor: improve type safety and component stability in HalfGlobe
- Replaced custom RotatableGroup type with Three.js Group type for better type safety
- Added key prop to root div element to help React's reconciliation process
- Removed unnecessary custom type definition by using built-in Three.js types
2025-10-30 13:04:51 +01:00
c0cbe7e6bf perf: implement lazy loading for route components
- Added React.lazy() for all page components to enable code splitting
- Wrapped Routes with Suspense component and loading fallback state
- Converted static imports to dynamic imports to reduce initial bundle size
- Added semicolons for consistent code style
2025-10-30 13:04:44 +01:00
Emre
6d6cbd115a fixed build errors 2025-10-28 19:47:55 +03:00
Emre
3c9823bf80 new dropdown content from Mik 2025-10-28 19:32:09 +03:00
139 changed files with 3986 additions and 499 deletions

252
README.md
View File

@@ -1,93 +1,195 @@
# Project Mycelium Website # Project Mycelium Website
A multi-page website for Project Mycelium built with React, Vite, TypeScript, and Tailwind CSS. All in one project mycelium website
## Tech Stack
- **Framework**: React 19 - **Repository:** [https://git.ourworld.tf/ourworld_web/www_projectmycelium_com/](https://git.ourworld.tf/ourworld_web/www_projectmycelium_com/)
- **Build Tool**: Vite 7
- **Main Branch (Production):** [https://www.projectmycelium.com/](https://www.projectmycelium.com)
- **Dev Branch (Staging):** [https://www2.projectmycelium.com/](https://www2.projectmycelium.com/)
---
## About
This is the official website for Mycelium , built using Vite.js and Tailwind CSS.
---
## Technologies
- **Framework**: Vite.js (React)
- **Language**: TypeScript - **Language**: TypeScript
- **Styling**: Tailwind CSS 4 - **Styling**: Tailwind CSS
- **Routing**: React Router DOM 7
- **Animations**: Framer Motion 11
## Project Structure
``` ---
src/
├── components/ # Shared components
│ ├── AnimatedSection.tsx
│ ├── Button.tsx
│ ├── CircleBackground.tsx
│ ├── Container.tsx
│ ├── Header.tsx
│ ├── Layout.tsx
│ └── Logo.tsx
├── pages/ # Page-specific components
│ ├── home/ # Home page blocks
│ ├── cloud/ # Cloud page blocks
│ ├── network/ # Network page blocks
│ │ ├── animations/ # SVG animations
│ │ ├── Hero.tsx
│ │ ├── About.tsx
│ │ ├── Features.tsx
│ │ ├── PrimaryFeatures.tsx
│ │ ├── SecondaryFeatures.tsx
│ │ ├── CallToAction.tsx
│ │ └── NetworkPage.tsx
│ └── agents/ # Agents page blocks
├── styles/
│ └── tailwind.css # Tailwind configuration
└── App.tsx # Main app with routing
```
## Pages
- **Home** (`/`) - Main landing page with placeholder content ## Dependencies
- **Cloud** (`/cloud`) - Mycelium Cloud information (placeholder)
- **Network** (`/network`) - Full Network page with:
- Hero section
- Our Mission (About)
- Core Components (Features with animations)
- How It Works
- Roadmap
- Call to Action
- **Agents** (`/agents`) - Mycelium Agents information (placeholder)
## Development - **@emailjs/browser**: ^4.4.1
- **@headlessui/react**: ^2.2.9
- **@heroicons/react**: ^2.2.0
- **@lobehub/icons**: ^1.97.2
- **@radix-ui/react-icons**: ^1.3.2
- **@react-three/drei**: ^9.89.2
- **@react-three/fiber**: ^8.15.12
- **@tabler/icons-react**: ^3.35.0
- **@tailwindcss/forms**: ^0.5.10
- **@types/node**: ^20.19.23
- **@types/react**: ^18.3.26
- **@types/react-dom**: ^18.3.7
- **@types/react-router-dom**: ^5.3.3
- **class-variance-authority**: ^0.7.1
- **clsx**: ^2.1.1
- **cobe**: ^0.6.5
- **dotted-map**: ^2.2.3
- **framer-motion**: ^10.18.0
- **lucide-react**: ^0.544.0
- **motion**: ^12.23.24
- **popmotion**: ^11.0.5
- **react**: ^18.3.1
- **react-countup**: ^6.5.3
- **react-dom**: ^18.3.1
- **react-icons**: ^5.5.0
- **react-router-dom**: ^7.9.4
- **react-type-animation**: ^3.2.0
- **tailwind-merge**: ^3.3.1
- **tailwindcss**: ^4.1.15
- **three**: ^0.151.0
- **typescript**: ^5.9.3
- **use-debounce**: ^10.0.6
Install dependencies: ### Dev Dependencies
```bash
npm install
```
Run development server: - **@tailwindcss/postcss**: ^4.1.15
```bash - **@types/three**: ^0.151.0
npm run dev - **@vitejs/plugin-react**: ^5.0.4
``` - **autoprefixer**: ^10.4.20
- **eslint**: ^8.57.1
- **prettier**: ^3.6.2
- **prettier-plugin-tailwindcss**: ^0.6.14
- **sharp**: ^0.33.1
- **tw-animate-css**: ^1.4.0
- **vite**: ^7.1.7
Build for production: ---
```bash
npm run build
```
Preview production build:
```bash
npm run preview
```
## Styling ## File Structure
The project follows the same styling conventions as the source Mycelium website:
- **Font**: Inter (Google Fonts)
- **Colors**: Custom gray scale and cyan accent
- **Animations**: Framer Motion with reduced motion support
- **Design**: Tailwind CSS with custom theme extensions
## Migration Notes - **Pages**: `src/pages`
- **Components**: `src/components`
- **Images**: `public/images`, `src/images`
- **CSS**: `src/index.css`, `src/App.css`
This website consolidates multiple one-pager sites into a single multi-page application. The Network page contains fully migrated content from the original www_mycelium_net repository, including:
- All animated SVG components ---
- Responsive layouts
- Hover effects and transitions
- Accessibility features ## Branding
- **Font**: 'Mulish', 'Neuton'
- **Logos**: `public/images/logo.svg`, `public/images/logomark.svg`
---
## Get Started
Follow these steps to get the project running locally:
1. **Install Dependencies**:
`npm install`
2. **Build the Project**:
`npm run build`
3. **Start the Development Server**:
`npm run dev`
---
## Development Guide
This project follows a modular, component-based architecture. Pages are assembled by combining reusable components into a single layout.
### Homepage Structure
The homepage is composed of components from `src/components` and pages are defined in `src/pages`.
To edit a specific section of the homepage, navigate to `src/components/` and modify the corresponding component file.
### Base Layout
The base layout for all pages is defined in `src/components/Layout.tsx`.
### Creating a New Page
To create a new page, add a new route in `src/App.tsx` and create a corresponding component in `src/pages`.
---
## Contributing
- **Never update the `main` branch directly.** All changes must be reviewed and merged by the team through a pull request.
- **Always work on the `development` branch.** Create a feature branch from `development` and submit your pull request to `development`.
- **Request a review.** After submitting your pull request, ask the team to review and accept it into the `main` branch.
---
## Report an Error
To report an issue, please use the following link and provide the requested information:
- **Issue Tracker**: [git.ourworld.tf/ourworld_web/HOME/issues/new](https://git.ourworld.tf/ourworld_web/HOME/issues/new) and tag **OW Website & Wiki Project 2025**
- See the current web rpoject on [OW Website & Wiki Project 2025](https://git.ourworld.tf/ourworld_web/-/projects/153)
When reporting an issue, please include:
- **URL**: The page where the error occurred.
- **Repo**: The repository you are working with.
- **Branch**: The specific branch you are on.
- **Problem**: A detailed description of the problem.
---
## Questions
If you have any questions, you can reach out to [sashaastiadi](https://git.ourworld.tf/sashaastiadi).

View File

@@ -8,6 +8,7 @@
<meta name="description" content="Project Mycelium's technology enables anyone to deploy their own Internet infrastructure, anywhere." /> <meta name="description" content="Project Mycelium's technology enables anyone to deploy their own Internet infrastructure, anywhere." />
<link rel="preconnect" href="https://fonts.googleapis.com" /> <link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Mulish:wght@400;500;700&display=swap" rel="stylesheet" />
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 497 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 303 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 992 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 802 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

BIN
public/images/agents.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 778 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 757 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 938 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

BIN
public/images/gpuhero2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

BIN
public/images/hero11.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

BIN
public/images/k82.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 910 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 835 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

BIN
public/images/pages/gpu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

BIN
public/images/storage.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

BIN
public/images/storage2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
public/videos/mhero.mp4 Normal file

Binary file not shown.

View File

@@ -1,29 +1,33 @@
import { BrowserRouter, 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 HomePage from './pages/home/HomePage' import { lazy, Suspense } from 'react';
import CloudPage from './pages/cloud/CloudPage'
import NetworkPage from './pages/network/NetworkPage' const HomePage = lazy(() => import('./pages/home/HomePage'));
import AgentsPage from './pages/agents/AgentsPage' const CloudPage = lazy(() => import('./pages/cloud/CloudPage'));
import DownloadPage from './pages/download/DownloadPage' const NetworkPage = lazy(() => import('./pages/network/NetworkPage'));
import ComputePage from './pages/compute/ComputePage' const AgentsPage = lazy(() => import('./pages/agents/AgentsPage'));
import StoragePage from './pages/storage/StoragePage' const DownloadPage = lazy(() => import('./pages/download/DownloadPage'));
import GpuPage from './pages/gpu/GpuPage' const ComputePage = lazy(() => import('./pages/compute/ComputePage'));
const StoragePage = lazy(() => import('./pages/storage/StoragePage'));
const GpuPage = lazy(() => import('./pages/gpu/GpuPage'));
function App() { function App() {
return ( return (
<BrowserRouter> <BrowserRouter>
<Routes> <Suspense fallback={<div>Loading...</div>}>
<Route path="/" element={<Layout />}> <Routes>
<Route index element={<HomePage />} /> <Route path="/" element={<Layout />}>
<Route path="cloud" element={<CloudPage />} /> <Route index element={<HomePage />} />
<Route path="network" element={<NetworkPage />} /> <Route path="cloud" element={<CloudPage />} />
<Route path="agents" element={<AgentsPage />} /> <Route path="network" element={<NetworkPage />} />
<Route path="download" element={<DownloadPage />} /> <Route path="agents" element={<AgentsPage />} />
<Route path="compute" element={<ComputePage />} /> <Route path="download" element={<DownloadPage />} />
<Route path="storage" element={<StoragePage />} /> <Route path="compute" element={<ComputePage />} />
<Route path="gpu" element={<GpuPage />} /> <Route path="storage" element={<StoragePage />} />
</Route> <Route path="gpu" element={<GpuPage />} />
</Routes> </Route>
</Routes>
</Suspense>
</BrowserRouter> </BrowserRouter>
) )
} }

View File

@@ -1,4 +1,5 @@
import { motion } from 'framer-motion' import { motion } from 'framer-motion'
import { forwardRef } from 'react'
type AnimatedSectionProps = { type AnimatedSectionProps = {
children: React.ReactNode children: React.ReactNode
@@ -6,9 +7,11 @@ type AnimatedSectionProps = {
className?: string className?: string
} }
export function AnimatedSection({ children, id, className }: AnimatedSectionProps) { export const AnimatedSection = forwardRef<HTMLElement, AnimatedSectionProps>(
({ children, id, className }, ref) => {
return ( return (
<motion.section <motion.section
ref={ref}
id={id} id={id}
className={className} className={className}
initial={{ opacity: 0, y: 40 }} initial={{ opacity: 0, y: 40 }}
@@ -19,4 +22,5 @@ export function AnimatedSection({ children, id, className }: AnimatedSectionProp
{children} {children}
</motion.section> </motion.section>
) )
} },
)

View File

@@ -1,11 +1,30 @@
import { Link } 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'
const cloudNavItems = [
{ name: 'Cloud', href: '/cloud' },
{ name: 'Compute', href: '/compute' },
{ name: 'Storage', href: '/storage' },
{ name: 'GPU', href: '/gpu' },
]
export function Header() { export function Header() {
const location = useLocation()
const getCurrentPageName = () => {
const currentPath = location.pathname;
if (currentPath.startsWith('/compute')) return 'Compute';
if (currentPath.startsWith('/storage')) return 'Storage';
if (currentPath.startsWith('/gpu')) return 'GPU';
if (currentPath.startsWith('/cloud')) return 'Cloud';
return 'Cloud';
};
return ( return (
<header> <header>
<nav> <nav>
@@ -18,16 +37,11 @@ export function Header() {
<Dropdown <Dropdown
buttonContent={ buttonContent={
<> <>
Cloud {getCurrentPageName()}
<ChevronDownIcon className="h-5 w-5" aria-hidden="true" /> <ChevronDownIcon className="h-5 w-5" aria-hidden="true" />
</> </>
} }
items={[ items={cloudNavItems}
{ name: 'Cloud', href: '/cloud' },
{ name: 'Compute', href: '/compute' },
{ name: 'Storage', href: '/storage' },
{ name: 'GPU', href: '/gpu' },
]}
/> />
<Link <Link
to="/network" to="/network"

View File

@@ -13,6 +13,7 @@ const colorVariants = {
secondary: 'text-gray-600', secondary: 'text-gray-600',
light: 'text-gray-50', light: 'text-gray-50',
accent: 'text-cyan-500', accent: 'text-cyan-500',
cyan: 'text-cyan-50',
white: 'text-white', white: 'text-white',
dark: 'text-gray-950', dark: 'text-gray-950',
tertiary: 'text-gray-700', tertiary: 'text-gray-700',
@@ -33,7 +34,8 @@ type PolymorphicProps<E extends React.ElementType, P> = P & {
const createTextComponent = <DefaultElement extends React.ElementType>( const createTextComponent = <DefaultElement extends React.ElementType>(
defaultElement: DefaultElement, defaultElement: DefaultElement,
defaultClassName: string defaultClassName: string,
defaultProps: Omit<TextOwnProps, 'className' | 'children'> = {}
) => { ) => {
type Props<E extends React.ElementType = DefaultElement> = PolymorphicProps< type Props<E extends React.ElementType = DefaultElement> = PolymorphicProps<
E, E,
@@ -41,9 +43,9 @@ const createTextComponent = <DefaultElement extends React.ElementType>(
> >
function Text<E extends React.ElementType = DefaultElement>({ function Text<E extends React.ElementType = DefaultElement>({
font = 'sans', font = defaultProps.font || 'sans',
as, as,
color = 'primary', color = defaultProps.color || 'primary',
className, className,
children, children,
...props ...props
@@ -72,7 +74,7 @@ const createTextComponent = <DefaultElement extends React.ElementType>(
// Exports based on your tailwind.css and the example // Exports based on your tailwind.css and the example
export const H1 = createTextComponent( export const H1 = createTextComponent(
'h1', 'h1',
'text-6xl lg:text-7xl font-medium leading-tight tracking-tight' 'text-5xl lg:text-7xl font-medium leading-tight tracking-tight'
) )
export const H2 = createTextComponent( export const H2 = createTextComponent(
'h2', 'h2',
@@ -88,7 +90,7 @@ export const H4 = createTextComponent(
) )
export const P = createTextComponent( export const P = createTextComponent(
'p', 'p',
'text-base lg:text-lg leading-relaxed' 'text-base lg:text-xl leading-relaxed'
) )
export const Small = createTextComponent( export const Small = createTextComponent(
'small', 'small',
@@ -100,11 +102,12 @@ export const Subtle = createTextComponent(
) )
export const H5 = createTextComponent( export const H5 = createTextComponent(
'h5', 'h5',
'text-xl lg:text-2xl font-light leading-snug tracking-normal' 'text-xl lg:text-2xl font-light lg:leading-snug leading-[0.85] tracking-normal'
) )
export const Eyebrow = createTextComponent( export const Eyebrow = createTextComponent(
'h2', 'h2',
'text-base/7 font-semibold tracking-wide' 'text-base/7 font-semibold tracking-[0.18em] uppercase',
{ color: 'accent' }
) )
export const SectionHeader = createTextComponent( export const SectionHeader = createTextComponent(
'p', 'p',
@@ -128,7 +131,7 @@ export const FeatureTitle = createTextComponent(
) )
export const FeatureDescription = createTextComponent( export const FeatureDescription = createTextComponent(
'p', 'p',
'text-sm leading-normal tracking-normal' 'lg:text-base text-sm leading-normal tracking-normal'
) )
export const MobileFeatureTitle = createTextComponent( export const MobileFeatureTitle = createTextComponent(
'h3', 'h3',
@@ -160,4 +163,4 @@ export const DownloadCardDescription = createTextComponent(
) )
export const CT = createTextComponent('span', 'text-lg lg:text-xl font-semibold') export const CT = createTextComponent('span', 'text-lg lg:text-xl font-semibold')
export const CP = createTextComponent('p', 'text-sm lg:text-sm tracking-wide leading-[1.525] font-light') export const CP = createTextComponent('p', 'text-sm lg:text-base tracking-wide leading-tight font-light')

View File

@@ -1,6 +1,5 @@
import type { ReactNode } from "react"; import type { ReactNode } from "react";
import { Button } from "@/components/ui/button"; import { ArrowRight } from "lucide-react";
import { ArrowRightIcon } from "@radix-ui/react-icons";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
const BentoGrid = ({ const BentoGrid = ({
@@ -64,12 +63,13 @@ const BentoCard = ({
"pointer-events-none absolute bottom-0 flex w-full translate-y-10 transform-gpu flex-row items-center p-4 opacity-0 transition-all duration-300 group-hover:translate-y-0 group-hover:opacity-100", "pointer-events-none absolute bottom-0 flex w-full translate-y-10 transform-gpu flex-row items-center p-4 opacity-0 transition-all duration-300 group-hover:translate-y-0 group-hover:opacity-100",
)} )}
> >
<Button variant="ghost" asChild size="sm" className="pointer-events-auto"> <a
<a href={href}> href={href}
{cta} className="pointer-events-auto inline-flex items-center gap-2 text-sm font-medium text-neutral-600 transition-colors hover:text-sky-700"
<ArrowRightIcon className="ml-2 h-4 w-4" /> >
</a> {cta}
</Button> <ArrowRight className="h-4 w-4" />
</a>
</div> </div>
</div> </div>
); );

View File

@@ -26,7 +26,7 @@ const CubeSvg: React.FC<React.SVGProps<SVGSVGElement> & { index: number }> = ({
<path <path
fill={`url(#cube-gradient-${index})`} fill={`url(#cube-gradient-${index})`}
d="M491.651 144.747L287.198 227.339C265.219 236.22 241.783 236.22 219.802 227.339L15.3486 144.747C-5.11621 136.479 -5.11621 97.5191 15.3486 89.2539L219.802 6.65884C241.783 -2.21961 265.219 -2.21961 287.198 6.65884L491.651 89.2539C512.116 97.5191 512.116 136.479 491.651 144.747Z" d="M491.651 144.747L287.198 227.339C265.219 236.22 241.783 236.22 219.802 227.339L15.3486 144.747C-5.11621 136.479 -5.11621 97.5191 15.3486 89.2539L219.802 6.65884C241.783 -2.21961 265.219 -2.21961 287.198 6.65884L491.651 89.2539C512.116 97.5191 512.116 136.479 491.651 144.747Z"
stroke="rgba(59, 130, 246, 0.25)" stroke="rgba(107, 114, 128, 0.3)"
strokeWidth="0.5" strokeWidth="0.5"
/> />
<defs> <defs>
@@ -79,8 +79,8 @@ export function CubeLight({
<div <div
className={`absolute inset-0 blur-3xl rounded-2xl transition-all duration-500 ${ className={`absolute inset-0 blur-3xl rounded-2xl transition-all duration-500 ${
isActive isActive
? "bg-blue-400/40 opacity-70" ? "bg-cyan-400/20 opacity-30"
: "bg-blue-200/20 opacity-40" : "bg-cyan-200/20 opacity-40"
}`} }`}
/> />
@@ -90,8 +90,8 @@ export function CubeLight({
className="w-48 sm:w-64 lg:w-80 h-auto relative" className="w-48 sm:w-64 lg:w-80 h-auto relative"
style={{ style={{
filter: isActive filter: isActive
? "drop-shadow(0 0 25px rgba(59, 130, 246, 0.4)) brightness(1.1)" ? "drop-shadow(0 0 15px rgba(34, 211, 238, 0.25)) brightness(1.05)"
: "drop-shadow(0 0 10px rgba(59, 130, 246, 0.15)) brightness(1)", : "drop-shadow(0 0 10px rgba(34, 211, 238, 0.15)) brightness(1)",
transition: "all 0.4s ease", transition: "all 0.4s ease",
}} }}
/> />
@@ -99,10 +99,10 @@ export function CubeLight({
{/* Title overlay */} {/* Title overlay */}
<div className="absolute inset-0 flex items-center justify-center"> <div className="absolute inset-0 flex items-center justify-center">
<h3 <h3
className="text-blue-900 text-sm lg:text-base font-medium text-center px-4" className="text-cyan-900 text-sm lg:text-base font-medium text-center px-4"
style={{ style={{
textShadow: textShadow:
"0 0 15px rgba(255,255,255,0.8), 0 0 25px rgba(59, 130, 246, 0.5)", "0 0 15px rgba(255,255,255,0.8), 0 0 25px rgba(34, 211, 238, 0.5)",
}} }}
> >
{title} {title}
@@ -131,7 +131,7 @@ export function CubeLight({
y1="1" y1="1"
x2="120" x2="120"
y2="1" y2="1"
stroke="rgba(59, 130, 246, 0.6)" stroke="rgba(34, 211, 238, 0.6)"
strokeWidth="1" strokeWidth="1"
opacity="0.8" opacity="0.8"
/> />

View File

@@ -34,7 +34,7 @@ export function Dropdown({ buttonContent, items }: DropdownProps) {
<div className="py-1"> <div className="py-1">
{items.map((item) => ( {items.map((item) => (
<Menu.Item key={item.href}> <Menu.Item key={item.href}>
{({ active }) => ( {({ active }: { active: boolean }) => (
<Link <Link
to={item.href} to={item.href}
className={` className={`

View File

@@ -3,13 +3,10 @@
import { Canvas, useFrame } from "@react-three/fiber"; import { Canvas, useFrame } from "@react-three/fiber";
import { Line, OrbitControls, useTexture } from "@react-three/drei"; import { Line, OrbitControls, useTexture } from "@react-three/drei";
import { useMemo, useRef } from "react"; import { useMemo, useRef } from "react";
import type { Group } from "three";
type RotatableGroup = {
rotation: { y: number };
};
function Globe() { function Globe() {
const groupRef = useRef<RotatableGroup | null>(null); const groupRef = useRef<Group>(null);
const cloudTexture = useTexture("/images/cloud1.png"); const cloudTexture = useTexture("/images/cloud1.png");
// Rotate the globe slowly // Rotate the globe slowly
@@ -78,7 +75,7 @@ function Globe() {
export function HalfGlobe() { export function HalfGlobe() {
return ( return (
<div className="w-full h-[500px] bg-white flex items-center justify-center"> <div key="half-globe" className="w-full h-[500px] bg-white flex items-center justify-center">
<Canvas camera={{ position: [0, 1.5, 4], fov: 45 }}> <Canvas camera={{ position: [0, 1.5, 4], fov: 45 }}>
<ambientLight intensity={0.8} /> <ambientLight intensity={0.8} />
<Globe /> <Globe />

View File

@@ -35,8 +35,8 @@ const stackData = [
]; ];
export function StackedCubesLight() { export function StackedCubesLight() {
const [active, setActive] = useState<string | null>("agent"); const [active, setActive] = useState<string | null>("network");
const [selectedForMobile, setSelectedForMobile] = useState<string | null>("agent"); const [selectedForMobile, setSelectedForMobile] = useState<string | null>("network");
const handleCubeClick = (id: string) => { const handleCubeClick = (id: string) => {
setSelectedForMobile((prev) => (prev === id ? null : id)); setSelectedForMobile((prev) => (prev === id ? null : id));
@@ -49,10 +49,10 @@ export function StackedCubesLight() {
return ( return (
<div className="flex flex-col items-center relative"> <div className="flex flex-col items-center relative">
{/* ✨ Ambient cyan-white gradient background */} {/* ✨ Ambient cyan-white gradient background */}
<div className="absolute inset-0 bg-gradient-to-b from-white via-cyan-50/40 to-white blur-3xl opacity-70 pointer-events-none" /> <div className="absolute inset-0 bg-gradient-to-b from-white via-cyan-50/30 to-white blur-3xl opacity-70 pointer-events-none" />
<div <div
className="relative w-full flex items-center justify-center lg:justify-center min-h-[450px] lg:min-h-[400px]" className="relative w-full flex items-center justify-center lg:justify-center min-h-[450px] lg:min-h-[400px]"
onMouseLeave={() => setActive("agent")} onMouseLeave={() => setActive("network")}
> >
<motion.div <motion.div
className="relative lg:pl-0 pl-6 h-[300px] lg:h-[400px] w-64 sm:w-80 lg:w-96" className="relative lg:pl-0 pl-6 h-[300px] lg:h-[400px] w-64 sm:w-80 lg:w-96"
@@ -77,8 +77,8 @@ export function StackedCubesLight() {
<div <div
className={`absolute inset-0 blur-2xl rounded-3xl transition-all duration-500 ${ className={`absolute inset-0 blur-2xl rounded-3xl transition-all duration-500 ${
active === layer.id active === layer.id
? "bg-cyan-300/40 opacity-70" ? "bg-cyan-300/20 opacity-20"
: "bg-cyan-200/20 opacity-40" : "bg-cyan-200/20 opacity-20"
}`} }`}
/> />
<CubeLight <CubeLight

View File

@@ -11,6 +11,7 @@ import {
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
import { motion } from "motion/react"; import { motion } from "motion/react";
import { DarkCard } from "./cards";
interface CarouselProps { interface CarouselProps {
items: JSX.Element[]; items: JSX.Element[];
@@ -73,7 +74,7 @@ export const Carousel = ({ items, initialScroll = 0 }: CarouselProps) => {
<div <div
className={cn( className={cn(
"flex flex-row justify-start gap-4 pl-4", "flex flex-row justify-start gap-6 pl-4",
"mx-auto max-w-7xl", // remove max-w-4xl if you want the carousel to span the full width of its container "mx-auto max-w-7xl", // remove max-w-4xl if you want the carousel to span the full width of its container
)} )}
> >
@@ -93,7 +94,7 @@ export const Carousel = ({ items, initialScroll = 0 }: CarouselProps) => {
}, },
}} }}
key={"card" + index} key={"card" + index}
className="rounded-3xl last:pr-[5%] md:last:pr-[33%]" className="rounded-3xl last:pr-[5%] md:last:pr-[33%] "
> >
{item} {item}
</motion.div> </motion.div>
@@ -127,42 +128,44 @@ export const Card = ({
card: Card; card: Card;
layout?: boolean; layout?: boolean;
}) => { }) => {
return ( return (
<Link to={card.link}> <Link to={card.link}>
<motion.div <DarkCard className="p-0 rounded-3xl">
layoutId={layout ? `card-${card.title}` : undefined} <motion.div
className="relative z-10 flex h-60 w-56 flex-col items-start justify-start overflow-hidden rounded-3xl md:h-120 md:w-96 hover:scale-105 transition-transform duration-200" layoutId={layout ? `card-${card.title}` : undefined}
style={{ 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"
backgroundImage: `url(${card.bg})`, >
backgroundSize: 'cover', <div className="flex h-2/5 flex-col justify-center py-6 px-4">
backgroundPosition: 'center',
}}
>
<div className="pointer-events-none absolute inset-x-0 top-0 z-30 h-full bg-gradient-to-b from-black/50 via-transparent to-transparent" />
<div className="relative z-40 p-8 w-full">
<motion.p <motion.p
layoutId={layout ? `category-${card.category}` : undefined} layoutId={layout ? `category-${card.category}` : undefined}
className="text-left font-sans text-sm font-medium text-white md:text-base" className="text-left font-sans font-semibold text-cyan-500 uppercase tracking-wider text-xs md:text-sm"
> >
{card.category} {card.category}
</motion.p> </motion.p>
<motion.p <motion.p
layoutId={layout ? `title-${card.title}` : undefined} layoutId={layout ? `title-${card.title}` : undefined}
className="mt-2 max-w-xs text-left font-sans text-xl font-semibold [text-wrap:balance] text-white md:text-3xl" className="mt-1 max-w-xs text-left font-sans text-xl font-semibold text-white [text-wrap:balance] lg:text-2xl"
> >
{card.title} {card.title}
</motion.p> </motion.p>
<div className="flex flex-row justify-between items-center w-full mt-4"> <div className="mt-2 flex w-full flex-row items-center justify-between md:mt-4">
<motion.p className="max-w-xs text-left font-sans text-sm text-neutral-300"> <motion.p className="max-w-xs text-left font-sans lg:text-xl text-lg text-neutral-300 lg:leading-normal leading-tight">
{card.description} {card.description}
</motion.p> </motion.p>
<div className="h-8 w-8 bg-[#212121] rounded-full flex items-center justify-center text-[#858585] shrink-0 hover:bg-[#262626] hover:text-white active:bg-[#262626] active:text-white transition-colors duration-200"> <div className="flex h-6 w-6 ml-2 shrink-0 items-center justify-center rounded-full bg-[#212121] text-[#858585] transition-colors duration-200 hover:bg-[#262626] hover:text-white md:h-8 md:w-8">
<IconChevronRight className="h-6 w-6" /> <IconChevronRight className="h-4 w-4 md:h-6 md:w-6 " />
</div> </div>
</div> </div>
</div> </div>
</motion.div> <div className="relative flex h-3/5 w-full items-end justify-end bg-transparent">
<img
src={card.src}
alt={card.title}
className="h-full w-full origin-bottom-right scale-75 object-contain mb-10"
/>
</div>
</motion.div>
</DarkCard>
</Link> </Link>
); );
}; };

View File

@@ -0,0 +1,19 @@
import * as React from "react";
import { cn } from "@/lib/utils";
const DarkCard = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
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-3xl hover:bg-white/6 hover:scale-105 hover:shadow-lg hover:shadow-cyan-500/15",
className
)}
{...props}
/>
));
DarkCard.displayName = "DarkCard";
export { DarkCard };

View File

@@ -33,7 +33,7 @@ export const LayoutTextFlip = ({
<motion.span <motion.span
layout layout
className="relative w-fit overflow-hidden px-2 py-2 font-medium italic tracking-tight" className="relative w-fit overflow-hidden px-2 py-2 font-medium tracking-tight"
> >
<AnimatePresence mode="popLayout"> <AnimatePresence mode="popLayout">
<motion.span <motion.span

View File

@@ -0,0 +1,33 @@
'use client'
import { Button } from '../../components/Button'
import { Eyebrow, P, H3 } from '../../components/Texts'
export function AgentHeroAlt() {
return (
<div className="relative bg-white lg:mt-10 mt-0">
<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">
<img
alt=""
src="/images/agents.png"
className="size-full object-cover"
/>
</div>
<div className="relative mx-auto max-w-7xl py-24 sm:py-32 lg:px-8">
<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">
<Eyebrow className="text-base/7 font-semibold text-cyan-500">AGENT</Eyebrow>
<H3 as="h1" className="mt-2 text-gray-900">Sovereign AI Agents, Coming Soon.</H3>
<P className="mt-6 text-gray-600">
Hero is the autonomous agent layer for the Mycelium platformtrusted, policy-aware AI that runs on infrastructure you control and remembers what matters.
</P>
<div className="mt-8">
<Button href="#" variant="solid" color="cyan">
Join the Waitlist
</Button>
</div>
</div>
</div>
</div>
)
}

View File

@@ -7,7 +7,7 @@ export function AgentsHeroAlt() {
return ( return (
<div <div
style={{ style={{
backgroundImage: "url(/images/agentshero.png)", backgroundImage: "url(/images/agentshero2.png)",
backgroundSize: "cover", backgroundSize: "cover",
backgroundPosition: "center", backgroundPosition: "center",
}} }}

View File

@@ -1,16 +1,15 @@
import { AnimatedSection } from '../../components/AnimatedSection' import { AnimatedSection } from '../../components/AnimatedSection'
import { AgentsHero } from './AgentsHero'
import { DeploySection } from './DeploySection' import { DeploySection } from './DeploySection'
import { GallerySection } from './GallerySection' import { GallerySection } from './GallerySection'
import { Companies } from './Companies' import { Companies } from './Companies'
import { BentoSection } from './BentoSection' import { BentoSection } from './BentoSection'
import { AgentsHeroAlt } from './AgentsHeroAlt' import { AgentHeroAlt } from './AgentHeroAlt'
export default function AgentsPage() { export default function AgentsPage() {
return ( return (
<div> <div>
<AnimatedSection> <AnimatedSection>
<AgentsHeroAlt /> <AgentHeroAlt />
</AnimatedSection> </AnimatedSection>
<AnimatedSection> <AnimatedSection>

View File

@@ -0,0 +1,92 @@
import { Container } from '../../components/Container'
import { Eyebrow, H3, P } from '../../components/Texts'
const architectureSections = [
{
title: 'Decentralized Infrastructure',
description:
'Clusters launch across the ThreeFold Grid with direct node access and encrypted connectivity.',
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: 'Network Flow',
description:
'Traffic moves through the Mycelium mesh, maintaining sovereignty without sacrificing reach.',
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: 'Kubernetes Management',
description:
'Lightweight K3s orchestration delivers HA clusters with automated lifecycle management.',
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() {
return (
<section className="bg-white py-24 lg:py-32">
<Container>
<div className="mx-auto max-w-5xl text-center">
<Eyebrow>
Technical Architecture
</Eyebrow>
<H3 className="mt-6 text-gray-900">
Built on a Sovereign, Encrypted Delivery Mesh.
</H3>
<P className="mt-6 text-gray-600">
Mycelium Cloud rides on the ThreeFold Grid, pairing encrypted mesh
networking with deterministic K3s orchestration. Every layer is
designed to keep workloads sovereign, observable, and effortless to
operate.
</P>
</div>
<div className="mt-16 grid gap-8 lg:grid-cols-3">
{architectureSections.map((section) => (
<div
key={section.title}
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 "
>
<div className="flex items-center gap-3">
<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">
</span>
<h3 className="text-xl font-semibold text-gray-900">
{section.title}
</h3>
</div>
<p className="mt-4 text-sm leading-relaxed text-gray-600">
{section.description}
</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>
</Container>
</section>
)
}

View File

@@ -0,0 +1,52 @@
import { H3, P, Eyebrow } from '../../components/Texts'
export function CloudBluePrint() {
return (
<div className="bg-white py-24 sm:py-32">
<div className="mx-auto max-w-7xl px-6 lg:px-8">
<Eyebrow color="accent">Cloud Blueprint</Eyebrow>
<H3 color="primary">Your Personal Sovereign Cloud Workspace</H3>
<P color="primary">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 className="mx-auto mt-10 grid max-w-lg grid-cols-4 items-center gap-x-8 gap-y-10 sm:max-w-xl sm:grid-cols-6 sm:gap-x-10 lg:mx-0 lg:max-w-none lg:grid-cols-5">
<img
alt="Transistor"
src="https://tailwindcss.com/plus-assets/img/logos/158x48/transistor-logo-gray-900.svg"
width={158}
height={48}
className="col-span-2 max-h-12 w-full object-contain lg:col-span-1"
/>
<img
alt="Reform"
src="https://tailwindcss.com/plus-assets/img/logos/158x48/reform-logo-gray-900.svg"
width={158}
height={48}
className="col-span-2 max-h-12 w-full object-contain lg:col-span-1"
/>
<img
alt="Tuple"
src="https://tailwindcss.com/plus-assets/img/logos/158x48/tuple-logo-gray-900.svg"
width={158}
height={48}
className="col-span-2 max-h-12 w-full object-contain lg:col-span-1"
/>
<img
alt="SavvyCal"
src="https://tailwindcss.com/plus-assets/img/logos/158x48/savvycal-logo-gray-900.svg"
width={158}
height={48}
className="col-span-2 max-h-12 w-full object-contain sm:col-start-2 lg:col-span-1"
/>
<img
alt="Statamic"
src="https://tailwindcss.com/plus-assets/img/logos/158x48/statamic-logo-gray-900.svg"
width={158}
height={48}
className="col-span-2 col-start-2 max-h-12 w-full object-contain sm:col-start-auto lg:col-span-1"
/>
</div>
</div>
</div>
)
}

View File

@@ -7,13 +7,16 @@ export function CloudCTA() {
<Container className="relative"> <Container className="relative">
<div className="mx-auto max-w-3xl text-center"> <div className="mx-auto max-w-3xl text-center">
<p className="text-sm font-semibold uppercase tracking-[0.3em] text-cyan-500"> <p className="text-sm font-semibold uppercase tracking-[0.3em] text-cyan-500">
Ready Today Launch Today
</p> </p>
<h2 className="mt-6 text-3xl font-semibold tracking-tight text-gray-900 lg:text-5xl"> <h2 className="mt-6 text-3xl font-semibold tracking-tight text-gray-900 lg:text-5xl">
Join thousands of developers and DevOps engineers who trust Mycelium Cloud for their production workloads. Put sovereign Kubernetes into production on the ThreeFold Grid.
</h2> </h2>
<p className="mt-6 text-lg text-gray-600"> <p className="mt-6 text-lg text-gray-600">
Revolutionary Kubernetes automation, deterministic compute, and quantum-safe storagedelivered as a turnkey platform so your team can deploy, scale, and operate cloud-native applications with confidence. Provision multi-master clusters, integrate quantum-safe storage, and
expose services worldwide without leaving the Mycelium mesh. Our
team will help you launch deterministic workloads that stay private,
compliant, and always-on.
</p> </p>
<div className="mt-10 flex justify-center"> <div className="mt-10 flex justify-center">
<Button <Button

View File

View File

@@ -0,0 +1,430 @@
'use client'
import { Fragment, useEffect, useId, 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'
interface CustomAnimationProps {
isForwards: boolean
changeCount: number
}
const features = [
{
name: 'Decentralized Kubernetes',
description:
"Reserve a node and deploy sovereign Kubernetes clusters on decentralized infrastructure.",
icon: DeviceUserIcon,
screen: ReserveNodeScreen,
},
{
name: 'Manage Your Cluster',
description:
'Manage your cluster with ease, with a simple and intuitive interface.',
icon: DeviceNotificationIcon,
screen: ManageClusterScreen,
},
{
name: 'Personalised Billings & Accounts',
description:
'Easily manage your cluster billing and accounts with personalised configurations.',
icon: DeviceTouchIcon,
screen: PersonalisedBillingsScreen,
},
]
function DeviceUserIcon(props: React.ComponentPropsWithoutRef<'svg'>) {
return (
<svg viewBox="0 0 32 32" aria-hidden="true" {...props}>
<circle cx={16} cy={16} r={16} fill="#A3A3A3" fillOpacity={0.2} />
<path
fillRule="evenodd"
clipRule="evenodd"
d="M16 23a3 3 0 100-6 3 3 0 000 6zm-1 2a4 4 0 00-4 4v1a2 2 0 002 2h6a2 2 0 002-2v-1a4 4 0 00-4-4h-2z"
fill="#737373"
/>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M5 4a4 4 0 014-4h14a4 4 0 014 4v24a4.002 4.002 0 01-3.01 3.877c-.535.136-.99-.325-.99-.877s.474-.98.959-1.244A2 2 0 0025 28V4a2 2 0 00-2-2h-1.382a1 1 0 00-.894.553l-.448.894a1 1 0 01-.894.553h-6.764a1 1 0 01-.894-.553l-.448-.894A1 1 0 0010.382 2H9a2 2 0 00-2 2v24a2 2 0 001.041 1.756C8.525 30.02 9 30.448 9 31s-.455 1.013-.99.877A4.002 4.002 0 015 28V4z"
fill="#A3A3A3"
/>
</svg>
)
}
function DeviceNotificationIcon(props: React.ComponentPropsWithoutRef<'svg'>) {
return (
<svg viewBox="0 0 32 32" aria-hidden="true" {...props}>
<circle cx={16} cy={16} r={16} fill="#A3A3A3" fillOpacity={0.2} />
<path
fillRule="evenodd"
clipRule="evenodd"
d="M9 0a4 4 0 00-4 4v24a4 4 0 004 4h14a4 4 0 004-4V4a4 4 0 00-4-4H9zm0 2a2 2 0 00-2 2v24a2 2 0 002 2h14a2 2 0 002-2V4a2 2 0 00-2-2h-1.382a1 1 0 00-.894.553l-.448.894a1 1 0 01-.894.553h-6.764a1 1 0 01-.894-.553l-.448-.894A1 1 0 0010.382 2H9z"
fill="#A3A3A3"
/>
<path
d="M9 8a2 2 0 012-2h10a2 2 0 012 2v2a2 2 0 01-2 2H11a2 2 0 01-2-2V8z"
fill="#737373"
/>
</svg>
)
}
function DeviceTouchIcon(props: React.ComponentPropsWithoutRef<'svg'>) {
let id = useId()
return (
<svg viewBox="0 0 32 32" fill="none" aria-hidden="true" {...props}>
<defs>
<linearGradient
id={`${id}-gradient`}
x1={14}
y1={14.5}
x2={7}
y2={17}
gradientUnits="userSpaceOnUse"
>
<stop stopColor="#737373" />
<stop offset={1} stopColor="#D4D4D4" stopOpacity={0} />
</linearGradient>
</defs>
<circle cx={16} cy={16} r={16} fill="#A3A3A3" fillOpacity={0.2} />
<path
fillRule="evenodd"
clipRule="evenodd"
d="M5 4a4 4 0 014-4h14a4 4 0 014 4v13h-2V4a2 2 0 00-2-2h-1.382a1 1 0 00-.894.553l-.448.894a1 1 0 01-.894.553h-6.764a1 1 0 01-.894-.553l-.448-.894A1 1 0 0010.382 2H9a2 2 0 00-2 2v24a2 2 0 002 2h4v2H9a4 4 0 01-4-4V4z"
fill="#A3A3A3"
/>
<path
d="M7 22c0-4.694 3.5-8 8-8"
stroke={`url(#${id}-gradient)`}
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M21 20l.217-5.513a1.431 1.431 0 00-2.85-.226L17.5 21.5l-1.51-1.51a2.107 2.107 0 00-2.98 0 .024.024 0 00-.005.024l3.083 9.25A4 4 0 0019.883 32H25a4 4 0 004-4v-5a3 3 0 00-3-3h-5z"
fill="#A3A3A3"
/>
</svg>
)
}
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 ReserveNodeScreen() {
return (
<img
src={reservenodeimg}
alt="Mycelium Reserve Node"
width={2432}
height={1442}
className="w-4xl max-w-none rounded-xl shadow-2xl ring-1 ring-gray-400/10 sm:w-240 md:-ml-32 lg:-ml-32"
/>
);
}
function ManageClusterScreen() {
return (
<img
src={kubeconfigImg}
alt="Mycelium Kubeconfig"
width={2432}
height={1442}
className="w-4xl max-w-none rounded-xl shadow-2xl ring-1 ring-gray-400/10 sm:w-240 md:-ml-32 lg:-ml-32"
/>
);
}
function PersonalisedBillingsScreen() {
return (
<img
src={billingImg}
alt="Mycelium Billing"
width={2432}
height={1442}
className="w-4xl max-w-none rounded-xl shadow-2xl ring-1 ring-gray-400/10 sm:w-240 md:-ml-32 lg:-ml-32"
/>
);
}
function usePrevious<T>(value: T) {
const ref = useRef<T>()
useEffect(() => {
ref.current = value
}, [value])
return ref.current
}
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
className="grid grid-cols-12 items-center gap-8 lg:gap-16"
selectedIndex={selectedIndex}
onChange={onChange}
vertical
>
<TabList className="z-10 col-span-6 space-y-6 pl-4 sm:pl-6 lg:pl-8">
{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-800/30 ml-16',
selectedIndex === featureIndex
? 'outline-cyan-500'
: 'outline-transparent hover:outline-cyan-500',
)}
>
{featureIndex === selectedIndex && (
<motion.div
layoutId="activeBackground"
className="absolute inset-0 bg-gray-800 "
initial={{ borderRadius: 16 }}
/>
)}
<div className="relative z-10 p-8">
<feature.icon className="h-8 w-8" />
<FeatureTitle as="h3" color="white" className="mt-6">
<Tab className="text-left data-selected:not-data-focus:outline-hidden">
<span className="absolute inset-0 rounded-2xl" />
{feature.name}
</Tab>
</FeatureTitle>
<FeatureDescription color="secondary" className="mt-2">
{feature.description}
</FeatureDescription>
</div>
</div>
))}
</TabList>
<div className="relative col-span-6 overflow-hidden">
<div className="z-10 mx-auto w-full max-w-[366px]">
<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 }}>
<feature.screen />
</motion.div>
</TabPanel>
) : null,
)}
</AnimatePresence>
</TabPanels>
</div>
</div>
</TabGroup>
)
}
function CloudFeaturesMobile() {
let [activeIndex, setActiveIndex] = useState(0)
let slideContainerRef = useRef<React.ElementRef<'div'>>(null)
let slideRefs = useRef<Array<React.ElementRef<'div'>>>([])
useEffect(() => {
let observer = new window.IntersectionObserver(
(entries) => {
for (let entry of entries) {
if (entry.isIntersecting && entry.target instanceof HTMLDivElement) {
setActiveIndex(slideRefs.current.indexOf(entry.target))
break
}
}
},
{
root: slideContainerRef.current,
threshold: 0.6,
},
)
for (let slide of slideRefs.current) {
if (slide) {
observer.observe(slide)
}
}
return () => {
observer.disconnect()
}
}, [slideContainerRef, slideRefs])
return (
<>
<div
ref={slideContainerRef}
className="-mb-4 flex snap-x snap-mandatory -space-x-4 overflow-x-auto overscroll-x-contain scroll-smooth pb-4 [scrollbar-width:none] sm:-space-x-6 [&::-webkit-scrollbar]:hidden"
>
{features.map((feature, featureIndex) => (
<div
key={featureIndex}
ref={(ref) => ref && (slideRefs.current[featureIndex] = ref)}
className="w-full flex-none snap-center px-4 sm:px-6 transition-all duration-300 ease-in-out hover:scale-105"
>
<div
className={clsx(
'relative transform overflow-hidden rounded-2xl bg-gray-800 px-5 py-6 outline-2 transition-colors',
activeIndex === featureIndex
? 'outline-transparent' // Remove outline for active mobile slide
: 'outline-transparent hover:outline-cyan-500',
)}
>
<div className="relative mx-auto w-full max-w-[366px]">
<feature.screen />
</div>
<div className="absolute inset-x-0 bottom-0 bg-gray-800 p-6 backdrop-blur-sm sm:p-10">
<feature.icon className="h-8 w-8" />
<MobileFeatureTitle color="white" className="mt-6">
{feature.name}
</MobileFeatureTitle>
<FeatureDescription color="secondary" className="mt-2">
{feature.description}
</FeatureDescription>
</div>
</div>
</div>
))}
</div>
<div className="mt-6 flex justify-center gap-3">
{features.map((_, featureIndex) => (
<button
type="button"
key={featureIndex}
className={clsx(
'relative h-0.5 w-4 rounded-full',
featureIndex === activeIndex ? 'bg-gray-600' : 'bg-gray-700',
)}
aria-label={`Go to slide ${featureIndex + 1}`}
onClick={() => {
slideRefs.current[featureIndex].scrollIntoView({
block: 'nearest',
inline: 'nearest',
})
}}
>
<span className="absolute -inset-x-1.5 -inset-y-3" />
</button>
))}
</div>
</>
)
}
export function CloudFeatures() {
return (
<section
id="overview"
aria-label="Features for investing all your money"
className="bg-gray-900 py-20 sm:py-32"
>
<Container>
<div className="mx-auto max-w-2xl lg:mx-0 lg:max-w-3xl">
<Eyebrow color="accent">Platform Overview</Eyebrow>
<SectionHeader color="white" className="mt-2">
A Decentralized Cloud that Operates Itself
</SectionHeader>
<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.
</P>
</div>
</Container>
<div className="hidden md:mt-20 md:block">
<CloudFeaturesDesktop />
</div>
<div className="mt-16 md:hidden">
<CloudFeaturesMobile />
</div>
</section>
)
}

View File

@@ -0,0 +1,138 @@
import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P, Small } from '../../components/Texts'
type Step = {
number: string
title: string
description: string
bullets: string[]
codes?: string[]
}
const steps: Step[] = [
{
number: '01',
title: 'Account Setup',
description: 'Create and prepare your Mycelium Cloud account.',
bullets: [
'Sign up through the Mycelium Cloud portal and verify your email.',
'Add credits in the dashboard so resources can be provisioned.',
'Upload your SSH public key to enable secure node access.',
],
},
{
number: '02',
title: 'Deploy Your First Cluster',
description:
'Use the dashboard to define topology, resources, and deployment targets.',
bullets: [
'Open the Deploy Cluster workflow from your dashboard.',
'Choose CPU, memory, and storage for master and worker nodes.',
'Select ThreeFold Grid nodes that match your residency policies.',
'Review the configuration and launch the cluster.',
],
},
{
number: '03',
title: 'Access Your Cluster',
description:
'Connect through kubeconfig and the Mycelium mesh to manage workloads.',
bullets: [
'Download the kubeconfig from the Clusters view and export `KUBECONFIG`.',
'Validate connectivity with `kubectl get nodes`.',
'Install the Mycelium client and join the provided peer list.',
'SSH directly to each node over its assigned Mycelium IP address.',
],
codes: [
`export KUBECONFIG=/path/to/config
kubectl get nodes`,
`wget https://github.com/threefoldtech/mycelium/releases/latest/download/mycelium-private-x86_64-unknown-linux-musl.tar.gz
tar -xzf mycelium-private-x86_64-unknown-linux-musl.tar.gz
sudo chmod +x mycelium-private
sudo mv mycelium-private /usr/local/bin/mycelium`,
`sudo mycelium --peers \\
tcp://188.40.132.242:9651 \\
tcp://136.243.47.186:9651 \\
tcp://185.69.166.7:9651 \\
tcp://185.69.166.8:9651 \\
tcp://65.21.231.58:9651 \\
tcp://65.109.18.113:9651 \\
tcp://209.159.146.190:9651 \\
tcp://5.78.122.16:9651 \\
tcp://5.223.43.251:9651 \\
tcp://142.93.217.194:9651`,
],
},
]
export function CloudGettingStarted() {
return (
<section
id="getting-started"
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%)]" />
<Container className="relative">
<div className="mx-auto max-w-3xl text-center">
<Eyebrow className="tracking-[0.32em] uppercase text-cyan-300">
Getting Started
</Eyebrow>
<SectionHeader as="h2" color="light" className="mt-6">
Launch, connect, and operate in three steps.
</SectionHeader>
<P color="lightSecondary" className="mt-6">
Follow the workflow from account creation to mesh connectivity.
You&rsquo;ll have a production-ready K3s cluster running on the
ThreeFold Grid in minutes.
</P>
</div>
<div className="mt-16 grid gap-10 lg:grid-cols-3">
{steps.map((step) => (
<div
key={step.title}
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">
<Small className="text-xs uppercase tracking-[0.4em] text-cyan-300">
{step.number}
</Small>
<span className="inline-flex size-10 items-center justify-center rounded-full border border-cyan-300/40 text-sm font-semibold uppercase tracking-[0.25em] text-cyan-200">
Go
</span>
</div>
<h3 className="mt-6 text-xl font-semibold text-white">
{step.title}
</h3>
<p className="mt-4 text-sm leading-relaxed text-gray-300">
{step.description}
</p>
<ul className="mt-6 space-y-3 text-sm text-gray-300">
{step.bullets.map((bullet) => (
<li
key={bullet}
className="flex items-start gap-3 rounded-2xl border border-cyan-500/10 bg-cyan-500/5 p-3 leading-relaxed"
>
<span className="mt-1 inline-block size-2 rounded-full bg-cyan-300" />
<span>{bullet}</span>
</li>
))}
</ul>
{step.codes && (
<div className="mt-6 space-y-4">
{step.codes.map((code) => (
<pre
key={code}
className="overflow-x-auto rounded-2xl border border-white/10 bg-black/70 p-4 text-xs text-cyan-100"
>
<code>{code}</code>
</pre>
))}
</div>
)}
</div>
))}
</div>
</Container>
</section>
)
}

View File

@@ -2,6 +2,7 @@ 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'
function BackgroundIllustration(props: React.ComponentPropsWithoutRef<'div'>) { function BackgroundIllustration(props: React.ComponentPropsWithoutRef<'div'>) {
const id = useId() const id = useId()
@@ -78,20 +79,36 @@ export function CloudHero() {
<Container> <Container>
<div className="flex flex-col-reverse gap-y-16 lg:grid lg:grid-cols-12 lg:gap-x-8 lg:gap-y-20"> <div className="flex flex-col-reverse gap-y-16 lg:grid lg:grid-cols-12 lg:gap-x-8 lg:gap-y-20">
<div className="relative z-10 mx-auto max-w-2xl lg:col-span-7 lg:max-w-none lg:pt-6 xl:col-span-6"> <div className="relative z-10 mx-auto max-w-2xl lg:col-span-7 lg:max-w-none lg:pt-6 xl:col-span-6">
<h1 className="text-4xl font-medium tracking-tight text-gray-900 lg:text-6xl"> <Eyebrow className="tracking-[0.35em] uppercase text-cyan-500">
Mycelium Cloud Mycelium Cloud
</h1> </Eyebrow>
<h2 className="mt-6 text-xl leading-normal tracking-tight text-gray-600 lg:text-2xl"> <H2 as="h1" className="mt-6 text-gray-900">
Own every workload with certainty. Deploy sovereign Kubernetes clusters on decentralized
</h2> infrastructure.
<p className="mt-6 text-lg text-gray-600 leading-tight lg:text-xl lg:leading-normal"> </H2>
Mycelium Cloud blends deterministic compute with quantum-safe storage, delivering a sovereign platform built for zero-ops automation. <H5 className="mt-6 text-gray-600">
</p> Mycelium Cloud turns the ThreeFold Grid into a programmable
<div className="mt-8 flex flex-wrap gap-x-6 gap-y-4"> substrate for K3s. Launch verifiable clusters with nature-inspired
<Button to="https://myceliumcloud.tf" variant="solid" color="cyan"> networking, quantum-safe storage, and zero-image delivery that
Start Deployment keeps every workload deterministic.
</H5>
<P className="mt-6 text-gray-500">
Developer guide to decentralized cloud computing.
</P>
<div className="mt-10 flex flex-wrap gap-4">
<Button
to="https://myceliumcloud.tf"
as="a"
variant="solid"
color="cyan"
target="_blank"
rel="noreferrer"
>
Launch a Cluster
</Button>
<Button to="#getting-started" as="a" variant="outline" color="cyan">
View Getting Started
</Button> </Button>
</div> </div>
</div> </div>
<div className="relative mt-0 lg:mt-10 lg:col-span-5 lg:row-span-2 xl:col-span-6"> <div className="relative mt-0 lg:mt-10 lg:col-span-5 lg:row-span-2 xl:col-span-6">

View File

@@ -0,0 +1,50 @@
import { H3, H5, Eyebrow } from "../../components/Texts"
import { Button } from "../../components/Button"
export function CloudHeroNew() {
return (
<div
className="relative bg-cover lg:bg-contain bg-right bg-no-repeat"
style={{ backgroundImage: "url('/images/cloudhero4.webp')" }}
>
<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">
<div className="mx-auto max-w-2xl lg:mx-0">
<Eyebrow>
Mycelium Cloud
</Eyebrow>
<H3 className="mt-4">
Run Kubernetes on the Sovereign Agentic Cloud
</H3>
<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.
Your workloads run on sovereign, encrypted infrastructure, without centralized cloud control.
</H5>
<H5 className="mt-4 text-sm text-gray-600">
Works Alone. Works Together.
Mycelium Cloud can run on any network fabric, or pair with Mycelium Network
for sovereign connectivity.
</H5>
<div className="mt-10 flex items-center gap-x-6">
<Button
to="#"
variant="solid"
className=""
color="cyan"
>
Get started
</Button>
<Button to="#" variant="outline">
Documentation <span aria-hidden="true"> </span>
</Button>
</div>
</div>
</div>
</div>
</div>
)
}

View File

@@ -0,0 +1,70 @@
import {
ArrowPathIcon,
CloudArrowUpIcon,
ServerIcon,
ShieldCheckIcon,
} from '@heroicons/react/24/outline'
import { CP, CT, Eyebrow, H3, P } from '../../components/Texts'
const features = [
{
Eyebrow: 'DevOps / Cloud teams',
name: 'Kubernetes Clusters',
description: 'Deterministic K3s workloads across sovereign hardware.',
icon: ServerIcon,
},
{
Eyebrow: 'Security & infrastructure',
name: 'Encrypted Mesh Networking',
description: 'No public ingress, no exposed attack surface, zero-trust routing.',
icon: ShieldCheckIcon,
},
{
Eyebrow: 'Data-driven teams',
name: 'S3-Compatible Storage',
description: 'Distributed storage with erasure coding and residency control.',
icon: CloudArrowUpIcon,
},
{
Eyebrow: 'AI / ML workloads',
name: 'GPU-Ready',
description: 'Scale inference & training on demand.',
icon: ArrowPathIcon,
},
]
export function CloudHosting() {
return (
<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">
<Eyebrow>CAPABILITIES</Eyebrow>
<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="grid grid-cols-1 gap-12 lg:grid-cols-4">
{features.map((feature) => (
<div key={feature.name} className="relative">
<div className="flex h-full flex-col rounded-3xl border border-slate-200 bg-gray-50/25 p-8 pt-16 shadow-sm transition hover:-translate-y-1 hover:border-cyan-300 hover: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" />
</span>
<Eyebrow>{feature.Eyebrow}</Eyebrow>
<CT as="h3" className="mt-4">
{feature.name}
</CT>
<CP color="secondary" className="mt-4">
{feature.description}
</CP>
</div>
</div>
))}
</div>
</div>
</div>
</div>
)
}

View File

@@ -1,61 +1,78 @@
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'
const focusAreas = [ const focusAreas = [
{ {
title: 'Sovereign by Design', label: 'Overview',
title: 'Decentralized Kubernetes on the ThreeFold Grid',
description: description:
'Control jurisdiction, residency, and governance for every workload with transparent, verifiable operations.', 'Mycelium Cloud provides a comprehensive platform for deploying and managing K3s clusters across global, sovereign infrastructure.',
}, },
{ {
title: 'Secure by Default', label: 'Core Concept',
title: 'Sovereign, self-managing operations',
description: description:
'Cryptographic verification, secure boot, and zero-image delivery protect the entire lifecycle automatically.', 'Deterministic networking, quantum-safe storage, and zero-image delivery keep every workload verifiable and autonomous from day zero.',
}, },
{ {
title: 'Ready to Scale', label: 'Developer Experience',
title: 'K3s-native workflows with full control',
description: description:
'Autonomous orchestration keeps the platform elastic, cost-efficient, and always available across the globe.', 'Provision multi-master clusters, govern residency, and observe node health from a single programmable control plane.',
}, },
] ]
export function CloudOverview() { export function CloudOverview() {
return ( return (
<section className="relative overflow-hidden bg-gray-900 py-24 lg:py-32"> <section className="relative overflow-hidden bg-gray-950 py-24 sm:py-32">
<div className="pointer-events-none absolute inset-0"> <div className="pointer-events-none absolute inset-0">
<CircleBackground <CircleBackground
color="#06b6d4" color="#06b6d4"
className="absolute left-1/2 top-full -translate-x-1/2 -translate-y-1/2 opacity-40" className="absolute left-1/2 top-full h-[520px] w-[520px] -translate-x-1/2 -translate-y-1/2 opacity-30 blur-3xl"
/> />
<CircleBackground <CircleBackground
color="#22d3ee" color="#22d3ee"
className="absolute -top-24 right-1/4 h-[420px] w-[420px] opacity-30 sm:opacity-40" className="absolute -top-24 right-1/4 h-[420px] w-[420px] opacity-25 blur-3xl sm:opacity-40"
/> />
<div className="absolute inset-0 bg-[radial-gradient(circle_at_top,_rgba(15,118,110,0.18),_transparent_55%)]" />
</div> </div>
<Container className="relative"> <Container className="relative">
<div className="mx-auto max-w-3xl text-center"> <div className="mx-auto max-w-3xl text-center">
<p className="text-sm font-semibold uppercase tracking-[0.3em] text-cyan-400"> <Eyebrow>
Mycelium Cloud Platform Overview
</p> </Eyebrow>
<h2 className="mt-6 text-3xl font-medium tracking-tight text-white lg:text-5xl"> <SectionHeader as="h2" color="light" className="mt-6 font-medium">
A sovereign, self-healing cloud built for trusted automation. A decentralized cloud that operates itself.
</h2> </SectionHeader>
<p className="mt-6 text-lg text-gray-300"> <P color="lightSecondary" className="mt-6">
Run critical workloads on a programmable substrate that keeps data private, compute deterministic, and operations autonomous. Mycelium Cloud orchestrates Kubernetes clusters on the ThreeFold
</p> Grid with cryptographic certainty. Networking, storage, and
orchestration are all built-in so developers can deploy critical
workloads without wrestling infrastructure.
</P>
<P color="lightSecondary" className="mt-6">
Declarative, sovereign, and ready for production workloads anywhere.
</P>
</div> </div>
<div className="mt-16 grid gap-8 lg:grid-cols-3"> <div className="mt-16 grid gap-8 lg:grid-cols-3">
{focusAreas.map((item) => ( {focusAreas.map((item) => (
<div <div
key={item.title} key={item.title}
className="rounded-3xl p-8 text-left transition hover:-translate-y-1" className="group relative overflow-hidden rounded-3xl border border-white/10 bg-white/[0.03] p-8 text-left backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 hover:bg-white/[0.07]"
> >
<div className="text-lg font-semibold text-white"> <div className="absolute inset-0 bg-gradient-to-br from-cyan-500/0 via-white/[0.04] to-cyan-300/15 opacity-0 transition group-hover:opacity-100" />
{item.title} <div className="relative">
<Small className="text-xs uppercase tracking-[0.35em] text-cyan-300">
{item.label}
</Small>
<div className="mt-4 text-lg font-semibold text-white">
{item.title}
</div>
<p className="mt-4 text-sm leading-relaxed text-gray-300">
{item.description}
</p>
</div> </div>
<p className="mt-4 text-sm leading-relaxed text-gray-300">
{item.description}
</p>
</div> </div>
))} ))}
</div> </div>

View File

@@ -1,26 +1,40 @@
import { AnimatedSection } from '../../components/AnimatedSection' import { AnimatedSection } from '../../components/AnimatedSection'
import { CloudHero } from './CloudHero' import { CloudArchitecture } from './CloudArchitecture'
import { CloudOverview } from './CloudOverview' import { CloudFeatures } from './CloudFeatures'
import { ComputeStorageSplit } from './ComputeStorageSplit' import { CloudUseCases } from './CloudUseCases'
import { SecurityPillars } from './SecurityPillars'
import { CloudCTA } from './CloudCTA' import { CloudCTA } from './CloudCTA'
import { CloudHeroAlt } from './CloudHeroAlt' import { CloudHeroNew } from './CloudHeroNew'
import { CloudHosting } from './CloudHosting'
import { CloudBluePrint } from './CloudBluePrint'
export default function CloudPage() { export default function CloudPage() {
return ( return (
<> <>
<AnimatedSection> <AnimatedSection>
<CloudHeroAlt /> <CloudHeroNew />
</AnimatedSection> </AnimatedSection>
<AnimatedSection> <AnimatedSection>
<CloudOverview /> <CloudHosting />
</AnimatedSection> </AnimatedSection>
<AnimatedSection> <AnimatedSection>
<ComputeStorageSplit /> <CloudFeatures />
</AnimatedSection> </AnimatedSection>
<AnimatedSection> <AnimatedSection>
<SecurityPillars /> <CloudArchitecture />
</AnimatedSection> </AnimatedSection>
<AnimatedSection>
<CloudUseCases />
</AnimatedSection>
<AnimatedSection>
<CloudBluePrint />
</AnimatedSection>
<AnimatedSection> <AnimatedSection>
<CloudCTA /> <CloudCTA />
</AnimatedSection> </AnimatedSection>

View File

@@ -0,0 +1,88 @@
import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P, Small } from '../../components/Texts'
const useCases = [
{
title: 'Enterprise & Private Kubernetes',
description:
'Production-grade K3s clusters with full workload ownership and residency control. Deploy apps and internal services without vendor lock-in or exposed surfaces.',
bullets: [
'High availability + failover',
'Encrypted, mesh-native networking',
'Compliance-ready governance & policy control',
],
},
{
title: 'Edge & Distributed Deployments',
description:
'Place compute close to where data is created. Run clusters globally across home labs, offices, data centers, or edge locations.',
bullets: [
'Low-latency execution',
'Mesh-routed connectivity',
'Autonomous healing across region',
],
},
{
title: 'AI / ML & Agent Workloads',
description:
'Run inference, training, and autonomous AI systems on sovereign compute. GPU orchestration, private vector storage, and model execution without handing data to hyperscalers.',
bullets: [
'Scales across nodes',
'Supports open-source & fine-tuned models',
'Built for agentic automation + RAG',
],
},
]
export function CloudUseCases() {
return (
<section className="bg-white py-24 sm:py-32">
<Container>
<div className="mx-auto max-w-3xl text-center">
<Eyebrow>
Use Cases
</Eyebrow>
<SectionHeader as="h2" className="mt-6 text-gray-900">
Built for intelligent workloads across every edge.
</SectionHeader>
<P className="mt-6 text-gray-600">
Mycelium Cloud unifies compute, storage, and networking so teams can
launch anything from GPU inference farms to global collaboration
suites with deterministic outcomes.
</P>
</div>
<div className="mt-16 grid gap-8 lg:grid-cols-2">
{useCases.map((useCase) => (
<div
key={useCase.title}
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"
>
<div className="flex items-center justify-between">
<h3 className="text-xl font-semibold text-gray-900">
{useCase.title}
</h3>
<Small className="text-xs uppercase tracking-[0.3em] text-cyan-500">
Scenario
</Small>
</div>
<p className="mt-4 text-sm leading-relaxed text-gray-600">
{useCase.description}
</p>
<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>
</div>
))}
</div>
</Container>
</section>
)
}

View File

@@ -1,7 +1,26 @@
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'
const pillars = [ const differentiators = [
{
title: 'Sovereign by Design',
description:
'Control jurisdiction, residency, and governance for every workload with transparent, verifiable operations.',
},
{
title: 'Secure by Default',
description:
'Cryptographic verification, secure boot, and zero-image delivery protect the entire lifecycle automatically.',
},
{
title: 'Ready to Scale',
description:
'Autonomous orchestration keeps the platform elastic, cost-efficient, and always available across the globe.',
},
]
const securityPillars = [
{ {
title: 'Provable Sovereignty', title: 'Provable Sovereignty',
description: description:
@@ -21,31 +40,51 @@ const pillars = [
export function SecurityPillars() { export function SecurityPillars() {
return ( return (
<section className="relative overflow-hidden bg-gray-900 py-24 lg:py-32"> <section className="relative overflow-hidden bg-gray-950 py-24 sm:py-32">
<div className="pointer-events-none absolute inset-0"> <div className="pointer-events-none absolute inset-0">
<CircleBackground <CircleBackground
color="#22d3ee" color="#22d3ee"
className="absolute -top-20 left-1/2 h-[520px] w-[520px] -translate-x-1/2 opacity-30" className="absolute -top-24 left-1/2 h-[520px] w-[520px] -translate-x-1/2 opacity-30 blur-3xl"
/> />
<div className="absolute inset-x-0 bottom-0 h-40 bg-gradient-to-t from-gray-900 to-transparent" /> <div className="absolute inset-0 bg-[radial-gradient(circle_at_bottom,_rgba(8,145,178,0.14),_transparent_60%)]" />
</div> </div>
<Container className="relative"> <Container className="relative">
<div className="mx-auto max-w-3xl text-center"> <div className="mx-auto max-w-3xl text-center">
<p className="text-sm font-semibold uppercase tracking-[0.3em] text-cyan-400"> <Eyebrow className="tracking-[0.32em] uppercase text-cyan-300">
Sovereign Architecture Security Architecture
</p> </Eyebrow>
<h2 className="mt-6 text-3xl font-medium tracking-tight text-white lg:text-5xl"> <SectionHeader as="h2" color="light" className="mt-6">
Built for security, trust, and unstoppable continuity. Provable trust from substrate to service.
</h2> </SectionHeader>
<p className="mt-6 text-lg text-gray-300"> <P color="lightSecondary" className="mt-6">
Every control surface is auditable and automated, enabling critical workloads to run with confidence. Mycelium Cloud enforces sovereignty, security, and resilience at the
</p> protocol level. The platform continuously verifies state, heals
itself, and keeps workloads operating even when regions go dark.
</P>
</div> </div>
<div className="mt-16 grid gap-8 lg:grid-cols-3"> <div className="mt-16 grid gap-8 lg:grid-cols-3">
{pillars.map((pillar) => ( {differentiators.map((item) => (
<div
key={item.title}
className="rounded-3xl border border-white/10 bg-white/[0.04] p-8 text-left backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 hover:bg-white/[0.08]"
>
<Small className="text-xs uppercase tracking-[0.35em] text-cyan-200">
Key Differentiator
</Small>
<div className="mt-4 text-lg font-semibold text-white">
{item.title}
</div>
<p className="mt-4 text-sm leading-relaxed text-gray-300">
{item.description}
</p>
</div>
))}
</div>
<div className="mt-16 grid gap-8 lg:grid-cols-3">
{securityPillars.map((pillar) => (
<div <div
key={pillar.title} key={pillar.title}
className="rounded-3xl p-8 text-left transition hover:-translate-y-1" className="rounded-3xl border border-white/10 bg-white/[0.03] p-8 text-left backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 hover:bg-white/[0.07]"
> >
<div className="text-lg font-semibold text-white"> <div className="text-lg font-semibold text-white">
{pillar.title} {pillar.title}

View File

@@ -14,14 +14,16 @@ 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">
Get Started Today Choose How You Want to Start
</h2> </h2>
<p className="mt-6 text-lg text-gray-300"> <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. Run workloads using Mycelium Cloud, or host your own compute node.
Both use the same deterministic execution fabric.
</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 to="/download" variant="solid" color="white"> <Button to="/download" variant="solid" color="white">
Get Mycelium Connector Deploy Workloads
</Button> </Button>
<Button <Button
to="https://threefold.info/mycelium_network/docs/" to="https://threefold.info/mycelium_network/docs/"
@@ -30,7 +32,7 @@ export function CallToAction() {
variant="outline" variant="outline"
color="white" color="white"
> >
Read Docs Host Compute Node
</Button> </Button>
</div> </div>
</div> </div>

View File

@@ -0,0 +1,92 @@
import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P } from '../../components/Texts'
const architectureSections = [
{
title: 'Deterministic Computing',
description:
'Every computational step is predictable and provable before it ever executes.',
bullets: [
'Cryptographic verification precedes every operation.',
'State determinism ensures identical results from identical inputs.',
'Tamper resistance surfaces any modification instantly.',
'Comprehensive audit trails verify the full execution history.',
],
},
{
title: 'Stateless Infrastructure',
description:
'A global substrate that scales and recovers without hardware-bound state.',
bullets: [
'No persistent state coupled to specific hardware or regions.',
'Global distribution makes compute available wherever it is needed.',
'Auto-scaling allocates the right resources at the right time.',
'Fault-tolerant orchestration provides automatic failover.',
],
},
{
title: 'Zero-Image System',
description:
'Metadata-first delivery keeps deployments lightweight and instantly repeatable.',
bullets: [
'Images represented as metadata instead of heavyweight artifacts.',
'Instant deployment for rapid workload startup.',
'Efficient storage with minimal footprint for artifacts.',
'Bandwidth-optimized transfers shrink delivery times.',
],
},
]
export function ComputeArchitecture() {
return (
<section className="bg-gray-50 py-24 sm:py-32">
<Container>
<div className="mx-auto max-w-3xl text-center">
<Eyebrow className="tracking-[0.28em] uppercase text-cyan-500">
Technical Architecture
</Eyebrow>
<SectionHeader as="h2" className="mt-6 text-gray-900">
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
key={section.title}
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"
>
<div className="flex items-center gap-3">
<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">
</span>
<h3 className="text-xl font-semibold text-gray-900">
{section.title}
</h3>
</div>
<p className="mt-4 text-sm leading-relaxed text-gray-600">
{section.description}
</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-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>
</Container>
</section>
)
}

View File

@@ -0,0 +1,58 @@
import {
CpuChipIcon,
CubeIcon,
ServerIcon,
} from '@heroicons/react/24/solid'
import { Eyebrow, H3, P, CT, CP } from '../../components/Texts'
import { Container } from '../../components/Container'
const capabilities = [
{
name: 'Containers',
description: 'Services, web apps, APIs. Fully compatible with Kubernetes.',
icon: CubeIcon,
},
{
name: 'Virtual Machines',
description:
'Legacy apps and specialized runtime stacks. Secure boot + attestation included.',
icon: ServerIcon,
},
{
name: 'Native Linux Workloads',
description:
'Agents, batch jobs, tooling. Runs statelessly anywhere.',
icon: CpuChipIcon,
},
]
export function ComputeCapabilities() {
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</H3>
<P className="mt-6 text-gray-600">
Mycelium Compute supports multiple workload types on a single
execution fabric.
</P>
</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-3">
{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 aria-hidden="true" className="size-6 text-cyan-600" />
</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

@@ -0,0 +1,56 @@
import {
ShieldCheckIcon,
ArrowPathIcon,
RocketLaunchIcon,
} from '@heroicons/react/24/solid'
import { Container } from '../../components/Container'
import { Eyebrow, H3, P, CT, CP } from '../../components/Texts'
const features = [
{
name: 'Cryptographically verified deployments',
description: 'Every cluster state is signed and checksummed to guarantee truth.',
icon: ShieldCheckIcon,
},
{
name: 'Stateless execution that scales anywhere',
description: 'Run workloads on any node, region, or edge without manual orchestration.',
icon: RocketLaunchIcon,
},
{
name: 'Automatic healing and recovery',
description: 'Self-repairing processes ensure workloads stay available and consistent.',
icon: ArrowPathIcon,
},
]
export function ComputeDesign() {
return (
<section className="bg-white py-24 sm:py-32">
<Container>
<div className="mx-auto max-w-3xl sm:text-center">
<Eyebrow>CORE VALUE</Eyebrow>
<H3 className="mt-4 text-gray-900">Deterministic by Design</H3>
<P className="mt-6 text-gray-600">
Every workload runs exactly as declared: no drift, no hidden state, no surprises.
</P>
</div>
<div className="mx-auto mt-16 max-w-5xl">
<dl className="grid grid-cols-1 gap-12 text-gray-600 sm:grid-cols-2 lg:grid-cols-3">
{features.map((feature) => (
<div key={feature.name} className="relative pl-12">
<feature.icon
aria-hidden="true"
className="absolute left-0 top-1 size-6 text-cyan-600"
/>
<CT className="font-semibold text-gray-900">{feature.name}</CT>
<CP className="mt-1 text-gray-600">{feature.description}</CP>
</div>
))}
</dl>
</div>
</Container>
</section>
)
}

View File

@@ -0,0 +1,114 @@
import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P } from '../../components/Texts'
const codeSamples = [
{
title: 'Simple Deployment',
description:
'Define deterministic workloads with familiar manifests that execute exactly as declared anywhere on the fabric.',
language: 'yaml',
code: `# Basic compute workload
apiVersion: v1
kind: Deployment
metadata:
name: deterministic-app
spec:
replicas: 3
selector:
matchLabels:
app: deterministic-app
template:
metadata:
labels:
app: deterministic-app
spec:
containers:
- name: app
image: ubuntu:latest
command: ["echo", "Deterministic deployment"]`,
},
{
title: 'Zero-Image Deployment',
description:
'Use metadata-only images to launch workloads instantly with zero heavy artifacts to distribute.',
language: 'yaml',
code: `# Using zero-image technology
apiVersion: v1
kind: Pod
metadata:
name: zero-image-pod
spec:
containers:
- name: app
image: "zero-image://ubuntu-latest" # Metadata-only image
command: ["echo", "Running on zero-image"]`,
},
{
title: 'Smart Contract Orchestration',
description:
'Automate workload lifecycles through cryptographically signed contracts that govern execution.',
language: 'yaml',
code: `# Smart contract orchestrated deployment
apiVersion: v1
kind: ConfigMap
metadata:
name: deployment-contract
data:
contract: |
smart_contract:
signature: "cryptographically_signed_deployment"
workload_spec:
image: "ubuntu-latest"
replicas: 3
verification_hash: "sha256_hash_of_workload"`,
},
]
export function ComputeDeveloperExperience() {
return (
<section className="bg-white py-24 sm:py-32">
<Container>
<div className="mx-auto max-w-3xl text-center">
<Eyebrow className="tracking-[0.28em] uppercase text-cyan-500">
Developer Experience
</Eyebrow>
<SectionHeader as="h2" className="mt-6 text-gray-900">
Declarative workflows, deterministic results.
</SectionHeader>
<P className="mt-6 text-gray-600">
Ship workloads using the same declarative patterns you already
trust. Mycelium Compute verifies and enforces every detail, from
classic deployments to zero-image launches and smart contract
upgrades.
</P>
</div>
<div className="mt-16 grid gap-8 lg:grid-cols-3">
{codeSamples.map((sample) => (
<div
key={sample.title}
className="flex h-full flex-col overflow-hidden rounded-3xl border border-slate-200 bg-slate-50"
>
<div className="p-8">
<p className="text-sm font-semibold uppercase tracking-[0.24em] text-cyan-500">
{sample.language}
</p>
<h3 className="mt-4 text-xl font-semibold text-gray-900">
{sample.title}
</h3>
<p className="mt-3 text-sm leading-relaxed text-gray-600">
{sample.description}
</p>
</div>
<div className="mt-auto bg-gray-900 p-6">
<pre className="overflow-auto text-left text-xs leading-relaxed text-cyan-100">
<code>{sample.code}</code>
</pre>
</div>
</div>
))}
</div>
</Container>
</section>
)
}

View File

@@ -0,0 +1,68 @@
import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P } from '../../components/Texts'
const differentiators = [
{
title: 'Deterministic Guarantee',
description:
'Every computation is cryptographically verified to ensure consistent, repeatable outcomes across environments.',
},
{
title: 'Autonomous Operations',
description:
'Infrastructure monitors, scales, and heals itself with zero human intervention required.',
},
{
title: 'Smart Contract Security',
description:
'Workload orchestration flows through cryptographically signed, tamper-proof contracts.',
},
{
title: 'Multi-Platform Support',
description:
'Run containers, VMs, or native Linux workloads with the same deterministic guarantees.',
},
{
title: 'Secure Boot Verification',
description:
'Hardware-level attestation validates every deployment path before workloads execute.',
},
]
export function ComputeDifferentiators() {
return (
<section className="bg-white py-24 sm:py-32">
<Container>
<div className="mx-auto max-w-3xl text-center">
<Eyebrow className="tracking-[0.3em] uppercase text-cyan-500">
Key Differentiators
</Eyebrow>
<SectionHeader as="h2" className="mt-6 text-gray-900">
Why teams choose Mycelium Compute.
</SectionHeader>
<P className="mt-6 text-gray-600">
Deterministic execution, contract-grade governance, and hardware
attestation make Mycelium Compute the most trusted substrate for
sensitive workloads.
</P>
</div>
<div className="mt-16 grid gap-6 md:grid-cols-2 lg:grid-cols-3">
{differentiators.map((item) => (
<div
key={item.title}
className="rounded-3xl border border-slate-200 bg-slate-50 p-8 transition hover:-translate-y-1 hover:border-cyan-300 hover:bg-white hover:shadow-lg"
>
<h3 className="text-lg font-semibold text-gray-900">
{item.title}
</h3>
<p className="mt-4 text-sm leading-relaxed text-gray-600">
{item.description}
</p>
</div>
))}
</div>
</Container>
</section>
)
}

View File

@@ -0,0 +1,68 @@
import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P, Small } from '../../components/Texts'
const featureGroups = [
{
title: 'Self-Managing Infrastructure',
description:
'Scaling, healing, and failover happen automatically, no manual intervention.',
},
{
title: 'Secure, Stateless Execution',
description:
'Workloads remain isolated, reproducible, and portable, no environment drift or configuration decay.',
},
{
title: 'Zero-Image Delivery',
description:
'Deploy workloads using metadata instead of large container images for instant launches.',
},
{
title: 'Global Placement Control',
description:
'Choose where workloads run, on your hardware or across the decentralized grid.',
},
]
export function ComputeFeatures() {
return (
<section className="bg-white py-24 sm:py-32">
<Container>
<div className="mx-auto max-w-3xl text-center">
<Eyebrow className="tracking-[0.28em] uppercase text-cyan-500">
Core Features
</Eyebrow>
<SectionHeader as="h2" className="mt-6 text-gray-900">
Precision infrastructure that verifies itself.
</SectionHeader>
<P className="mt-6 text-gray-600">
Every layer is designed for determinism, from how workloads are
declared to the way they scale, protect, and govern themselves on
the grid.
</P>
</div>
<div className="mt-16 grid gap-8 md:grid-cols-2">
{featureGroups.map((feature) => (
<div
key={feature.title}
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>
<Small className="text-xs uppercase tracking-[0.3em] text-cyan-500">
Feature
</Small>
<h3 className="mt-4 text-2xl font-semibold text-gray-900">
{feature.title}
</h3>
<p className="mt-4 text-sm leading-relaxed text-gray-600">
{feature.description}
</p>
</div>
</div>
))}
</div>
</Container>
</section>
)
}

View File

@@ -1,6 +1,7 @@
'use client' 'use client'
import { Button } from '../../components/Button' import { Button } from '../../components/Button'
import { Eyebrow, P, H3 } from '../../components/Texts'
export function ComputeHero() { export function ComputeHero() {
return ( return (
@@ -8,25 +9,24 @@ export function ComputeHero() {
<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 className="relative h-80 overflow-hidden bg-transparent md:absolute md:right-0 md:h-full md:w-1/3 lg:w-1/2">
<img <img
alt="" alt=""
src="/images/computehero4.png" src="/images/computehero.webp"
className="size-full object-cover" className="size-full object-contain"
/> />
</div> </div>
<div className="relative mx-auto max-w-7xl py-24 sm:py-32 lg:px-8 lg:py-40"> <div className="relative mx-auto max-w-7xl py-12 lg:py-24 lg:px-8">
<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"> <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">
<h2 className="text-base/7 font-semibold text-cyan-500">COMPUTE</h2> <Eyebrow className="text-base/7 font-semibold text-cyan-500">COMPUTE</Eyebrow>
<p className="mt-2 text-4xl font-semibold tracking-tight text-gray-900 sm:text-5xl">The pulse of intelligence runs here.</p> <H3 className="mt-2 text-gray-900">Deterministic Compute You Control</H3>
<p className="mt-6 text-base/7 text-gray-600"> <P className="mt-6 text-gray-600">
Mycelium Compute brings predictable, sovereign performance free from lock-in, free from drift. Run workloads on sovereign, self-verifying infrastructure.
Deploy any workload, anywhere, with cryptographic precision and zero compromise. Mycelium Compute delivers predictable execution, zero drift, and automatic healing, whether youre running containers, VMs, agents, or full Kubernetes clusters.
From micro-VMs to full clusters, every operation is deterministic, self-managing, and stateless by design. </P>
Compute that verifies itself. Expands itself. Heals itself. <div className="mt-12">
</p>
<div className="mt-8">
<Button href="#" variant="solid" color="cyan"> <Button href="#" variant="solid" color="cyan">
Experience Deterministic Compute How it works
</Button> </Button>
<Button href="#" variant="outline" color="cyan">Explore Docs</Button>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -0,0 +1,74 @@
import { CircleBackground } from '../../components/CircleBackground'
import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P } from '../../components/Texts'
const overviewCards = [
{
label: 'Overview',
title: 'Built for sovereign, verifiable operations',
copy: `Mycelium Compute provides a sovereign, deterministic compute fabric that enables developers to launch workloads with cryptographic certainty and autonomous operations. Built on decentralized infrastructure, it keeps environments transparent, verifiable, and free from manual intervention.`,
},
{
label: 'Core Concept',
title: 'Deterministic compute fabric',
copy: `Every workload deploys exactly as intended through cryptographic verification—eliminating tampering and configuration drift while maintaining complete operational autonomy.`,
},
]
export function ComputeOverview() {
return (
<section className="relative overflow-hidden bg-gray-950 py-24 sm:py-32">
<div className="pointer-events-none absolute inset-0">
<CircleBackground
color="#06b6d4"
className="absolute -top-40 left-1/2 h-[520px] w-[520px] -translate-x-1/2 opacity-30 blur-3xl sm:opacity-40"
/>
<CircleBackground
color="#22d3ee"
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(15,118,110,0.1),_transparent_55%)]" />
</div>
<Container className="relative">
<div className="mx-auto max-w-3xl text-center">
<Eyebrow color="accent" className="tracking-[0.35em] uppercase">
Mycelium Compute
</Eyebrow>
<SectionHeader as="h2" color="light" className="mt-6 font-medium">
Deterministic compute fabric for autonomous workloads.
</SectionHeader>
<P color="lightSecondary" className="mt-6">
Mycelium Compute delivers predictable, sovereign performancefree
from lock-in and drift. Deploy any workload with cryptographic
precision, knowing the platform verifies, scales, and heals itself
on your behalf.
</P>
<P color="lightSecondary" className="mt-4">
Deterministic. Self-managing. Stateless by design.
</P>
</div>
<div className="mt-16 grid gap-6 lg:grid-cols-2">
{overviewCards.map((card) => (
<div
key={card.title}
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-500/0 via-white/[0.04] to-cyan-300/10 opacity-0 transition group-hover:opacity-100" />
<div className="relative">
<p className="text-[0.7rem] font-semibold uppercase tracking-[0.35em] text-cyan-300">
{card.label}
</p>
<h3 className="mt-4 text-xl font-semibold text-white">
{card.title}
</h3>
<p className="mt-4 text-sm leading-relaxed text-gray-300">
{card.copy}
</p>
</div>
</div>
))}
</div>
</Container>
</section>
)
}

View File

@@ -1,6 +1,15 @@
import { AnimatedSection } from '../../components/AnimatedSection' import { AnimatedSection } from '../../components/AnimatedSection'
import { ComputeHero } from './ComputeHero' import { ComputeHero } from './ComputeHero'
import { ComputeOverview } from './ComputeOverview'
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' import { CallToAction } from './CallToAction'
import { ComputeCapabilities } from './ComputeCapabilities'
import { ComputeDesign } from './ComputeDesign'
export default function ComputePage() { export default function ComputePage() {
return ( return (
@@ -8,6 +17,39 @@ export default function ComputePage() {
<AnimatedSection> <AnimatedSection>
<ComputeHero /> <ComputeHero />
</AnimatedSection> </AnimatedSection>
<AnimatedSection>
<ComputeCapabilities />
</AnimatedSection>
<AnimatedSection>
<ComputeDesign />
</AnimatedSection>
<AnimatedSection>
<ComputeFeatures />
</AnimatedSection>
<AnimatedSection>
<ComputeOverview />
</AnimatedSection>
<AnimatedSection>
<ComputeZeroImage />
</AnimatedSection>
<AnimatedSection>
<ComputeArchitecture />
</AnimatedSection>
<AnimatedSection>
<ComputeDeveloperExperience />
</AnimatedSection>
<AnimatedSection>
<ComputeUseCases />
</AnimatedSection>
<AnimatedSection>
<ComputeDifferentiators />
</AnimatedSection>
<AnimatedSection> <AnimatedSection>
<CallToAction /> <CallToAction />
</AnimatedSection> </AnimatedSection>

View File

@@ -0,0 +1,58 @@
import { Container } from '../../components/Container'
import { Eyebrow, SectionHeader, P } from '../../components/Texts'
const useCases = [
{
title: 'AI / ML Training',
description:
'Reproducible pipelines, private model execution, scalable GPU orchestration.',
},
{
title: 'Application Hosting',
description:
'Private, reliable, self-healing services without cloud vendor lock-in.',
},
{
title: 'Distributed & Edge Compute',
description:
'Run workloads where data lives, in homes, offices, datacenters, or remote regions.',
},
]
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="mx-auto mt-16 max-w-4xl space-y-6">
{useCases.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>
<p className="mt-3 text-sm leading-relaxed text-gray-200">
{useCase.description}
</p>
</div>
))}
</div>
</Container>
</section>
)
}

View File

@@ -0,0 +1,135 @@
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-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"
>
<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>
)
}

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