This commit is contained in:
despiegk 2025-08-03 09:37:27 +02:00
parent 9d0ea42900
commit 91efc3c41f
32 changed files with 143 additions and 139 deletions

View File

@ -23,11 +23,8 @@ function App() {
<Route path="/technology" element={<Technology />} /> <Route path="/technology" element={<Technology />} />
<Route path="/freezone" element={<Freezone />} /> <Route path="/freezone" element={<Freezone />} />
<Route path="/blog" element={<Blog />} /> <Route path="/blog" element={<Blog />} />
<Route path="/blog/:slug" element={<BlogPost />} /> <Route path="/blog/:category/:slug" element={<BlogPost />} />
<Route path="/capability/:slug" element={<BlogPost />} />
<Route path="/component/:slug" element={<BlogPost />} /> <Route path="/component/:slug" element={<BlogPost />} />
<Route path="/tech/:slug" element={<BlogPost />} />
<Route path="/freezone/:slug" element={<BlogPost />} />
</Routes> </Routes>
</main> </main>
</div> </div>

View File

@ -4,11 +4,11 @@ author: "HERO Team"
date: "December 8, 2024" date: "December 8, 2024"
readTime: "7 min read" readTime: "7 min read"
tags: ["AI", "Personal Agents", "Technology"] tags: ["AI", "Personal Agents", "Technology"]
image: "/src/assets/heart.jpg" image: "heart.jpg"
description: "Unlike corporate AI that serves shareholders, Personal Agents work exclusively for you. Learn how this changes everything about AI interaction." description: "Unlike corporate AI that serves shareholders, Personal Agents work exclusively for you. Learn how this changes everything about AI interaction."
featured: false featured: false
draft: false draft: false
cat: "blog"
slug: "ai-that-serves-you-the-personal-agent-revolution" slug: "ai-that-serves-you-the-personal-agent-revolution"
--- ---

View File

@ -4,11 +4,11 @@ author: "Dr. Sarah Chen"
date: "December 12, 2024" date: "December 12, 2024"
readTime: "6 min read" readTime: "6 min read"
tags: ["Cryptography", "Zero-Knowledge", "Security"] tags: ["Cryptography", "Zero-Knowledge", "Security"]
image: "/src/assets/balls.jpg" image: "balls.jpg"
description: "How HERO's zero-knowledge architecture enables trust without compromising privacy. A deep dive into the cryptographic foundations of digital sovereignty." description: "How HERO's zero-knowledge architecture enables trust without compromising privacy. A deep dive into the cryptographic foundations of digital sovereignty."
featured: false featured: false
draft: false draft: false
cat: "blog"
slug: "building-trust-in-a-zero-knowledge-world" slug: "building-trust-in-a-zero-knowledge-world"
--- ---

View File

@ -2,8 +2,8 @@
title: "Communicate" title: "Communicate"
description: "Secure messaging, voice, and video chat — all managed privately by your Personal Agent" description: "Secure messaging, voice, and video chat — all managed privately by your Personal Agent"
icon: "Brain" icon: "Brain"
image: "/src/assets/communicate.jpg" image: "communicate.jpg"
cat: "capability"
order: 1 order: 1
slug: "communicate" slug: "communicate"
--- ---

View File

@ -2,8 +2,8 @@
title: "Create" title: "Create"
description: "Build documents, videos, and creative assets collaboratively with AI assistance" description: "Build documents, videos, and creative assets collaboratively with AI assistance"
icon: "Zap" icon: "Zap"
image: "/src/assets/heart.jpg" image: "heart.jpg"
cat: "capability"
order: 2 order: 2
slug: "create" slug: "create"
--- ---

View File

@ -2,8 +2,8 @@
title: "Develop" title: "Develop"
description: "Build and deploy applications faster with local AI and secure storage" description: "Build and deploy applications faster with local AI and secure storage"
icon: "Users" icon: "Users"
image: "/src/assets/develop.jpg" image: "develop.jpg"
cat: "capability"
order: 4 order: 4
slug: "develop" slug: "develop"
--- ---

View File

@ -2,8 +2,8 @@
title: "Discover" title: "Discover"
description: "Browse and search using authentic sources and AI assistance while maintaining privacy" description: "Browse and search using authentic sources and AI assistance while maintaining privacy"
icon: "Shield" icon: "Shield"
image: "/src/assets/discover.jpg" image: "discover.jpg"
cat: "capability"
order: 3 order: 3
slug: "discover" slug: "discover"
--- ---

View File

@ -4,11 +4,11 @@ author: "Alex Rodriguez"
date: "December 10, 2024" date: "December 10, 2024"
readTime: "5 min read" readTime: "5 min read"
tags: ["Identity", "Blockchain", "Sovereignty"] tags: ["Identity", "Blockchain", "Sovereignty"]
image: "/src/assets/white_keyb.jpg" image: "white_keyb.jpg"
description: "Tracing the journey from corporate-controlled identities to blockchain-verified, user-owned digital personas. The future is sovereign." description: "Tracing the journey from corporate-controlled identities to blockchain-verified, user-owned digital personas. The future is sovereign."
featured: false featured: false
draft: false draft: false
cat: "blog"
slug: "from-centralized-to-sovereign-the-evolution-of-digital-identity" slug: "from-centralized-to-sovereign-the-evolution-of-digital-identity"
--- ---

View File

@ -4,10 +4,10 @@ author: "HERO Team"
date: "December 1, 2024" date: "December 1, 2024"
readTime: "6 min read" readTime: "6 min read"
tags: ["Communication", "P2P", "Privacy"] tags: ["Communication", "P2P", "Privacy"]
image: "/src/assets/heart.jpg" image: "heart.jpg"
featured: false featured: false
draft: false draft: false
cat: "blog"
slug: "peer-to-peer-communication-cutting-out-the-middleman" slug: "peer-to-peer-communication-cutting-out-the-middleman"
--- ---

View File

@ -4,10 +4,10 @@ author: "Dr. Michael Park"
date: "December 5, 2024" date: "December 5, 2024"
readTime: "9 min read" readTime: "9 min read"
tags: ["Quantum Computing", "Storage", "Security"] tags: ["Quantum Computing", "Storage", "Security"]
image: "/src/assets/balls.jpg" image: "balls.jpg"
featured: false featured: false
draft: false draft: false
cat: "blog"
slug: "quantum-safe-storage-protecting-your-digital-legacy" slug: "quantum-safe-storage-protecting-your-digital-legacy"
--- ---

View File

@ -2,8 +2,8 @@
title: "Share" title: "Share"
description: "Distribute content without central platforms — sovereignly and securely" description: "Distribute content without central platforms — sovereignly and securely"
icon: "Lock" icon: "Lock"
image: "/src/assets/share.jpg" image: "share.jpg"
cat: "capability"
order: 5 order: 5
slug: "share" slug: "share"
--- ---

View File

@ -4,11 +4,11 @@ author: "Emma Thompson"
date: "December 3, 2024" date: "December 3, 2024"
readTime: "4 min read" readTime: "4 min read"
tags: ["Economics", "Privacy", "Value"] tags: ["Economics", "Privacy", "Value"]
image: "/src/assets/white_keyb.jpg" image: "white_keyb.jpg"
description: "Why paying $20/month for digital freedom is the best investment you'll ever make. Breaking down the true cost of corporate data harvesting." description: "Why paying $20/month for digital freedom is the best investment you'll ever make. Breaking down the true cost of corporate data harvesting."
featured: false featured: false
draft: false draft: false
cat: "blog"
slug: "the-economics-of-digital-sovereignty" slug: "the-economics-of-digital-sovereignty"
--- ---

View File

@ -4,11 +4,11 @@ author: "HERO Team"
date: "December 15, 2024" date: "December 15, 2024"
readTime: "8 min read" readTime: "8 min read"
tags: ["Digital Sovereignty", "Privacy", "AI"] tags: ["Digital Sovereignty", "Privacy", "AI"]
image: "/src/assets/heart.jpg" image: "heart.jpg"
description: "In an era where tech giants control our digital lives, Personal Agents represent a fundamental shift toward individual sovereignty and privacy. Discover how HERO is leading this revolution." description: "In an era where tech giants control our digital lives, Personal Agents represent a fundamental shift toward individual sovereignty and privacy. Discover how HERO is leading this revolution."
featured: true featured: true
draft: false draft: false
cat: "blog"
slug: "the-future-of-digital-sovereignty-why-personal-agents-matter" slug: "the-future-of-digital-sovereignty-why-personal-agents-matter"
--- ---

View File

@ -2,8 +2,8 @@
title: "Transact" title: "Transact"
description: "Send and receive digital value safely and without intermediaries" description: "Send and receive digital value safely and without intermediaries"
icon: "Heart" icon: "Heart"
image: "/src/assets/transact.jpg" image: "transact.jpg"
cat: "capability"
order: 6 order: 6
slug: "transact" slug: "transact"
--- ---

View File

@ -3,10 +3,10 @@ title: "AI Agents on Your Terms"
author: "HERO Team" author: "HERO Team"
date: "2023-10-26" date: "2023-10-26"
readTime: "7 min read" readTime: "7 min read"
image: "/src/assets/itworks.jpg" image: "itworks.jpg"
iconname: "Brain"
description: "HERO connects with a wide range of AI agents for research, content creation, and task automation. All computation is done locally or via trusted partners." description: "HERO connects with a wide range of AI agents for research, content creation, and task automation. All computation is done locally or via trusted partners."
tags: ["components", "ai-agents", "how-it-works"] tags: ["components", "ai-agents", "how-it-works"]
cat: component
slug: ai-agents-on-your-terms slug: ai-agents-on-your-terms
--- ---

View File

@ -3,10 +3,11 @@ title: "Your Personal Agent"
author: "HERO Team" author: "HERO Team"
date: "2023-10-26" date: "2023-10-26"
readTime: "5 min read" readTime: "5 min read"
image: "/src/assets/balls.jpg" image: "balls.jpg"
description: "Your HERO acts as your digital assistant, managing messaging, meetings, calendar, documents, tasks, AI interactions, personal identity, credentials, and financial transactions." description: "Your HERO acts as your digital assistant, managing messaging, meetings, calendar, documents, tasks, AI interactions, personal identity, credentials, and financial transactions."
tags: ["components", "personal-agent", "how-it-works"] tags: ["components", "personal-agent", "how-it-works"]
cat: component iconname: "User"
order: 1
slug: personal-agent slug: personal-agent
--- ---

View File

@ -3,10 +3,11 @@ title: "A Private Ledger Just for You"
author: "HERO Team" author: "HERO Team"
date: "2023-10-26" date: "2023-10-26"
readTime: "8 min read" readTime: "8 min read"
image: "/src/assets/tech.jpg" image: "tech.jpg"
description: "Every HERO maintains a private blockchain ledger that verifies identity, manages access control, tracks interactions, and can communicate securely with other ledgers." description: "Every HERO maintains a private blockchain ledger that verifies identity, manages access control, tracks interactions, and can communicate securely with other ledgers."
tags: ["components", "ledger", "how-it-works"] tags: ["components", "ledger", "how-it-works"]
cat: component iconname: "Key"
order: 4
slug: private-ledger slug: private-ledger
--- ---

View File

@ -3,10 +3,11 @@ title: "Secure, Unbreakable Memory"
author: "HERO Team" author: "HERO Team"
date: "2023-10-26" date: "2023-10-26"
readTime: "6 min read" readTime: "6 min read"
image: "/src/assets/white_keyb.jpg" image: "white_keyb.jpg"
description: "Uses a zero-knowledge, quantum-safe dispersal algorithm. Memory is stored across multiple nodes with no single point of failure. You control the geographic placement of your data." description: "Uses a zero-knowledge, quantum-safe dispersal algorithm. Memory is stored across multiple nodes with no single point of failure. You control the geographic placement of your data."
tags: ["components", "memory", "how-it-works"] tags: ["components", "memory", "how-it-works"]
cat: component iconname: "Database"
order: 2
slug: secure-unbreakable-memory slug: secure-unbreakable-memory
--- ---

View File

@ -2,7 +2,7 @@
title: Dispute Resolution (AI & People) title: Dispute Resolution (AI & People)
slug: dispute-resolution-ai-and-people slug: dispute-resolution-ai-and-people
description: Explore the innovative dispute resolution mechanisms available within a digital freezone, combining AI efficiency with human oversight. description: Explore the innovative dispute resolution mechanisms available within a digital freezone, combining AI efficiency with human oversight.
image: /src/assets/disputeresolution.jpg image: disputeresolution.jpg
--- ---
Disputes are an inevitable part of any business or personal interaction. A digital freezone introduces a novel approach to dispute resolution, integrating the efficiency of artificial intelligence with the nuanced judgment of human experts, ensuring fair and swift outcomes. Disputes are an inevitable part of any business or personal interaction. A digital freezone introduces a novel approach to dispute resolution, integrating the efficiency of artificial intelligence with the nuanced judgment of human experts, ensuring fair and swift outcomes.

View File

@ -2,7 +2,7 @@
title: Keep Your Assets Safe Now and in Future title: Keep Your Assets Safe Now and in Future
slug: keep-your-assets-safe-now-and-in-future slug: keep-your-assets-safe-now-and-in-future
description: Discover how a digital freezone provides robust protection for your assets against current and future threats. description: Discover how a digital freezone provides robust protection for your assets against current and future threats.
image: /src/assets/world.jpg image: world.jpg
--- ---
In an era of increasing digital threats and economic uncertainties, securing your assets is more critical than ever. A digital freezone offers a fortified environment designed to protect your digital wealth, ensuring its safety both today and in the years to come. In an era of increasing digital threats and economic uncertainties, securing your assets is more critical than ever. A digital freezone offers a fortified environment designed to protect your digital wealth, ensuring its safety both today and in the years to come.

View File

@ -2,7 +2,7 @@
title: Legal and Financial Sovereignty title: Legal and Financial Sovereignty
slug: legal-and-financial-sovereignty slug: legal-and-financial-sovereignty
description: Understand how a digital freezone provides unparalleled legal and financial sovereignty for your operations. description: Understand how a digital freezone provides unparalleled legal and financial sovereignty for your operations.
image: /src/assets/freezone.jpg image: freezone.jpg
--- ---
In an increasingly interconnected world, maintaining legal and financial sovereignty is paramount for individuals and businesses alike. Digital freezones offer a revolutionary approach to achieving this, providing a secure and independent environment for your digital assets and operations. In an increasingly interconnected world, maintaining legal and financial sovereignty is paramount for individuals and businesses alike. Digital freezones offer a revolutionary approach to achieving this, providing a secure and independent environment for your digital assets and operations.

View File

@ -2,7 +2,7 @@
title: Ultimate in Convenience and Features title: Ultimate in Convenience and Features
slug: ultimate-in-convenience-and-features slug: ultimate-in-convenience-and-features
description: Experience unparalleled convenience and a rich suite of features designed to make your business life fun again within a digital freezone. description: Experience unparalleled convenience and a rich suite of features designed to make your business life fun again within a digital freezone.
image: /src/assets/stresssfree.jpg image: stresssfree.jpg
--- ---
Imagine a business environment where every tool you need is at your fingertips, processes are streamlined, and innovation thrives. A digital freezone delivers this reality, offering an ultimate blend of convenience and advanced features that transform the way you work. Imagine a business environment where every tool you need is at your fingertips, processes are streamlined, and innovation thrives. A digital freezone delivers this reality, offering an ultimate blend of convenience and advanced features that transform the way you work.

View File

@ -3,10 +3,10 @@ title: "Blockchain Identity"
author: "HERO Team" author: "HERO Team"
date: "2023-10-26" date: "2023-10-26"
readTime: "7 min read" readTime: "7 min read"
image: "/src/assets/heartblue.jpg" image: "heartblue.jpg"
description: "Cryptographically verified identity system built on blockchain technology. You control your reputation and trust relationships." description: "Cryptographically verified identity system built on blockchain technology. You control your reputation and trust relationships."
tags: ["technology", "blockchain", "identity", "security"] tags: ["technology", "blockchain", "identity", "security"]
cat: tech
slug: blockchain-identity slug: blockchain-identity
--- ---

View File

@ -3,10 +3,10 @@ title: "Peer-to-Peer Network"
author: "HERO Team" author: "HERO Team"
date: "2023-10-26" date: "2023-10-26"
readTime: "6 min read" readTime: "6 min read"
image: "/src/assets/sphere.jpg" image: "sphere.jpg"
description: "Direct communication between HEROs without central servers. Built on distributed protocols that ensure privacy and resilience." description: "Direct communication between HEROs without central servers. Built on distributed protocols that ensure privacy and resilience."
tags: ["technology", "p2p", "network", "communication"] tags: ["technology", "p2p", "network", "communication"]
cat: tech
slug: peer-to-peer-network slug: peer-to-peer-network
--- ---

View File

@ -3,10 +3,10 @@ title: "Quantum-Safe Storage"
author: "HERO Team" author: "HERO Team"
date: "2023-10-26" date: "2023-10-26"
readTime: "8 min read" readTime: "8 min read"
image: "/src/assets/swarm.jpg" image: "swarm.jpg"
description: "Post-quantum cryptography protects your data against future quantum computing threats. Memory is dispersed across multiple nodes with no single point of failure." description: "Post-quantum cryptography protects your data against future quantum computing threats. Memory is dispersed across multiple nodes with no single point of failure."
tags: ["technology", "quantum-safe", "storage", "security"] tags: ["technology", "quantum-safe", "storage", "security"]
cat: tech
slug: quantum-safe-storage slug: quantum-safe-storage
--- ---

View File

@ -3,10 +3,10 @@ title: "Zero-Knowledge Architecture"
author: "HERO Team" author: "HERO Team"
date: "2023-10-26" date: "2023-10-26"
readTime: "7 min read" readTime: "7 min read"
image: "/src/assets/person.jpg" image: "person.jpg"
description: "Advanced cryptographic techniques ensure that even HERO cannot access your data. Your information is encrypted before it leaves your device." description: "Advanced cryptographic techniques ensure that even HERO cannot access your data. Your information is encrypted before it leaves your device."
tags: ["technology", "zero-knowledge", "security"] tags: ["technology", "zero-knowledge", "security"]
cat: tech
slug: zero-knowledge-architecture slug: zero-knowledge-architecture
--- ---

View File

@ -13,7 +13,7 @@ import blogBackground from '../assets/myhero.jpg';
import defaultPostImage from '../assets/myhero.jpg'; // Using an existing image as a fallback import defaultPostImage from '../assets/myhero.jpg'; // Using an existing image as a fallback
// Use Vite's import.meta.glob to import all markdown files // Use Vite's import.meta.glob to import all markdown files
const modules = import.meta.glob('../blogs/*.md', { query: '?raw', import: 'default', eager: true }); const modules = import.meta.glob('../content/blog/*.md', { query: '?raw', import: 'default', eager: true });
const Blog = () => { const Blog = () => {
const [posts, setPosts] = useState([]); const [posts, setPosts] = useState([]);
@ -31,12 +31,10 @@ const Blog = () => {
// Extract slug from filename // Extract slug from filename
const slug = path.split('/').pop().replace('.md', ''); const slug = path.split('/').pop().replace('.md', '');
// Only include posts that are not drafts and have cat="blog" if (frontmatter.draft !== true) {
if (frontmatter.draft !== true && frontmatter.cat === 'blog') {
loadedPosts.push({ loadedPosts.push({
...frontmatter, ...frontmatter,
slug, slug,
// Ensure image path is correct for Vite, use defaultPostImage as fallback
image: frontmatter.image ? new URL(frontmatter.image, import.meta.url).href : defaultPostImage image: frontmatter.image ? new URL(frontmatter.image, import.meta.url).href : defaultPostImage
}); });
} }
@ -155,7 +153,7 @@ const Blog = () => {
</motion.h2> </motion.h2>
</div> </div>
<Link to={`/blog/${displayFeaturedPost.slug}`} className="block"> <Link to={`/blog/blog/${displayFeaturedPost.slug}`} className="block">
<motion.article <motion.article
initial={{ opacity: 0, y: 30 }} initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }} whileInView={{ opacity: 1, y: 0 }}
@ -253,7 +251,7 @@ const Blog = () => {
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8"> <div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
{blogPosts.map((post) => ( {blogPosts.map((post) => (
<Link to={`/blog/${post.slug}`} className="block" key={post.slug}> <Link to={`/blog/blog/${post.slug}`} className="block" key={post.slug}>
<motion.article <motion.article
initial={{ opacity: 0, y: 30 }} initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }} whileInView={{ opacity: 1, y: 0 }}
@ -271,7 +269,7 @@ const Blog = () => {
</div> </div>
<div className="p-6"> <div className="p-6">
<div className="flex flex-wrap gap-2 mb-3"> <div className="flex flex-wrap gap-2 mb-3">
{post.tags.slice(0, 2).map((tag) => ( {post.tags?.slice(0, 2).map((tag) => (
<span <span
key={tag} key={tag}
className="px-2 py-1 bg-purple-600/20 text-purple-400 text-xs rounded-full" className="px-2 py-1 bg-purple-600/20 text-purple-400 text-xs rounded-full"

View File

@ -1,5 +1,5 @@
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { useParams, Link } from 'react-router-dom'; import { useParams, Link, useLocation } from 'react-router-dom';
import ReactMarkdown from 'react-markdown'; import ReactMarkdown from 'react-markdown';
import remarkGfm from 'remark-gfm'; import remarkGfm from 'remark-gfm';
import matter from 'gray-matter'; import matter from 'gray-matter';
@ -7,8 +7,11 @@ import { ArrowLeft, Calendar, User, Tag } from 'lucide-react';
import { Button } from '@/components/ui/button'; import { Button } from '@/components/ui/button';
import { Buffer } from 'buffer'; // Explicitly import Buffer import { Buffer } from 'buffer'; // Explicitly import Buffer
const imageModules = import.meta.glob('../assets/*.jpg', { eager: true, import: 'default' });
const BlogPost = () => { const BlogPost = () => {
const { slug } = useParams(); const { category, slug } = useParams(); // category will be undefined for /component/:slug
const location = useLocation();
const [post, setPost] = useState(null); const [post, setPost] = useState(null);
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
const [error, setError] = useState(null); const [error, setError] = useState(null);
@ -16,27 +19,54 @@ const BlogPost = () => {
useEffect(() => { useEffect(() => {
const loadPost = async () => { const loadPost = async () => {
try { try {
const allModules = import.meta.glob('../blogs/*.md', { query: '?raw', import: 'default', eager: true }); let contentModule;
let foundPost = null; let basePath;
let currentSlug = slug; // Use slug from useParams
for (const path in allModules) { // Determine content type based on pathname
const content = allModules[path]; const pathSegments = location.pathname.split('/').filter(Boolean);
const { data: frontmatter, content: markdownContent } = matter(content); let contentType = '';
// Generate slug from filename if not present in frontmatter
const postSlug = frontmatter.slug || path.split('/').pop().replace('.md', '');
// Check if the generated slug matches the URL slug if (pathSegments[0] === 'blog' && pathSegments.length >= 3) {
if (postSlug === slug) { contentType = 'blog';
foundPost = { frontmatter, content: markdownContent }; // For blog posts, category is the second segment, slug is the third
break; currentSlug = pathSegments[2];
} basePath = `../content/blog/${pathSegments[1]}/`; // blog/:category/:slug
} } else if (pathSegments[0] === 'component' && pathSegments.length >= 2) {
contentType = 'component';
if (foundPost) { currentSlug = pathSegments[1]; // component/:slug
setPost(foundPost); basePath = '../content/component/';
} else if (pathSegments[0] === 'technology' && pathSegments.length >= 2) {
contentType = 'tech';
currentSlug = pathSegments[1];
basePath = '../content/tech/';
} else if (pathSegments[0] === 'freezone' && pathSegments.length >= 2) {
contentType = 'freezone';
currentSlug = pathSegments[1];
basePath = '../content/freezone/';
} else { } else {
setError('Post not found'); setError('Invalid URL path for content.');
setLoading(false);
return;
}
try {
const modules = import.meta.glob('../content/**/*.md', { as: 'raw', eager: true });
const fullPath = `${basePath}${currentSlug}.md`;
contentModule = modules[fullPath];
if (!contentModule) {
throw new Error(`Markdown file not found at ${fullPath}`);
}
const { data: frontmatter, content: markdownContent } = matter(contentModule);
// Resolve image path
const resolvedImage = frontmatter.image ? imageModules[`../assets/${frontmatter.image}`] : null;
setPost({ frontmatter: { ...frontmatter, image: resolvedImage }, content: markdownContent, contentType }); // Store contentType and resolved image with post
} catch (err) {
setError(`Failed to load content: ${err.message}. Please ensure the file exists and is correctly formatted.`);
} }
} catch (err) { } catch (err) {
setError(err.message); setError(err.message);
@ -46,7 +76,7 @@ const BlogPost = () => {
}; };
loadPost(); loadPost();
}, [slug]); }, [location.pathname, slug]); // Depend on pathname and slug
if (loading) { if (loading) {
return ( return (
@ -64,14 +94,33 @@ const BlogPost = () => {
); );
} }
const getBackLink = () => {
// Use post.contentType to determine the back link
if (!post || !post.contentType) {
return '/'; // Default to home if content type is unknown
}
switch (post.contentType) {
case 'component':
return '/how';
case 'blog':
return '/blog';
case 'tech':
return '/technology';
case 'freezone':
return '/freezone';
default:
return '/';
}
};
return ( return (
<div className="min-h-screen bg-gray-900"> <div className="min-h-screen bg-gray-900">
<div className="container mx-auto px-4 py-8 max-w-4xl"> <div className="container mx-auto px-4 py-8 max-w-4xl">
<div className="mb-8"> <div className="mb-8">
<Link to="/"> <Link to={getBackLink()}>
<Button className="bg-gray-800 hover:bg-gray-700 text-white"> <Button className="bg-gray-800 hover:bg-gray-700 text-white">
<ArrowLeft className="mr-2 h-4 w-4" /> <ArrowLeft className="mr-2 h-4 w-4" />
Back Back to {post?.contentType ? post.contentType.charAt(0).toUpperCase() + post.contentType.slice(1) : 'Previous Page'}
</Button> </Button>
</Link> </Link>
</div> </div>
@ -161,4 +210,4 @@ const BlogPost = () => {
); );
}; };
export default BlogPost; export default BlogPost;

View File

@ -15,7 +15,7 @@ const disputeresolutionImage = new URL('../assets/disputeresolution.jpg', import
const stresssfreeImage = new URL('../assets/stresssfree.jpg', import.meta.url).href; const stresssfreeImage = new URL('../assets/stresssfree.jpg', import.meta.url).href;
// Use Vite's import.meta.glob to import all freezone markdown files // Use Vite's import.meta.glob to import all freezone markdown files
const freezoneModules = import.meta.glob('../blogs/freezone_*.md', { query: '?raw', import: 'default', eager: true }); const freezoneModules = import.meta.glob('../content/freezone/*.md', { query: '?raw', import: 'default', eager: true });
const Freezone = () => { const Freezone = () => {
const [articles, setArticles] = useState([]); const [articles, setArticles] = useState([]);
@ -155,7 +155,7 @@ const Freezone = () => {
)) ))
) : ( ) : (
articles.map((article, index) => ( articles.map((article, index) => (
<Link key={index} to={`/freezone/${article.slug}`} className="block"> <Link key={index} to={`/blog/freezone/${article.slug}`} className="block">
<FeatureCard <FeatureCard
icon={article.icon} icon={article.icon}
title={article.title} title={article.title}

View File

@ -8,14 +8,13 @@ import FeatureCard from '../components/FeatureCard';
import matter from 'gray-matter'; // Import matter import matter from 'gray-matter'; // Import matter
// Import images // Import images
import agentImage from '../assets/balls.jpg'; // AI Agent Creation
import memoryImage from '../assets/white_keyb.jpg'; // Digital privacy/memory
import ledgerImage from '../assets/tech.jpg'; // Blockchain visualization
import networkImage from '../assets/itworks.jpg'; // Main background image
import itworksTechImage from '../assets/itworks_tech.jpg'; // Maximum security section image import itworksTechImage from '../assets/itworks_tech.jpg'; // Maximum security section image
import networkImage from '../assets/itworks.jpg'; // Main background image
// Use Vite's import.meta.glob to import all component markdown files // Use Vite's import.meta.glob to import all component markdown files and images
const componentModules = import.meta.glob('../blogs/component_*.md', { as: 'raw', eager: true }); const componentModules = import.meta.glob('../content/component/*.md', { as: 'raw', eager: true });
const imageModules = import.meta.glob('../assets/*.jpg', { eager: true, import: 'default' });
const iconComponents = { User, Shield, Brain, Network, Database, Key };
const How = () => { const How = () => {
const [components, setComponents] = useState([]); const [components, setComponents] = useState([]);
@ -30,27 +29,15 @@ const How = () => {
const content = componentModules[path]; const content = componentModules[path];
const { data: frontmatter } = matter(content); const { data: frontmatter } = matter(content);
// Map icon strings to actual components const IconComponent = iconComponents[frontmatter.iconname];
const iconMap = { const imagePath = `../assets/${frontmatter.image}`; // Construct full path
'User': <User size={32} />, const importedImage = imageModules[imagePath];
'Database': <Database size={32} />,
'Brain': <Brain size={32} />,
'Key': <Key size={32} />
};
// Map image paths to actual imports
const imageMap = {
'/src/assets/balls.jpg': agentImage,
'/src/assets/white_keyb.jpg': memoryImage,
'/src/assets/itworks.jpg': networkImage,
'/src/assets/tech.jpg': ledgerImage
};
loadedComponents.push({ loadedComponents.push({
icon: iconMap[frontmatter.icon] || <User size={32} />, icon: IconComponent ? <IconComponent size={32} /> : <User size={32} />,
title: frontmatter.title, title: frontmatter.title,
description: frontmatter.description, description: frontmatter.description,
image: imageMap[frontmatter.image] || agentImage, image: importedImage,
order: frontmatter.order || 999, order: frontmatter.order || 999,
slug: frontmatter.slug || frontmatter.title.toLowerCase().replace(/\s+/g, '-') slug: frontmatter.slug || frontmatter.title.toLowerCase().replace(/\s+/g, '-')
}); });
@ -61,37 +48,6 @@ const How = () => {
setComponents(loadedComponents); setComponents(loadedComponents);
} catch (error) { } catch (error) {
console.error('Error loading components:', error); console.error('Error loading components:', error);
// Fallback to static data if loading fails (optional, but good for robustness)
setComponents([
{
icon: <User size={32} />,
title: "Your Personal Agent",
description: "Your HERO acts as your digital assistant, managing messaging, meetings, calendar, documents, tasks, AI interactions, personal identity, credentials, and financial transactions.",
image: agentImage,
slug: "personal-agent"
},
{
icon: <Database size={32} />,
title: "Secure, Unbreakable Memory",
description: "Uses a zero-knowledge, quantum-safe dispersal algorithm. Memory is stored across multiple nodes with no single point of failure. You control the geographic placement of your data.",
image: memoryImage,
slug: "secure-unbreakable-memory"
},
{
icon: <Brain size={32} />,
title: "AI Agents on Your Terms",
description: "HERO connects with a wide range of AI agents for research, content creation, and task automation. All computation is done locally or via trusted partners.",
image: networkImage,
slug: "ai-agents-on-your-terms"
},
{
icon: <Key size={32} />,
title: "A Private Ledger Just for You",
description: "Every HERO maintains a private blockchain ledger that verifies identity, manages access control, tracks interactions, and can communicate securely with other ledgers.",
image: ledgerImage,
slug: "private-ledger"
}
]);
} finally { } finally {
setLoading(false); setLoading(false);
} }

View File

@ -15,7 +15,7 @@ import securityImage from '../assets/person.jpg'; // Digital privacy
import swarmImage from '../assets/swarm.jpg'; // AI Agent Creation import swarmImage from '../assets/swarm.jpg'; // AI Agent Creation
// Use Vite's import.meta.glob to import all tech markdown files // Use Vite's import.meta.glob to import all tech markdown files
const techModules = import.meta.glob('../blogs/tech_*.md', { query: '?raw', import: 'default', eager: true }); const techModules = import.meta.glob('../content/tech/*.md', { query: '?raw', import: 'default', eager: true });
const Technology = () => { const Technology = () => {
const [technologies, setTechnologies] = useState([]); const [technologies, setTechnologies] = useState([]);
@ -225,7 +225,7 @@ const Technology = () => {
)) ))
) : ( ) : (
technologies.map((spec, index) => ( technologies.map((spec, index) => (
<Link key={index} to={`/tech/${spec.slug}`} className="block"> <Link key={index} to={`/blog/tech/${spec.slug}`} className="block">
<FeatureCard <FeatureCard
icon={spec.icon} icon={spec.icon}
title={spec.title} title={spec.title}

View File

@ -6,6 +6,7 @@ import path from 'path'
// https://vite.dev/config/ // https://vite.dev/config/
export default defineConfig({ export default defineConfig({
plugins: [react(),tailwindcss()], plugins: [react(),tailwindcss()],
assetsInclude: ['**/*.md'],
define: { define: {
global: 'window', global: 'window',
'process.env': {}, // Define process.env as an empty object 'process.env': {}, // Define process.env as an empty object