Initial Phoenix Sankofa Cloud setup

- Complete project structure with Next.js frontend
- GraphQL API backend with Apollo Server
- Portal application with NextAuth
- Crossplane Proxmox provider
- GitOps configurations
- CI/CD pipelines
- Testing infrastructure (Vitest, Jest, Go tests)
- Error handling and monitoring
- Security hardening
- UI component library
- Documentation
This commit is contained in:
defiQUG
2025-11-28 12:54:33 -08:00
commit 6f28146ac3
229 changed files with 43136 additions and 0 deletions

140
src/app/about/page.tsx Normal file
View File

@@ -0,0 +1,140 @@
import Link from 'next/link'
import { Button } from '@/components/ui/button'
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
export default function AboutPage() {
return (
<main className="min-h-screen bg-studio-black">
{/* Header */}
<header className="border-b border-studio-medium bg-studio-dark">
<div className="mx-auto flex max-w-7xl items-center justify-between px-4 py-4">
<Link href="/" className="text-2xl font-bold text-white">
Phoenix <span className="text-phoenix-fire">Sankofa</span> Cloud
</Link>
<nav className="flex gap-4">
<Link href="/" className="text-gray-400 hover:text-white">
Home
</Link>
<Link href="/products" className="text-gray-400 hover:text-white">
Products
</Link>
<Link href="/manifesto" className="text-gray-400 hover:text-white">
Manifesto
</Link>
</nav>
</div>
</header>
{/* Hero */}
<section className="py-24 px-4">
<div className="mx-auto max-w-4xl text-center">
<h1 className="mb-6 text-5xl font-bold text-white md:text-6xl">
The Deeper Meaning
</h1>
<p className="text-xl text-gray-300">
Understanding the Akan philosophy of Sankofa and the Phoenix transformation
</p>
</div>
</section>
{/* Philosophy Section */}
<section className="py-16 px-4">
<div className="mx-auto max-w-4xl space-y-12">
<Card>
<CardHeader>
<CardTitle className="text-phoenix-fire">Sankofa and Akan Cosmology</CardTitle>
</CardHeader>
<CardContent className="space-y-4 text-gray-300">
<p>
In Akan cosmology, the universe is circular, not linear; interconnected, not hierarchical;
ancestrally governed, not isolated. Sankofa represents the return to origin to complete the cycle.
</p>
<p>
It echoes the Akan belief that life, identity, and destiny (nkrabea) must be aligned with
source (kra), ancestral memory (nananom nsamanfoɔ), and lineage (abusua).
</p>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle className="text-sankofa-gold">Sankofa and Time</CardTitle>
</CardHeader>
<CardContent className="space-y-4 text-gray-300">
<p>
Western time is linear. Akan time is recursive events are patterns that return.
</p>
<p className="text-lg font-semibold text-white">
Progress is a spiral, not a straight line.
</p>
<p>
The future is found in the past; the past informs the future. This is why a bird looking
back while flying forward is perfect as the symbol.
</p>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle className="text-neon-cyan">Sankofa and the Soul</CardTitle>
</CardHeader>
<CardContent className="space-y-4 text-gray-300">
<p>
In Akan thought, "Kra" is the divine soul, given by Nyame (Creator). It comes from a
spiritual origin place, and its mission is learned by reflecting on where it came from.
</p>
<p className="text-lg font-semibold text-white">
Sankofa is the soul's act of remembering itself.
</p>
<p>It is spiritual self-retrieval.</p>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle className="text-phoenix-fire">Sankofa as Technology</CardTitle>
</CardHeader>
<CardContent className="space-y-4 text-gray-300">
<p>
Sankofa is an algorithm. A cosmological protocol. A recursive pattern of:
</p>
<p className="text-2xl font-bold text-center text-white">
Remember Retrieve Restore Rise
</p>
<p>
Sankofa is how individuals, families, nations, and civilizations rebuild themselves.
</p>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle className="text-sankofa-gold">The PhoenixSankofa Integration</CardTitle>
</CardHeader>
<CardContent className="space-y-4 text-gray-300">
<p>
<strong className="text-white">Phoenix</strong> = fire, rebirth, immortality
</p>
<p>
<strong className="text-white">Sankofa</strong> = return, reclaim, rise forward
</p>
<p className="text-xl font-semibold text-center text-white mt-6">
Together, they form: <span className="text-phoenix-fire">Rebirth + Ancestral Return = Sovereign Global Power</span>
</p>
</CardContent>
</Card>
</div>
</section>
{/* CTA */}
<section className="py-16 px-4">
<div className="mx-auto max-w-4xl text-center">
<Link href="/manifesto">
<Button variant="phoenix" size="lg">Read the Full Manifesto</Button>
</Link>
</div>
</section>
</main>
)
}

60
src/app/globals.css Normal file
View File

@@ -0,0 +1,60 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
:root {
--background: 10 10 10;
--foreground: 255 255 255;
}
* {
@apply border-studio-medium;
}
body {
@apply bg-studio-black text-foreground;
}
}
@layer utilities {
.text-balance {
text-wrap: balance;
}
.glow-phoenix {
box-shadow: 0 0 20px rgba(255, 69, 0, 0.5);
}
.glow-sankofa {
box-shadow: 0 0 20px rgba(255, 215, 0, 0.5);
}
.glow-neon {
box-shadow: 0 0 20px rgba(0, 255, 209, 0.5);
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
.sr-only-focusable:focus {
position: static;
width: auto;
height: auto;
padding: inherit;
margin: inherit;
overflow: visible;
clip: auto;
white-space: normal;
}
}

32
src/app/layout.tsx Normal file
View File

@@ -0,0 +1,32 @@
import type { Metadata } from 'next'
import { Inter } from 'next/font/google'
import './globals.css'
import { Providers } from './providers'
import { ErrorBoundary } from '@/components/error-boundary'
const inter = Inter({
subsets: ['latin'],
variable: '--font-inter',
})
export const metadata: Metadata = {
title: 'Phoenix Sankofa Cloud',
description: 'The sovereign cloud born of fire and ancestral wisdom.',
}
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en" className="dark">
<body className={`${inter.variable} font-sans antialiased`}>
<ErrorBoundary>
<Providers>{children}</Providers>
</ErrorBoundary>
</body>
</html>
)
}

167
src/app/manifesto/page.tsx Normal file
View File

@@ -0,0 +1,167 @@
import Link from 'next/link'
import { Button } from '@/components/ui/button'
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
export default function ManifestoPage() {
const principles = [
{
title: 'Sovereignty',
description: 'Infrastructure must serve sovereignty, not subvert it. Every region, nation, and community has the right to control its own data, govern its own infrastructure, and determine its own technological destiny.',
},
{
title: 'Ancestral Wisdom',
description: 'Technology must remember its origins. The cloud must learn from the past, honor ancestral knowledge, and integrate traditional wisdom with modern innovation.',
},
{
title: 'Identity',
description: 'Infrastructure must reflect identity. Technology is not neutral. We build infrastructure that reflects our cultural identity, honors our heritage, and serves our communities.',
},
{
title: 'Recursive Learning',
description: 'Progress is a spiral, not a straight line. We build systems that remember what came before, learn from history, and return to origin to complete cycles.',
},
{
title: 'Global Cultural Intelligence',
description: 'The cloud must understand culture. Across 325 regions, we build infrastructure that respects cultural contexts, adapts to local needs, and honors diverse traditions.',
},
{
title: 'Rebirth and Transformation',
description: 'Like the Phoenix, we rise from fire. We build infrastructure that transforms continuously, renews itself, and emerges stronger from every cycle.',
},
]
return (
<main className="min-h-screen bg-studio-black">
{/* Header */}
<header className="border-b border-studio-medium bg-studio-dark">
<div className="mx-auto flex max-w-7xl items-center justify-between px-4 py-4">
<Link href="/" className="text-2xl font-bold text-white">
Phoenix <span className="text-phoenix-fire">Sankofa</span> Cloud
</Link>
<nav className="flex gap-4">
<Link href="/" className="text-gray-400 hover:text-white">
Home
</Link>
<Link href="/about" className="text-gray-400 hover:text-white">
About
</Link>
<Link href="/products" className="text-gray-400 hover:text-white">
Products
</Link>
</nav>
</div>
</header>
{/* Hero */}
<section className="py-24 px-4">
<div className="mx-auto max-w-4xl text-center">
<h1 className="mb-6 text-5xl font-bold text-white md:text-6xl">
The Sovereign Cloud Manifesto
</h1>
<p className="text-xl text-gray-300">
A declaration of technological sovereignty
</p>
</div>
</section>
{/* Declaration */}
<section className="py-16 px-4">
<div className="mx-auto max-w-4xl">
<Card className="border-phoenix-fire/50 bg-gradient-to-br from-phoenix-fire/10 to-sankofa-gold/10">
<CardContent className="pt-6">
<div className="space-y-4 text-lg text-white">
<p className="text-2xl font-bold">We declare the right to technological sovereignty.</p>
<p className="text-2xl font-bold">We declare the right to infrastructure that reflects our identity.</p>
<p className="text-2xl font-bold">We declare the right to cloud computing that honors our ancestors.</p>
<p className="text-2xl font-bold">We declare the right to AI that remembers where it came from.</p>
</div>
</CardContent>
</Card>
</div>
</section>
{/* Principles */}
<section className="py-16 px-4">
<div className="mx-auto max-w-6xl">
<h2 className="mb-12 text-center text-4xl font-bold text-white">
Principles
</h2>
<div className="grid gap-8 md:grid-cols-2">
{principles.map((principle) => (
<Card key={principle.title}>
<CardHeader>
<CardTitle className="text-phoenix-fire">{principle.title}</CardTitle>
</CardHeader>
<CardContent>
<p className="text-gray-300">{principle.description}</p>
</CardContent>
</Card>
))}
</div>
</div>
</section>
{/* The Promise */}
<section className="py-16 px-4">
<div className="mx-auto max-w-4xl">
<Card>
<CardHeader>
<CardTitle className="text-3xl text-center text-sankofa-gold">The Promise</CardTitle>
</CardHeader>
<CardContent className="space-y-6 pt-6">
<p className="text-center text-2xl font-bold text-white">
We promise infrastructure that:
</p>
<div className="space-y-4 text-lg text-gray-300">
<p className="flex items-center gap-3">
<span className="text-phoenix-fire text-2xl"></span>
<strong className="text-white">Remembers</strong> its origins
</p>
<p className="flex items-center gap-3">
<span className="text-phoenix-fire text-2xl"></span>
<strong className="text-white">Retrieves</strong> ancestral wisdom
</p>
<p className="flex items-center gap-3">
<span className="text-phoenix-fire text-2xl"></span>
<strong className="text-white">Restores</strong> identity and sovereignty
</p>
<p className="flex items-center gap-3">
<span className="text-phoenix-fire text-2xl"></span>
<strong className="text-white">Rises</strong> forward with purpose
</p>
</div>
<p className="mt-8 text-center text-3xl font-bold text-white">
Remember Retrieve Restore Rise
</p>
<p className="text-center text-gray-400">
This is the Sankofa cycle. This is the Phoenix transformation.
</p>
<p className="text-center text-2xl font-bold text-phoenix-fire">
This is Phoenix Sankofa Cloud.
</p>
</CardContent>
</Card>
</div>
</section>
{/* CTA */}
<section className="py-16 px-4">
<div className="mx-auto max-w-4xl text-center">
<h2 className="mb-6 text-3xl font-bold text-white">
Join the Movement
</h2>
<p className="mb-8 text-xl text-gray-400">
If you believe in technological sovereignty, ancestral wisdom, and identity-based infrastructure,
</p>
<p className="mb-8 text-xl font-semibold text-white">
Join us. Build with us. Rise with us.
</p>
<Link href="/">
<Button variant="phoenix" size="lg">Get Started</Button>
</Link>
</div>
</section>
</main>
)
}

34
src/app/page.test.tsx Normal file
View File

@@ -0,0 +1,34 @@
import { describe, it, expect } from 'vitest'
import { render, screen } from '@/lib/test-utils'
import Home from './page'
describe('Home Page', () => {
it('should render the main heading', () => {
render(<Home />)
expect(screen.getByRole('heading', { level: 1, name: /phoenix.*sankofa.*cloud/i })).toBeInTheDocument()
})
it('should render the tagline', () => {
render(<Home />)
expect(screen.getByText(/the sovereign cloud born of fire and ancestral wisdom/i)).toBeInTheDocument()
})
it('should render the Remember → Retrieve → Restore → Rise text', () => {
render(<Home />)
expect(screen.getByText(/remember.*retrieve.*restore.*rise/i)).toBeInTheDocument()
})
it('should render navigation links', () => {
render(<Home />)
expect(screen.getByRole('link', { name: /learn more/i })).toBeInTheDocument()
expect(screen.getByRole('link', { name: /products/i })).toBeInTheDocument()
})
it('should render feature cards', () => {
render(<Home />)
expect(screen.getByText(/phoenix fire/i)).toBeInTheDocument()
expect(screen.getByText(/sankofa memory/i)).toBeInTheDocument()
expect(screen.getByText(/sovereign power/i)).toBeInTheDocument()
})
})

110
src/app/page.tsx Normal file
View File

@@ -0,0 +1,110 @@
import Link from 'next/link'
import { Button } from '@/components/ui/button'
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
export default function Home() {
return (
<main className="min-h-screen bg-studio-black">
{/* Hero Section */}
<section className="relative flex min-h-screen flex-col items-center justify-center overflow-hidden px-4">
<div className="absolute inset-0 bg-gradient-to-br from-phoenix-fire/20 via-transparent to-sankofa-gold/20" />
<div className="relative z-10 max-w-4xl text-center">
<h1 className="mb-6 text-5xl font-bold tracking-tight text-white md:text-7xl">
Phoenix{' '}
<span className="bg-gradient-to-r from-phoenix-fire to-sankofa-gold bg-clip-text text-transparent">
Sankofa
</span>{' '}
Cloud
</h1>
<p className="mb-8 text-xl text-gray-300 md:text-2xl">
The sovereign cloud born of fire and ancestral wisdom.
</p>
<p className="mb-12 text-lg text-gray-400">
Remember Retrieve Restore Rise
</p>
<div className="flex flex-col gap-4 sm:flex-row sm:justify-center">
<Link href="/about">
<Button variant="phoenix" size="lg">Learn More</Button>
</Link>
<Link href="/products">
<Button variant="outline" size="lg">Products</Button>
</Link>
</div>
</div>
</section>
{/* Features Section */}
<section className="py-24 px-4">
<div className="mx-auto max-w-6xl">
<h2 className="mb-12 text-center text-4xl font-bold text-white">
Sovereign. Ancestral. Transformative.
</h2>
<div className="grid gap-8 md:grid-cols-3">
<Card>
<CardHeader>
<CardTitle className="text-phoenix-fire">Phoenix Fire</CardTitle>
<CardDescription>
Rebirth through transformation
</CardDescription>
</CardHeader>
<CardContent>
<p className="text-gray-300">
Infrastructure that continuously transforms and renews, rising from every challenge like the Phoenix.
</p>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle className="text-sankofa-gold">Sankofa Memory</CardTitle>
<CardDescription>
Return to origin, rise forward
</CardDescription>
</CardHeader>
<CardContent>
<p className="text-gray-300">
Systems that remember their origins, retrieve ancestral wisdom, and rise forward with purpose.
</p>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle className="text-neon-cyan">Sovereign Power</CardTitle>
<CardDescription>
True technological sovereignty
</CardDescription>
</CardHeader>
<CardContent>
<p className="text-gray-300">
Complete control over infrastructure, data, and destiny across 325 global regions.
</p>
</CardContent>
</Card>
</div>
</div>
</section>
{/* CTA Section */}
<section className="py-24 px-4">
<div className="mx-auto max-w-4xl text-center">
<h2 className="mb-6 text-4xl font-bold text-white">
Join the Sovereign Cloud Movement
</h2>
<p className="mb-8 text-xl text-gray-400">
Build infrastructure that honors identity and serves sovereignty.
</p>
<Link href="/manifesto">
<Button variant="phoenix" size="lg">Read the Manifesto</Button>
</Link>
</div>
</section>
</main>
)
}

134
src/app/products/page.tsx Normal file
View File

@@ -0,0 +1,134 @@
import Link from 'next/link'
import { Button } from '@/components/ui/button'
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
export default function ProductsPage() {
const products = [
{
category: 'Compute',
items: [
{ name: 'PhoenixCore Compute', description: 'Core compute engine powered by Phoenix fire' },
{ name: 'SankofaEdge Nodes', description: 'Edge nodes that remember and return data' },
{ name: 'AkanFire VM Engine', description: 'High-performance VMs with Akan heritage' },
],
},
{
category: 'Storage',
items: [
{ name: 'OkraVault Storage', description: 'Storage for the soul of your data' },
{ name: 'Nananom Archive', description: 'Long-term archival with ancestral memory' },
{ name: 'Egg of the Phoenix Object Store', description: 'Object storage for transformation' },
],
},
{
category: 'Networking',
items: [
{ name: 'SankofaGrid Global Mesh', description: 'Global network mesh that remembers' },
{ name: 'AkanSphere Edge Routing', description: 'Edge routing with cultural intelligence' },
{ name: 'PhoenixFlight Network Fabric', description: 'High-performance network fabric' },
],
},
{
category: 'AI & Machine Learning',
items: [
{ name: 'Firebird AI Engine', description: 'AI that transforms like fire' },
{ name: 'Sankofa Memory Model', description: 'AI models that remember and learn' },
{ name: 'Ancestral Neural Fabric', description: 'Distributed AI with ancestral patterns' },
],
},
{
category: 'Security',
items: [
{ name: 'Aegis of Akan Shield', description: 'Comprehensive security platform' },
{ name: 'PhoenixGuard IAM', description: 'Identity and access management' },
{ name: 'Nsamankom Sentinel', description: 'Security monitoring with ancestral protection' },
],
},
{
category: 'Identity',
items: [
{ name: 'OkraID', description: 'Soul-powered identity framework' },
{ name: 'AkanAuth Sovereign Identity Plane', description: 'Sovereign authentication platform' },
],
},
]
return (
<main className="min-h-screen bg-studio-black">
{/* Header */}
<header className="border-b border-studio-medium bg-studio-dark">
<div className="mx-auto flex max-w-7xl items-center justify-between px-4 py-4">
<Link href="/" className="text-2xl font-bold text-white">
Phoenix <span className="text-phoenix-fire">Sankofa</span> Cloud
</Link>
<nav className="flex gap-4">
<Link href="/" className="text-gray-400 hover:text-white">
Home
</Link>
<Link href="/about" className="text-gray-400 hover:text-white">
About
</Link>
<Link href="/manifesto" className="text-gray-400 hover:text-white">
Manifesto
</Link>
</nav>
</div>
</header>
{/* Hero */}
<section className="py-24 px-4">
<div className="mx-auto max-w-4xl text-center">
<h1 className="mb-6 text-5xl font-bold text-white md:text-6xl">
Product Architecture
</h1>
<p className="text-xl text-gray-300">
Infrastructure services themed in Phoenix + Akan cosmology
</p>
</div>
</section>
{/* Products Grid */}
<section className="py-16 px-4">
<div className="mx-auto max-w-7xl space-y-16">
{products.map((category) => (
<div key={category.category}>
<h2 className="mb-8 text-3xl font-bold text-white">
{category.category}
</h2>
<div className="grid gap-6 md:grid-cols-2 lg:grid-cols-3">
{category.items.map((item) => (
<Card key={item.name}>
<CardHeader>
<CardTitle className="text-lg">{item.name}</CardTitle>
</CardHeader>
<CardContent>
<CardDescription className="text-gray-400">
{item.description}
</CardDescription>
</CardContent>
</Card>
))}
</div>
</div>
))}
</div>
</section>
{/* CTA */}
<section className="py-16 px-4">
<div className="mx-auto max-w-4xl text-center">
<h2 className="mb-6 text-3xl font-bold text-white">
Ready to Build?
</h2>
<p className="mb-8 text-xl text-gray-400">
Start your sovereign cloud journey today.
</p>
<Link href="/manifesto">
<Button variant="phoenix" size="lg">Learn More</Button>
</Link>
</div>
</section>
</main>
)
}

46
src/app/providers.tsx Normal file
View File

@@ -0,0 +1,46 @@
'use client'
import { ApolloProvider } from '@apollo/client'
import { apolloClient } from '@/lib/graphql/client'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { useState } from 'react'
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
import { Toaster } from '@/components/ui/toaster'
export function Providers({ children }: { children: React.ReactNode }) {
const [queryClient] = useState(
() =>
new QueryClient({
defaultOptions: {
queries: {
staleTime: 60 * 1000, // 1 minute
refetchOnWindowFocus: false,
retry: (failureCount, error) => {
// Don't retry on 4xx errors
if (error && typeof error === 'object' && 'statusCode' in error) {
const statusCode = error.statusCode as number
if (statusCode >= 400 && statusCode < 500) {
return false
}
}
return failureCount < 3
},
},
mutations: {
retry: false,
},
},
})
)
return (
<ApolloProvider client={apolloClient}>
<QueryClientProvider client={queryClient}>
{children}
{process.env.NODE_ENV === 'development' && <ReactQueryDevtools initialIsOpen={false} />}
<Toaster />
</QueryClientProvider>
</ApolloProvider>
)
}