feat: rename ThreeFold to Mycelium in copyright, docs, specs, and UI across codebase
This commit is contained in:
@@ -4471,7 +4471,7 @@ impl DashboardController {
|
||||
// Generate text agreement content
|
||||
let agreement_content = format!(
|
||||
"SERVICE PROVIDER AGREEMENT\n\n\
|
||||
ThreeFold Grid Service Provider Agreement\n\
|
||||
Mycelium Grid Service Provider Agreement\n\
|
||||
\n\
|
||||
Service Provider: {}\n\
|
||||
Agreement Date: January 15, 2025\n\
|
||||
@@ -4479,7 +4479,7 @@ impl DashboardController {
|
||||
Status: Active\n\
|
||||
\n\
|
||||
This agreement outlines the terms and conditions for providing services\n\
|
||||
on the ThreeFold Grid platform.\n\
|
||||
on the Mycelium Grid platform.\n\
|
||||
\n\
|
||||
Terms:\n\
|
||||
1. Service Quality Standards\n\
|
||||
@@ -6329,7 +6329,7 @@ impl DashboardController {
|
||||
}
|
||||
}
|
||||
|
||||
/// Sync resource_provider nodes with ThreeFold Grid
|
||||
/// Sync resource_provider nodes with Mycelium Grid
|
||||
pub async fn sync_with_grid(session: Session) -> Result<impl Responder> {
|
||||
// Check authentication
|
||||
if let Err(response) = Self::check_authentication(&session) {
|
||||
@@ -6339,7 +6339,7 @@ impl DashboardController {
|
||||
// Mock sync operation
|
||||
let sync_result = serde_json::json!({
|
||||
"success": true,
|
||||
"message": "Successfully synced with ThreeFold Grid",
|
||||
"message": "Successfully synced with Mycelium Grid",
|
||||
"nodes_updated": 3,
|
||||
"new_nodes_found": 1,
|
||||
"sync_timestamp": chrono::Utc::now().to_rfc3339()
|
||||
@@ -6803,7 +6803,7 @@ impl DashboardController {
|
||||
}
|
||||
}
|
||||
|
||||
/// API endpoint to sync with ThreeFold Grid
|
||||
/// API endpoint to sync with Mycelium Grid
|
||||
pub async fn sync_with_grid_api(session: Session) -> Result<impl Responder> {
|
||||
|
||||
let user_email = session.get::<String>("user_email")
|
||||
@@ -6834,13 +6834,13 @@ impl DashboardController {
|
||||
|
||||
Ok(ResponseBuilder::ok().json(serde_json::json!({
|
||||
"success": true,
|
||||
"message": format!("Successfully synced {} nodes with ThreeFold Grid", synced_nodes),
|
||||
"message": format!("Successfully synced {} nodes with Mycelium Grid", synced_nodes),
|
||||
"synced_nodes": synced_nodes
|
||||
})).build())
|
||||
}
|
||||
Err(e) => {
|
||||
Ok(ResponseBuilder::internal_error().json(serde_json::json!({
|
||||
"error": "Failed to sync with ThreeFold Grid",
|
||||
"error": "Failed to sync with Mycelium Grid",
|
||||
"details": e.to_string()
|
||||
})).build())
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
//! Grid service for ThreeFold Grid integration
|
||||
//! Grid service for Mycelium Grid integration
|
||||
//! Handles fetching node data from gridproxy API
|
||||
|
||||
use crate::models::user::{GridNodeData, NodeCapacity};
|
||||
@@ -44,7 +44,7 @@ pub struct GridProxyResources {
|
||||
pub hru: u64, // HDD storage in bytes
|
||||
}
|
||||
|
||||
/// Service for ThreeFold Grid operations
|
||||
/// Service for Mycelium Grid operations
|
||||
#[derive(Clone)]
|
||||
pub struct GridService {
|
||||
gridproxy_url: String,
|
||||
@@ -86,7 +86,7 @@ impl GridService {
|
||||
GridServiceBuilder::new()
|
||||
}
|
||||
|
||||
/// Fetch node data from ThreeFold Grid
|
||||
/// Fetch node data from Mycelium Grid
|
||||
pub async fn fetch_node_data(&self, node_id: u32) -> Result<GridNodeData, String> {
|
||||
// Try to fetch from real API first, fall back to mock data
|
||||
match self.fetch_real_node_data(node_id).await {
|
||||
|
@@ -238,7 +238,7 @@ impl ResourceProviderService {
|
||||
Ok(node)
|
||||
}
|
||||
|
||||
/// Add a new node from ThreeFold Grid (automatic creation with real data)
|
||||
/// Add a new node from Mycelium Grid (automatic creation with real data)
|
||||
pub async fn add_node_from_grid(&self, user_email: &str, grid_node_id: u32) -> Result<FarmNode, String> {
|
||||
// Load existing data and check for duplicates more thoroughly
|
||||
let mut persistent_data = UserPersistence::load_user_data(user_email)
|
||||
@@ -1285,7 +1285,7 @@ impl ResourceProviderService {
|
||||
// GRID NODE MANAGEMENT
|
||||
// =============================================================================
|
||||
|
||||
/// Add a node from ThreeFold Grid by node ID
|
||||
/// Add a node from Mycelium Grid by node ID
|
||||
pub async fn add_grid_node(&self, user_email: &str, grid_node_id: u32, _slice_format: Option<String>, _slice_price: Option<Decimal>) -> Result<FarmNode, String> {
|
||||
// Check for duplicate grid node IDs first
|
||||
let existing_nodes = self.get_resource_provider_nodes(user_email);
|
||||
@@ -1295,7 +1295,7 @@ impl ResourceProviderService {
|
||||
|
||||
// Validate node exists on grid
|
||||
if !self.grid_service.validate_node_exists(grid_node_id).await? {
|
||||
return Err(format!("Node {} does not exist on ThreeFold Grid", grid_node_id));
|
||||
return Err(format!("Node {} does not exist on Mycelium Grid", grid_node_id));
|
||||
}
|
||||
|
||||
// Fetch node data from grid
|
||||
@@ -1352,7 +1352,7 @@ impl ResourceProviderService {
|
||||
|
||||
// Validate and fetch grid data
|
||||
if !self.grid_service.validate_node_exists(grid_node_id).await.map_err(|e| e.to_string())? {
|
||||
return Err(format!("Node {} does not exist on ThreeFold Grid", grid_node_id));
|
||||
return Err(format!("Node {} does not exist on Mycelium Grid", grid_node_id));
|
||||
}
|
||||
let grid_data = self.grid_service.fetch_node_data(grid_node_id).await.map_err(|e| e.to_string())?;
|
||||
|
||||
@@ -2314,7 +2314,7 @@ impl ResourceProviderService {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Sync all nodes with ThreeFold Grid
|
||||
/// Sync all nodes with Mycelium Grid
|
||||
pub fn sync_all_nodes_with_grid(&self, user_email: &str) -> Result<u32, String> {
|
||||
let mut persistent_data = UserPersistence::load_user_data(user_email)
|
||||
.ok_or("User data not found")?;
|
||||
@@ -2479,7 +2479,7 @@ impl ResourceProviderService {
|
||||
pub async fn fetch_and_validate_grid_node(&self, grid_node_id: u32) -> Result<crate::models::user::GridNodeData, String> {
|
||||
// Validate node exists on grid
|
||||
if !self.grid_service.validate_node_exists(grid_node_id).await? {
|
||||
return Err(format!("Node {} does not exist on ThreeFold Grid", grid_node_id));
|
||||
return Err(format!("Node {} does not exist on Mycelium Grid", grid_node_id));
|
||||
}
|
||||
|
||||
// Fetch node data from grid
|
||||
@@ -2852,7 +2852,7 @@ impl ResourceProviderService {
|
||||
Ok(updated_count)
|
||||
}
|
||||
|
||||
/// Sync all nodes with ThreeFold Grid (async version)
|
||||
/// Sync all nodes with Mycelium Grid (async version)
|
||||
pub async fn sync_all_nodes_with_grid_async(&self, user_email: &str) -> Result<u32, String> {
|
||||
let mut persistent_data = UserPersistence::load_user_data(user_email)
|
||||
.ok_or("User data not found")?;
|
||||
|
@@ -183,8 +183,8 @@
|
||||
}
|
||||
function shareCart() {
|
||||
const shareData = {
|
||||
title: 'My ThreeFold Cart',
|
||||
text: 'Check out my ThreeFold marketplace cart',
|
||||
title: 'My Mycelium Cart',
|
||||
text: 'Check out my Mycelium marketplace cart',
|
||||
url: window.location.href
|
||||
};
|
||||
if (navigator.share) {
|
||||
|
@@ -712,7 +712,7 @@ function monitorDeployment(deploymentId) {
|
||||
}
|
||||
|
||||
function supportDeployment(deploymentId, customerName) {
|
||||
showThreeFoldSupportModal(deploymentId, customerName);
|
||||
showMyceliumSupportModal(deploymentId, customerName);
|
||||
}
|
||||
|
||||
// Register New Application Function
|
||||
@@ -1248,7 +1248,7 @@ function showDeploymentDetailsModal(deployment, appName) {
|
||||
}
|
||||
|
||||
// ThreeFold Support Modal
|
||||
function showThreeFoldSupportModal(deploymentId, customerName) {
|
||||
function showMyceliumSupportModal(deploymentId, customerName) {
|
||||
const modalHtml = `
|
||||
<div class="modal fade" id="threeFoldSupportModal" tabindex="-1" aria-labelledby="threeFoldSupportModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog modal-lg">
|
||||
@@ -1265,7 +1265,7 @@ function showThreeFoldSupportModal(deploymentId, customerName) {
|
||||
</style>
|
||||
<div class="modal-header bg-primary text-white">
|
||||
<h5 class="modal-title" id="threeFoldSupportModalLabel">
|
||||
<i class="bi bi-headset me-2"></i>ThreeFold Grid Support
|
||||
<i class="bi bi-headset me-2"></i>Mycelium Grid Support
|
||||
</h5>
|
||||
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
@@ -1275,7 +1275,7 @@ function showThreeFoldSupportModal(deploymentId, customerName) {
|
||||
<i class="bi bi-grid-3x3-gap-fill text-primary" style="font-size: 2rem;"></i>
|
||||
</div>
|
||||
<h4 class="text-primary">Need Help with Your Deployment?</h4>
|
||||
<p class="text-muted">We're here to support you with any ThreeFold Grid related issues</p>
|
||||
<p class="text-muted">We're here to support you with any Mycelium Grid related issues</p>
|
||||
</div>
|
||||
|
||||
<div class="row mb-2">
|
||||
@@ -1357,7 +1357,7 @@ function closeViewAndOpenSupport(deploymentId, customerName) {
|
||||
|
||||
// Small delay to ensure the first modal is closed before opening the second
|
||||
setTimeout(() => {
|
||||
showThreeFoldSupportModal(deploymentId, customerName);
|
||||
showMyceliumSupportModal(deploymentId, customerName);
|
||||
}, 300);
|
||||
}
|
||||
|
||||
|
@@ -131,10 +131,10 @@ function validateSlicePrice(event) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate nodes by fetching data from ThreeFold Grid
|
||||
* Validate nodes by fetching data from Mycelium Grid
|
||||
*/
|
||||
function validateNodes() {
|
||||
console.log('🔍 Validating nodes from ThreeFold Grid');
|
||||
console.log('🔍 Validating nodes from Mycelium Grid');
|
||||
|
||||
// Prevent validation if nodes are being added
|
||||
const addBtn = document.getElementById('addNodesBtn');
|
||||
|
@@ -2816,13 +2816,13 @@ function viewAgreement() {
|
||||
<div class="modal-dialog modal-xl">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="viewAgreementModalLabel">ThreeFold Service Provider Agreement</h5>
|
||||
<h5 class="modal-title" id="viewAgreementModalLabel">Mycelium Service Provider Agreement</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body" style="max-height: 70vh; overflow-y: auto;">
|
||||
<div class="agreement-content">
|
||||
<h6>1. Agreement Overview</h6>
|
||||
<p>This Service Provider Agreement ("Agreement") is entered into between ThreeFold and the Service Provider for the provision of professional services through the ThreeFold marketplace platform.</p>
|
||||
<p>This Service Provider Agreement ("Agreement") is entered into between Mycelium and the Service Provider for the provision of professional services through the Mycelium marketplace platform.</p>
|
||||
|
||||
<h6>2. Service Provider Obligations</h6>
|
||||
<ul>
|
||||
@@ -2833,7 +2833,7 @@ function viewAgreement() {
|
||||
</ul>
|
||||
|
||||
<h6>3. Payment Terms</h6>
|
||||
<p>Payments will be processed through the ThreeFold platform using USD Credits. Service providers will receive payment upon successful completion of services as verified by the client.</p>
|
||||
<p>Payments will be processed through the Mycelium platform using USD Credits. Service providers will receive payment upon successful completion of services as verified by the client.</p>
|
||||
|
||||
<h6>4. Quality Standards</h6>
|
||||
<p>Service providers must maintain a minimum rating of 4.0 stars and respond to service requests within 24 hours unless otherwise specified in their service offerings.</p>
|
||||
@@ -2862,7 +2862,7 @@ function downloadAgreement() {
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Service Provider Agreement - ThreeFold</title>
|
||||
<title>Service Provider Agreement - Mycelium</title>
|
||||
<style>
|
||||
@media print {
|
||||
.no-print { display: none !important; }
|
||||
@@ -2889,7 +2889,7 @@ function downloadAgreement() {
|
||||
<body>
|
||||
<div class="agreement-content">
|
||||
<div class="header">
|
||||
<h1>ThreeFold Service Provider Agreement</h1>
|
||||
<h1>Mycelium Service Provider Agreement</h1>
|
||||
<p><strong>Agreement Date:</strong> ${new Date().toLocaleDateString()}</p>
|
||||
<p><strong>Provider:</strong> Service Provider</p>
|
||||
<p><strong>Agreement ID:</strong> SPA-${Date.now()}</p>
|
||||
@@ -2897,7 +2897,7 @@ function downloadAgreement() {
|
||||
|
||||
<div class="section">
|
||||
<h2>1. Service Provider Terms</h2>
|
||||
<p>This Service Provider Agreement ("Agreement") is entered into between ThreeFold and the Service Provider for the provision of services on the ThreeFold marketplace platform.</p>
|
||||
<p>This Service Provider Agreement ("Agreement") is entered into between Mycelium and the Service Provider for the provision of services on the Mycelium marketplace platform.</p>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
@@ -2913,29 +2913,29 @@ function downloadAgreement() {
|
||||
|
||||
<div class="section">
|
||||
<h2>3. Payment Terms</h2>
|
||||
<p>Payment for services will be processed through the ThreeFold platform using USD Credits. The Service Provider agrees to the platform's payment processing terms and fee structure.</p>
|
||||
<p>Payment for services will be processed through the Mycelium platform using USD Credits. The Service Provider agrees to the platform's payment processing terms and fee structure.</p>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h2>4. Quality Standards</h2>
|
||||
<p>All services must meet ThreeFold's quality standards and client expectations. The Service Provider is responsible for maintaining a professional reputation and delivering high-quality work.</p>
|
||||
<p>All services must meet Mycelium's quality standards and client expectations. The Service Provider is responsible for maintaining a professional reputation and delivering high-quality work.</p>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h2>5. Dispute Resolution</h2>
|
||||
<p>Any disputes arising from this agreement will be resolved through ThreeFold's dispute resolution process, with mediation as the preferred method.</p>
|
||||
<p>Any disputes arising from this agreement will be resolved through Mycelium's dispute resolution process, with mediation as the preferred method.</p>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h2>6. Termination</h2>
|
||||
<p>Either party may terminate this agreement with 30 days written notice. ThreeFold reserves the right to terminate immediately for violations of platform terms.</p>
|
||||
<p>Either party may terminate this agreement with 30 days written notice. Mycelium reserves the right to terminate immediately for violations of platform terms.</p>
|
||||
</div>
|
||||
|
||||
<div class="signature-section">
|
||||
<h2>7. Agreement Acceptance</h2>
|
||||
<p>By using the ThreeFold service provider platform, you acknowledge that you have read, understood, and agree to be bound by the terms of this agreement.</p>
|
||||
<p>By using the Mycelium service provider platform, you acknowledge that you have read, understood, and agree to be bound by the terms of this agreement.</p>
|
||||
<br>
|
||||
<p><strong>ThreeFold Foundation</strong></p>
|
||||
<p><strong>Mycelium Foundation</strong></p>
|
||||
<p>Date: ${new Date().toLocaleDateString()}</p>
|
||||
<br>
|
||||
<p><strong>Service Provider Signature:</strong> _________________________</p>
|
||||
|
@@ -1,13 +1,13 @@
|
||||
// Demo Workflow JavaScript
|
||||
// This file provides a comprehensive demo of the ThreeFold Dashboard functionality
|
||||
// This file provides a comprehensive demo of the Mycelium Dashboard functionality
|
||||
|
||||
class DemoWorkflow {
|
||||
constructor() {
|
||||
this.currentStep = 0;
|
||||
this.steps = [
|
||||
{
|
||||
title: "Welcome to ThreeFold Dashboard Demo",
|
||||
description: "This demo will showcase the complete interactive functionality of the ThreeFold ecosystem.",
|
||||
title: "Welcome to Mycelium Dashboard Demo",
|
||||
description: "This demo will showcase the complete interactive functionality of the Mycelium ecosystem.",
|
||||
action: () => this.showWelcome()
|
||||
},
|
||||
{
|
||||
@@ -42,7 +42,7 @@ class DemoWorkflow {
|
||||
},
|
||||
{
|
||||
title: "Demo Complete",
|
||||
description: "You've seen the complete ThreeFold ecosystem in action!",
|
||||
description: "You've seen the complete Mycelium ecosystem in action!",
|
||||
action: () => this.showCompletion()
|
||||
}
|
||||
];
|
||||
@@ -75,14 +75,14 @@ class DemoWorkflow {
|
||||
|
||||
demoPanel.innerHTML = `
|
||||
<div class="demo-header">
|
||||
<h5 class="mb-2">🚀 ThreeFold Demo</h5>
|
||||
<h5 class="mb-2">🚀 Mycelium Demo</h5>
|
||||
<div class="progress mb-3" style="height: 6px;">
|
||||
<div class="progress-bar bg-primary" id="demo-progress" role="progressbar" style="width: 0%"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="demo-content">
|
||||
<h6 id="demo-title">Welcome to ThreeFold Dashboard Demo</h6>
|
||||
<p id="demo-description" class="text-muted small">This demo will showcase the complete interactive functionality of the ThreeFold ecosystem.</p>
|
||||
<h6 id="demo-title">Welcome to Mycelium Dashboard Demo</h6>
|
||||
<p id="demo-description" class="text-muted small">This demo will showcase the complete interactive functionality of the Mycelium ecosystem.</p>
|
||||
</div>
|
||||
<div class="demo-controls mt-3">
|
||||
<button class="btn btn-primary btn-sm me-2" id="demo-next">Start Demo</button>
|
||||
@@ -139,7 +139,7 @@ class DemoWorkflow {
|
||||
}
|
||||
|
||||
showWelcome() {
|
||||
showNotification('Welcome to the ThreeFold Dashboard Demo! 🎉', 'info');
|
||||
showNotification('Welcome to the Mycelium Dashboard Demo! 🎉', 'info');
|
||||
}
|
||||
|
||||
demoAppRegistration() {
|
||||
@@ -167,7 +167,7 @@ class DemoWorkflow {
|
||||
fillAppRegistrationForm() {
|
||||
const formData = {
|
||||
appName: 'Demo Secure Chat App',
|
||||
appDesc: 'A decentralized, end-to-end encrypted chat application built for the ThreeFold Grid',
|
||||
appDesc: 'A decentralized, end-to-end encrypted chat application built for the Mycelium Grid',
|
||||
appCategory: 'communication',
|
||||
appType: 'container',
|
||||
appRepo: 'https://github.com/demo/secure-chat',
|
||||
@@ -219,8 +219,8 @@ class DemoWorkflow {
|
||||
|
||||
fillServiceCreationForm() {
|
||||
const formData = {
|
||||
serviceName: 'Demo ThreeFold Migration Service',
|
||||
serviceDesc: 'Professional migration service to help businesses move their workloads to the ThreeFold Grid with zero downtime',
|
||||
serviceName: 'Demo Mycelium Migration Service',
|
||||
serviceDesc: 'Professional migration service to help businesses move their workloads to the Mycelium Grid with zero downtime',
|
||||
serviceCategory: 'migration',
|
||||
serviceDelivery: 'hybrid',
|
||||
pricingType: 'hourly',
|
||||
@@ -228,7 +228,7 @@ class DemoWorkflow {
|
||||
serviceExperience: 'expert',
|
||||
availableHours: '30',
|
||||
responseTime: '4',
|
||||
serviceSkills: 'Docker, Kubernetes, ThreeFold Grid, Cloud Migration, DevOps'
|
||||
serviceSkills: 'Docker, Kubernetes, Mycelium Grid, Cloud Migration, DevOps'
|
||||
};
|
||||
|
||||
Object.entries(formData).forEach(([key, value]) => {
|
||||
@@ -307,7 +307,7 @@ class DemoWorkflow {
|
||||
}
|
||||
|
||||
showCompletion() {
|
||||
showNotification('🎉 Demo completed! You\'ve experienced the full ThreeFold ecosystem.', 'success');
|
||||
showNotification('🎉 Demo completed! You\'ve experienced the full Mycelium ecosystem.', 'success');
|
||||
|
||||
setTimeout(() => {
|
||||
this.closeDemo();
|
||||
|
@@ -390,8 +390,8 @@ class MarketplaceIntegration {
|
||||
{
|
||||
id: 'ms-mock-1',
|
||||
source_service_id: 'service-mock-1',
|
||||
name: 'ThreeFold Migration Service',
|
||||
description: 'Professional migration from cloud providers to ThreeFold Grid',
|
||||
name: 'Mycelium Migration Service',
|
||||
description: 'Professional migration from cloud providers to Mycelium Grid',
|
||||
category: 'Migration',
|
||||
provider_id: mikeUser.id,
|
||||
provider_name: mikeUser.display_name,
|
||||
|
@@ -16,7 +16,7 @@
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-dark fixed-top">
|
||||
<div class="container">
|
||||
<a class="navbar-brand d-flex align-items-center" href="/">
|
||||
<img src="/static/images/logo_dark.png" alt="ThreeFold Logo" height="30" class="me-2">
|
||||
<img src="/static/images/logo_dark.png" alt="Mycelium Logo" height="30" class="me-2">
|
||||
<span>Project Mycelium</span>
|
||||
</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"
|
||||
|
@@ -5,7 +5,7 @@
|
||||
{% block marketplace_content %}
|
||||
<div class="my-4">
|
||||
<h1>Professional Services</h1>
|
||||
<p class="lead">Expert services to help you succeed with ThreeFold technology and infrastructure.</p>
|
||||
<p class="lead">Expert services to help you succeed with Mycelium technology and infrastructure.</p>
|
||||
|
||||
<!-- Services Introduction -->
|
||||
<div class="alert alert-info mb-4">
|
||||
@@ -15,7 +15,7 @@
|
||||
</div>
|
||||
<div>
|
||||
<h5 class="alert-heading">Professional Support & Services</h5>
|
||||
<p>Our certified experts and trusted community providers offer comprehensive services to help you deploy, manage, and optimize your ThreeFold infrastructure and applications.</p>
|
||||
<p>Our certified experts and trusted community providers offer comprehensive services to help you deploy, manage, and optimize your Mycelium infrastructure and applications.</p>
|
||||
<hr>
|
||||
<p class="mb-0">From initial consultation to ongoing support, we ensure your success with decentralized technology.</p>
|
||||
</div>
|
||||
@@ -320,7 +320,7 @@
|
||||
<div class="card-body text-center">
|
||||
<i class="bi bi-tools fs-1 text-primary mb-3"></i>
|
||||
<h5>Deployment & Setup</h5>
|
||||
<p class="small text-muted">Professional deployment, configuration, and optimization of your ThreeFold infrastructure and applications.</p>
|
||||
<p class="small text-muted">Professional deployment, configuration, and optimization of your Mycelium infrastructure and applications.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
Reference in New Issue
Block a user