Prettier format pending files
This commit is contained in:
parent
c60daa76ee
commit
68ddb5ca8c
17 changed files with 970 additions and 399 deletions
|
|
@ -235,7 +235,11 @@ export default function EthosGuild() {
|
||||||
|
|
||||||
{/* Tabs: Overview, Features, Curriculum, etc */}
|
{/* Tabs: Overview, Features, Curriculum, etc */}
|
||||||
<section>
|
<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">
|
<TabsList className="grid w-full grid-cols-3 bg-black/50 border border-pink-500/30">
|
||||||
<TabsTrigger
|
<TabsTrigger
|
||||||
value="overview"
|
value="overview"
|
||||||
|
|
|
||||||
|
|
@ -49,11 +49,7 @@ const curriculumModules: CurriculumModule[] = [
|
||||||
"Master the core sound design and production techniques that define AeThex audio.",
|
"Master the core sound design and production techniques that define AeThex audio.",
|
||||||
level: "foundation",
|
level: "foundation",
|
||||||
duration: "4 hrs",
|
duration: "4 hrs",
|
||||||
focus: [
|
focus: ["Synthwave aesthetics", "Synthesis basics", "Drum programming"],
|
||||||
"Synthwave aesthetics",
|
|
||||||
"Synthesis basics",
|
|
||||||
"Drum programming",
|
|
||||||
],
|
|
||||||
lessons: [
|
lessons: [
|
||||||
{
|
{
|
||||||
title: "The Synthwave Sound: History & Vibes",
|
title: "The Synthwave Sound: History & Vibes",
|
||||||
|
|
@ -121,8 +117,7 @@ const curriculumModules: CurriculumModule[] = [
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Spatial Audio & 3D Sound Panning",
|
title: "Spatial Audio & 3D Sound Panning",
|
||||||
summary:
|
summary: "Position sounds in 3D space for immersive game environments.",
|
||||||
"Position sounds in 3D space for immersive game environments.",
|
|
||||||
status: "coming_soon",
|
status: "coming_soon",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -174,8 +169,7 @@ const curriculumModules: CurriculumModule[] = [
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Adaptive Music for Games",
|
title: "Adaptive Music for Games",
|
||||||
summary:
|
summary: "Create stems and variations that respond to gameplay states.",
|
||||||
"Create stems and variations that respond to gameplay states.",
|
|
||||||
status: "coming_soon",
|
status: "coming_soon",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -250,7 +244,8 @@ export default function DocsCurriculumEthos() {
|
||||||
const highlights = [
|
const highlights = [
|
||||||
{
|
{
|
||||||
title: "Synthwave-focused",
|
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,
|
icon: Music,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -321,8 +316,8 @@ export default function DocsCurriculumEthos() {
|
||||||
</CardTitle>
|
</CardTitle>
|
||||||
<CardDescription className="text-gray-300">
|
<CardDescription className="text-gray-300">
|
||||||
Four progressive modules from foundational synthwave to advanced
|
Four progressive modules from foundational synthwave to advanced
|
||||||
composition and licensing. Content coming soon—led by the community
|
composition and licensing. Content coming soon—led by the
|
||||||
under AeThex Foundation.
|
community under AeThex Foundation.
|
||||||
</CardDescription>
|
</CardDescription>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent className="space-y-4">
|
<CardContent className="space-y-4">
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,11 @@
|
||||||
import { Link } from "react-router-dom";
|
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 { Badge } from "@/components/ui/badge";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import { GitBranch, ExternalLink, CheckCircle2 } from "lucide-react";
|
import { GitBranch, ExternalLink, CheckCircle2 } from "lucide-react";
|
||||||
|
|
@ -8,38 +14,87 @@ export default function DocsEditorsGuide() {
|
||||||
return (
|
return (
|
||||||
<div className="space-y-8">
|
<div className="space-y-8">
|
||||||
<section>
|
<section>
|
||||||
<Badge className="bg-indigo-600/20 text-indigo-200 uppercase tracking-wide">Docs Editing</Badge>
|
<Badge className="bg-indigo-600/20 text-indigo-200 uppercase tracking-wide">
|
||||||
<h2 className="text-3xl font-semibold text-white">Editing Public Docs (Builder → GitHub PR workflow)</h2>
|
Docs Editing
|
||||||
<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>
|
||||||
|
<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>
|
||||||
|
|
||||||
<section className="grid gap-6 lg:grid-cols-2">
|
<section className="grid gap-6 lg:grid-cols-2">
|
||||||
<Card className="bg-slate-900/60 border-slate-700">
|
<Card className="bg-slate-900/60 border-slate-700">
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
<CardTitle className="text-white">Edit in Builder</CardTitle>
|
<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>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<ol className="list-decimal pl-6 space-y-2 text-sm text-gray-300">
|
<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>
|
||||||
<li>Select <strong>Builder.io</strong> and edit the desired public doc entry (e.g. Getting Started, Platform).</li>
|
Open the app and click <strong>Open MCP popover</strong> (
|
||||||
<li>Use the preview mode to validate across themes (Brand / Professional).</li>
|
<a
|
||||||
<li>Save drafts and request review from the Docs team (assign reviewer in Builder).</li>
|
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>
|
</ol>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
<Card className="bg-slate-900/60 border-slate-700">
|
<Card className="bg-slate-900/60 border-slate-700">
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
<CardTitle className="text-white">Export & Publish (GitHub PR)</CardTitle>
|
<CardTitle className="text-white">
|
||||||
<CardDescription className="text-gray-300">After Builder review, export or commit changes to the docs repo and open a GitHub PR.</CardDescription>
|
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>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<ol className="list-decimal pl-6 space-y-2 text-sm text-gray-300">
|
<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>
|
||||||
<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>
|
From Builder, use the export feature to get Markdown/JSX
|
||||||
<li>Open a GitHub Pull Request describing the change, link the Builder draft, and assign the Docs reviewer team.</li>
|
content, or copy the updated component code.
|
||||||
<li>CI will run lint & build checks. After approval, merge to main and the docs will be deployed automatically.</li>
|
</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>
|
</ol>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
@ -48,15 +103,34 @@ export default function DocsEditorsGuide() {
|
||||||
<section>
|
<section>
|
||||||
<Card className="bg-slate-900/60 border-slate-700">
|
<Card className="bg-slate-900/60 border-slate-700">
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
<CardTitle className="text-white">Public docs policy & safety checks</CardTitle>
|
<CardTitle className="text-white">
|
||||||
<CardDescription className="text-gray-300">Ensure no internal APIs or sensitive operational details are exposed publicly.</CardDescription>
|
Public docs policy & safety checks
|
||||||
|
</CardTitle>
|
||||||
|
<CardDescription className="text-gray-300">
|
||||||
|
Ensure no internal APIs or sensitive operational details are
|
||||||
|
exposed publicly.
|
||||||
|
</CardDescription>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<ul className="list-disc pl-6 mt-2 space-y-2 text-sm text-gray-300">
|
<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>
|
||||||
<li>When in doubt, link to an internal doc (under <code>/internal-docs</code>) instead of copying operational procedures to public docs.</li>
|
Do not include internal admin endpoints, service role keys, or
|
||||||
<li>For partner-facing API documentation, create a gated partner docs area (contact the Docs lead).</li>
|
SQL migrations in public docs.
|
||||||
<li>Security checklist: remove any <code>/api/discord/role-mappings</code>, admin-register endpoints, or internal-only debug examples before publishing.</li>
|
</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>
|
</ul>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
@ -70,13 +144,20 @@ export default function DocsEditorsGuide() {
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<ul className="list-disc pl-6 mt-2 space-y-2 text-sm text-gray-300">
|
<ul className="list-disc pl-6 mt-2 space-y-2 text-sm text-gray-300">
|
||||||
<li>Builder draft created and reviewed.</li>
|
<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>CI passes (lint, build).</li>
|
||||||
<li>Final review & merge by Docs lead.</li>
|
<li>Final review & merge by Docs lead.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div className="mt-4">
|
<div className="mt-4">
|
||||||
<Button asChild>
|
<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
|
<GitBranch className="h-4 w-4" /> Open repo
|
||||||
</a>
|
</a>
|
||||||
</Button>
|
</Button>
|
||||||
|
|
|
||||||
|
|
@ -213,28 +213,50 @@ export default function DocsGettingStarted() {
|
||||||
<section id="create-account" className="space-y-6">
|
<section id="create-account" className="space-y-6">
|
||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
<Shield className="h-6 w-6 text-purple-400" />
|
<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>
|
||||||
|
|
||||||
<div className="grid gap-6 lg:grid-cols-2">
|
<div className="grid gap-6 lg:grid-cols-2">
|
||||||
<Card className="bg-slate-900/60 border-slate-700">
|
<Card className="bg-slate-900/60 border-slate-700">
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
<CardTitle className="text-white text-lg">Step 1 — Choose sign-in method</CardTitle>
|
<CardTitle className="text-white text-lg">
|
||||||
<CardDescription className="text-gray-300">AeThex supports Email/password, OAuth providers, and Web3 wallet sign-in.</CardDescription>
|
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>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<ol className="list-decimal pl-6 space-y-2 text-sm text-gray-300">
|
<ol className="list-decimal pl-6 space-y-2 text-sm text-gray-300">
|
||||||
<li>
|
<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>
|
||||||
<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>
|
||||||
<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>
|
||||||
<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>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
|
|
@ -242,15 +264,38 @@ export default function DocsGettingStarted() {
|
||||||
|
|
||||||
<Card className="bg-slate-900/60 border-slate-700">
|
<Card className="bg-slate-900/60 border-slate-700">
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
<CardTitle className="text-white text-lg">Step 2 — Verify & complete profile</CardTitle>
|
<CardTitle className="text-white text-lg">
|
||||||
<CardDescription className="text-gray-300">After initial login you'll be prompted to complete onboarding (profile, bio, primary arm).</CardDescription>
|
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>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<ol className="list-decimal pl-6 space-y-2 text-sm text-gray-300">
|
<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>
|
||||||
<li>Complete the onboarding steps including name, bio, interests, and primary arm selection.</li>
|
Check your email and follow the verification link (email
|
||||||
<li>Link any additional providers from <Link to="/dashboard?tab=connections" className="text-aethex-400 underline">Dashboard → Connections</Link> if needed.</li>
|
provider flow).
|
||||||
<li>Once finished click "Finish & Go to Dashboard" to start using the platform.</li>
|
</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>
|
</ol>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</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">
|
<div className="bg-slate-900/60 border-slate-700 p-4 text-sm text-gray-300">
|
||||||
<strong>Notes & troubleshooting</strong>
|
<strong>Notes & troubleshooting</strong>
|
||||||
<ul className="list-disc pl-6 mt-2 space-y-1">
|
<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>
|
||||||
<li>If you don't receive verification emails, check spam and ensure no company email filtering blocks support@aethex.tech.</li>
|
If an OAuth provider reports "account exists", sign in using the
|
||||||
<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>
|
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>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="categories" className="space-y-6">
|
<section id="categories" className="space-y-6">
|
||||||
<div className="text-center space-y-2">
|
<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">
|
<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>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="grid gap-6 lg:grid-cols-2">
|
<div className="grid gap-6 lg:grid-cols-2">
|
||||||
{docCategories.map((category) => (
|
{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>
|
<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
|
{category.docs} docs
|
||||||
</div>
|
</div>
|
||||||
<CardTitle className="text-xl text-white mt-3">{category.title}</CardTitle>
|
<CardTitle className="text-xl text-white mt-3">
|
||||||
<CardDescription className="text-gray-300">{category.description}</CardDescription>
|
{category.title}
|
||||||
|
</CardTitle>
|
||||||
|
<CardDescription className="text-gray-300">
|
||||||
|
{category.description}
|
||||||
|
</CardDescription>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<ul className="grid grid-cols-2 gap-2 text-sm text-gray-300">
|
<ul className="grid grid-cols-2 gap-2 text-sm text-gray-300">
|
||||||
|
|
@ -308,9 +376,16 @@ export default function DocsGettingStarted() {
|
||||||
</CardTitle>
|
</CardTitle>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent className="space-y-4">
|
<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">
|
<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" />
|
<ArrowRight className="mr-2 h-4 w-4" />
|
||||||
{item.actionLabel}
|
{item.actionLabel}
|
||||||
</Link>
|
</Link>
|
||||||
|
|
@ -323,32 +398,66 @@ export default function DocsGettingStarted() {
|
||||||
<section id="onboarding-summary" className="space-y-6">
|
<section id="onboarding-summary" className="space-y-6">
|
||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
<PlugZap className="h-6 w-6 text-purple-400" />
|
<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>
|
||||||
<div className="bg-slate-900/60 border-slate-700 p-4 text-sm text-gray-300">
|
<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">
|
<ol className="list-decimal pl-6 space-y-2">
|
||||||
<li><strong>Personal Info</strong> — name, display handle, avatar.</li>
|
<li>
|
||||||
<li><strong>Profile Type</strong> — select experience level and role (creator, studio, enterprise).</li>
|
<strong>Personal Info</strong> — name, display handle, avatar.
|
||||||
<li><strong>Interests & Skills</strong> — choose tags so we can recommend opportunities and mentors.</li>
|
</li>
|
||||||
<li><strong>Choose Primary Arm</strong> — pick the arm that best represents your work (Labs, GameForge, Corp, Foundation, Dev-Link).</li>
|
<li>
|
||||||
<li><strong>Creator Profile</strong> — optional portfolio, bio, links (recommended for discoverability).</li>
|
<strong>Profile Type</strong> — select experience level and role
|
||||||
<li><strong>Finish</strong> — background tasks run (profile refresh) and you land on the dashboard.</li>
|
(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>
|
</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>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="platform-highlights" className="space-y-6">
|
<section id="platform-highlights" className="space-y-6">
|
||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
<LayoutDashboard className="h-6 w-6 text-purple-400" />
|
<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>
|
||||||
<div className="grid gap-6 lg:grid-cols-2">
|
<div className="grid gap-6 lg:grid-cols-2">
|
||||||
{platformHighlights.map((item) => {
|
{platformHighlights.map((item) => {
|
||||||
const Icon = item.icon;
|
const Icon = item.icon;
|
||||||
return (
|
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>
|
<CardHeader>
|
||||||
<CardTitle className="text-white text-lg flex items-center gap-3">
|
<CardTitle className="text-white text-lg flex items-center gap-3">
|
||||||
<Icon className="h-5 w-5 text-purple-300" />
|
<Icon className="h-5 w-5 text-purple-300" />
|
||||||
|
|
@ -356,7 +465,9 @@ export default function DocsGettingStarted() {
|
||||||
</CardTitle>
|
</CardTitle>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent>
|
<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>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
|
|
@ -373,12 +484,20 @@ export default function DocsGettingStarted() {
|
||||||
{setupSteps.map((step, index) => (
|
{setupSteps.map((step, index) => (
|
||||||
<Card key={step.title} className="bg-slate-900/60 border-slate-700">
|
<Card key={step.title} className="bg-slate-900/60 border-slate-700">
|
||||||
<CardHeader className="space-y-1">
|
<CardHeader className="space-y-1">
|
||||||
<Badge variant="outline" className="w-fit">Step {index + 1}</Badge>
|
<Badge variant="outline" className="w-fit">
|
||||||
<CardTitle className="text-white text-lg">{step.title}</CardTitle>
|
Step {index + 1}
|
||||||
<CardDescription className="text-gray-300">{step.description}</CardDescription>
|
</Badge>
|
||||||
|
<CardTitle className="text-white text-lg">
|
||||||
|
{step.title}
|
||||||
|
</CardTitle>
|
||||||
|
<CardDescription className="text-gray-300">
|
||||||
|
{step.description}
|
||||||
|
</CardDescription>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent>
|
<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>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
))}
|
))}
|
||||||
|
|
@ -389,39 +508,91 @@ export default function DocsGettingStarted() {
|
||||||
{deploymentChecklist.map((item) => (
|
{deploymentChecklist.map((item) => (
|
||||||
<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>
|
<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>
|
</CardHeader>
|
||||||
<CardContent>
|
<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>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
))}
|
))}
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="staff-editing" className="space-y-4">
|
<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">
|
<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>
|
||||||
<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>
|
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">
|
<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>
|
||||||
<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>
|
<strong>Edit in Builder:</strong>{" "}
|
||||||
<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>
|
<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>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="next-steps" className="space-y-4">
|
<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">
|
<div className="grid gap-4 md:grid-cols-2 xl:grid-cols-4">
|
||||||
{explorationLinks.map((link) => (
|
{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>
|
<CardHeader>
|
||||||
<CardTitle className="flex items-center justify-between text-white text-base">{link.title}<ArrowRight className="h-4 w-4 text-purple-300" /></CardTitle>
|
<CardTitle className="flex items-center justify-between text-white text-base">
|
||||||
<CardDescription className="text-gray-300 text-sm">{link.description}</CardDescription>
|
{link.title}
|
||||||
|
<ArrowRight className="h-4 w-4 text-purple-300" />
|
||||||
|
</CardTitle>
|
||||||
|
<CardDescription className="text-gray-300 text-sm">
|
||||||
|
{link.description}
|
||||||
|
</CardDescription>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent>
|
<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>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
))}
|
))}
|
||||||
|
|
|
||||||
|
|
@ -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 { Button } from "@/components/ui/button";
|
||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
import { Lock, Users, GitBranch } from "lucide-react";
|
import { Lock, Users, GitBranch } from "lucide-react";
|
||||||
|
|
@ -7,22 +13,44 @@ export default function DocsPartnerProposal() {
|
||||||
return (
|
return (
|
||||||
<div className="space-y-8">
|
<div className="space-y-8">
|
||||||
<section>
|
<section>
|
||||||
<h2 className="text-3xl font-semibold text-white">Partner Docs & Gated Area Proposal</h2>
|
<h2 className="text-3xl font-semibold text-white">
|
||||||
<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>
|
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>
|
||||||
|
|
||||||
<section className="grid gap-6 lg:grid-cols-2">
|
<section className="grid gap-6 lg:grid-cols-2">
|
||||||
<Card className="bg-slate-900/60 border-slate-700">
|
<Card className="bg-slate-900/60 border-slate-700">
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
<CardTitle className="text-white">Scope</CardTitle>
|
<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>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<ul className="list-disc pl-6 space-y-2 text-sm text-gray-300">
|
<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>
|
||||||
<li>Operational integration instructions (webhooks, role mappings, admin endpoints).</li>
|
Partner API endpoints and sample requests that include partner
|
||||||
<li>Deployment scripts, secrets management guidance (redacted for public), and verification flows.</li>
|
keys or elevated scopes.
|
||||||
<li>Commercial and SLA information, onboarding steps for partner accounts.</li>
|
</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>
|
</ul>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
@ -30,18 +58,34 @@ export default function DocsPartnerProposal() {
|
||||||
<Card className="bg-slate-900/60 border-slate-700">
|
<Card className="bg-slate-900/60 border-slate-700">
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
<CardTitle className="text-white">Access & Workflow</CardTitle>
|
<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>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<ol className="list-decimal pl-6 space-y-2 text-sm text-gray-300">
|
<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>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>
|
||||||
<li>Partner gets access to the gated docs area (passwordless SSO or invite link).</li>
|
Docs team creates a partner account and assigns a partner role
|
||||||
<li>Partner changes and feedback are managed via Support or a private Builder space.</li>
|
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>
|
</ol>
|
||||||
<div className="mt-4">
|
<div className="mt-4">
|
||||||
<Button asChild>
|
<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>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
|
|
@ -52,13 +96,24 @@ export default function DocsPartnerProposal() {
|
||||||
<Card className="bg-slate-900/60 border-slate-700">
|
<Card className="bg-slate-900/60 border-slate-700">
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
<CardTitle className="text-white">Security & Controls</CardTitle>
|
<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>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<ul className="list-disc pl-6 space-y-2 text-sm text-gray-300">
|
<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>
|
||||||
<li>Audit logs for partner doc accesses are retained and reviewed monthly.</li>
|
Partner accounts are RBAC-limited and issued short-lived
|
||||||
<li>Automation prevents copying internal operational docs into public pages; editors must follow the PR checklist.</li>
|
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>
|
</ul>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
@ -71,9 +126,19 @@ export default function DocsPartnerProposal() {
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<ul className="list-disc pl-6 space-y-2 text-sm text-gray-300">
|
<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>
|
||||||
<li>Create Builder space for partner docs drafts and approval workflow.</li>
|
Implement partner role and gated content routing (Auth +
|
||||||
<li>Update CI to only publish public docs from <code>code/client/pages/docs</code> and prevent internal docs from being included.</li>
|
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>
|
</ul>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
|
||||||
|
|
@ -365,23 +365,47 @@ export default function DocsPlatform() {
|
||||||
<section id="architecture" className="space-y-6">
|
<section id="architecture" className="space-y-6">
|
||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
<Globe className="h-6 w-6 text-cyan-300" />
|
<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>
|
</div>
|
||||||
<Card className="bg-slate-900/60 border-slate-700">
|
<Card className="bg-slate-900/60 border-slate-700">
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<p className="text-gray-300 text-sm leading-relaxed">
|
<p className="text-gray-300 text-sm leading-relaxed">
|
||||||
AeThex is composed of a lightweight React + Vite frontend, a Node.js backend that
|
AeThex is composed of a lightweight React + Vite frontend, a
|
||||||
exposes API endpoints (under <code>/api/*</code>), and a Supabase-backed PostgreSQL
|
Node.js backend that exposes API endpoints (under{" "}
|
||||||
database. The system integrates several services:
|
<code>/api/*</code>), and a Supabase-backed PostgreSQL database.
|
||||||
|
The system integrates several services:
|
||||||
</p>
|
</p>
|
||||||
<ul className="list-disc pl-6 mt-3 text-gray-300 text-sm space-y-2">
|
<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>
|
||||||
<li><strong>Backend:</strong> Node/Express handlers for public APIs, Discord webhooks, and OAuth flows.</li>
|
<strong>Frontend:</strong> React + TypeScript, Docs and Internal
|
||||||
<li><strong>Database:</strong> Supabase (Postgres) stores user profiles, creator data, and operational tables. Migrations live under <code>code/supabase/migrations</code>.</li>
|
hubs use a separate layout and access control.
|
||||||
<li><strong>Integrations:</strong> OAuth providers (Google, GitHub, Discord, Roblox), Discord bot for role mapping & verification, and optional Web3 wallet linking.</li>
|
</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>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>
|
</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>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
</section>
|
</section>
|
||||||
|
|
@ -390,16 +414,42 @@ export default function DocsPlatform() {
|
||||||
<section id="troubleshooting" className="space-y-6">
|
<section id="troubleshooting" className="space-y-6">
|
||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
<ShieldCheck className="h-6 w-6 text-cyan-300" />
|
<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>
|
</div>
|
||||||
<Card className="bg-slate-900/60 border-slate-700">
|
<Card className="bg-slate-900/60 border-slate-700">
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<h4 className="text-white font-semibold mb-2">OAuth redirect issues</h4>
|
<h4 className="text-white font-semibold mb-2">
|
||||||
<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>
|
OAuth redirect issues
|
||||||
<h4 className="text-white font-semibold mt-4 mb-2">Session/linking problems</h4>
|
</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>
|
<p className="text-gray-300 text-sm">
|
||||||
<h4 className="text-white font-semibold mt-4 mb-2">Missing emails</h4>
|
If an OAuth provider returns an <code>invalid_redirect_uri</code>{" "}
|
||||||
<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>
|
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>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -225,192 +225,194 @@ export default function DocsTutorials() {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DocsLayout title="Tutorials" description="Step-by-step guides">
|
<DocsLayout title="Tutorials" description="Step-by-step guides">
|
||||||
<div>
|
<div>
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="mb-8 hidden">
|
<div className="mb-8 hidden">
|
||||||
<h2 className="text-2xl font-bold text-white mb-4">
|
<h2 className="text-2xl font-bold text-white mb-4">
|
||||||
Documentation Tutorials
|
Documentation Tutorials
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-gray-300 mb-6">
|
<p className="text-gray-300 mb-6">
|
||||||
Step-by-step guides and interactive tutorials to help you master
|
Step-by-step guides and interactive tutorials to help you master
|
||||||
AeThex
|
AeThex
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
{/* Filters */}
|
{/* Filters */}
|
||||||
<div className="flex flex-col lg:flex-row gap-4 mb-6">
|
<div className="flex flex-col lg:flex-row gap-4 mb-6">
|
||||||
<div className="flex-1">
|
<div className="flex-1">
|
||||||
<div className="relative">
|
<div className="relative">
|
||||||
<Search className="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 h-4 w-4" />
|
<Search className="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 h-4 w-4" />
|
||||||
<Input
|
<Input
|
||||||
placeholder="Search tutorials..."
|
placeholder="Search tutorials..."
|
||||||
value={searchTerm}
|
value={searchTerm}
|
||||||
onChange={(e) => setSearchTerm(e.target.value)}
|
onChange={(e) => setSearchTerm(e.target.value)}
|
||||||
className="pl-10 bg-slate-800/50 border-slate-600 text-white"
|
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>
|
</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>
|
</div>
|
||||||
|
|
||||||
{/* Tutorials Grid */}
|
<div className="grid grid-cols-1 lg:grid-cols-4 gap-8">
|
||||||
<div className="lg:col-span-3">
|
{/* Categories Sidebar */}
|
||||||
<div className="mb-4">
|
<div className="lg:col-span-1">
|
||||||
<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">
|
<Card className="bg-slate-800/50 border-slate-700">
|
||||||
<CardContent className="p-8 text-center">
|
<CardHeader>
|
||||||
<BookOpen className="h-12 w-12 text-gray-400 mx-auto mb-4" />
|
<CardTitle className="text-white flex items-center">
|
||||||
<h3 className="text-lg font-semibold text-white mb-2">
|
<Filter className="h-5 w-5 mr-2" />
|
||||||
No tutorials found
|
Categories
|
||||||
</h3>
|
</CardTitle>
|
||||||
<p className="text-gray-400">
|
</CardHeader>
|
||||||
Try adjusting your search terms or filters to find what you're
|
<CardContent className="space-y-2">
|
||||||
looking for.
|
{categories.map((category) => {
|
||||||
</p>
|
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>
|
</CardContent>
|
||||||
</Card>
|
</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>
|
</div>
|
||||||
</div>
|
|
||||||
</DocsLayout>
|
</DocsLayout>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,31 +3,89 @@ import { Link } from "react-router-dom";
|
||||||
|
|
||||||
export default function InternalDocsDiscordAdmin() {
|
export default function InternalDocsDiscordAdmin() {
|
||||||
return (
|
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">
|
<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>
|
<section>
|
||||||
<h3 className="text-xl font-semibold text-white">Operational docs</h3>
|
<h3 className="text-xl font-semibold text-white">Operational docs</h3>
|
||||||
<ul className="list-disc pl-6 text-slate-300 space-y-2">
|
<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>
|
||||||
<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>
|
<Link
|
||||||
<li><a href="/docs/DISCORD-LINKING-FLOW-ANALYSIS.md" className="text-aethex-400 underline">Discord Linking Flow Analysis</a> — detailed flow and fixes.</li>
|
to="/internal-docs/onboarding"
|
||||||
<li><a href="/docs/DISCORD-ACTIVITY-DEPLOYMENT.md" className="text-aethex-400 underline">Discord Activity Deployment</a> — deploy & register commands (internal).</li>
|
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>
|
</ul>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<h3 className="text-xl font-semibold text-white">Quick links</h3>
|
<h3 className="text-xl font-semibold text-white">Quick links</h3>
|
||||||
<ul className="list-disc pl-6 text-slate-300 space-y-2">
|
<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>
|
||||||
<li><Link to="/staff/docs" className="text-aethex-400 underline">Staff docs index</Link></li>
|
<Link to="/admin" className="text-aethex-400 underline">
|
||||||
<li><a href="https://github.com/AeThex-Corporation/aethex-forge" target="_blank" rel="noreferrer" className="text-aethex-400 underline">Source repo</a></li>
|
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>
|
</ul>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<div className="bg-slate-800/30 border border-slate-700 rounded-lg p-4 text-sm text-slate-300">
|
<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>
|
||||||
</div>
|
</div>
|
||||||
</InternalDocsLayout>
|
</InternalDocsLayout>
|
||||||
|
|
|
||||||
|
|
@ -154,25 +154,44 @@ interface InternalDocsLayoutProps {
|
||||||
// Map routes -> source file path so "Edit this page" can link to the component in the repo
|
// Map routes -> source file path so "Edit this page" can link to the component in the repo
|
||||||
const SOURCE_MAP: Record<string, string> = {
|
const SOURCE_MAP: Record<string, string> = {
|
||||||
"/internal-docs": "code/client/pages/internal-docs/Space1Welcome.tsx",
|
"/internal-docs": "code/client/pages/internal-docs/Space1Welcome.tsx",
|
||||||
"/internal-docs/axiom-model": "code/client/pages/internal-docs/Space1AxiomModel.tsx",
|
"/internal-docs/axiom-model":
|
||||||
"/internal-docs/find-your-role": "code/client/pages/internal-docs/Space1FindYourRole.tsx",
|
"code/client/pages/internal-docs/Space1AxiomModel.tsx",
|
||||||
"/internal-docs/code-of-conduct": "code/client/pages/internal-docs/Space2CodeOfConduct.tsx",
|
"/internal-docs/find-your-role":
|
||||||
"/internal-docs/communication": "code/client/pages/internal-docs/Space2Communication.tsx",
|
"code/client/pages/internal-docs/Space1FindYourRole.tsx",
|
||||||
"/internal-docs/meetings": "code/client/pages/internal-docs/Space2MeetingCadence.tsx",
|
"/internal-docs/code-of-conduct":
|
||||||
"/internal-docs/brand": "code/client/pages/internal-docs/Space2BrandVoice.tsx",
|
"code/client/pages/internal-docs/Space2CodeOfConduct.tsx",
|
||||||
"/internal-docs/tech-stack": "code/client/pages/internal-docs/Space2TechStack.tsx",
|
"/internal-docs/communication":
|
||||||
"/internal-docs/foundation-governance": "code/client/pages/internal-docs/Space3FoundationGovernance.tsx",
|
"code/client/pages/internal-docs/Space2Communication.tsx",
|
||||||
"/internal-docs/foundation-protocol": "code/client/pages/internal-docs/Space3OpenSourceProtocol.tsx",
|
"/internal-docs/meetings":
|
||||||
"/internal-docs/foundation-programs": "code/client/pages/internal-docs/Space3CommunityPrograms.tsx",
|
"code/client/pages/internal-docs/Space2MeetingCadence.tsx",
|
||||||
"/internal-docs/corp-product": "code/client/pages/internal-docs/Space4ProductOps.tsx",
|
"/internal-docs/brand":
|
||||||
"/internal-docs/corp-blueprints": "code/client/pages/internal-docs/Space4CorpBlueprints.tsx",
|
"code/client/pages/internal-docs/Space2BrandVoice.tsx",
|
||||||
"/internal-docs/corp-clients": "code/client/pages/internal-docs/Space4ClientOps.tsx",
|
"/internal-docs/tech-stack":
|
||||||
"/internal-docs/corp-platform": "code/client/pages/internal-docs/Space4PlatformStrategy.tsx",
|
"code/client/pages/internal-docs/Space2TechStack.tsx",
|
||||||
"/internal-docs/onboarding": "code/client/pages/internal-docs/Space5Onboarding.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",
|
"/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 { user, loading } = useAuth();
|
||||||
const [sidebarOpen, setSidebarOpen] = useState(false);
|
const [sidebarOpen, setSidebarOpen] = useState(false);
|
||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
|
|
@ -184,10 +203,12 @@ export default function InternalDocsLayout({ children, title, description }: Int
|
||||||
if ((pre as HTMLElement).dataset.hasCopy === "true") return;
|
if ((pre as HTMLElement).dataset.hasCopy === "true") return;
|
||||||
(pre as HTMLElement).dataset.hasCopy = "true";
|
(pre as HTMLElement).dataset.hasCopy = "true";
|
||||||
const btn = document.createElement("button");
|
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.innerText = "Copy";
|
||||||
btn.onclick = async () => {
|
btn.onclick = async () => {
|
||||||
const code = pre.querySelector("code")?.textContent || pre.textContent || "";
|
const code =
|
||||||
|
pre.querySelector("code")?.textContent || pre.textContent || "";
|
||||||
try {
|
try {
|
||||||
await navigator.clipboard.writeText(code);
|
await navigator.clipboard.writeText(code);
|
||||||
btn.innerText = "Copied";
|
btn.innerText = "Copied";
|
||||||
|
|
@ -208,10 +229,14 @@ export default function InternalDocsLayout({ children, title, description }: Int
|
||||||
container.querySelectorAll("h2, h3").forEach((el) => {
|
container.querySelectorAll("h2, h3").forEach((el) => {
|
||||||
if ((el as HTMLElement).querySelector(".heading-anchor")) return;
|
if ((el as HTMLElement).querySelector(".heading-anchor")) return;
|
||||||
const text = (el.textContent || "").trim();
|
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;
|
(el as HTMLElement).id = id;
|
||||||
const anchor = document.createElement("a");
|
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.href = `#${id}`;
|
||||||
anchor.innerText = "#";
|
anchor.innerText = "#";
|
||||||
(el as HTMLElement).appendChild(anchor);
|
(el as HTMLElement).appendChild(anchor);
|
||||||
|
|
@ -225,7 +250,10 @@ export default function InternalDocsLayout({ children, title, description }: Int
|
||||||
addCopyButtons();
|
addCopyButtons();
|
||||||
addAnchors();
|
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();
|
return () => obs.disconnect();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
|
@ -266,7 +294,11 @@ export default function InternalDocsLayout({ children, title, description }: Int
|
||||||
>
|
>
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="p-6 border-b border-slate-700 sticky top-0 bg-slate-900">
|
<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" />
|
<Lock className="h-5 w-5 text-blue-400" />
|
||||||
<div>
|
<div>
|
||||||
<div className="font-bold text-sm text-white">Internal Hub</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>
|
</div>
|
||||||
</Link>
|
</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" />
|
<Home className="h-4 w-4" />
|
||||||
Back to Site
|
Back to Site
|
||||||
</Link>
|
</Link>
|
||||||
|
|
@ -287,8 +322,12 @@ export default function InternalDocsLayout({ children, title, description }: Int
|
||||||
<div className="flex items-center gap-2 mb-3 px-2">
|
<div className="flex items-center gap-2 mb-3 px-2">
|
||||||
<span className="text-lg">{space.emoji}</span>
|
<span className="text-lg">{space.emoji}</span>
|
||||||
<div>
|
<div>
|
||||||
<div className="text-xs font-semibold text-blue-400 uppercase tracking-wider">{space.title}</div>
|
<div className="text-xs font-semibold text-blue-400 uppercase tracking-wider">
|
||||||
<div className="text-xs text-slate-500">{space.description}</div>
|
{space.title}
|
||||||
|
</div>
|
||||||
|
<div className="text-xs text-slate-500">
|
||||||
|
{space.description}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -299,11 +338,17 @@ export default function InternalDocsLayout({ children, title, description }: Int
|
||||||
to={page.path}
|
to={page.path}
|
||||||
onClick={() => setSidebarOpen(false)}
|
onClick={() => setSidebarOpen(false)}
|
||||||
className={`block px-3 py-2 rounded-lg text-sm transition-all group ${
|
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>
|
<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>
|
</Link>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -322,10 +367,20 @@ export default function InternalDocsLayout({ children, title, description }: Int
|
||||||
<main className="md:ml-72">
|
<main className="md:ml-72">
|
||||||
{/* Mobile Header */}
|
{/* 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">
|
<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">
|
<button
|
||||||
{sidebarOpen ? <X className="h-5 w-5" /> : <Menu className="h-5 w-5" />}
|
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>
|
</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
|
← Back
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -335,29 +390,41 @@ export default function InternalDocsLayout({ children, title, description }: Int
|
||||||
<div className="flex-1">
|
<div className="flex-1">
|
||||||
{title && (
|
{title && (
|
||||||
<div className="mb-4">
|
<div className="mb-4">
|
||||||
<h1 className="text-4xl font-bold text-white mb-2">{title}</h1>
|
<h1 className="text-4xl font-bold text-white mb-2">
|
||||||
{description && <p className="text-lg text-slate-400">{description}</p>}
|
{title}
|
||||||
|
</h1>
|
||||||
|
{description && (
|
||||||
|
<p className="text-lg text-slate-400">{description}</p>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="ml-6 flex-shrink-0 pt-1">
|
<div className="ml-6 flex-shrink-0 pt-1">
|
||||||
{editUrl && (
|
{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
|
<ExternalLink className="h-4 w-4" /> Edit this page
|
||||||
</a>
|
</a>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</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>
|
</div>
|
||||||
|
|
||||||
{/* Footer */}
|
{/* Footer */}
|
||||||
<footer className="border-t border-slate-700 bg-slate-900/50 mt-12">
|
<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">
|
<div className="max-w-5xl mx-auto px-6 md:px-8 py-8">
|
||||||
<p className="text-sm text-slate-500">
|
<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>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
<!-- INTERNAL: Operational doc - DO NOT PUBLISH TO PUBLIC DOCS -->
|
<!-- INTERNAL: Operational doc - DO NOT PUBLISH TO PUBLIC DOCS -->
|
||||||
|
|
||||||
# Discord Activity Deployment Guide
|
# Discord Activity Deployment Guide
|
||||||
|
|
||||||
## For Web-Based Development (No Terminal Access)
|
## For Web-Based Development (No Terminal Access)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
<!-- INTERNAL: Operational doc - DO NOT PUBLISH TO PUBLIC DOCS -->
|
<!-- INTERNAL: Operational doc - DO NOT PUBLISH TO PUBLIC DOCS -->
|
||||||
|
|
||||||
# Discord Commands Registration - Admin Panel
|
# Discord Commands Registration - Admin Panel
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
<!-- INTERNAL: Operational doc - DO NOT PUBLISH TO PUBLIC DOCS -->
|
<!-- INTERNAL: Operational doc - DO NOT PUBLISH TO PUBLIC DOCS -->
|
||||||
|
|
||||||
# Discord Linking Fixes - Summary of Changes
|
# Discord Linking Fixes - Summary of Changes
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
<!-- INTERNAL: Operational doc - DO NOT PUBLISH TO PUBLIC DOCS -->
|
<!-- INTERNAL: Operational doc - DO NOT PUBLISH TO PUBLIC DOCS -->
|
||||||
|
|
||||||
# Discord Linking Flow - Complete Issue Analysis & Fix
|
# Discord Linking Flow - Complete Issue Analysis & Fix
|
||||||
|
|
||||||
## Current Broken Flows
|
## Current Broken Flows
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
<!-- INTERNAL: Operational doc - DO NOT PUBLISH TO PUBLIC DOCS -->
|
<!-- INTERNAL: Operational doc - DO NOT PUBLISH TO PUBLIC DOCS -->
|
||||||
|
|
||||||
# Discord OAuth Setup Verification Checklist
|
# Discord OAuth Setup Verification Checklist
|
||||||
|
|
||||||
## 🔴 CRITICAL: OAuth Redirect URI Registration
|
## 🔴 CRITICAL: OAuth Redirect URI Registration
|
||||||
|
|
|
||||||
|
|
@ -13,18 +13,20 @@
|
||||||
## Phase 1 Deliverables
|
## Phase 1 Deliverables
|
||||||
|
|
||||||
### 1. ✅ Database Schema (Supabase Migration)
|
### 1. ✅ Database Schema (Supabase Migration)
|
||||||
|
|
||||||
**File:** `code/supabase/migrations/20250206_add_ethos_guild.sql`
|
**File:** `code/supabase/migrations/20250206_add_ethos_guild.sql`
|
||||||
|
|
||||||
**Tables Created:**
|
**Tables Created:**
|
||||||
|
|
||||||
| Table | Purpose | Key Fields |
|
| Table | Purpose | Key Fields |
|
||||||
|-------|---------|-----------|
|
| ---------------------------- | ---------------------------------------------- | -------------------------------------------------------------------------------- |
|
||||||
| `ethos_tracks` | Music & SFX assets uploaded by artists | user_id, title, genre[], file_url, license_type, bpm, download_count |
|
| `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_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_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 |
|
| `ethos_licensing_agreements` | Commercial licensing contracts | track_id, licensee_id, license_type, agreement_url, approved, expires_at |
|
||||||
|
|
||||||
**Features:**
|
**Features:**
|
||||||
|
|
||||||
- Full RLS policies (row-level security)
|
- Full RLS policies (row-level security)
|
||||||
- Proper indexes for performance
|
- Proper indexes for performance
|
||||||
- Triggers for `updated_at` maintenance
|
- Triggers for `updated_at` maintenance
|
||||||
|
|
@ -35,11 +37,13 @@
|
||||||
---
|
---
|
||||||
|
|
||||||
### 2. ✅ Community Group Page
|
### 2. ✅ Community Group Page
|
||||||
|
|
||||||
**File:** `code/client/pages/community/EthosGuild.tsx`
|
**File:** `code/client/pages/community/EthosGuild.tsx`
|
||||||
|
|
||||||
**Route:** `/community/groups/ethos`
|
**Route:** `/community/groups/ethos`
|
||||||
|
|
||||||
**Features:**
|
**Features:**
|
||||||
|
|
||||||
- Synthwave-themed hero with neon pink/purple/cyan gradients
|
- Synthwave-themed hero with neon pink/purple/cyan gradients
|
||||||
- Guild mission and value propositions for three audiences:
|
- Guild mission and value propositions for three audiences:
|
||||||
- Musicians & Producers
|
- Musicians & Producers
|
||||||
|
|
@ -55,6 +59,7 @@
|
||||||
---
|
---
|
||||||
|
|
||||||
### 3. ✅ Curriculum Skeleton
|
### 3. ✅ Curriculum Skeleton
|
||||||
|
|
||||||
**File:** `code/client/pages/docs/DocsCurriculumEthos.tsx`
|
**File:** `code/client/pages/docs/DocsCurriculumEthos.tsx`
|
||||||
|
|
||||||
**Route:** `/docs/curriculum/ethos`
|
**Route:** `/docs/curriculum/ethos`
|
||||||
|
|
@ -62,6 +67,7 @@
|
||||||
**Structure:** 4 progressive modules
|
**Structure:** 4 progressive modules
|
||||||
|
|
||||||
1. **Synthwave Foundations** (4 hrs)
|
1. **Synthwave Foundations** (4 hrs)
|
||||||
|
|
||||||
- The Synthwave Sound
|
- The Synthwave Sound
|
||||||
- DAW Setup & Workflow
|
- DAW Setup & Workflow
|
||||||
- Synth Basics: Oscillators & Filters
|
- Synth Basics: Oscillators & Filters
|
||||||
|
|
@ -69,6 +75,7 @@
|
||||||
- Capstone: Your First Synthwave Track
|
- Capstone: Your First Synthwave Track
|
||||||
|
|
||||||
2. **Game Audio & SFX Design** (5 hrs)
|
2. **Game Audio & SFX Design** (5 hrs)
|
||||||
|
|
||||||
- SFX Categories for Games
|
- SFX Categories for Games
|
||||||
- Layering & Processing Techniques
|
- Layering & Processing Techniques
|
||||||
- Procedural Audio with SFX Tools
|
- Procedural Audio with SFX Tools
|
||||||
|
|
@ -77,6 +84,7 @@
|
||||||
- Capstone: Design an SFX Pack
|
- Capstone: Design an SFX Pack
|
||||||
|
|
||||||
3. **Composition & Scoring** (6 hrs)
|
3. **Composition & Scoring** (6 hrs)
|
||||||
|
|
||||||
- Music Theory Essentials
|
- Music Theory Essentials
|
||||||
- Writing Memorable Melodies
|
- Writing Memorable Melodies
|
||||||
- Arranging & Orchestration
|
- Arranging & Orchestration
|
||||||
|
|
@ -96,15 +104,18 @@
|
||||||
---
|
---
|
||||||
|
|
||||||
### 4. ✅ App Routes & Navigation
|
### 4. ✅ App Routes & Navigation
|
||||||
|
|
||||||
**File:** `code/client/App.tsx`
|
**File:** `code/client/App.tsx`
|
||||||
|
|
||||||
**Routes Added:**
|
**Routes Added:**
|
||||||
|
|
||||||
```
|
```
|
||||||
/community/groups/ethos → EthosGuild component
|
/community/groups/ethos → EthosGuild component
|
||||||
/docs/curriculum/ethos → DocsCurriculumEthos component (wrapped in DocsLayout)
|
/docs/curriculum/ethos → DocsCurriculumEthos component (wrapped in DocsLayout)
|
||||||
```
|
```
|
||||||
|
|
||||||
**Navigation Linkage:**
|
**Navigation Linkage:**
|
||||||
|
|
||||||
- Ethos Guild page links to curriculum: "Learn Music Production"
|
- Ethos Guild page links to curriculum: "Learn Music Production"
|
||||||
- Curriculum page links back to guild: "Join the Guild"
|
- Curriculum page links back to guild: "Join the Guild"
|
||||||
- Both pages link to NEXUS marketplace: "Browse Audio Services"
|
- Both pages link to NEXUS marketplace: "Browse Audio Services"
|
||||||
|
|
@ -153,24 +164,27 @@ LABS (Yellow)
|
||||||
### Licensing Model (The "Firewall")
|
### Licensing Model (The "Firewall")
|
||||||
|
|
||||||
**Ecosystem License** (Non-Commercial, Free)
|
**Ecosystem License** (Non-Commercial, Free)
|
||||||
|
|
||||||
- Artists upload tracks to the library
|
- Artists upload tracks to the library
|
||||||
- AeThex community (GameForge, Foundation) use for free
|
- AeThex community (GameForge, Foundation) use for free
|
||||||
- Non-exclusive (artist can sell on Spotify, etc.)
|
- Non-exclusive (artist can sell on Spotify, etc.)
|
||||||
- Royalty-free for internal AeThex projects
|
- Royalty-free for internal AeThex projects
|
||||||
- *Protects artists from exploitation*
|
- _Protects artists from exploitation_
|
||||||
|
|
||||||
**Commercial License** (Paid, For-Profit)
|
**Commercial License** (Paid, For-Profit)
|
||||||
|
|
||||||
- CORP wants to use a track for client video/product
|
- CORP wants to use a track for client video/product
|
||||||
- Artist must negotiate & sign separate contract
|
- Artist must negotiate & sign separate contract
|
||||||
- Via NEXUS marketplace: "Custom Track $500", "SFX Pack $150"
|
- Via NEXUS marketplace: "Custom Track $500", "SFX Pack $150"
|
||||||
- Manages payment & IP rights
|
- Manages payment & IP rights
|
||||||
- *Creates Funnel 3 (Talent Flywheel) revenue stream*
|
- _Creates Funnel 3 (Talent Flywheel) revenue stream_
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## What Happens Next: Phase 2 & 3
|
## What Happens Next: Phase 2 & 3
|
||||||
|
|
||||||
### Phase 2: MVP Build (Q1 2025 - ~4 weeks)
|
### Phase 2: MVP Build (Q1 2025 - ~4 weeks)
|
||||||
|
|
||||||
**Goal:** Make Ethos operational
|
**Goal:** Make Ethos operational
|
||||||
|
|
||||||
- Track upload interface (MP3/WAV, metadata)
|
- Track upload interface (MP3/WAV, metadata)
|
||||||
|
|
@ -182,12 +196,14 @@ LABS (Yellow)
|
||||||
**Owner:** CTO/Engineering Team
|
**Owner:** CTO/Engineering Team
|
||||||
|
|
||||||
**Key Deliverables:**
|
**Key Deliverables:**
|
||||||
|
|
||||||
- 4 API endpoints (tracks, artists, licensing)
|
- 4 API endpoints (tracks, artists, licensing)
|
||||||
- 5 new pages (upload, library, artist profile, settings, licensing dashboard)
|
- 5 new pages (upload, library, artist profile, settings, licensing dashboard)
|
||||||
- 6 reusable components (upload modal, track card, artist card, etc.)
|
- 6 reusable components (upload modal, track card, artist card, etc.)
|
||||||
- Full error handling & validation
|
- Full error handling & validation
|
||||||
|
|
||||||
### Phase 3: Content & Community (Q1-Q2 2025)
|
### Phase 3: Content & Community (Q1-Q2 2025)
|
||||||
|
|
||||||
**Goal:** Populate with founding artists and curriculum
|
**Goal:** Populate with founding artists and curriculum
|
||||||
|
|
||||||
- Community writes music production curriculum
|
- Community writes music production curriculum
|
||||||
|
|
@ -199,6 +215,7 @@ LABS (Yellow)
|
||||||
**Owner:** Community Team (Dylan & Foundation)
|
**Owner:** Community Team (Dylan & Foundation)
|
||||||
|
|
||||||
**Key Actions:**
|
**Key Actions:**
|
||||||
|
|
||||||
- Identify 5-10 founding artists to seed the guild
|
- Identify 5-10 founding artists to seed the guild
|
||||||
- Schedule curriculum writing sprints
|
- Schedule curriculum writing sprints
|
||||||
- Create artist guidelines & COC
|
- Create artist guidelines & COC
|
||||||
|
|
@ -211,12 +228,14 @@ LABS (Yellow)
|
||||||
**Your Responsibility This Week:**
|
**Your Responsibility This Week:**
|
||||||
|
|
||||||
1. Draft **AeThex Ecosystem License** template
|
1. Draft **AeThex Ecosystem License** template
|
||||||
|
|
||||||
- Non-exclusive, royalty-free for AeThex internal use
|
- Non-exclusive, royalty-free for AeThex internal use
|
||||||
- Attribution requirements
|
- Attribution requirements
|
||||||
- IP ownership clarification
|
- IP ownership clarification
|
||||||
- Term: perpetual or limited duration?
|
- Term: perpetual or limited duration?
|
||||||
|
|
||||||
2. Draft **Commercial License Agreement** template
|
2. Draft **Commercial License Agreement** template
|
||||||
|
|
||||||
- One-time use, exclusive/non-exclusive options
|
- One-time use, exclusive/non-exclusive options
|
||||||
- Broadcast/sync/mechanical rights
|
- Broadcast/sync/mechanical rights
|
||||||
- Pricing negotiation guidance
|
- Pricing negotiation guidance
|
||||||
|
|
@ -266,15 +285,15 @@ Phase 2 integration roadmap
|
||||||
|
|
||||||
## Metrics & Success Criteria (Phase 1)
|
## Metrics & Success Criteria (Phase 1)
|
||||||
|
|
||||||
| Metric | Target | Status |
|
| Metric | Target | Status |
|
||||||
|--------|--------|--------|
|
| --------------------------------- | ---------- | ------------- |
|
||||||
| Database migration created | ✅ Yes | DONE |
|
| Database migration created | ✅ Yes | DONE |
|
||||||
| Community group page live | ✅ Yes | DONE |
|
| Community group page live | ✅ Yes | DONE |
|
||||||
| Curriculum structure complete | ✅ Yes | DONE |
|
| Curriculum structure complete | ✅ Yes | DONE |
|
||||||
| Routes wired in App.tsx | ✅ Yes | DONE |
|
| Routes wired in App.tsx | ✅ Yes | DONE |
|
||||||
| Synthwave aesthetic implemented | ✅ Yes | DONE |
|
| Synthwave aesthetic implemented | ✅ Yes | DONE |
|
||||||
| Legal templates drafted | ⏳ Pending | CEO ownership |
|
| Legal templates drafted | ⏳ Pending | CEO ownership |
|
||||||
| Phase 2 technical plan documented | ✅ Yes | DONE |
|
| Phase 2 technical plan documented | ✅ Yes | DONE |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -283,17 +302,20 @@ Phase 2 integration roadmap
|
||||||
### Strategic Value
|
### Strategic Value
|
||||||
|
|
||||||
1. **Sound Brand Identity**
|
1. **Sound Brand Identity**
|
||||||
|
|
||||||
- Every AeThex game has "the sound of AeThex"
|
- Every AeThex game has "the sound of AeThex"
|
||||||
- Synthwave aesthetic = competitive advantage
|
- Synthwave aesthetic = competitive advantage
|
||||||
- Professional quality, instantly recognizable
|
- Professional quality, instantly recognizable
|
||||||
|
|
||||||
2. **Talent Pipeline**
|
2. **Talent Pipeline**
|
||||||
|
|
||||||
- Foundation nurtures emerging musicians
|
- Foundation nurtures emerging musicians
|
||||||
- NEXUS connects them to paid work
|
- NEXUS connects them to paid work
|
||||||
- CORP profits from client projects
|
- CORP profits from client projects
|
||||||
- DEV-LINK gets cost-effective game audio
|
- DEV-LINK gets cost-effective game audio
|
||||||
|
|
||||||
3. **Community Engagement**
|
3. **Community Engagement**
|
||||||
|
|
||||||
- Attracts musicians, producers, sound designers
|
- Attracts musicians, producers, sound designers
|
||||||
- Mentorship program grows talent
|
- Mentorship program grows talent
|
||||||
- Monthly events & spotlights build loyalty
|
- Monthly events & spotlights build loyalty
|
||||||
|
|
@ -309,12 +331,14 @@ Phase 2 integration roadmap
|
||||||
## Known Limitations & Future Enhancements
|
## Known Limitations & Future Enhancements
|
||||||
|
|
||||||
### Phase 1 Limitations (By Design)
|
### Phase 1 Limitations (By Design)
|
||||||
|
|
||||||
- No real user data in gallery (will populate in Phase 3)
|
- No real user data in gallery (will populate in Phase 3)
|
||||||
- Licensing workflow not fully operational (awaiting legal templates)
|
- Licensing workflow not fully operational (awaiting legal templates)
|
||||||
- Curriculum content not written (community-driven in Phase 3)
|
- Curriculum content not written (community-driven in Phase 3)
|
||||||
- No monetization or payment processing (Phase 2+)
|
- No monetization or payment processing (Phase 2+)
|
||||||
|
|
||||||
### Future Enhancements (Post-Phase 3)
|
### Future Enhancements (Post-Phase 3)
|
||||||
|
|
||||||
- Royalty tracking & payment automation
|
- Royalty tracking & payment automation
|
||||||
- AI-powered track recommendations
|
- AI-powered track recommendations
|
||||||
- Live jam sessions & collaboration tools
|
- Live jam sessions & collaboration tools
|
||||||
|
|
@ -326,13 +350,13 @@ Phase 2 integration roadmap
|
||||||
|
|
||||||
## Action Items Summary
|
## Action Items Summary
|
||||||
|
|
||||||
| Owner | Task | Deadline | Status |
|
| Owner | Task | Deadline | Status |
|
||||||
|-------|------|----------|--------|
|
| --------------------- | ------------------------------------------------------- | ----------- | ----------------- |
|
||||||
| **CEO (You)** | Draft 3 legal templates (ecosystem, commercial, artist) | This week | ⏳ In progress |
|
| **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)** | Deploy Phase 1 database migration | This sprint | ✅ Ready |
|
||||||
| **CTO (Braden)** | Plan Phase 2 sprint (4 weeks, ~20 hrs) | Next week | Ready to schedule |
|
| **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)** | Identify founding artists | Next month | ⏳ Pending |
|
||||||
| **Community (Dylan)** | Schedule curriculum writing sprints | Next month | ⏳ Pending |
|
| **Community (Dylan)** | Schedule curriculum writing sprints | Next month | ⏳ Pending |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
||||||
**Technical Scope:**
|
**Technical Scope:**
|
||||||
|
|
||||||
- **File Upload Component**
|
- **File Upload Component**
|
||||||
|
|
||||||
- Location: `code/client/components/ethos/TrackUploadModal.tsx`
|
- Location: `code/client/components/ethos/TrackUploadModal.tsx`
|
||||||
- Features:
|
- Features:
|
||||||
- Support MP3, WAV file formats
|
- 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}`)
|
- Storage: Supabase Storage (`ethos-tracks/{user_id}/{track_id}.{ext}`)
|
||||||
|
|
||||||
- **Track Metadata Form**
|
- **Track Metadata Form**
|
||||||
|
|
||||||
- Location: `code/client/components/ethos/TrackMetadataForm.tsx`
|
- Location: `code/client/components/ethos/TrackMetadataForm.tsx`
|
||||||
- Fields:
|
- Fields:
|
||||||
- `title` (required, text)
|
- `title` (required, text)
|
||||||
|
|
@ -41,6 +43,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
||||||
- `is_published` (optional, toggle)
|
- `is_published` (optional, toggle)
|
||||||
|
|
||||||
- **Track Library Page**
|
- **Track Library Page**
|
||||||
|
|
||||||
- Location: `code/client/pages/ethos/TrackLibrary.tsx`
|
- Location: `code/client/pages/ethos/TrackLibrary.tsx`
|
||||||
- Features:
|
- Features:
|
||||||
- Grid view of all published tracks
|
- Grid view of all published tracks
|
||||||
|
|
@ -67,6 +70,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
||||||
**Technical Scope:**
|
**Technical Scope:**
|
||||||
|
|
||||||
- **Artist Profile Page**
|
- **Artist Profile Page**
|
||||||
|
|
||||||
- Location: `code/client/pages/ethos/ArtistProfile.tsx`
|
- Location: `code/client/pages/ethos/ArtistProfile.tsx`
|
||||||
- Route: `/ethos/artists/:userId` or `/passport/:username/ethos`
|
- Route: `/ethos/artists/:userId` or `/passport/:username/ethos`
|
||||||
- Displays:
|
- Displays:
|
||||||
|
|
@ -80,6 +84,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
||||||
- CTA: "Contact Artist", "Hire for Project"
|
- CTA: "Contact Artist", "Hire for Project"
|
||||||
|
|
||||||
- **Artist Settings Page**
|
- **Artist Settings Page**
|
||||||
|
|
||||||
- Location: `code/client/pages/ethos/ArtistSettings.tsx`
|
- Location: `code/client/pages/ethos/ArtistSettings.tsx`
|
||||||
- Route: `/ethos/settings` (authenticated)
|
- Route: `/ethos/settings` (authenticated)
|
||||||
- Features:
|
- Features:
|
||||||
|
|
@ -105,6 +110,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
||||||
**Technical Scope:**
|
**Technical Scope:**
|
||||||
|
|
||||||
- **NEXUS Audio Category**
|
- **NEXUS Audio Category**
|
||||||
|
|
||||||
- New service category on `/nexus`
|
- New service category on `/nexus`
|
||||||
- Display: Audio Production (alongside existing categories)
|
- Display: Audio Production (alongside existing categories)
|
||||||
- Filter options:
|
- Filter options:
|
||||||
|
|
@ -114,6 +120,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
||||||
- By rating: sort by downloads, artist rating
|
- By rating: sort by downloads, artist rating
|
||||||
|
|
||||||
- **Ethos Service Card** (in NEXUS grid)
|
- **Ethos Service Card** (in NEXUS grid)
|
||||||
|
|
||||||
- Artist name, avatar, verified badge
|
- Artist name, avatar, verified badge
|
||||||
- Sample pricing preview: "Custom Track $500 • SFX Pack $150"
|
- Sample pricing preview: "Custom Track $500 • SFX Pack $150"
|
||||||
- Skills tags: [Synthwave] [SFX Design] [Electronic]
|
- 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`
|
- CTA: "View Portfolio" → `/ethos/artists/:userId`
|
||||||
|
|
||||||
- **Integration Points**
|
- **Integration Points**
|
||||||
|
|
||||||
- Location: `code/client/pages/Nexus.tsx`
|
- Location: `code/client/pages/Nexus.tsx`
|
||||||
- Modify:
|
- Modify:
|
||||||
- Add "Audio Production" filter/category button
|
- Add "Audio Production" filter/category button
|
||||||
|
|
@ -144,6 +152,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
||||||
**Technical Scope:**
|
**Technical Scope:**
|
||||||
|
|
||||||
- **Contact Artist Flow**
|
- **Contact Artist Flow**
|
||||||
|
|
||||||
- Location: `code/client/components/ethos/ContactArtistModal.tsx`
|
- Location: `code/client/components/ethos/ContactArtistModal.tsx`
|
||||||
- When user clicks "Contact Artist" on a track or profile:
|
- When user clicks "Contact Artist" on a track or profile:
|
||||||
- Modal asks: "What's your project about?"
|
- 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
|
- Email: Notify artist that someone wants to license their track
|
||||||
|
|
||||||
- **Artist Licensing Dashboard**
|
- **Artist Licensing Dashboard**
|
||||||
|
|
||||||
- Location: `code/client/pages/ethos/LicensingDashboard.tsx`
|
- Location: `code/client/pages/ethos/LicensingDashboard.tsx`
|
||||||
- Tab 1: "Pending Agreements" (awaiting response)
|
- Tab 1: "Pending Agreements" (awaiting response)
|
||||||
- Card per agreement: licensee name, track, project desc, created date
|
- 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
|
- Archive of declined agreements
|
||||||
|
|
||||||
- **Approval Flow**
|
- **Approval Flow**
|
||||||
|
|
||||||
- Artist clicks "Review & Approve"
|
- Artist clicks "Review & Approve"
|
||||||
- Modal shows:
|
- Modal shows:
|
||||||
- Licensee info, project description
|
- Licensee info, project description
|
||||||
|
|
@ -185,11 +196,13 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
||||||
## UI/UX Design Principles
|
## UI/UX Design Principles
|
||||||
|
|
||||||
### Color Palette
|
### Color Palette
|
||||||
|
|
||||||
- Primary: Neon pink (#ec4899), purple (#a855f7), cyan (#06b6d4)
|
- Primary: Neon pink (#ec4899), purple (#a855f7), cyan (#06b6d4)
|
||||||
- Synthwave aesthetic: dark backgrounds, glowing accents
|
- Synthwave aesthetic: dark backgrounds, glowing accents
|
||||||
- Consistent with NEXUS (purple) and existing AeThex arms
|
- Consistent with NEXUS (purple) and existing AeThex arms
|
||||||
|
|
||||||
### Components
|
### Components
|
||||||
|
|
||||||
- Reuse existing UI components (Button, Card, Badge, Input, Textarea)
|
- Reuse existing UI components (Button, Card, Badge, Input, Textarea)
|
||||||
- Create new Ethos-specific components:
|
- Create new Ethos-specific components:
|
||||||
- `TrackUploadModal.tsx`
|
- `TrackUploadModal.tsx`
|
||||||
|
|
@ -200,6 +213,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
||||||
- `LicensingAgreementCard.tsx`
|
- `LicensingAgreementCard.tsx`
|
||||||
|
|
||||||
### Navigation
|
### Navigation
|
||||||
|
|
||||||
- Add Ethos link to main nav: "Ethos Guild"
|
- Add Ethos link to main nav: "Ethos Guild"
|
||||||
- Link to: `/ethos` or `/community/groups/ethos` (Phase 1 page)
|
- Link to: `/ethos` or `/community/groups/ethos` (Phase 1 page)
|
||||||
- From Ethos Guild page, link to:
|
- From Ethos Guild page, link to:
|
||||||
|
|
@ -212,6 +226,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
||||||
## Database Queries & Indexing
|
## Database Queries & Indexing
|
||||||
|
|
||||||
### Optimized Queries
|
### Optimized Queries
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
-- Get all published tracks (with artist info)
|
-- Get all published tracks (with artist info)
|
||||||
SELECT t.*, p.full_name as artist_name, p.avatar_url
|
SELECT t.*, p.full_name as artist_name, p.avatar_url
|
||||||
|
|
@ -241,6 +256,7 @@ ORDER BY la.created_at DESC;
|
||||||
```
|
```
|
||||||
|
|
||||||
### Index Strategy
|
### Index Strategy
|
||||||
|
|
||||||
- `ethos_tracks`: index on (is_published, created_at), (user_id), (genre)
|
- `ethos_tracks`: index on (is_published, created_at), (user_id), (genre)
|
||||||
- `ethos_artist_profiles`: index on (for_hire, verified)
|
- `ethos_artist_profiles`: index on (for_hire, verified)
|
||||||
- `ethos_licensing_agreements`: index on (track_id, approved), (licensee_id)
|
- `ethos_licensing_agreements`: index on (track_id, approved), (licensee_id)
|
||||||
|
|
@ -252,6 +268,7 @@ ORDER BY la.created_at DESC;
|
||||||
### Tracks API
|
### Tracks API
|
||||||
|
|
||||||
**POST /api/ethos/tracks**
|
**POST /api/ethos/tracks**
|
||||||
|
|
||||||
```
|
```
|
||||||
Headers: Authorization: Bearer <token>
|
Headers: Authorization: Bearer <token>
|
||||||
Body: FormData {
|
Body: FormData {
|
||||||
|
|
@ -267,12 +284,14 @@ Response: { id, user_id, title, file_url, ... }
|
||||||
```
|
```
|
||||||
|
|
||||||
**GET /api/ethos/tracks**
|
**GET /api/ethos/tracks**
|
||||||
|
|
||||||
```
|
```
|
||||||
Query: ?genre=Synthwave&license_type=ecosystem&page=1&limit=20&sort=downloads
|
Query: ?genre=Synthwave&license_type=ecosystem&page=1&limit=20&sort=downloads
|
||||||
Response: { tracks: [...], total, page, limit }
|
Response: { tracks: [...], total, page, limit }
|
||||||
```
|
```
|
||||||
|
|
||||||
**PUT /api/ethos/tracks/:id**
|
**PUT /api/ethos/tracks/:id**
|
||||||
|
|
||||||
```
|
```
|
||||||
Headers: Authorization: Bearer <token>
|
Headers: Authorization: Bearer <token>
|
||||||
Body: Partial track update (title, description, genre, license_type, is_published)
|
Body: Partial track update (title, description, genre, license_type, is_published)
|
||||||
|
|
@ -280,6 +299,7 @@ Response: Updated track
|
||||||
```
|
```
|
||||||
|
|
||||||
**DELETE /api/ethos/tracks/:id**
|
**DELETE /api/ethos/tracks/:id**
|
||||||
|
|
||||||
```
|
```
|
||||||
Headers: Authorization: Bearer <token>
|
Headers: Authorization: Bearer <token>
|
||||||
Response: { success: true }
|
Response: { success: true }
|
||||||
|
|
@ -288,17 +308,20 @@ Response: { success: true }
|
||||||
### Artists API
|
### Artists API
|
||||||
|
|
||||||
**GET /api/ethos/artists**
|
**GET /api/ethos/artists**
|
||||||
|
|
||||||
```
|
```
|
||||||
Query: ?for_hire=true&verified=true&page=1&limit=20&skills=Synthwave
|
Query: ?for_hire=true&verified=true&page=1&limit=20&skills=Synthwave
|
||||||
Response: { artists: [...], total }
|
Response: { artists: [...], total }
|
||||||
```
|
```
|
||||||
|
|
||||||
**GET /api/ethos/artists/:userId**
|
**GET /api/ethos/artists/:userId**
|
||||||
|
|
||||||
```
|
```
|
||||||
Response: { id, user_id, full_name, avatar_url, bio, skills, for_hire, pricing, stats }
|
Response: { id, user_id, full_name, avatar_url, bio, skills, for_hire, pricing, stats }
|
||||||
```
|
```
|
||||||
|
|
||||||
**PUT /api/ethos/artists/:userId**
|
**PUT /api/ethos/artists/:userId**
|
||||||
|
|
||||||
```
|
```
|
||||||
Headers: Authorization: Bearer <token>
|
Headers: Authorization: Bearer <token>
|
||||||
Body: { bio, skills, for_hire, portfolio_url, sample_price_track, ... }
|
Body: { bio, skills, for_hire, portfolio_url, sample_price_track, ... }
|
||||||
|
|
@ -308,6 +331,7 @@ Response: Updated artist profile
|
||||||
### Licensing API
|
### Licensing API
|
||||||
|
|
||||||
**POST /api/ethos/licensing-agreements**
|
**POST /api/ethos/licensing-agreements**
|
||||||
|
|
||||||
```
|
```
|
||||||
Headers: Authorization: Bearer <token>
|
Headers: Authorization: Bearer <token>
|
||||||
Body: { track_id, project_description }
|
Body: { track_id, project_description }
|
||||||
|
|
@ -315,6 +339,7 @@ Response: { id, track_id, licensee_id, status: 'pending', ... }
|
||||||
```
|
```
|
||||||
|
|
||||||
**PUT /api/ethos/licensing-agreements/:id**
|
**PUT /api/ethos/licensing-agreements/:id**
|
||||||
|
|
||||||
```
|
```
|
||||||
Headers: Authorization: Bearer <token> (artist only)
|
Headers: Authorization: Bearer <token> (artist only)
|
||||||
Body: { approved: boolean, message?: string }
|
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
|
- `code/supabase/migrations/20250206_add_ethos_guild.sql` - Database schema
|
||||||
- `/community/groups/ethos` - Community group landing page
|
- `/community/groups/ethos` - Community group landing page
|
||||||
- `/docs/curriculum/ethos` - Curriculum skeleton
|
- `/docs/curriculum/ethos` - Curriculum skeleton
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,24 +14,24 @@
|
||||||
|
|
||||||
### Public Pages (Live Now)
|
### Public Pages (Live Now)
|
||||||
|
|
||||||
| Page | Route | Purpose |
|
| Page | Route | Purpose |
|
||||||
|------|-------|---------|
|
| ------------------- | ------------------------- | -------------------------------------- |
|
||||||
| **Guild Community** | `/community/groups/ethos` | Overview, features, roadmap |
|
| **Guild Community** | `/community/groups/ethos` | Overview, features, roadmap |
|
||||||
| **Curriculum** | `/docs/curriculum/ethos` | Learning path (content coming Phase 3) |
|
| **Curriculum** | `/docs/curriculum/ethos` | Learning path (content coming Phase 3) |
|
||||||
|
|
||||||
### Admin Pages (Phase 2)
|
### Admin Pages (Phase 2)
|
||||||
|
|
||||||
| Page | Route | Purpose |
|
| Page | Route | Purpose |
|
||||||
|------|-------|---------|
|
| ------------------- | ------------------------ | -------------------------------------------- |
|
||||||
| Track Library | `/ethos/library` | Browse all published tracks |
|
| Track Library | `/ethos/library` | Browse all published tracks |
|
||||||
| Artist Profiles | `/ethos/artists/:userId` | View artist portfolio |
|
| Artist Profiles | `/ethos/artists/:userId` | View artist portfolio |
|
||||||
| Artist Settings | `/ethos/settings` | Manage profile & pricing (authenticated) |
|
| Artist Settings | `/ethos/settings` | Manage profile & pricing (authenticated) |
|
||||||
| Licensing Dashboard | `/ethos/licensing` | Manage commercial agreements (authenticated) |
|
| Licensing Dashboard | `/ethos/licensing` | Manage commercial agreements (authenticated) |
|
||||||
|
|
||||||
### Marketplace Integration (Phase 2)
|
### Marketplace Integration (Phase 2)
|
||||||
|
|
||||||
| Page | Feature | Purpose |
|
| Page | Feature | Purpose |
|
||||||
|------|---------|---------|
|
| --------- | -------- | ---------------------------------------------- |
|
||||||
| **NEXUS** | `/nexus` | "Audio Production" category with Ethos artists |
|
| **NEXUS** | `/nexus` | "Audio Production" category with Ethos artists |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
@ -39,9 +39,11 @@
|
||||||
## 🗂️ What Was Built (Phase 1)
|
## 🗂️ What Was Built (Phase 1)
|
||||||
|
|
||||||
### 1. Database Schema ✅
|
### 1. Database Schema ✅
|
||||||
|
|
||||||
**File:** `code/supabase/migrations/20250206_add_ethos_guild.sql`
|
**File:** `code/supabase/migrations/20250206_add_ethos_guild.sql`
|
||||||
|
|
||||||
4 tables:
|
4 tables:
|
||||||
|
|
||||||
- `ethos_tracks` - Music & SFX files
|
- `ethos_tracks` - Music & SFX files
|
||||||
- `ethos_artist_profiles` - Artist info & pricing
|
- `ethos_artist_profiles` - Artist info & pricing
|
||||||
- `ethos_guild_members` - Membership tracking
|
- `ethos_guild_members` - Membership tracking
|
||||||
|
|
@ -50,10 +52,12 @@
|
||||||
**Status:** Ready to deploy. Run migration on Supabase.
|
**Status:** Ready to deploy. Run migration on Supabase.
|
||||||
|
|
||||||
### 2. Community Page ✅
|
### 2. Community Page ✅
|
||||||
|
|
||||||
**File:** `code/client/pages/community/EthosGuild.tsx`
|
**File:** `code/client/pages/community/EthosGuild.tsx`
|
||||||
**Route:** `/community/groups/ethos`
|
**Route:** `/community/groups/ethos`
|
||||||
|
|
||||||
Features:
|
Features:
|
||||||
|
|
||||||
- Synthwave branding (neon pink/purple/cyan)
|
- Synthwave branding (neon pink/purple/cyan)
|
||||||
- Mission statement & value props
|
- Mission statement & value props
|
||||||
- 3 tabs: Overview, Features, Roadmap
|
- 3 tabs: Overview, Features, Roadmap
|
||||||
|
|
@ -63,10 +67,12 @@ Features:
|
||||||
**Status:** Live and public. Share with community.
|
**Status:** Live and public. Share with community.
|
||||||
|
|
||||||
### 3. Curriculum Page ✅
|
### 3. Curriculum Page ✅
|
||||||
|
|
||||||
**File:** `code/client/pages/docs/DocsCurriculumEthos.tsx`
|
**File:** `code/client/pages/docs/DocsCurriculumEthos.tsx`
|
||||||
**Route:** `/docs/curriculum/ethos`
|
**Route:** `/docs/curriculum/ethos`
|
||||||
|
|
||||||
4 modules:
|
4 modules:
|
||||||
|
|
||||||
- Synthwave Foundations (4 hrs)
|
- Synthwave Foundations (4 hrs)
|
||||||
- Game Audio & SFX Design (5 hrs)
|
- Game Audio & SFX Design (5 hrs)
|
||||||
- Composition & Scoring (6 hrs)
|
- Composition & Scoring (6 hrs)
|
||||||
|
|
@ -75,9 +81,11 @@ Features:
|
||||||
**Status:** Skeleton ready. Content writing in Phase 3.
|
**Status:** Skeleton ready. Content writing in Phase 3.
|
||||||
|
|
||||||
### 4. Routes & Navigation ✅
|
### 4. Routes & Navigation ✅
|
||||||
|
|
||||||
**File:** `code/client/App.tsx` (updated)
|
**File:** `code/client/App.tsx` (updated)
|
||||||
|
|
||||||
Routes added:
|
Routes added:
|
||||||
|
|
||||||
```
|
```
|
||||||
/community/groups/ethos → EthosGuild
|
/community/groups/ethos → EthosGuild
|
||||||
/docs/curriculum/ethos → DocsCurriculumEthos (with DocsLayout)
|
/docs/curriculum/ethos → DocsCurriculumEthos (with DocsLayout)
|
||||||
|
|
@ -86,7 +94,9 @@ Routes added:
|
||||||
**Status:** Wired and accessible.
|
**Status:** Wired and accessible.
|
||||||
|
|
||||||
### 5. Documentation ✅
|
### 5. Documentation ✅
|
||||||
|
|
||||||
**Files:**
|
**Files:**
|
||||||
|
|
||||||
- `ETHOS_GUILD_PHASE1_COMPLETE.md` - Full Phase 1 summary
|
- `ETHOS_GUILD_PHASE1_COMPLETE.md` - Full Phase 1 summary
|
||||||
- `ETHOS_GUILD_PHASE2_NEXUS_INTEGRATION.md` - Phase 2 technical plan
|
- `ETHOS_GUILD_PHASE2_NEXUS_INTEGRATION.md` - Phase 2 technical plan
|
||||||
- `ETHOS_GUILD_QUICK_START.md` - This guide
|
- `ETHOS_GUILD_QUICK_START.md` - This guide
|
||||||
|
|
@ -133,22 +143,26 @@ LABS (Yellow)
|
||||||
### Tech Team (CTO) - 4 weeks, ~20 hours
|
### Tech Team (CTO) - 4 weeks, ~20 hours
|
||||||
|
|
||||||
**Week 1:** APIs + database
|
**Week 1:** APIs + database
|
||||||
|
|
||||||
- `POST /api/ethos/tracks` - Upload track
|
- `POST /api/ethos/tracks` - Upload track
|
||||||
- `GET /api/ethos/tracks` - List tracks
|
- `GET /api/ethos/tracks` - List tracks
|
||||||
- `GET /api/ethos/artists` - List artists
|
- `GET /api/ethos/artists` - List artists
|
||||||
- `POST /api/ethos/licensing-agreements` - Create licensing request
|
- `POST /api/ethos/licensing-agreements` - Create licensing request
|
||||||
|
|
||||||
**Week 2:** Upload UI
|
**Week 2:** Upload UI
|
||||||
|
|
||||||
- `TrackUploadModal.tsx` - File upload + progress
|
- `TrackUploadModal.tsx` - File upload + progress
|
||||||
- `TrackMetadataForm.tsx` - Title, genre, license type, BPM, etc.
|
- `TrackMetadataForm.tsx` - Title, genre, license type, BPM, etc.
|
||||||
- `code/pages/ethos/TrackLibrary.tsx` - Browse all tracks
|
- `code/pages/ethos/TrackLibrary.tsx` - Browse all tracks
|
||||||
|
|
||||||
**Week 3:** Artist profiles + NEXUS
|
**Week 3:** Artist profiles + NEXUS
|
||||||
|
|
||||||
- `ArtistProfile.tsx` - View artist portfolio
|
- `ArtistProfile.tsx` - View artist portfolio
|
||||||
- `ArtistSettings.tsx` - Manage profile & pricing
|
- `ArtistSettings.tsx` - Manage profile & pricing
|
||||||
- Update `/nexus` to show "Audio Production" category
|
- Update `/nexus` to show "Audio Production" category
|
||||||
|
|
||||||
**Week 4:** Licensing + testing
|
**Week 4:** Licensing + testing
|
||||||
|
|
||||||
- `LicensingDashboard.tsx` - Manage agreements
|
- `LicensingDashboard.tsx` - Manage agreements
|
||||||
- Error handling & validation
|
- Error handling & validation
|
||||||
- Performance testing
|
- Performance testing
|
||||||
|
|
@ -158,6 +172,7 @@ LABS (Yellow)
|
||||||
### CEO - This Week ⏳
|
### CEO - This Week ⏳
|
||||||
|
|
||||||
**Draft 3 legal templates:**
|
**Draft 3 legal templates:**
|
||||||
|
|
||||||
1. **Ecosystem License** - Free non-exclusive use (internal AeThex projects)
|
1. **Ecosystem License** - Free non-exclusive use (internal AeThex projects)
|
||||||
2. **Commercial License** - Paid (CORP client projects)
|
2. **Commercial License** - Paid (CORP client projects)
|
||||||
3. **Artist Agreement** - Rights, ownership, guidelines
|
3. **Artist Agreement** - Rights, ownership, guidelines
|
||||||
|
|
@ -167,15 +182,18 @@ LABS (Yellow)
|
||||||
### Community Team (Dylan) - Phase 3
|
### Community Team (Dylan) - Phase 3
|
||||||
|
|
||||||
**Identify founding artists**
|
**Identify founding artists**
|
||||||
|
|
||||||
- 5-10 seed artists to launch with
|
- 5-10 seed artists to launch with
|
||||||
- Reach out & onboard to guild
|
- Reach out & onboard to guild
|
||||||
|
|
||||||
**Write curriculum**
|
**Write curriculum**
|
||||||
|
|
||||||
- Schedule writing sprints
|
- Schedule writing sprints
|
||||||
- Covers: synthwave, SFX design, composition, licensing
|
- Covers: synthwave, SFX design, composition, licensing
|
||||||
- Target: Live by Q2 2025
|
- Target: Live by Q2 2025
|
||||||
|
|
||||||
**Community management**
|
**Community management**
|
||||||
|
|
||||||
- Guild leadership roles (curator, admin)
|
- Guild leadership roles (curator, admin)
|
||||||
- Monthly spotlights & events
|
- Monthly spotlights & events
|
||||||
- Artist guidelines & COC
|
- Artist guidelines & COC
|
||||||
|
|
@ -184,32 +202,35 @@ LABS (Yellow)
|
||||||
|
|
||||||
## 🚀 Launching Ethos (Timeline)
|
## 🚀 Launching Ethos (Timeline)
|
||||||
|
|
||||||
| Date | Phase | Milestone |
|
| Date | Phase | Milestone |
|
||||||
|------|-------|-----------|
|
| ------------- | -------------- | ------------------------------------ |
|
||||||
| **This week** | Phase 1 → 2 | CEO approves legal templates |
|
| **This week** | Phase 1 → 2 | CEO approves legal templates |
|
||||||
| **Next week** | Phase 2 Start | CTO schedules 4-week sprint |
|
| **Next week** | Phase 2 Start | CTO schedules 4-week sprint |
|
||||||
| **Week 1-4** | Phase 2 Build | API endpoints + upload UI |
|
| **Week 1-4** | Phase 2 Build | API endpoints + upload UI |
|
||||||
| **Week 5** | Phase 2 QA | Testing & final polish |
|
| **Week 5** | Phase 2 QA | Testing & final polish |
|
||||||
| **Week 6** | Phase 2 Launch | MVP live, founding artists invited |
|
| **Week 6** | Phase 2 Launch | MVP live, founding artists invited |
|
||||||
| **Month 2-3** | Phase 3 | Curriculum writing, community growth |
|
| **Month 2-3** | Phase 3 | Curriculum writing, community growth |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 💡 Key Design Decisions
|
## 💡 Key Design Decisions
|
||||||
|
|
||||||
### Why Synthwave?
|
### Why Synthwave?
|
||||||
|
|
||||||
- '80s retro-futuristic aesthetic = AeThex brand
|
- '80s retro-futuristic aesthetic = AeThex brand
|
||||||
- Neon pink, purple, cyan visuals
|
- Neon pink, purple, cyan visuals
|
||||||
- Instantly recognizable, culturally cool
|
- Instantly recognizable, culturally cool
|
||||||
- Differentiates from other game studios
|
- Differentiates from other game studios
|
||||||
|
|
||||||
### Why Not a Separate Venture?
|
### Why Not a Separate Venture?
|
||||||
|
|
||||||
- Ethos is **for the ecosystem**, not profits alone
|
- Ethos is **for the ecosystem**, not profits alone
|
||||||
- Foundation owns & nurtures it
|
- Foundation owns & nurtures it
|
||||||
- Revenue flows back to CORP client work
|
- Revenue flows back to CORP client work
|
||||||
- Talent pipeline strengthens all arms
|
- Talent pipeline strengthens all arms
|
||||||
|
|
||||||
### Why NEXUS Integration?
|
### Why NEXUS Integration?
|
||||||
|
|
||||||
- Makes artists discoverable across AeThex
|
- Makes artists discoverable across AeThex
|
||||||
- Unifies creator economy (designers, devs, musicians)
|
- Unifies creator economy (designers, devs, musicians)
|
||||||
- Enables CORP to hire for commercial projects
|
- Enables CORP to hire for commercial projects
|
||||||
|
|
@ -219,29 +240,32 @@ LABS (Yellow)
|
||||||
|
|
||||||
## 📊 Success Metrics (Phase 2+)
|
## 📊 Success Metrics (Phase 2+)
|
||||||
|
|
||||||
| Metric | Q1 2025 Target | Q2+ Target |
|
| Metric | Q1 2025 Target | Q2+ Target |
|
||||||
|--------|----------------|-----------|
|
| ----------------------------------- | -------------- | ----------- |
|
||||||
| Guild members | 10 founding | 100+ active |
|
| Guild members | 10 founding | 100+ active |
|
||||||
| Tracks uploaded | 50 | 500+ |
|
| Tracks uploaded | 50 | 500+ |
|
||||||
| Commercial licensing agreements | 2-3 | 20+ |
|
| Commercial licensing agreements | 2-3 | 20+ |
|
||||||
| CORP revenue from Ethos (licensing) | $5K | $50K+ |
|
| CORP revenue from Ethos (licensing) | $5K | $50K+ |
|
||||||
| GameForge games using Ethos audio | 3-5 | 15+ |
|
| GameForge games using Ethos audio | 3-5 | 15+ |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🔗 Quick Links
|
## 🔗 Quick Links
|
||||||
|
|
||||||
**Documentation:**
|
**Documentation:**
|
||||||
|
|
||||||
- Phase 1 Summary: `code/docs/ETHOS_GUILD_PHASE1_COMPLETE.md`
|
- Phase 1 Summary: `code/docs/ETHOS_GUILD_PHASE1_COMPLETE.md`
|
||||||
- Phase 2 Plan: `code/docs/ETHOS_GUILD_PHASE2_NEXUS_INTEGRATION.md`
|
- Phase 2 Plan: `code/docs/ETHOS_GUILD_PHASE2_NEXUS_INTEGRATION.md`
|
||||||
- Database: `code/supabase/migrations/20250206_add_ethos_guild.sql`
|
- Database: `code/supabase/migrations/20250206_add_ethos_guild.sql`
|
||||||
|
|
||||||
**Code:**
|
**Code:**
|
||||||
|
|
||||||
- Community page: `code/client/pages/community/EthosGuild.tsx`
|
- Community page: `code/client/pages/community/EthosGuild.tsx`
|
||||||
- Curriculum page: `code/client/pages/docs/DocsCurriculumEthos.tsx`
|
- Curriculum page: `code/client/pages/docs/DocsCurriculumEthos.tsx`
|
||||||
- Routes: `code/client/App.tsx` (search "ethos" or "EthosGuild")
|
- Routes: `code/client/App.tsx` (search "ethos" or "EthosGuild")
|
||||||
|
|
||||||
**Team Responsibilities:**
|
**Team Responsibilities:**
|
||||||
|
|
||||||
- **CEO:** Legal templates (this week)
|
- **CEO:** Legal templates (this week)
|
||||||
- **CTO:** Phase 2 sprint planning & build
|
- **CTO:** Phase 2 sprint planning & build
|
||||||
- **Community:** Founding artist outreach & curriculum
|
- **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?**
|
**Q: How do artists make money?**
|
||||||
A: Three ways:
|
A: Three ways:
|
||||||
|
|
||||||
1. CORP hires them for commercial projects (via NEXUS)
|
1. CORP hires them for commercial projects (via NEXUS)
|
||||||
2. Streaming revenue on other platforms
|
2. Streaming revenue on other platforms
|
||||||
3. (Future) Royalty share on successful games using their music
|
3. (Future) Royalty share on successful games using their music
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue