Prettier format pending files

This commit is contained in:
Builder.io 2025-11-11 21:10:35 +00:00
parent c60daa76ee
commit 68ddb5ca8c
17 changed files with 970 additions and 399 deletions

View file

@ -235,7 +235,11 @@ export default function EthosGuild() {
{/* Tabs: Overview, Features, Curriculum, etc */}
<section>
<Tabs value={activeTab} onValueChange={setActiveTab} className="w-full">
<Tabs
value={activeTab}
onValueChange={setActiveTab}
className="w-full"
>
<TabsList className="grid w-full grid-cols-3 bg-black/50 border border-pink-500/30">
<TabsTrigger
value="overview"

View file

@ -49,11 +49,7 @@ const curriculumModules: CurriculumModule[] = [
"Master the core sound design and production techniques that define AeThex audio.",
level: "foundation",
duration: "4 hrs",
focus: [
"Synthwave aesthetics",
"Synthesis basics",
"Drum programming",
],
focus: ["Synthwave aesthetics", "Synthesis basics", "Drum programming"],
lessons: [
{
title: "The Synthwave Sound: History & Vibes",
@ -121,8 +117,7 @@ const curriculumModules: CurriculumModule[] = [
},
{
title: "Spatial Audio & 3D Sound Panning",
summary:
"Position sounds in 3D space for immersive game environments.",
summary: "Position sounds in 3D space for immersive game environments.",
status: "coming_soon",
},
{
@ -174,8 +169,7 @@ const curriculumModules: CurriculumModule[] = [
},
{
title: "Adaptive Music for Games",
summary:
"Create stems and variations that respond to gameplay states.",
summary: "Create stems and variations that respond to gameplay states.",
status: "coming_soon",
},
{
@ -250,7 +244,8 @@ export default function DocsCurriculumEthos() {
const highlights = [
{
title: "Synthwave-focused",
description: "All lessons aligned to AeThex sound and the '80s aesthetic.",
description:
"All lessons aligned to AeThex sound and the '80s aesthetic.",
icon: Music,
},
{
@ -321,8 +316,8 @@ export default function DocsCurriculumEthos() {
</CardTitle>
<CardDescription className="text-gray-300">
Four progressive modules from foundational synthwave to advanced
composition and licensing. Content coming soonled by the community
under AeThex Foundation.
composition and licensing. Content coming soonled by the
community under AeThex Foundation.
</CardDescription>
</CardHeader>
<CardContent className="space-y-4">

View file

@ -1,5 +1,11 @@
import { Link } from "react-router-dom";
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
import {
Card,
CardContent,
CardHeader,
CardTitle,
CardDescription,
} from "@/components/ui/card";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import { GitBranch, ExternalLink, CheckCircle2 } from "lucide-react";
@ -8,38 +14,87 @@ export default function DocsEditorsGuide() {
return (
<div className="space-y-8">
<section>
<Badge className="bg-indigo-600/20 text-indigo-200 uppercase tracking-wide">Docs Editing</Badge>
<h2 className="text-3xl font-semibold text-white">Editing Public Docs (Builder GitHub PR workflow)</h2>
<p className="text-gray-300 max-w-3xl">This guide explains how staff can edit public documentation using Builder CMS and publish changes through a GitHub pull request. Internal operational docs must remain under <code>/internal-docs</code> and are not editable from the public docs workflow.</p>
<Badge className="bg-indigo-600/20 text-indigo-200 uppercase tracking-wide">
Docs Editing
</Badge>
<h2 className="text-3xl font-semibold text-white">
Editing Public Docs (Builder GitHub PR workflow)
</h2>
<p className="text-gray-300 max-w-3xl">
This guide explains how staff can edit public documentation using
Builder CMS and publish changes through a GitHub pull request.
Internal operational docs must remain under{" "}
<code>/internal-docs</code> and are not editable from the public docs
workflow.
</p>
</section>
<section className="grid gap-6 lg:grid-cols-2">
<Card className="bg-slate-900/60 border-slate-700">
<CardHeader>
<CardTitle className="text-white">Edit in Builder</CardTitle>
<CardDescription className="text-gray-300">Use the Builder (MCP) editor for content changes, layout tweaks, and page composition.</CardDescription>
<CardDescription className="text-gray-300">
Use the Builder (MCP) editor for content changes, layout tweaks,
and page composition.
</CardDescription>
</CardHeader>
<CardContent>
<ol className="list-decimal pl-6 space-y-2 text-sm text-gray-300">
<li>Open the app and click <strong>Open MCP popover</strong> (<a href="#open-mcp-popover" className="text-aethex-400 underline">#open-mcp-popover</a>).</li>
<li>Select <strong>Builder.io</strong> and edit the desired public doc entry (e.g. Getting Started, Platform).</li>
<li>Use the preview mode to validate across themes (Brand / Professional).</li>
<li>Save drafts and request review from the Docs team (assign reviewer in Builder).</li>
<li>
Open the app and click <strong>Open MCP popover</strong> (
<a
href="#open-mcp-popover"
className="text-aethex-400 underline"
>
#open-mcp-popover
</a>
).
</li>
<li>
Select <strong>Builder.io</strong> and edit the desired public
doc entry (e.g. Getting Started, Platform).
</li>
<li>
Use the preview mode to validate across themes (Brand /
Professional).
</li>
<li>
Save drafts and request review from the Docs team (assign
reviewer in Builder).
</li>
</ol>
</CardContent>
</Card>
<Card className="bg-slate-900/60 border-slate-700">
<CardHeader>
<CardTitle className="text-white">Export & Publish (GitHub PR)</CardTitle>
<CardDescription className="text-gray-300">After Builder review, export or commit changes to the docs repo and open a GitHub PR.</CardDescription>
<CardTitle className="text-white">
Export & Publish (GitHub PR)
</CardTitle>
<CardDescription className="text-gray-300">
After Builder review, export or commit changes to the docs repo
and open a GitHub PR.
</CardDescription>
</CardHeader>
<CardContent>
<ol className="list-decimal pl-6 space-y-2 text-sm text-gray-300">
<li>From Builder, use the export feature to get Markdown/JSX content, or copy the updated component code.</li>
<li>Create a branch in the repository named <code>docs/{`your-change`}</code> and add the changes under <code>code/client/pages/docs</code> or <code>code/docs</code>.</li>
<li>Open a GitHub Pull Request describing the change, link the Builder draft, and assign the Docs reviewer team.</li>
<li>CI will run lint & build checks. After approval, merge to main and the docs will be deployed automatically.</li>
<li>
From Builder, use the export feature to get Markdown/JSX
content, or copy the updated component code.
</li>
<li>
Create a branch in the repository named{" "}
<code>docs/{`your-change`}</code> and add the changes under{" "}
<code>code/client/pages/docs</code> or <code>code/docs</code>.
</li>
<li>
Open a GitHub Pull Request describing the change, link the
Builder draft, and assign the Docs reviewer team.
</li>
<li>
CI will run lint & build checks. After approval, merge to main
and the docs will be deployed automatically.
</li>
</ol>
</CardContent>
</Card>
@ -48,15 +103,34 @@ export default function DocsEditorsGuide() {
<section>
<Card className="bg-slate-900/60 border-slate-700">
<CardHeader>
<CardTitle className="text-white">Public docs policy & safety checks</CardTitle>
<CardDescription className="text-gray-300">Ensure no internal APIs or sensitive operational details are exposed publicly.</CardDescription>
<CardTitle className="text-white">
Public docs policy & safety checks
</CardTitle>
<CardDescription className="text-gray-300">
Ensure no internal APIs or sensitive operational details are
exposed publicly.
</CardDescription>
</CardHeader>
<CardContent>
<ul className="list-disc pl-6 mt-2 space-y-2 text-sm text-gray-300">
<li>Do not include internal admin endpoints, service role keys, or SQL migrations in public docs.</li>
<li>When in doubt, link to an internal doc (under <code>/internal-docs</code>) instead of copying operational procedures to public docs.</li>
<li>For partner-facing API documentation, create a gated partner docs area (contact the Docs lead).</li>
<li>Security checklist: remove any <code>/api/discord/role-mappings</code>, admin-register endpoints, or internal-only debug examples before publishing.</li>
<li>
Do not include internal admin endpoints, service role keys, or
SQL migrations in public docs.
</li>
<li>
When in doubt, link to an internal doc (under{" "}
<code>/internal-docs</code>) instead of copying operational
procedures to public docs.
</li>
<li>
For partner-facing API documentation, create a gated partner
docs area (contact the Docs lead).
</li>
<li>
Security checklist: remove any{" "}
<code>/api/discord/role-mappings</code>, admin-register
endpoints, or internal-only debug examples before publishing.
</li>
</ul>
</CardContent>
</Card>
@ -70,13 +144,20 @@ export default function DocsEditorsGuide() {
<CardContent>
<ul className="list-disc pl-6 mt-2 space-y-2 text-sm text-gray-300">
<li>Builder draft created and reviewed.</li>
<li>GitHub PR open with Builder draft link and reviewer assigned.</li>
<li>
GitHub PR open with Builder draft link and reviewer assigned.
</li>
<li>CI passes (lint, build).</li>
<li>Final review & merge by Docs lead.</li>
</ul>
<div className="mt-4">
<Button asChild>
<a href="https://github.com/AeThex-Corporation/aethex-forge" target="_blank" rel="noreferrer" className="inline-flex items-center gap-2">
<a
href="https://github.com/AeThex-Corporation/aethex-forge"
target="_blank"
rel="noreferrer"
className="inline-flex items-center gap-2"
>
<GitBranch className="h-4 w-4" /> Open repo
</a>
</Button>

View file

@ -213,28 +213,50 @@ export default function DocsGettingStarted() {
<section id="create-account" className="space-y-6">
<div className="flex items-center gap-3">
<Shield className="h-6 w-6 text-purple-400" />
<h3 className="text-2xl font-semibold text-white">Create an AeThex account (full)</h3>
<h3 className="text-2xl font-semibold text-white">
Create an AeThex account (full)
</h3>
</div>
<div className="grid gap-6 lg:grid-cols-2">
<Card className="bg-slate-900/60 border-slate-700">
<CardHeader>
<CardTitle className="text-white text-lg">Step 1 Choose sign-in method</CardTitle>
<CardDescription className="text-gray-300">AeThex supports Email/password, OAuth providers, and Web3 wallet sign-in.</CardDescription>
<CardTitle className="text-white text-lg">
Step 1 Choose sign-in method
</CardTitle>
<CardDescription className="text-gray-300">
AeThex supports Email/password, OAuth providers, and Web3 wallet
sign-in.
</CardDescription>
</CardHeader>
<CardContent>
<ol className="list-decimal pl-6 space-y-2 text-sm text-gray-300">
<li>
Email sign-up: go to <Link to="/signup" className="text-aethex-400 underline">/signup</Link>, provide your email and a secure password. A verification email will be sent click the link to confirm.
Email sign-up: go to{" "}
<Link to="/signup" className="text-aethex-400 underline">
/signup
</Link>
, provide your email and a secure password. A verification
email will be sent click the link to confirm.
</li>
<li>
Google / GitHub: click the provider button on <Link to="/login" className="text-aethex-400 underline">/login</Link>. The first time you sign in we'll create your account automatically using the provider email.
Google / GitHub: click the provider button on{" "}
<Link to="/login" className="text-aethex-400 underline">
/login
</Link>
. The first time you sign in we'll create your account
automatically using the provider email.
</li>
<li>
Discord: use "Continue with Discord" on the login page. Existing accounts with the same email will be linked, otherwise a new account is created. For linking flows for existing staff, see the Dashboard Connections.
Discord: use "Continue with Discord" on the login page.
Existing accounts with the same email will be linked,
otherwise a new account is created. For linking flows for
existing staff, see the Dashboard Connections.
</li>
<li>
Web3 (optional): sign-in with Ethereum wallet via MetaMask used only for wallet verification and account linking (no custody).
Web3 (optional): sign-in with Ethereum wallet via MetaMask
used only for wallet verification and account linking (no
custody).
</li>
</ol>
</CardContent>
@ -242,15 +264,38 @@ export default function DocsGettingStarted() {
<Card className="bg-slate-900/60 border-slate-700">
<CardHeader>
<CardTitle className="text-white text-lg">Step 2 Verify & complete profile</CardTitle>
<CardDescription className="text-gray-300">After initial login you'll be prompted to complete onboarding (profile, bio, primary arm).</CardDescription>
<CardTitle className="text-white text-lg">
Step 2 Verify & complete profile
</CardTitle>
<CardDescription className="text-gray-300">
After initial login you'll be prompted to complete onboarding
(profile, bio, primary arm).
</CardDescription>
</CardHeader>
<CardContent>
<ol className="list-decimal pl-6 space-y-2 text-sm text-gray-300">
<li>Check your email and follow the verification link (email provider flow).</li>
<li>Complete the onboarding steps including name, bio, interests, and primary arm selection.</li>
<li>Link any additional providers from <Link to="/dashboard?tab=connections" className="text-aethex-400 underline">Dashboard Connections</Link> if needed.</li>
<li>Once finished click "Finish & Go to Dashboard" to start using the platform.</li>
<li>
Check your email and follow the verification link (email
provider flow).
</li>
<li>
Complete the onboarding steps including name, bio, interests,
and primary arm selection.
</li>
<li>
Link any additional providers from{" "}
<Link
to="/dashboard?tab=connections"
className="text-aethex-400 underline"
>
Dashboard Connections
</Link>{" "}
if needed.
</li>
<li>
Once finished click "Finish & Go to Dashboard" to start using
the platform.
</li>
</ol>
</CardContent>
</Card>
@ -259,29 +304,52 @@ export default function DocsGettingStarted() {
<div className="bg-slate-900/60 border-slate-700 p-4 text-sm text-gray-300">
<strong>Notes & troubleshooting</strong>
<ul className="list-disc pl-6 mt-2 space-y-1">
<li>If an OAuth provider reports "account exists", sign in using the original provider and then link the new provider from Dashboard Connections.</li>
<li>If you don't receive verification emails, check spam and ensure no company email filtering blocks support@aethex.tech.</li>
<li>Staff accounts (aethex.dev emails) may receive additional role access; contact HR if you expect staff access and it doesn't appear after login.</li>
<li>
If an OAuth provider reports "account exists", sign in using the
original provider and then link the new provider from Dashboard
Connections.
</li>
<li>
If you don't receive verification emails, check spam and ensure no
company email filtering blocks support@aethex.tech.
</li>
<li>
Staff accounts (aethex.dev emails) may receive additional role
access; contact HR if you expect staff access and it doesn't
appear after login.
</li>
</ul>
</div>
</section>
<section id="categories" className="space-y-6">
<div className="text-center space-y-2">
<h3 className="text-2xl font-semibold text-white">Documentation categories</h3>
<h3 className="text-2xl font-semibold text-white">
Documentation categories
</h3>
<p className="text-gray-300 max-w-2xl mx-auto text-sm">
Jump into the area you need most. Each category below is mirrored in Builder CMS for collaborative editing.
Jump into the area you need most. Each category below is mirrored in
Builder CMS for collaborative editing.
</p>
</div>
<div className="grid gap-6 lg:grid-cols-2">
{docCategories.map((category) => (
<Card key={category.title} className="border-border/50 hover:border-aethex-400/40 transition-all">
<Card
key={category.title}
className="border-border/50 hover:border-aethex-400/40 transition-all"
>
<CardHeader>
<div className={`inline-flex rounded-lg bg-gradient-to-r ${category.color} px-3 py-1 text-xs uppercase tracking-wider text-white`}>
<div
className={`inline-flex rounded-lg bg-gradient-to-r ${category.color} px-3 py-1 text-xs uppercase tracking-wider text-white`}
>
{category.docs} docs
</div>
<CardTitle className="text-xl text-white mt-3">{category.title}</CardTitle>
<CardDescription className="text-gray-300">{category.description}</CardDescription>
<CardTitle className="text-xl text-white mt-3">
{category.title}
</CardTitle>
<CardDescription className="text-gray-300">
{category.description}
</CardDescription>
</CardHeader>
<CardContent>
<ul className="grid grid-cols-2 gap-2 text-sm text-gray-300">
@ -308,9 +376,16 @@ export default function DocsGettingStarted() {
</CardTitle>
</CardHeader>
<CardContent className="space-y-4">
<CardDescription className="text-gray-300">{item.description}</CardDescription>
<CardDescription className="text-gray-300">
{item.description}
</CardDescription>
<Button asChild variant="outline" className="justify-start">
<Link to={item.actionHref} target={item.actionHref.startsWith("http") ? "_blank" : undefined}>
<Link
to={item.actionHref}
target={
item.actionHref.startsWith("http") ? "_blank" : undefined
}
>
<ArrowRight className="mr-2 h-4 w-4" />
{item.actionLabel}
</Link>
@ -323,32 +398,66 @@ export default function DocsGettingStarted() {
<section id="onboarding-summary" className="space-y-6">
<div className="flex items-center gap-3">
<PlugZap className="h-6 w-6 text-purple-400" />
<h3 className="text-2xl font-semibold text-white">Onboarding what to expect</h3>
<h3 className="text-2xl font-semibold text-white">
Onboarding what to expect
</h3>
</div>
<div className="bg-slate-900/60 border-slate-700 p-4 text-sm text-gray-300">
<p className="mb-3">Onboarding is a guided, multi-step flow that helps users complete the essential profile and platform setup. Typical onboarding steps:</p>
<p className="mb-3">
Onboarding is a guided, multi-step flow that helps users complete
the essential profile and platform setup. Typical onboarding steps:
</p>
<ol className="list-decimal pl-6 space-y-2">
<li><strong>Personal Info</strong> name, display handle, avatar.</li>
<li><strong>Profile Type</strong> select experience level and role (creator, studio, enterprise).</li>
<li><strong>Interests & Skills</strong> choose tags so we can recommend opportunities and mentors.</li>
<li><strong>Choose Primary Arm</strong> pick the arm that best represents your work (Labs, GameForge, Corp, Foundation, Dev-Link).</li>
<li><strong>Creator Profile</strong> optional portfolio, bio, links (recommended for discoverability).</li>
<li><strong>Finish</strong> background tasks run (profile refresh) and you land on the dashboard.</li>
<li>
<strong>Personal Info</strong> name, display handle, avatar.
</li>
<li>
<strong>Profile Type</strong> select experience level and role
(creator, studio, enterprise).
</li>
<li>
<strong>Interests & Skills</strong> choose tags so we can
recommend opportunities and mentors.
</li>
<li>
<strong>Choose Primary Arm</strong> pick the arm that best
represents your work (Labs, GameForge, Corp, Foundation,
Dev-Link).
</li>
<li>
<strong>Creator Profile</strong> optional portfolio, bio, links
(recommended for discoverability).
</li>
<li>
<strong>Finish</strong> background tasks run (profile refresh)
and you land on the dashboard.
</li>
</ol>
<p className="mt-3">You can always update these later from <Link to="/profile/settings" className="text-aethex-400 underline">Profile Settings</Link>.</p>
<p className="mt-3">
You can always update these later from{" "}
<Link to="/profile/settings" className="text-aethex-400 underline">
Profile Settings
</Link>
.
</p>
</div>
</section>
<section id="platform-highlights" className="space-y-6">
<div className="flex items-center gap-3">
<LayoutDashboard className="h-6 w-6 text-purple-400" />
<h3 className="text-2xl font-semibold text-white">Explore the platform</h3>
<h3 className="text-2xl font-semibold text-white">
Explore the platform
</h3>
</div>
<div className="grid gap-6 lg:grid-cols-2">
{platformHighlights.map((item) => {
const Icon = item.icon;
return (
<Card key={item.title} className="bg-slate-900/60 border-slate-700">
<Card
key={item.title}
className="bg-slate-900/60 border-slate-700"
>
<CardHeader>
<CardTitle className="text-white text-lg flex items-center gap-3">
<Icon className="h-5 w-5 text-purple-300" />
@ -356,7 +465,9 @@ export default function DocsGettingStarted() {
</CardTitle>
</CardHeader>
<CardContent>
<CardDescription className="text-gray-300 text-sm leading-relaxed">{item.description}</CardDescription>
<CardDescription className="text-gray-300 text-sm leading-relaxed">
{item.description}
</CardDescription>
</CardContent>
</Card>
);
@ -373,12 +484,20 @@ export default function DocsGettingStarted() {
{setupSteps.map((step, index) => (
<Card key={step.title} className="bg-slate-900/60 border-slate-700">
<CardHeader className="space-y-1">
<Badge variant="outline" className="w-fit">Step {index + 1}</Badge>
<CardTitle className="text-white text-lg">{step.title}</CardTitle>
<CardDescription className="text-gray-300">{step.description}</CardDescription>
<Badge variant="outline" className="w-fit">
Step {index + 1}
</Badge>
<CardTitle className="text-white text-lg">
{step.title}
</CardTitle>
<CardDescription className="text-gray-300">
{step.description}
</CardDescription>
</CardHeader>
<CardContent>
<pre className="rounded-lg border border-slate-700 bg-slate-950/60 p-4 text-sm text-purple-200"><code>{step.command}</code></pre>
<pre className="rounded-lg border border-slate-700 bg-slate-950/60 p-4 text-sm text-purple-200">
<code>{step.command}</code>
</pre>
</CardContent>
</Card>
))}
@ -389,39 +508,91 @@ export default function DocsGettingStarted() {
{deploymentChecklist.map((item) => (
<Card key={item.title} className="bg-slate-900/60 border-slate-700">
<CardHeader>
<CardTitle className="flex items-center gap-2 text-white text-lg"><CheckCircle2 className="h-5 w-5 text-emerald-400" />{item.title}</CardTitle>
<CardTitle className="flex items-center gap-2 text-white text-lg">
<CheckCircle2 className="h-5 w-5 text-emerald-400" />
{item.title}
</CardTitle>
</CardHeader>
<CardContent>
<p className="text-gray-300 text-sm leading-relaxed">{item.description}</p>
<p className="text-gray-300 text-sm leading-relaxed">
{item.description}
</p>
</CardContent>
</Card>
))}
</section>
<section id="staff-editing" className="space-y-4">
<h3 className="text-2xl font-semibold text-white">Staff editing & governance</h3>
<h3 className="text-2xl font-semibold text-white">
Staff editing & governance
</h3>
<div className="bg-slate-900/60 border-slate-700 p-4 text-sm text-gray-300">
<p>This public documentation is the platform-facing view. Internal operational documents remain private under <code>/internal-docs</code>.</p>
<p className="mt-2">Editors (staff) can edit public docs using Builder CMS. After changes are reviewed in Builder, create a GitHub PR to push finalized content into the repository so it can be deployed with site updates.</p>
<p>
This public documentation is the platform-facing view. Internal
operational documents remain private under{" "}
<code>/internal-docs</code>.
</p>
<p className="mt-2">
Editors (staff) can edit public docs using Builder CMS. After
changes are reviewed in Builder, create a GitHub PR to push
finalized content into the repository so it can be deployed with
site updates.
</p>
<ul className="list-disc pl-6 mt-2 space-y-1">
<li><strong>Edit in Builder:</strong> <a href="#open-mcp-popover" className="text-aethex-400 underline">Open MCP popover</a> and select <strong>Builder.io</strong> to edit live doc components and page content. (Staff only)</li>
<li><strong>Publish workflow:</strong> Use the Builder preview to validate changes, then export or commit the markdown/content and open a GitHub PR for review. CI runs will deploy the updated public docs.</li>
<li><strong>Security:</strong> Internal API references are intentionally not included in public docs. If you need to publish API guides for partners, request a gated partner docs area.</li>
<li>
<strong>Edit in Builder:</strong>{" "}
<a href="#open-mcp-popover" className="text-aethex-400 underline">
Open MCP popover
</a>{" "}
and select <strong>Builder.io</strong> to edit live doc components
and page content. (Staff only)
</li>
<li>
<strong>Publish workflow:</strong> Use the Builder preview to
validate changes, then export or commit the markdown/content and
open a GitHub PR for review. CI runs will deploy the updated
public docs.
</li>
<li>
<strong>Security:</strong> Internal API references are
intentionally not included in public docs. If you need to publish
API guides for partners, request a gated partner docs area.
</li>
</ul>
</div>
</section>
<section id="next-steps" className="space-y-4">
<div className="flex items-center gap-3"><Layers className="h-6 w-6 text-purple-400" /><h3 className="text-2xl font-semibold text-white">Next steps</h3></div>
<div className="flex items-center gap-3">
<Layers className="h-6 w-6 text-purple-400" />
<h3 className="text-2xl font-semibold text-white">Next steps</h3>
</div>
<div className="grid gap-4 md:grid-cols-2 xl:grid-cols-4">
{explorationLinks.map((link) => (
<Card key={link.title} className="bg-slate-900/60 border-slate-700 hover:border-purple-500/40 transition-colors">
<Card
key={link.title}
className="bg-slate-900/60 border-slate-700 hover:border-purple-500/40 transition-colors"
>
<CardHeader>
<CardTitle className="flex items-center justify-between text-white text-base">{link.title}<ArrowRight className="h-4 w-4 text-purple-300" /></CardTitle>
<CardDescription className="text-gray-300 text-sm">{link.description}</CardDescription>
<CardTitle className="flex items-center justify-between text-white text-base">
{link.title}
<ArrowRight className="h-4 w-4 text-purple-300" />
</CardTitle>
<CardDescription className="text-gray-300 text-sm">
{link.description}
</CardDescription>
</CardHeader>
<CardContent>
<Button asChild variant="ghost" className="w-full justify-start text-purple-300 hover:text-purple-200"><Link to={link.href}>Explore<ArrowRight className="ml-2 h-4 w-4" /></Link></Button>
<Button
asChild
variant="ghost"
className="w-full justify-start text-purple-300 hover:text-purple-200"
>
<Link to={link.href}>
Explore
<ArrowRight className="ml-2 h-4 w-4" />
</Link>
</Button>
</CardContent>
</Card>
))}

View file

@ -1,4 +1,10 @@
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
import {
Card,
CardContent,
CardHeader,
CardTitle,
CardDescription,
} from "@/components/ui/card";
import { Button } from "@/components/ui/button";
import { Link } from "react-router-dom";
import { Lock, Users, GitBranch } from "lucide-react";
@ -7,22 +13,44 @@ export default function DocsPartnerProposal() {
return (
<div className="space-y-8">
<section>
<h2 className="text-3xl font-semibold text-white">Partner Docs & Gated Area Proposal</h2>
<p className="text-gray-300 max-w-3xl">This document outlines a proposal for a gated partner documentation area, intended for partners and external integrators who require more detailed API and integration guides than the public docs expose. The gated area will be accessible to approved partners after authentication and agreement to terms.</p>
<h2 className="text-3xl font-semibold text-white">
Partner Docs & Gated Area Proposal
</h2>
<p className="text-gray-300 max-w-3xl">
This document outlines a proposal for a gated partner documentation
area, intended for partners and external integrators who require more
detailed API and integration guides than the public docs expose. The
gated area will be accessible to approved partners after
authentication and agreement to terms.
</p>
</section>
<section className="grid gap-6 lg:grid-cols-2">
<Card className="bg-slate-900/60 border-slate-700">
<CardHeader>
<CardTitle className="text-white">Scope</CardTitle>
<CardDescription className="text-gray-300">Content that belongs in the gated partner area</CardDescription>
<CardDescription className="text-gray-300">
Content that belongs in the gated partner area
</CardDescription>
</CardHeader>
<CardContent>
<ul className="list-disc pl-6 space-y-2 text-sm text-gray-300">
<li>Partner API endpoints and sample requests that include partner keys or elevated scopes.</li>
<li>Operational integration instructions (webhooks, role mappings, admin endpoints).</li>
<li>Deployment scripts, secrets management guidance (redacted for public), and verification flows.</li>
<li>Commercial and SLA information, onboarding steps for partner accounts.</li>
<li>
Partner API endpoints and sample requests that include partner
keys or elevated scopes.
</li>
<li>
Operational integration instructions (webhooks, role mappings,
admin endpoints).
</li>
<li>
Deployment scripts, secrets management guidance (redacted for
public), and verification flows.
</li>
<li>
Commercial and SLA information, onboarding steps for partner
accounts.
</li>
</ul>
</CardContent>
</Card>
@ -30,18 +58,34 @@ export default function DocsPartnerProposal() {
<Card className="bg-slate-900/60 border-slate-700">
<CardHeader>
<CardTitle className="text-white">Access & Workflow</CardTitle>
<CardDescription className="text-gray-300">How partners request and receive access</CardDescription>
<CardDescription className="text-gray-300">
How partners request and receive access
</CardDescription>
</CardHeader>
<CardContent>
<ol className="list-decimal pl-6 space-y-2 text-sm text-gray-300">
<li>Partner signs NDA and registers interest via sales team.</li>
<li>Docs team creates a partner account and assigns a partner role in Supabase.</li>
<li>Partner gets access to the gated docs area (passwordless SSO or invite link).</li>
<li>Partner changes and feedback are managed via Support or a private Builder space.</li>
<li>
Docs team creates a partner account and assigns a partner role
in Supabase.
</li>
<li>
Partner gets access to the gated docs area (passwordless SSO or
invite link).
</li>
<li>
Partner changes and feedback are managed via Support or a
private Builder space.
</li>
</ol>
<div className="mt-4">
<Button asChild>
<Link to="/internal-docs/onboarding" className="inline-flex items-center gap-2">View Internal Onboarding <GitBranch className="h-4 w-4" /></Link>
<Link
to="/internal-docs/onboarding"
className="inline-flex items-center gap-2"
>
View Internal Onboarding <GitBranch className="h-4 w-4" />
</Link>
</Button>
</div>
</CardContent>
@ -52,13 +96,24 @@ export default function DocsPartnerProposal() {
<Card className="bg-slate-900/60 border-slate-700">
<CardHeader>
<CardTitle className="text-white">Security & Controls</CardTitle>
<CardDescription className="text-gray-300">Minimum controls for gated content</CardDescription>
<CardDescription className="text-gray-300">
Minimum controls for gated content
</CardDescription>
</CardHeader>
<CardContent>
<ul className="list-disc pl-6 space-y-2 text-sm text-gray-300">
<li>Partner accounts are RBAC-limited and issued short-lived credentials for API testing.</li>
<li>Audit logs for partner doc accesses are retained and reviewed monthly.</li>
<li>Automation prevents copying internal operational docs into public pages; editors must follow the PR checklist.</li>
<li>
Partner accounts are RBAC-limited and issued short-lived
credentials for API testing.
</li>
<li>
Audit logs for partner doc accesses are retained and reviewed
monthly.
</li>
<li>
Automation prevents copying internal operational docs into
public pages; editors must follow the PR checklist.
</li>
</ul>
</CardContent>
</Card>
@ -71,9 +126,19 @@ export default function DocsPartnerProposal() {
</CardHeader>
<CardContent>
<ul className="list-disc pl-6 space-y-2 text-sm text-gray-300">
<li>Implement partner role and gated content routing (Auth + middleware).</li>
<li>Create Builder space for partner docs drafts and approval workflow.</li>
<li>Update CI to only publish public docs from <code>code/client/pages/docs</code> and prevent internal docs from being included.</li>
<li>
Implement partner role and gated content routing (Auth +
middleware).
</li>
<li>
Create Builder space for partner docs drafts and approval
workflow.
</li>
<li>
Update CI to only publish public docs from{" "}
<code>code/client/pages/docs</code> and prevent internal docs
from being included.
</li>
</ul>
</CardContent>
</Card>

View file

@ -365,23 +365,47 @@ export default function DocsPlatform() {
<section id="architecture" className="space-y-6">
<div className="flex items-center gap-3">
<Globe className="h-6 w-6 text-cyan-300" />
<h3 className="text-2xl font-semibold text-white">Architecture overview</h3>
<h3 className="text-2xl font-semibold text-white">
Architecture overview
</h3>
</div>
<Card className="bg-slate-900/60 border-slate-700">
<CardContent>
<p className="text-gray-300 text-sm leading-relaxed">
AeThex is composed of a lightweight React + Vite frontend, a Node.js backend that
exposes API endpoints (under <code>/api/*</code>), and a Supabase-backed PostgreSQL
database. The system integrates several services:
AeThex is composed of a lightweight React + Vite frontend, a
Node.js backend that exposes API endpoints (under{" "}
<code>/api/*</code>), and a Supabase-backed PostgreSQL database.
The system integrates several services:
</p>
<ul className="list-disc pl-6 mt-3 text-gray-300 text-sm space-y-2">
<li><strong>Frontend:</strong> React + TypeScript, Docs and Internal hubs use a separate layout and access control.</li>
<li><strong>Backend:</strong> Node/Express handlers for public APIs, Discord webhooks, and OAuth flows.</li>
<li><strong>Database:</strong> Supabase (Postgres) stores user profiles, creator data, and operational tables. Migrations live under <code>code/supabase/migrations</code>.</li>
<li><strong>Integrations:</strong> OAuth providers (Google, GitHub, Discord, Roblox), Discord bot for role mapping & verification, and optional Web3 wallet linking.</li>
<li><strong>Docs & CMS:</strong> Public docs are rendered with DocsLayout and editable in Builder CMS (MCP). Internal docs live under <code>/internal-docs</code> and require authentication.</li>
<li>
<strong>Frontend:</strong> React + TypeScript, Docs and Internal
hubs use a separate layout and access control.
</li>
<li>
<strong>Backend:</strong> Node/Express handlers for public APIs,
Discord webhooks, and OAuth flows.
</li>
<li>
<strong>Database:</strong> Supabase (Postgres) stores user
profiles, creator data, and operational tables. Migrations live
under <code>code/supabase/migrations</code>.
</li>
<li>
<strong>Integrations:</strong> OAuth providers (Google, GitHub,
Discord, Roblox), Discord bot for role mapping & verification,
and optional Web3 wallet linking.
</li>
<li>
<strong>Docs & CMS:</strong> Public docs are rendered with
DocsLayout and editable in Builder CMS (MCP). Internal docs live
under <code>/internal-docs</code> and require authentication.
</li>
</ul>
<p className="mt-3 text-gray-300 text-sm">This arrangement lets staff operate private operational processes while exposing curated platform docs publicly.</p>
<p className="mt-3 text-gray-300 text-sm">
This arrangement lets staff operate private operational processes
while exposing curated platform docs publicly.
</p>
</CardContent>
</Card>
</section>
@ -390,16 +414,42 @@ export default function DocsPlatform() {
<section id="troubleshooting" className="space-y-6">
<div className="flex items-center gap-3">
<ShieldCheck className="h-6 w-6 text-cyan-300" />
<h3 className="text-2xl font-semibold text-white">Common troubleshooting</h3>
<h3 className="text-2xl font-semibold text-white">
Common troubleshooting
</h3>
</div>
<Card className="bg-slate-900/60 border-slate-700">
<CardContent>
<h4 className="text-white font-semibold mb-2">OAuth redirect issues</h4>
<p className="text-gray-300 text-sm">If an OAuth provider returns an <code>invalid_redirect_uri</code> error, verify that the callback URL configured in the provider matches the deployed app's API base (e.g. <code>https://aethex.dev/api/discord/oauth/callback</code> for Discord). For local development use the configured VITE_API_BASE when available.</p>
<h4 className="text-white font-semibold mt-4 mb-2">Session/linking problems</h4>
<p className="text-gray-300 text-sm">If a linking flow (e.g. linking Discord) redirects to login or loses session, check cookie SameSite settings and ensure the redirect URI domain matches where cookies are set. Staff can consult internal docs under <code>/internal-docs/onboarding</code> for detailed diagnostic steps.</p>
<h4 className="text-white font-semibold mt-4 mb-2">Missing emails</h4>
<p className="text-gray-300 text-sm">Verification and notification emails are sent from <code>support@aethex.tech</code>. If emails are not arriving, check spam filters and outbound SMTP logs (Hostinger) for delivery failures.</p>
<h4 className="text-white font-semibold mb-2">
OAuth redirect issues
</h4>
<p className="text-gray-300 text-sm">
If an OAuth provider returns an <code>invalid_redirect_uri</code>{" "}
error, verify that the callback URL configured in the provider
matches the deployed app's API base (e.g.{" "}
<code>https://aethex.dev/api/discord/oauth/callback</code> for
Discord). For local development use the configured VITE_API_BASE
when available.
</p>
<h4 className="text-white font-semibold mt-4 mb-2">
Session/linking problems
</h4>
<p className="text-gray-300 text-sm">
If a linking flow (e.g. linking Discord) redirects to login or
loses session, check cookie SameSite settings and ensure the
redirect URI domain matches where cookies are set. Staff can
consult internal docs under <code>/internal-docs/onboarding</code>{" "}
for detailed diagnostic steps.
</p>
<h4 className="text-white font-semibold mt-4 mb-2">
Missing emails
</h4>
<p className="text-gray-300 text-sm">
Verification and notification emails are sent from{" "}
<code>support@aethex.tech</code>. If emails are not arriving,
check spam filters and outbound SMTP logs (Hostinger) for delivery
failures.
</p>
</CardContent>
</Card>
</section>

View file

@ -225,192 +225,194 @@ export default function DocsTutorials() {
return (
<DocsLayout title="Tutorials" description="Step-by-step guides">
<div>
{/* Header */}
<div className="mb-8 hidden">
<h2 className="text-2xl font-bold text-white mb-4">
Documentation Tutorials
</h2>
<p className="text-gray-300 mb-6">
Step-by-step guides and interactive tutorials to help you master
AeThex
</p>
<div>
{/* Header */}
<div className="mb-8 hidden">
<h2 className="text-2xl font-bold text-white mb-4">
Documentation Tutorials
</h2>
<p className="text-gray-300 mb-6">
Step-by-step guides and interactive tutorials to help you master
AeThex
</p>
{/* Filters */}
<div className="flex flex-col lg:flex-row gap-4 mb-6">
<div className="flex-1">
<div className="relative">
<Search className="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 h-4 w-4" />
<Input
placeholder="Search tutorials..."
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
className="pl-10 bg-slate-800/50 border-slate-600 text-white"
/>
{/* Filters */}
<div className="flex flex-col lg:flex-row gap-4 mb-6">
<div className="flex-1">
<div className="relative">
<Search className="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 h-4 w-4" />
<Input
placeholder="Search tutorials..."
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
className="pl-10 bg-slate-800/50 border-slate-600 text-white"
/>
</div>
</div>
<div className="flex gap-2">
<select
value={selectedDifficulty}
onChange={(e) => setSelectedDifficulty(e.target.value)}
className="bg-slate-800/50 border-slate-600 text-white rounded-md px-3 py-2"
>
<option value="all">All Levels</option>
<option value="beginner">Beginner</option>
<option value="intermediate">Intermediate</option>
<option value="advanced">Advanced</option>
</select>
<select
value={selectedType}
onChange={(e) => setSelectedType(e.target.value)}
className="bg-slate-800/50 border-slate-600 text-white rounded-md px-3 py-2"
>
<option value="all">All Types</option>
<option value="video">Video</option>
<option value="article">Article</option>
<option value="interactive">Interactive</option>
</select>
</div>
</div>
<div className="flex gap-2">
<select
value={selectedDifficulty}
onChange={(e) => setSelectedDifficulty(e.target.value)}
className="bg-slate-800/50 border-slate-600 text-white rounded-md px-3 py-2"
>
<option value="all">All Levels</option>
<option value="beginner">Beginner</option>
<option value="intermediate">Intermediate</option>
<option value="advanced">Advanced</option>
</select>
<select
value={selectedType}
onChange={(e) => setSelectedType(e.target.value)}
className="bg-slate-800/50 border-slate-600 text-white rounded-md px-3 py-2"
>
<option value="all">All Types</option>
<option value="video">Video</option>
<option value="article">Article</option>
<option value="interactive">Interactive</option>
</select>
</div>
</div>
</div>
<div className="grid grid-cols-1 lg:grid-cols-4 gap-8">
{/* Categories Sidebar */}
<div className="lg:col-span-1">
<Card className="bg-slate-800/50 border-slate-700">
<CardHeader>
<CardTitle className="text-white flex items-center">
<Filter className="h-5 w-5 mr-2" />
Categories
</CardTitle>
</CardHeader>
<CardContent className="space-y-2">
{categories.map((category) => {
const Icon = category.icon;
return (
<button
key={category.id}
onClick={() => setSelectedCategory(category.id)}
className={`w-full flex items-center space-x-3 p-3 rounded-lg transition-all ${
selectedCategory === category.id
? "bg-purple-600 text-white"
: "bg-slate-900/50 text-gray-300 hover:bg-slate-700/50"
}`}
>
<Icon className="h-4 w-4" />
<span className="text-sm font-medium">{category.name}</span>
</button>
);
})}
</CardContent>
</Card>
</div>
{/* Tutorials Grid */}
<div className="lg:col-span-3">
<div className="mb-4">
<p className="text-gray-400">
Showing {filteredTutorials.length} tutorials
</p>
</div>
<div className="space-y-4">
{filteredTutorials.map((tutorial) => {
const TypeIcon = getTypeIcon(tutorial.type);
return (
<Card
key={tutorial.id}
className="bg-slate-800/50 border-slate-700 hover:border-purple-500/50 transition-all duration-300 cursor-pointer group"
>
<CardContent className="p-6">
<div className="flex items-start justify-between">
<div className="flex-1">
<div className="flex items-center space-x-3 mb-3">
<TypeIcon
className={`h-5 w-5 ${getTypeColor(tutorial.type)}`}
/>
<Badge variant="outline" className="text-xs">
{tutorial.category}
</Badge>
<Badge
className={`${getDifficultyColor(tutorial.difficulty)} text-white text-xs`}
>
{tutorial.difficulty}
</Badge>
{tutorial.isNew && (
<Badge className="bg-green-600 text-white text-xs">
New
</Badge>
)}
</div>
<h3 className="text-xl font-semibold text-white mb-2 group-hover:text-purple-400 transition-colors">
{tutorial.title}
</h3>
<p className="text-gray-400 mb-4">
{tutorial.description}
</p>
<div className="flex items-center justify-between">
<div className="flex items-center space-x-4 text-sm text-gray-500">
<div className="flex items-center">
<Clock className="h-4 w-4 mr-1" />
{tutorial.duration}
</div>
<div className="flex items-center">
<User className="h-4 w-4 mr-1" />
{tutorial.author}
</div>
<div className="flex items-center">
<Star className="h-4 w-4 mr-1 text-yellow-400" />
{tutorial.rating}
</div>
<div className="flex items-center">
<Eye className="h-4 w-4 mr-1" />
{tutorial.views}
</div>
<div className="flex items-center">
<Heart className="h-4 w-4 mr-1" />
{tutorial.likes}
</div>
</div>
<Button
asChild
className="bg-purple-600 hover:bg-purple-700"
>
<Link to={tutorial.path}>
Start Tutorial
<ChevronRight className="h-4 w-4 ml-2" />
</Link>
</Button>
</div>
</div>
</div>
</CardContent>
</Card>
);
})}
</div>
{filteredTutorials.length === 0 && (
<div className="grid grid-cols-1 lg:grid-cols-4 gap-8">
{/* Categories Sidebar */}
<div className="lg:col-span-1">
<Card className="bg-slate-800/50 border-slate-700">
<CardContent className="p-8 text-center">
<BookOpen className="h-12 w-12 text-gray-400 mx-auto mb-4" />
<h3 className="text-lg font-semibold text-white mb-2">
No tutorials found
</h3>
<p className="text-gray-400">
Try adjusting your search terms or filters to find what you're
looking for.
</p>
<CardHeader>
<CardTitle className="text-white flex items-center">
<Filter className="h-5 w-5 mr-2" />
Categories
</CardTitle>
</CardHeader>
<CardContent className="space-y-2">
{categories.map((category) => {
const Icon = category.icon;
return (
<button
key={category.id}
onClick={() => setSelectedCategory(category.id)}
className={`w-full flex items-center space-x-3 p-3 rounded-lg transition-all ${
selectedCategory === category.id
? "bg-purple-600 text-white"
: "bg-slate-900/50 text-gray-300 hover:bg-slate-700/50"
}`}
>
<Icon className="h-4 w-4" />
<span className="text-sm font-medium">
{category.name}
</span>
</button>
);
})}
</CardContent>
</Card>
)}
</div>
{/* Tutorials Grid */}
<div className="lg:col-span-3">
<div className="mb-4">
<p className="text-gray-400">
Showing {filteredTutorials.length} tutorials
</p>
</div>
<div className="space-y-4">
{filteredTutorials.map((tutorial) => {
const TypeIcon = getTypeIcon(tutorial.type);
return (
<Card
key={tutorial.id}
className="bg-slate-800/50 border-slate-700 hover:border-purple-500/50 transition-all duration-300 cursor-pointer group"
>
<CardContent className="p-6">
<div className="flex items-start justify-between">
<div className="flex-1">
<div className="flex items-center space-x-3 mb-3">
<TypeIcon
className={`h-5 w-5 ${getTypeColor(tutorial.type)}`}
/>
<Badge variant="outline" className="text-xs">
{tutorial.category}
</Badge>
<Badge
className={`${getDifficultyColor(tutorial.difficulty)} text-white text-xs`}
>
{tutorial.difficulty}
</Badge>
{tutorial.isNew && (
<Badge className="bg-green-600 text-white text-xs">
New
</Badge>
)}
</div>
<h3 className="text-xl font-semibold text-white mb-2 group-hover:text-purple-400 transition-colors">
{tutorial.title}
</h3>
<p className="text-gray-400 mb-4">
{tutorial.description}
</p>
<div className="flex items-center justify-between">
<div className="flex items-center space-x-4 text-sm text-gray-500">
<div className="flex items-center">
<Clock className="h-4 w-4 mr-1" />
{tutorial.duration}
</div>
<div className="flex items-center">
<User className="h-4 w-4 mr-1" />
{tutorial.author}
</div>
<div className="flex items-center">
<Star className="h-4 w-4 mr-1 text-yellow-400" />
{tutorial.rating}
</div>
<div className="flex items-center">
<Eye className="h-4 w-4 mr-1" />
{tutorial.views}
</div>
<div className="flex items-center">
<Heart className="h-4 w-4 mr-1" />
{tutorial.likes}
</div>
</div>
<Button
asChild
className="bg-purple-600 hover:bg-purple-700"
>
<Link to={tutorial.path}>
Start Tutorial
<ChevronRight className="h-4 w-4 ml-2" />
</Link>
</Button>
</div>
</div>
</div>
</CardContent>
</Card>
);
})}
</div>
{filteredTutorials.length === 0 && (
<Card className="bg-slate-800/50 border-slate-700">
<CardContent className="p-8 text-center">
<BookOpen className="h-12 w-12 text-gray-400 mx-auto mb-4" />
<h3 className="text-lg font-semibold text-white mb-2">
No tutorials found
</h3>
<p className="text-gray-400">
Try adjusting your search terms or filters to find what
you're looking for.
</p>
</CardContent>
</Card>
)}
</div>
</div>
</div>
</div>
</DocsLayout>
);
}

View file

@ -3,31 +3,89 @@ import { Link } from "react-router-dom";
export default function InternalDocsDiscordAdmin() {
return (
<InternalDocsLayout title="Discord Admin & Operations" description="Internal operations for Discord integration">
<InternalDocsLayout
title="Discord Admin & Operations"
description="Internal operations for Discord integration"
>
<div className="space-y-6">
<p className="text-slate-300">This internal page aggregates operational references for Discord integrations, bot operations, and admin tasks. These resources are for staff only.</p>
<p className="text-slate-300">
This internal page aggregates operational references for Discord
integrations, bot operations, and admin tasks. These resources are for
staff only.
</p>
<section>
<h3 className="text-xl font-semibold text-white">Operational docs</h3>
<ul className="list-disc pl-6 text-slate-300 space-y-2">
<li><Link to="/internal-docs/onboarding" className="text-aethex-400 underline">Onboarding handbook</Link> includes Discord linking troubleshooting steps.</li>
<li><a href="/docs/DISCORD-ADMIN-COMMANDS-REGISTRATION.md" className="text-aethex-400 underline">Discord Admin Commands Registration</a> admin endpoint usage and token guidelines.</li>
<li><a href="/docs/DISCORD-LINKING-FLOW-ANALYSIS.md" className="text-aethex-400 underline">Discord Linking Flow Analysis</a> detailed flow and fixes.</li>
<li><a href="/docs/DISCORD-ACTIVITY-DEPLOYMENT.md" className="text-aethex-400 underline">Discord Activity Deployment</a> deploy & register commands (internal).</li>
<li>
<Link
to="/internal-docs/onboarding"
className="text-aethex-400 underline"
>
Onboarding handbook
</Link>{" "}
includes Discord linking troubleshooting steps.
</li>
<li>
<a
href="/docs/DISCORD-ADMIN-COMMANDS-REGISTRATION.md"
className="text-aethex-400 underline"
>
Discord Admin Commands Registration
</a>{" "}
admin endpoint usage and token guidelines.
</li>
<li>
<a
href="/docs/DISCORD-LINKING-FLOW-ANALYSIS.md"
className="text-aethex-400 underline"
>
Discord Linking Flow Analysis
</a>{" "}
detailed flow and fixes.
</li>
<li>
<a
href="/docs/DISCORD-ACTIVITY-DEPLOYMENT.md"
className="text-aethex-400 underline"
>
Discord Activity Deployment
</a>{" "}
deploy & register commands (internal).
</li>
</ul>
</section>
<section>
<h3 className="text-xl font-semibold text-white">Quick links</h3>
<ul className="list-disc pl-6 text-slate-300 space-y-2">
<li><Link to="/admin" className="text-aethex-400 underline">Admin panel</Link></li>
<li><Link to="/staff/docs" className="text-aethex-400 underline">Staff docs index</Link></li>
<li><a href="https://github.com/AeThex-Corporation/aethex-forge" target="_blank" rel="noreferrer" className="text-aethex-400 underline">Source repo</a></li>
<li>
<Link to="/admin" className="text-aethex-400 underline">
Admin panel
</Link>
</li>
<li>
<Link to="/staff/docs" className="text-aethex-400 underline">
Staff docs index
</Link>
</li>
<li>
<a
href="https://github.com/AeThex-Corporation/aethex-forge"
target="_blank"
rel="noreferrer"
className="text-aethex-400 underline"
>
Source repo
</a>
</li>
</ul>
</section>
<div className="bg-slate-800/30 border border-slate-700 rounded-lg p-4 text-sm text-slate-300">
<strong>Reminder:</strong> Do not copy operational steps to public docs. Use the Builder PR process for any partner-facing content and consult Security before publishing sensitive integration details.
<strong>Reminder:</strong> Do not copy operational steps to public
docs. Use the Builder PR process for any partner-facing content and
consult Security before publishing sensitive integration details.
</div>
</div>
</InternalDocsLayout>

View file

@ -154,25 +154,44 @@ interface InternalDocsLayoutProps {
// Map routes -> source file path so "Edit this page" can link to the component in the repo
const SOURCE_MAP: Record<string, string> = {
"/internal-docs": "code/client/pages/internal-docs/Space1Welcome.tsx",
"/internal-docs/axiom-model": "code/client/pages/internal-docs/Space1AxiomModel.tsx",
"/internal-docs/find-your-role": "code/client/pages/internal-docs/Space1FindYourRole.tsx",
"/internal-docs/code-of-conduct": "code/client/pages/internal-docs/Space2CodeOfConduct.tsx",
"/internal-docs/communication": "code/client/pages/internal-docs/Space2Communication.tsx",
"/internal-docs/meetings": "code/client/pages/internal-docs/Space2MeetingCadence.tsx",
"/internal-docs/brand": "code/client/pages/internal-docs/Space2BrandVoice.tsx",
"/internal-docs/tech-stack": "code/client/pages/internal-docs/Space2TechStack.tsx",
"/internal-docs/foundation-governance": "code/client/pages/internal-docs/Space3FoundationGovernance.tsx",
"/internal-docs/foundation-protocol": "code/client/pages/internal-docs/Space3OpenSourceProtocol.tsx",
"/internal-docs/foundation-programs": "code/client/pages/internal-docs/Space3CommunityPrograms.tsx",
"/internal-docs/corp-product": "code/client/pages/internal-docs/Space4ProductOps.tsx",
"/internal-docs/corp-blueprints": "code/client/pages/internal-docs/Space4CorpBlueprints.tsx",
"/internal-docs/corp-clients": "code/client/pages/internal-docs/Space4ClientOps.tsx",
"/internal-docs/corp-platform": "code/client/pages/internal-docs/Space4PlatformStrategy.tsx",
"/internal-docs/onboarding": "code/client/pages/internal-docs/Space5Onboarding.tsx",
"/internal-docs/axiom-model":
"code/client/pages/internal-docs/Space1AxiomModel.tsx",
"/internal-docs/find-your-role":
"code/client/pages/internal-docs/Space1FindYourRole.tsx",
"/internal-docs/code-of-conduct":
"code/client/pages/internal-docs/Space2CodeOfConduct.tsx",
"/internal-docs/communication":
"code/client/pages/internal-docs/Space2Communication.tsx",
"/internal-docs/meetings":
"code/client/pages/internal-docs/Space2MeetingCadence.tsx",
"/internal-docs/brand":
"code/client/pages/internal-docs/Space2BrandVoice.tsx",
"/internal-docs/tech-stack":
"code/client/pages/internal-docs/Space2TechStack.tsx",
"/internal-docs/foundation-governance":
"code/client/pages/internal-docs/Space3FoundationGovernance.tsx",
"/internal-docs/foundation-protocol":
"code/client/pages/internal-docs/Space3OpenSourceProtocol.tsx",
"/internal-docs/foundation-programs":
"code/client/pages/internal-docs/Space3CommunityPrograms.tsx",
"/internal-docs/corp-product":
"code/client/pages/internal-docs/Space4ProductOps.tsx",
"/internal-docs/corp-blueprints":
"code/client/pages/internal-docs/Space4CorpBlueprints.tsx",
"/internal-docs/corp-clients":
"code/client/pages/internal-docs/Space4ClientOps.tsx",
"/internal-docs/corp-platform":
"code/client/pages/internal-docs/Space4PlatformStrategy.tsx",
"/internal-docs/onboarding":
"code/client/pages/internal-docs/Space5Onboarding.tsx",
"/internal-docs/finance": "code/client/pages/internal-docs/Space5Finance.tsx",
};
export default function InternalDocsLayout({ children, title, description }: InternalDocsLayoutProps) {
export default function InternalDocsLayout({
children,
title,
description,
}: InternalDocsLayoutProps) {
const { user, loading } = useAuth();
const [sidebarOpen, setSidebarOpen] = useState(false);
const location = useLocation();
@ -184,10 +203,12 @@ export default function InternalDocsLayout({ children, title, description }: Int
if ((pre as HTMLElement).dataset.hasCopy === "true") return;
(pre as HTMLElement).dataset.hasCopy = "true";
const btn = document.createElement("button");
btn.className = "copy-code-btn absolute right-3 top-3 bg-slate-800/70 text-slate-200 text-xs px-2 py-1 rounded-md hover:bg-slate-800";
btn.className =
"copy-code-btn absolute right-3 top-3 bg-slate-800/70 text-slate-200 text-xs px-2 py-1 rounded-md hover:bg-slate-800";
btn.innerText = "Copy";
btn.onclick = async () => {
const code = pre.querySelector("code")?.textContent || pre.textContent || "";
const code =
pre.querySelector("code")?.textContent || pre.textContent || "";
try {
await navigator.clipboard.writeText(code);
btn.innerText = "Copied";
@ -208,10 +229,14 @@ export default function InternalDocsLayout({ children, title, description }: Int
container.querySelectorAll("h2, h3").forEach((el) => {
if ((el as HTMLElement).querySelector(".heading-anchor")) return;
const text = (el.textContent || "").trim();
const id = text.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/(^-|-$)/g, "");
const id = text
.toLowerCase()
.replace(/[^a-z0-9]+/g, "-")
.replace(/(^-|-$)/g, "");
(el as HTMLElement).id = id;
const anchor = document.createElement("a");
anchor.className = "heading-anchor ml-2 text-slate-500 text-sm opacity-0 hover:opacity-100 transition-opacity";
anchor.className =
"heading-anchor ml-2 text-slate-500 text-sm opacity-0 hover:opacity-100 transition-opacity";
anchor.href = `#${id}`;
anchor.innerText = "#";
(el as HTMLElement).appendChild(anchor);
@ -225,7 +250,10 @@ export default function InternalDocsLayout({ children, title, description }: Int
addCopyButtons();
addAnchors();
});
obs.observe(document.querySelector(".internal-docs-content") || document.body, { childList: true, subtree: true });
obs.observe(
document.querySelector(".internal-docs-content") || document.body,
{ childList: true, subtree: true },
);
return () => obs.disconnect();
}, []);
@ -266,7 +294,11 @@ export default function InternalDocsLayout({ children, title, description }: Int
>
{/* Header */}
<div className="p-6 border-b border-slate-700 sticky top-0 bg-slate-900">
<Link to="/internal-docs" className="flex items-center gap-3 mb-6" onClick={() => setSidebarOpen(false)}>
<Link
to="/internal-docs"
className="flex items-center gap-3 mb-6"
onClick={() => setSidebarOpen(false)}
>
<Lock className="h-5 w-5 text-blue-400" />
<div>
<div className="font-bold text-sm text-white">Internal Hub</div>
@ -274,7 +306,10 @@ export default function InternalDocsLayout({ children, title, description }: Int
</div>
</Link>
<Link to="/" className="inline-flex items-center gap-2 px-3 py-2 rounded-lg text-sm font-medium text-slate-300 hover:text-white hover:bg-slate-800 transition-colors w-full justify-center">
<Link
to="/"
className="inline-flex items-center gap-2 px-3 py-2 rounded-lg text-sm font-medium text-slate-300 hover:text-white hover:bg-slate-800 transition-colors w-full justify-center"
>
<Home className="h-4 w-4" />
Back to Site
</Link>
@ -287,8 +322,12 @@ export default function InternalDocsLayout({ children, title, description }: Int
<div className="flex items-center gap-2 mb-3 px-2">
<span className="text-lg">{space.emoji}</span>
<div>
<div className="text-xs font-semibold text-blue-400 uppercase tracking-wider">{space.title}</div>
<div className="text-xs text-slate-500">{space.description}</div>
<div className="text-xs font-semibold text-blue-400 uppercase tracking-wider">
{space.title}
</div>
<div className="text-xs text-slate-500">
{space.description}
</div>
</div>
</div>
@ -299,11 +338,17 @@ export default function InternalDocsLayout({ children, title, description }: Int
to={page.path}
onClick={() => setSidebarOpen(false)}
className={`block px-3 py-2 rounded-lg text-sm transition-all group ${
isCurrentPage(page.path) ? "bg-blue-600 text-white font-medium" : "text-slate-400 hover:text-slate-200 hover:bg-slate-800"
isCurrentPage(page.path)
? "bg-blue-600 text-white font-medium"
: "text-slate-400 hover:text-slate-200 hover:bg-slate-800"
}`}
>
<div className="font-medium">{page.title}</div>
{page.description && <div className="text-xs text-slate-500 group-hover:text-slate-400">{page.description}</div>}
{page.description && (
<div className="text-xs text-slate-500 group-hover:text-slate-400">
{page.description}
</div>
)}
</Link>
))}
</div>
@ -322,10 +367,20 @@ export default function InternalDocsLayout({ children, title, description }: Int
<main className="md:ml-72">
{/* Mobile Header */}
<div className="md:hidden sticky top-0 z-20 border-b border-slate-700 bg-slate-900/95 backdrop-blur p-4 flex items-center justify-between">
<button onClick={() => setSidebarOpen(!sidebarOpen)} className="p-2 hover:bg-slate-800 rounded-lg transition-colors">
{sidebarOpen ? <X className="h-5 w-5" /> : <Menu className="h-5 w-5" />}
<button
onClick={() => setSidebarOpen(!sidebarOpen)}
className="p-2 hover:bg-slate-800 rounded-lg transition-colors"
>
{sidebarOpen ? (
<X className="h-5 w-5" />
) : (
<Menu className="h-5 w-5" />
)}
</button>
<Link to="/" className="text-sm font-medium text-blue-400 hover:text-blue-300">
<Link
to="/"
className="text-sm font-medium text-blue-400 hover:text-blue-300"
>
Back
</Link>
</div>
@ -335,29 +390,41 @@ export default function InternalDocsLayout({ children, title, description }: Int
<div className="flex-1">
{title && (
<div className="mb-4">
<h1 className="text-4xl font-bold text-white mb-2">{title}</h1>
{description && <p className="text-lg text-slate-400">{description}</p>}
<h1 className="text-4xl font-bold text-white mb-2">
{title}
</h1>
{description && (
<p className="text-lg text-slate-400">{description}</p>
)}
</div>
)}
</div>
<div className="ml-6 flex-shrink-0 pt-1">
{editUrl && (
<a href={editUrl} target="_blank" rel="noreferrer" className="inline-flex items-center gap-2 text-xs text-slate-300 hover:text-white bg-slate-800/40 px-3 py-2 rounded-md">
<a
href={editUrl}
target="_blank"
rel="noreferrer"
className="inline-flex items-center gap-2 text-xs text-slate-300 hover:text-white bg-slate-800/40 px-3 py-2 rounded-md"
>
<ExternalLink className="h-4 w-4" /> Edit this page
</a>
)}
</div>
</div>
<div className="internal-docs-content prose prose-invert mx-auto max-w-none lg:max-w-3xl">{children}</div>
<div className="internal-docs-content prose prose-invert mx-auto max-w-none lg:max-w-3xl">
{children}
</div>
</div>
{/* Footer */}
<footer className="border-t border-slate-700 bg-slate-900/50 mt-12">
<div className="max-w-5xl mx-auto px-6 md:px-8 py-8">
<p className="text-sm text-slate-500">
© 2025 AeThex. This is an internal operations hub. Information here is confidential and for authorized personnel only.
© 2025 AeThex. This is an internal operations hub. Information
here is confidential and for authorized personnel only.
</p>
</div>
</footer>

View file

@ -1,4 +1,5 @@
<!-- INTERNAL: Operational doc - DO NOT PUBLISH TO PUBLIC DOCS -->
# Discord Activity Deployment Guide
## For Web-Based Development (No Terminal Access)

View file

@ -1,4 +1,5 @@
<!-- INTERNAL: Operational doc - DO NOT PUBLISH TO PUBLIC DOCS -->
# Discord Commands Registration - Admin Panel
## Overview

View file

@ -1,4 +1,5 @@
<!-- INTERNAL: Operational doc - DO NOT PUBLISH TO PUBLIC DOCS -->
# Discord Linking Fixes - Summary of Changes
## Overview

View file

@ -1,4 +1,5 @@
<!-- INTERNAL: Operational doc - DO NOT PUBLISH TO PUBLIC DOCS -->
# Discord Linking Flow - Complete Issue Analysis & Fix
## Current Broken Flows

View file

@ -1,4 +1,5 @@
<!-- INTERNAL: Operational doc - DO NOT PUBLISH TO PUBLIC DOCS -->
# Discord OAuth Setup Verification Checklist
## 🔴 CRITICAL: OAuth Redirect URI Registration

View file

@ -13,18 +13,20 @@
## Phase 1 Deliverables
### 1. ✅ Database Schema (Supabase Migration)
**File:** `code/supabase/migrations/20250206_add_ethos_guild.sql`
**Tables Created:**
| Table | Purpose | Key Fields |
|-------|---------|-----------|
| `ethos_tracks` | Music & SFX assets uploaded by artists | user_id, title, genre[], file_url, license_type, bpm, download_count |
| `ethos_artist_profiles` | Extended artist profiles with skills & pricing | user_id, skills[], for_hire, bio, sample_price_track, sample_price_sfx, verified |
| `ethos_guild_members` | Guild membership tracking | user_id, role (member/curator/admin), joined_at |
| `ethos_licensing_agreements` | Commercial licensing contracts | track_id, licensee_id, license_type, agreement_url, approved, expires_at |
| Table | Purpose | Key Fields |
| ---------------------------- | ---------------------------------------------- | -------------------------------------------------------------------------------- |
| `ethos_tracks` | Music & SFX assets uploaded by artists | user_id, title, genre[], file_url, license_type, bpm, download_count |
| `ethos_artist_profiles` | Extended artist profiles with skills & pricing | user_id, skills[], for_hire, bio, sample_price_track, sample_price_sfx, verified |
| `ethos_guild_members` | Guild membership tracking | user_id, role (member/curator/admin), joined_at |
| `ethos_licensing_agreements` | Commercial licensing contracts | track_id, licensee_id, license_type, agreement_url, approved, expires_at |
**Features:**
- Full RLS policies (row-level security)
- Proper indexes for performance
- Triggers for `updated_at` maintenance
@ -35,11 +37,13 @@
---
### 2. ✅ Community Group Page
**File:** `code/client/pages/community/EthosGuild.tsx`
**Route:** `/community/groups/ethos`
**Features:**
- Synthwave-themed hero with neon pink/purple/cyan gradients
- Guild mission and value propositions for three audiences:
- Musicians & Producers
@ -55,6 +59,7 @@
---
### 3. ✅ Curriculum Skeleton
**File:** `code/client/pages/docs/DocsCurriculumEthos.tsx`
**Route:** `/docs/curriculum/ethos`
@ -62,6 +67,7 @@
**Structure:** 4 progressive modules
1. **Synthwave Foundations** (4 hrs)
- The Synthwave Sound
- DAW Setup & Workflow
- Synth Basics: Oscillators & Filters
@ -69,6 +75,7 @@
- Capstone: Your First Synthwave Track
2. **Game Audio & SFX Design** (5 hrs)
- SFX Categories for Games
- Layering & Processing Techniques
- Procedural Audio with SFX Tools
@ -77,6 +84,7 @@
- Capstone: Design an SFX Pack
3. **Composition & Scoring** (6 hrs)
- Music Theory Essentials
- Writing Memorable Melodies
- Arranging & Orchestration
@ -96,15 +104,18 @@
---
### 4. ✅ App Routes & Navigation
**File:** `code/client/App.tsx`
**Routes Added:**
```
/community/groups/ethos → EthosGuild component
/docs/curriculum/ethos → DocsCurriculumEthos component (wrapped in DocsLayout)
```
**Navigation Linkage:**
- Ethos Guild page links to curriculum: "Learn Music Production"
- Curriculum page links back to guild: "Join the Guild"
- Both pages link to NEXUS marketplace: "Browse Audio Services"
@ -153,24 +164,27 @@ LABS (Yellow)
### Licensing Model (The "Firewall")
**Ecosystem License** (Non-Commercial, Free)
- Artists upload tracks to the library
- AeThex community (GameForge, Foundation) use for free
- Non-exclusive (artist can sell on Spotify, etc.)
- Royalty-free for internal AeThex projects
- *Protects artists from exploitation*
- _Protects artists from exploitation_
**Commercial License** (Paid, For-Profit)
- CORP wants to use a track for client video/product
- Artist must negotiate & sign separate contract
- Via NEXUS marketplace: "Custom Track $500", "SFX Pack $150"
- Manages payment & IP rights
- *Creates Funnel 3 (Talent Flywheel) revenue stream*
- _Creates Funnel 3 (Talent Flywheel) revenue stream_
---
## What Happens Next: Phase 2 & 3
### Phase 2: MVP Build (Q1 2025 - ~4 weeks)
**Goal:** Make Ethos operational
- Track upload interface (MP3/WAV, metadata)
@ -182,12 +196,14 @@ LABS (Yellow)
**Owner:** CTO/Engineering Team
**Key Deliverables:**
- 4 API endpoints (tracks, artists, licensing)
- 5 new pages (upload, library, artist profile, settings, licensing dashboard)
- 6 reusable components (upload modal, track card, artist card, etc.)
- Full error handling & validation
### Phase 3: Content & Community (Q1-Q2 2025)
**Goal:** Populate with founding artists and curriculum
- Community writes music production curriculum
@ -199,6 +215,7 @@ LABS (Yellow)
**Owner:** Community Team (Dylan & Foundation)
**Key Actions:**
- Identify 5-10 founding artists to seed the guild
- Schedule curriculum writing sprints
- Create artist guidelines & COC
@ -211,12 +228,14 @@ LABS (Yellow)
**Your Responsibility This Week:**
1. Draft **AeThex Ecosystem License** template
- Non-exclusive, royalty-free for AeThex internal use
- Attribution requirements
- IP ownership clarification
- Term: perpetual or limited duration?
2. Draft **Commercial License Agreement** template
- One-time use, exclusive/non-exclusive options
- Broadcast/sync/mechanical rights
- Pricing negotiation guidance
@ -266,15 +285,15 @@ Phase 2 integration roadmap
## Metrics & Success Criteria (Phase 1)
| Metric | Target | Status |
|--------|--------|--------|
| Database migration created | ✅ Yes | DONE |
| Community group page live | ✅ Yes | DONE |
| Curriculum structure complete | ✅ Yes | DONE |
| Routes wired in App.tsx | ✅ Yes | DONE |
| Synthwave aesthetic implemented | ✅ Yes | DONE |
| Legal templates drafted | ⏳ Pending | CEO ownership |
| Phase 2 technical plan documented | ✅ Yes | DONE |
| Metric | Target | Status |
| --------------------------------- | ---------- | ------------- |
| Database migration created | ✅ Yes | DONE |
| Community group page live | ✅ Yes | DONE |
| Curriculum structure complete | ✅ Yes | DONE |
| Routes wired in App.tsx | ✅ Yes | DONE |
| Synthwave aesthetic implemented | ✅ Yes | DONE |
| Legal templates drafted | ⏳ Pending | CEO ownership |
| Phase 2 technical plan documented | ✅ Yes | DONE |
---
@ -283,17 +302,20 @@ Phase 2 integration roadmap
### Strategic Value
1. **Sound Brand Identity**
- Every AeThex game has "the sound of AeThex"
- Synthwave aesthetic = competitive advantage
- Professional quality, instantly recognizable
2. **Talent Pipeline**
- Foundation nurtures emerging musicians
- NEXUS connects them to paid work
- CORP profits from client projects
- DEV-LINK gets cost-effective game audio
3. **Community Engagement**
- Attracts musicians, producers, sound designers
- Mentorship program grows talent
- Monthly events & spotlights build loyalty
@ -309,12 +331,14 @@ Phase 2 integration roadmap
## Known Limitations & Future Enhancements
### Phase 1 Limitations (By Design)
- No real user data in gallery (will populate in Phase 3)
- Licensing workflow not fully operational (awaiting legal templates)
- Curriculum content not written (community-driven in Phase 3)
- No monetization or payment processing (Phase 2+)
### Future Enhancements (Post-Phase 3)
- Royalty tracking & payment automation
- AI-powered track recommendations
- Live jam sessions & collaboration tools
@ -326,13 +350,13 @@ Phase 2 integration roadmap
## Action Items Summary
| Owner | Task | Deadline | Status |
|-------|------|----------|--------|
| **CEO (You)** | Draft 3 legal templates (ecosystem, commercial, artist) | This week | ⏳ In progress |
| **CTO (Braden)** | Deploy Phase 1 database migration | This sprint | ✅ Ready |
| **CTO (Braden)** | Plan Phase 2 sprint (4 weeks, ~20 hrs) | Next week | Ready to schedule |
| **Community (Dylan)** | Identify founding artists | Next month | ⏳ Pending |
| **Community (Dylan)** | Schedule curriculum writing sprints | Next month | ⏳ Pending |
| Owner | Task | Deadline | Status |
| --------------------- | ------------------------------------------------------- | ----------- | ----------------- |
| **CEO (You)** | Draft 3 legal templates (ecosystem, commercial, artist) | This week | ⏳ In progress |
| **CTO (Braden)** | Deploy Phase 1 database migration | This sprint | ✅ Ready |
| **CTO (Braden)** | Plan Phase 2 sprint (4 weeks, ~20 hrs) | Next week | Ready to schedule |
| **Community (Dylan)** | Identify founding artists | Next month | ⏳ Pending |
| **Community (Dylan)** | Schedule curriculum writing sprints | Next month | ⏳ Pending |
---

View file

@ -22,6 +22,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
**Technical Scope:**
- **File Upload Component**
- Location: `code/client/components/ethos/TrackUploadModal.tsx`
- Features:
- Support MP3, WAV file formats
@ -31,6 +32,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
- Storage: Supabase Storage (`ethos-tracks/{user_id}/{track_id}.{ext}`)
- **Track Metadata Form**
- Location: `code/client/components/ethos/TrackMetadataForm.tsx`
- Fields:
- `title` (required, text)
@ -41,6 +43,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
- `is_published` (optional, toggle)
- **Track Library Page**
- Location: `code/client/pages/ethos/TrackLibrary.tsx`
- Features:
- Grid view of all published tracks
@ -67,6 +70,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
**Technical Scope:**
- **Artist Profile Page**
- Location: `code/client/pages/ethos/ArtistProfile.tsx`
- Route: `/ethos/artists/:userId` or `/passport/:username/ethos`
- Displays:
@ -80,6 +84,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
- CTA: "Contact Artist", "Hire for Project"
- **Artist Settings Page**
- Location: `code/client/pages/ethos/ArtistSettings.tsx`
- Route: `/ethos/settings` (authenticated)
- Features:
@ -105,6 +110,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
**Technical Scope:**
- **NEXUS Audio Category**
- New service category on `/nexus`
- Display: Audio Production (alongside existing categories)
- Filter options:
@ -114,6 +120,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
- By rating: sort by downloads, artist rating
- **Ethos Service Card** (in NEXUS grid)
- Artist name, avatar, verified badge
- Sample pricing preview: "Custom Track $500 • SFX Pack $150"
- Skills tags: [Synthwave] [SFX Design] [Electronic]
@ -122,6 +129,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
- CTA: "View Portfolio" → `/ethos/artists/:userId`
- **Integration Points**
- Location: `code/client/pages/Nexus.tsx`
- Modify:
- Add "Audio Production" filter/category button
@ -144,6 +152,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
**Technical Scope:**
- **Contact Artist Flow**
- Location: `code/client/components/ethos/ContactArtistModal.tsx`
- When user clicks "Contact Artist" on a track or profile:
- Modal asks: "What's your project about?"
@ -154,6 +163,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
- Email: Notify artist that someone wants to license their track
- **Artist Licensing Dashboard**
- Location: `code/client/pages/ethos/LicensingDashboard.tsx`
- Tab 1: "Pending Agreements" (awaiting response)
- Card per agreement: licensee name, track, project desc, created date
@ -165,6 +175,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
- Archive of declined agreements
- **Approval Flow**
- Artist clicks "Review & Approve"
- Modal shows:
- Licensee info, project description
@ -185,11 +196,13 @@ This document outlines the Phase 2 technical implementation plan for integrating
## UI/UX Design Principles
### Color Palette
- Primary: Neon pink (#ec4899), purple (#a855f7), cyan (#06b6d4)
- Synthwave aesthetic: dark backgrounds, glowing accents
- Consistent with NEXUS (purple) and existing AeThex arms
### Components
- Reuse existing UI components (Button, Card, Badge, Input, Textarea)
- Create new Ethos-specific components:
- `TrackUploadModal.tsx`
@ -200,6 +213,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
- `LicensingAgreementCard.tsx`
### Navigation
- Add Ethos link to main nav: "Ethos Guild"
- Link to: `/ethos` or `/community/groups/ethos` (Phase 1 page)
- From Ethos Guild page, link to:
@ -212,6 +226,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
## Database Queries & Indexing
### Optimized Queries
```sql
-- Get all published tracks (with artist info)
SELECT t.*, p.full_name as artist_name, p.avatar_url
@ -241,6 +256,7 @@ ORDER BY la.created_at DESC;
```
### Index Strategy
- `ethos_tracks`: index on (is_published, created_at), (user_id), (genre)
- `ethos_artist_profiles`: index on (for_hire, verified)
- `ethos_licensing_agreements`: index on (track_id, approved), (licensee_id)
@ -252,6 +268,7 @@ ORDER BY la.created_at DESC;
### Tracks API
**POST /api/ethos/tracks**
```
Headers: Authorization: Bearer <token>
Body: FormData {
@ -267,12 +284,14 @@ Response: { id, user_id, title, file_url, ... }
```
**GET /api/ethos/tracks**
```
Query: ?genre=Synthwave&license_type=ecosystem&page=1&limit=20&sort=downloads
Response: { tracks: [...], total, page, limit }
```
**PUT /api/ethos/tracks/:id**
```
Headers: Authorization: Bearer <token>
Body: Partial track update (title, description, genre, license_type, is_published)
@ -280,6 +299,7 @@ Response: Updated track
```
**DELETE /api/ethos/tracks/:id**
```
Headers: Authorization: Bearer <token>
Response: { success: true }
@ -288,17 +308,20 @@ Response: { success: true }
### Artists API
**GET /api/ethos/artists**
```
Query: ?for_hire=true&verified=true&page=1&limit=20&skills=Synthwave
Response: { artists: [...], total }
```
**GET /api/ethos/artists/:userId**
```
Response: { id, user_id, full_name, avatar_url, bio, skills, for_hire, pricing, stats }
```
**PUT /api/ethos/artists/:userId**
```
Headers: Authorization: Bearer <token>
Body: { bio, skills, for_hire, portfolio_url, sample_price_track, ... }
@ -308,6 +331,7 @@ Response: Updated artist profile
### Licensing API
**POST /api/ethos/licensing-agreements**
```
Headers: Authorization: Bearer <token>
Body: { track_id, project_description }
@ -315,6 +339,7 @@ Response: { id, track_id, licensee_id, status: 'pending', ... }
```
**PUT /api/ethos/licensing-agreements/:id**
```
Headers: Authorization: Bearer <token> (artist only)
Body: { approved: boolean, message?: string }
@ -403,4 +428,3 @@ Once Phase 2 MVP is live:
- `code/supabase/migrations/20250206_add_ethos_guild.sql` - Database schema
- `/community/groups/ethos` - Community group landing page
- `/docs/curriculum/ethos` - Curriculum skeleton

View file

@ -14,24 +14,24 @@
### Public Pages (Live Now)
| Page | Route | Purpose |
|------|-------|---------|
| **Guild Community** | `/community/groups/ethos` | Overview, features, roadmap |
| **Curriculum** | `/docs/curriculum/ethos` | Learning path (content coming Phase 3) |
| Page | Route | Purpose |
| ------------------- | ------------------------- | -------------------------------------- |
| **Guild Community** | `/community/groups/ethos` | Overview, features, roadmap |
| **Curriculum** | `/docs/curriculum/ethos` | Learning path (content coming Phase 3) |
### Admin Pages (Phase 2)
| Page | Route | Purpose |
|------|-------|---------|
| Track Library | `/ethos/library` | Browse all published tracks |
| Artist Profiles | `/ethos/artists/:userId` | View artist portfolio |
| Artist Settings | `/ethos/settings` | Manage profile & pricing (authenticated) |
| Licensing Dashboard | `/ethos/licensing` | Manage commercial agreements (authenticated) |
| Page | Route | Purpose |
| ------------------- | ------------------------ | -------------------------------------------- |
| Track Library | `/ethos/library` | Browse all published tracks |
| Artist Profiles | `/ethos/artists/:userId` | View artist portfolio |
| Artist Settings | `/ethos/settings` | Manage profile & pricing (authenticated) |
| Licensing Dashboard | `/ethos/licensing` | Manage commercial agreements (authenticated) |
### Marketplace Integration (Phase 2)
| Page | Feature | Purpose |
|------|---------|---------|
| Page | Feature | Purpose |
| --------- | -------- | ---------------------------------------------- |
| **NEXUS** | `/nexus` | "Audio Production" category with Ethos artists |
---
@ -39,9 +39,11 @@
## 🗂️ What Was Built (Phase 1)
### 1. Database Schema ✅
**File:** `code/supabase/migrations/20250206_add_ethos_guild.sql`
4 tables:
- `ethos_tracks` - Music & SFX files
- `ethos_artist_profiles` - Artist info & pricing
- `ethos_guild_members` - Membership tracking
@ -50,10 +52,12 @@
**Status:** Ready to deploy. Run migration on Supabase.
### 2. Community Page ✅
**File:** `code/client/pages/community/EthosGuild.tsx`
**Route:** `/community/groups/ethos`
Features:
- Synthwave branding (neon pink/purple/cyan)
- Mission statement & value props
- 3 tabs: Overview, Features, Roadmap
@ -63,10 +67,12 @@ Features:
**Status:** Live and public. Share with community.
### 3. Curriculum Page ✅
**File:** `code/client/pages/docs/DocsCurriculumEthos.tsx`
**Route:** `/docs/curriculum/ethos`
4 modules:
- Synthwave Foundations (4 hrs)
- Game Audio & SFX Design (5 hrs)
- Composition & Scoring (6 hrs)
@ -75,9 +81,11 @@ Features:
**Status:** Skeleton ready. Content writing in Phase 3.
### 4. Routes & Navigation ✅
**File:** `code/client/App.tsx` (updated)
Routes added:
```
/community/groups/ethos → EthosGuild
/docs/curriculum/ethos → DocsCurriculumEthos (with DocsLayout)
@ -86,7 +94,9 @@ Routes added:
**Status:** Wired and accessible.
### 5. Documentation ✅
**Files:**
- `ETHOS_GUILD_PHASE1_COMPLETE.md` - Full Phase 1 summary
- `ETHOS_GUILD_PHASE2_NEXUS_INTEGRATION.md` - Phase 2 technical plan
- `ETHOS_GUILD_QUICK_START.md` - This guide
@ -133,22 +143,26 @@ LABS (Yellow)
### Tech Team (CTO) - 4 weeks, ~20 hours
**Week 1:** APIs + database
- `POST /api/ethos/tracks` - Upload track
- `GET /api/ethos/tracks` - List tracks
- `GET /api/ethos/artists` - List artists
- `POST /api/ethos/licensing-agreements` - Create licensing request
**Week 2:** Upload UI
- `TrackUploadModal.tsx` - File upload + progress
- `TrackMetadataForm.tsx` - Title, genre, license type, BPM, etc.
- `code/pages/ethos/TrackLibrary.tsx` - Browse all tracks
**Week 3:** Artist profiles + NEXUS
- `ArtistProfile.tsx` - View artist portfolio
- `ArtistSettings.tsx` - Manage profile & pricing
- Update `/nexus` to show "Audio Production" category
**Week 4:** Licensing + testing
- `LicensingDashboard.tsx` - Manage agreements
- Error handling & validation
- Performance testing
@ -158,6 +172,7 @@ LABS (Yellow)
### CEO - This Week ⏳
**Draft 3 legal templates:**
1. **Ecosystem License** - Free non-exclusive use (internal AeThex projects)
2. **Commercial License** - Paid (CORP client projects)
3. **Artist Agreement** - Rights, ownership, guidelines
@ -167,15 +182,18 @@ LABS (Yellow)
### Community Team (Dylan) - Phase 3
**Identify founding artists**
- 5-10 seed artists to launch with
- Reach out & onboard to guild
**Write curriculum**
- Schedule writing sprints
- Covers: synthwave, SFX design, composition, licensing
- Target: Live by Q2 2025
**Community management**
- Guild leadership roles (curator, admin)
- Monthly spotlights & events
- Artist guidelines & COC
@ -184,32 +202,35 @@ LABS (Yellow)
## 🚀 Launching Ethos (Timeline)
| Date | Phase | Milestone |
|------|-------|-----------|
| **This week** | Phase 1 → 2 | CEO approves legal templates |
| **Next week** | Phase 2 Start | CTO schedules 4-week sprint |
| **Week 1-4** | Phase 2 Build | API endpoints + upload UI |
| **Week 5** | Phase 2 QA | Testing & final polish |
| **Week 6** | Phase 2 Launch | MVP live, founding artists invited |
| **Month 2-3** | Phase 3 | Curriculum writing, community growth |
| Date | Phase | Milestone |
| ------------- | -------------- | ------------------------------------ |
| **This week** | Phase 1 → 2 | CEO approves legal templates |
| **Next week** | Phase 2 Start | CTO schedules 4-week sprint |
| **Week 1-4** | Phase 2 Build | API endpoints + upload UI |
| **Week 5** | Phase 2 QA | Testing & final polish |
| **Week 6** | Phase 2 Launch | MVP live, founding artists invited |
| **Month 2-3** | Phase 3 | Curriculum writing, community growth |
---
## 💡 Key Design Decisions
### Why Synthwave?
- '80s retro-futuristic aesthetic = AeThex brand
- Neon pink, purple, cyan visuals
- Instantly recognizable, culturally cool
- Differentiates from other game studios
### Why Not a Separate Venture?
- Ethos is **for the ecosystem**, not profits alone
- Foundation owns & nurtures it
- Revenue flows back to CORP client work
- Talent pipeline strengthens all arms
### Why NEXUS Integration?
- Makes artists discoverable across AeThex
- Unifies creator economy (designers, devs, musicians)
- Enables CORP to hire for commercial projects
@ -219,29 +240,32 @@ LABS (Yellow)
## 📊 Success Metrics (Phase 2+)
| Metric | Q1 2025 Target | Q2+ Target |
|--------|----------------|-----------|
| Guild members | 10 founding | 100+ active |
| Tracks uploaded | 50 | 500+ |
| Commercial licensing agreements | 2-3 | 20+ |
| CORP revenue from Ethos (licensing) | $5K | $50K+ |
| GameForge games using Ethos audio | 3-5 | 15+ |
| Metric | Q1 2025 Target | Q2+ Target |
| ----------------------------------- | -------------- | ----------- |
| Guild members | 10 founding | 100+ active |
| Tracks uploaded | 50 | 500+ |
| Commercial licensing agreements | 2-3 | 20+ |
| CORP revenue from Ethos (licensing) | $5K | $50K+ |
| GameForge games using Ethos audio | 3-5 | 15+ |
---
## 🔗 Quick Links
**Documentation:**
- Phase 1 Summary: `code/docs/ETHOS_GUILD_PHASE1_COMPLETE.md`
- Phase 2 Plan: `code/docs/ETHOS_GUILD_PHASE2_NEXUS_INTEGRATION.md`
- Database: `code/supabase/migrations/20250206_add_ethos_guild.sql`
**Code:**
- Community page: `code/client/pages/community/EthosGuild.tsx`
- Curriculum page: `code/client/pages/docs/DocsCurriculumEthos.tsx`
- Routes: `code/client/App.tsx` (search "ethos" or "EthosGuild")
**Team Responsibilities:**
- **CEO:** Legal templates (this week)
- **CTO:** Phase 2 sprint planning & build
- **Community:** Founding artist outreach & curriculum
@ -258,6 +282,7 @@ A: Yes! The ecosystem license is non-exclusive. Artists can sell on Spotify, Ban
**Q: How do artists make money?**
A: Three ways:
1. CORP hires them for commercial projects (via NEXUS)
2. Streaming revenue on other platforms
3. (Future) Royalty share on successful games using their music