diff --git a/astro-site/.astro/settings.json b/astro-site/.astro/settings.json
index ce198b8..6d76a53 100644
--- a/astro-site/.astro/settings.json
+++ b/astro-site/.astro/settings.json
@@ -1,5 +1,5 @@
{
"_variables": {
- "lastUpdateCheck": 1768189288502
+ "lastUpdateCheck": 1770417750117
}
}
\ No newline at end of file
diff --git a/astro-site/astro.config.mjs b/astro-site/astro.config.mjs
index 7ce9cc3..4c89e4d 100644
--- a/astro-site/astro.config.mjs
+++ b/astro-site/astro.config.mjs
@@ -5,4 +5,8 @@ import react from '@astrojs/react';
export default defineConfig({
integrations: [tailwind(), react()],
site: 'https://aethex-connect.com',
+ server: {
+ port: 4321,
+ host: 'localhost'
+ }
});
diff --git a/astro-site/src/components/aethex/AeThexProvider.jsx b/astro-site/src/components/aethex/AeThexProvider.jsx
new file mode 100644
index 0000000..0971c64
--- /dev/null
+++ b/astro-site/src/components/aethex/AeThexProvider.jsx
@@ -0,0 +1,275 @@
+/**
+ * AeThex Provider
+ * Main context provider for AeThex Connect - handles auth, chat, and real-time features
+ */
+
+import React, { createContext, useContext, useState, useEffect, useCallback } from 'react';
+import { io } from 'socket.io-client';
+
+const API_URL = import.meta.env?.VITE_API_URL || 'http://localhost:3000';
+const API_BASE = `${API_URL}/api`;
+
+const AeThexContext = createContext(null);
+
+export function useAeThex() {
+ return useContext(AeThexContext);
+}
+
+export function AeThexProvider({ children }) {
+ // Auth state
+ const [user, setUser] = useState(null);
+ const [token, setTokenState] = useState(null);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ // Socket state
+ const [socket, setSocket] = useState(null);
+ const [connected, setConnected] = useState(false);
+
+ // Chat state
+ const [servers, setServers] = useState([]);
+ const [channels, setChannels] = useState([]);
+ const [messages, setMessages] = useState([]);
+ const [currentServer, setCurrentServer] = useState(null);
+ const [currentChannel, setCurrentChannel] = useState(null);
+ const [onlineUsers, setOnlineUsers] = useState([]);
+
+ // Token management
+ const setToken = useCallback((newToken) => {
+ setTokenState(newToken);
+ if (newToken) {
+ localStorage.setItem('aethex_token', newToken);
+ } else {
+ localStorage.removeItem('aethex_token');
+ }
+ }, []);
+
+ // API request helper
+ const apiRequest = useCallback(async (endpoint, options = {}) => {
+ const headers = {
+ 'Content-Type': 'application/json',
+ ...options.headers,
+ };
+
+ const currentToken = token || localStorage.getItem('aethex_token');
+ if (currentToken) {
+ headers['Authorization'] = `Bearer ${currentToken}`;
+ }
+
+ const response = await fetch(`${API_BASE}${endpoint}`, {
+ ...options,
+ headers,
+ });
+
+ const data = await response.json();
+ if (!response.ok) {
+ throw new Error(data.error || 'Request failed');
+ }
+ return data;
+ }, [token]);
+
+ // Auth functions
+ const login = useCallback(async (email, password) => {
+ setError(null);
+ setLoading(true);
+ try {
+ const response = await apiRequest('/auth/login', {
+ method: 'POST',
+ body: JSON.stringify({ email, password }),
+ });
+ if (response.success) {
+ setToken(response.data.token);
+ setUser(response.data.user);
+ return { success: true };
+ }
+ throw new Error(response.error || 'Login failed');
+ } catch (err) {
+ setError(err.message);
+ return { success: false, error: err.message };
+ } finally {
+ setLoading(false);
+ }
+ }, [apiRequest, setToken]);
+
+ const register = useCallback(async (email, password, username, displayName) => {
+ setError(null);
+ setLoading(true);
+ try {
+ const response = await apiRequest('/auth/register', {
+ method: 'POST',
+ body: JSON.stringify({ email, password, username, displayName }),
+ });
+ if (response.success) {
+ setToken(response.data.token);
+ setUser(response.data.user);
+ return { success: true };
+ }
+ throw new Error(response.error || 'Registration failed');
+ } catch (err) {
+ setError(err.message);
+ return { success: false, error: err.message };
+ } finally {
+ setLoading(false);
+ }
+ }, [apiRequest, setToken]);
+
+ const demoLogin = useCallback(async () => {
+ setError(null);
+ setLoading(true);
+ try {
+ const response = await apiRequest('/auth/demo', {
+ method: 'POST',
+ });
+ if (response.success) {
+ setToken(response.data.token);
+ setUser(response.data.user);
+ return { success: true };
+ }
+ throw new Error(response.error || 'Demo login failed');
+ } catch (err) {
+ setError(err.message);
+ return { success: false, error: err.message };
+ } finally {
+ setLoading(false);
+ }
+ }, [apiRequest, setToken]);
+
+ const logout = useCallback(() => {
+ setToken(null);
+ setUser(null);
+ if (socket) {
+ socket.disconnect();
+ setSocket(null);
+ }
+ setConnected(false);
+ }, [socket, setToken]);
+
+ // Socket connection
+ const connectSocket = useCallback((authToken) => {
+ if (socket) {
+ socket.disconnect();
+ }
+
+ const newSocket = io(API_URL, {
+ auth: { token: authToken },
+ reconnection: true,
+ reconnectionDelay: 1000,
+ reconnectionAttempts: 10,
+ transports: ['websocket', 'polling']
+ });
+
+ newSocket.on('connect', () => {
+ console.log('✓ Connected to AeThex Connect');
+ setConnected(true);
+ });
+
+ newSocket.on('disconnect', () => {
+ console.log('✗ Disconnected from AeThex Connect');
+ setConnected(false);
+ });
+
+ newSocket.on('message:new', (message) => {
+ setMessages(prev => [...prev, message]);
+ });
+
+ newSocket.on('presence:online', (users) => {
+ setOnlineUsers(users);
+ });
+
+ setSocket(newSocket);
+ return newSocket;
+ }, [socket]);
+
+ // Chat functions
+ const sendMessage = useCallback((content) => {
+ if (!socket || !connected || !currentChannel) return;
+ socket.emit('channel:message', {
+ channelId: currentChannel.id,
+ content
+ });
+ }, [socket, connected, currentChannel]);
+
+ const joinChannel = useCallback((channelId) => {
+ if (!socket || !connected) return;
+ socket.emit('channel:join', { channelId });
+ }, [socket, connected]);
+
+ // Check auth on mount
+ useEffect(() => {
+ const checkAuth = async () => {
+ const storedToken = localStorage.getItem('aethex_token');
+ if (storedToken) {
+ setTokenState(storedToken);
+ try {
+ const response = await fetch(`${API_BASE}/auth/me`, {
+ headers: { 'Authorization': `Bearer ${storedToken}` }
+ });
+ const data = await response.json();
+ if (data.success) {
+ setUser(data.data);
+ connectSocket(storedToken);
+ } else {
+ localStorage.removeItem('aethex_token');
+ }
+ } catch (err) {
+ console.error('Auth check failed:', err);
+ localStorage.removeItem('aethex_token');
+ }
+ }
+ setLoading(false);
+ };
+
+ checkAuth();
+
+ return () => {
+ if (socket) {
+ socket.disconnect();
+ }
+ };
+ }, []);
+
+ // Connect socket when user logs in
+ useEffect(() => {
+ if (user && token && !socket) {
+ connectSocket(token);
+ }
+ }, [user, token]);
+
+ const value = {
+ // Auth
+ user,
+ loading,
+ error,
+ isAuthenticated: !!user,
+ login,
+ register,
+ demoLogin,
+ logout,
+
+ // Socket
+ socket,
+ connected,
+
+ // Chat
+ servers,
+ channels,
+ messages,
+ currentServer,
+ currentChannel,
+ onlineUsers,
+ setCurrentServer,
+ setCurrentChannel,
+ setMessages,
+ sendMessage,
+ joinChannel,
+
+ // API helper
+ apiRequest
+ };
+
+ return (
+
+ Free stock images from Unsplash + DiceBear avatars +
+ +Auto-generated based on username seed
+Random images from Unsplash (refreshes on reload)
+All images from Unsplash (free for commercial use)
+Avatars from DiceBear (free for commercial use)
+Sign in to explore all features
+ {error &&{error}
} + +Call in progress
-{activeCall.duration}
-No call history yet. Start a call to get begun!
-- {call.type === 'voice' ? '📞 Voice Call' : '📹 Video Call'} • {call.duration} -
-- {new Date(call.timestamp).toLocaleDateString()} -
- -No messages yet. Start the conversation!
-{msg.content}
-{new Date(msg.createdAt).toLocaleTimeString()}
-Select a conversation to start messaging
-- Your next-generation communication platform with blockchain identity verification, - real-time messaging, voice/video calls, and premium features. -
- -- End-to-end encrypted messages with real-time synchronization across all devices. -
-- Crystal-clear voice calls and HD video conferencing with WebRTC technology. -
-- Connect with game communities and manage channels with GameForge. -
-- Blockchain-backed domain verification for authentic user identification. -
-- Explore your messages, start a call, or customize your settings to unlock the full potential of AeThex Connect. -
-Next-generation communication platform
-Demo Credentials:
-Email: demo@aethex.dev
-Password: demo123
-- © 2026 AeThex Corporation. All rights reserved. -
-Add an extra layer of security to your account
-Your messages are end-to-end encrypted
-Version
-1.0.0
-Build Date
-February 3, 2026
-Features
-Loading AeThex Connect...
-Next-Gen Communication for Gamers
-- A comprehensive communication platform built specifically for gamers and game developers. - Explore each feature using the tabs above. -
- -Verify ownership of traditional domains (DNS) or blockchain .aethex domains
-Instant, encrypted messaging with WebSocket connections
-Built-in chat for game development teams
-High-quality WebRTC calls with screen sharing
-Cross-game identity and social features
-Monetization with blockchain domains
-Transform AeThex Connect into cross-platform apps:
-Expected completion: May 2026 (5 months)
-- Prove ownership of your domain to display it on your profile and prevent impersonation. - Supports both traditional domains (via DNS) and blockchain .aethex domains. -
-- Private encrypted conversations with real-time delivery. Messages sync across all devices. -
-- Collaborate with your game development team. Channels auto-provision with your GameForge projects. -
-- Crystal-clear WebRTC calls with screen sharing. Perfect for co-op gaming or team standups. -
-- Upgrade to unlock blockchain .aethex domains, increased storage, and advanced features. -
-Loading conversations...
-⚠️ {error}
- -- {activeConversation.otherParticipants?.length || 0} participants -
-Select a conversation to start messaging
-or create a new conversation
-No conversations yet
-Start a new conversation to get started
-- {conv.lastMessage?.content || 'No messages yet'} -
- {conv.unreadCount > 0 && ( - {conv.unreadCount} - )} -No messages yet
-Send a message to start the conversation
-- Verified on {new Date(currentStatus.verifiedAt).toLocaleDateString()} -
- -- Prove ownership of a domain to display it on your profile -
- - {error && ( -Connect the wallet that owns {domain}
-{verificationInstructions.recordValue}
-
- How to add DNS records:
-- ⏱️ This verification expires on {new Date(verificationInstructions.expiresAt).toLocaleDateString()} -
-{channel.description}
- {channel.permissions && !channel.permissions.includes('all') && ( - - Restricted to: {channel.permissions.join(', ')} - - )} -{error}
- -Select a channel to start chatting
-No friends yet
-Recent messages appear here
-- Click a friend to start chatting -
-- Your premium blockchain domain with NFT ownership proof -
- -✓ {domainAvailable.domain} is available!
-- Price: ${domainAvailable.price}/year -
- > - ) : ( -✗ {domainAvailable.domain} is taken
- {domainAvailable.error && ( -{domainAvailable.error}
- )} - {domainAvailable.suggestedAlternatives && domainAvailable.suggestedAlternatives.length > 0 && ( - <> -Try these alternatives:
-For Enterprise plans, please contact our sales team:
- -{selectedApp.description}
-{app.description}
-Automatically moderate your server with configurable rules
- -{rule.description}
-Add your own words to block in messages
-Where to send AutoMod logs
- -No bans found
- This server has no banned users -- Are you sure you want to unban{' '} - {bans.find(b => b.id === selectedBan)?.user.name}? -
-They will be able to rejoin the server with an invite.
-Only selected roles can view this category
-- Sync permissions with {categoryData.channels.length} channels in this category -
-Members can only send one message per this interval
-Users must verify their age to view content
-Channel permissions override server-level permissions for specific roles or members.
-No invites have been created for this channel yet.
- -Webhooks allow external services to send messages to this channel.
- -You can add friends with their AeThex username.
-It's quiet for now...
-When a friend starts an activity—like playing a game or hanging out on voice—we'll show it here!
-Drag and drop or click to upload
- - {activeTab === 'emoji' - ? 'PNG or GIF, 256KB max, 128x128 recommended' - : 'PNG or APNG, 512KB max, 320x320 size' - } - -{event.description}
- -Create an event to bring your community together!
- -{formatDate(event.startTime)}
-- {formatTime(event.startTime)} - {formatTime(event.endTime)} -
- {event.recurring && ( -🔄 Repeats {event.recurring}
- )} -#{event.channel}
- )} -{event.description}
-Drag & drop files here or click to browse
- Max file size: {maxSize} MB -{channelData.description}
-{post.content}
-No posts found
-{post.content}
-{reply.content}
-No active invites
- Create an invite to share your server -{invite.code}
-
- - Your invite link expires in 7 days. - -
-
- {code}
-
- )},
- // Inline code (`)
- { regex: /`([^`]+)`/g, render: (match, code) => (
- {code}
- )},
- // Spoiler (||text||)
- { regex: /\|\|([^|]+)\|\|/g, render: (match, content) => (
- e.target.classList.toggle('revealed')}>
- {content}
-
- )},
- // Bold (**text**)
- { regex: /\*\*([^*]+)\*\*/g, render: (match, content) => (
- {content}
- )},
- // Italic (*text* or _text_)
- { regex: /(?:\*|_)([^*_]+)(?:\*|_)/g, render: (match, content) => (
- {content}
- )},
- // Strikethrough (~~text~~)
- { regex: /~~([^~]+)~~/g, render: (match, content) => (
- {content}- )}, - ]; - - // Process special patterns - // For simplicity, we'll do a basic render with some patterns - const processedText = text - .replace(/```(\w+)?\n?([\s\S]*?)```/g, '⟦CODE_BLOCK⟧$1⟦SEP⟧$2⟦END_CODE⟧') - .replace(/`([^`]+)`/g, '⟦INLINE_CODE⟧$1⟦END_INLINE⟧') - .replace(/\|\|([^|]+)\|\|/g, '⟦SPOILER⟧$1⟦END_SPOILER⟧') - .replace(/\*\*([^*]+)\*\*/g, '⟦BOLD⟧$1⟦END_BOLD⟧') - .replace(/~~([^~]+)~~/g, '⟦STRIKE⟧$1⟦END_STRIKE⟧') - .replace(/__([^_]+)__/g, '⟦UNDERLINE⟧$1⟦END_UNDERLINE⟧') - .replace(/(?; -} - -function renderMarkdown(text) { - let html = text - // Escape HTML - .replace(/&/g, '&') - .replace(//g, '>') - // Code blocks - .replace(/```(\w+)?\n?([\s\S]*?)```/g, '
$2')
- // Inline code
- .replace(/`([^`]+)`/g, '$1')
- // Spoilers
- .replace(/\|\|([^|]+)\|\|/g, '$1')
- // Bold
- .replace(/\*\*([^*]+)\*\*/g, '$1')
- // Strikethrough
- .replace(/~~([^~]+)~~/g, '$1') - // Newlines - .replace(/\n/g, '
{config.description}
- - {config.showDuration && ( -Reports are confidential. The reported user won't know who reported them.
-Subscribe to Nitro to unlock features and perks
-Unlock perks for your favorite communities
-$4.99/month or included with Nitro
-Send the gift of Nitro to a friend
-Receive push notifications on mobile
-You can customize notifications for individual channels
-You're all caught up!
-This channel doesn't have any pinned messages... yet.
-No results found
-from: usermentions: userhas: link, embed, filebefore: dateafter: datein: channel{serverData.description}
-{server.description}
-Settings for {tabs.find(t => t.id === activeTab)?.label} coming soon
-- Start your server with a template to get channels, roles, and settings pre-configured. -
-{template.description}
-No saved templates
- Create a template from your server to save it here -{template.description}
- Created {template.createdAt} -- Create a template from your current server configuration. -
- -- Members can only send one message per {formatDuration(slowMode)}. -
- -- These roles won't be affected by slowmode. -
- {roles.map(role => ( - - ))} -{stageData.topic}
-{userData.about}
-{userData.memberSince || 'Jan 2024'}
-Protect your AeThex account with an extra layer of security.
-Disabling your account means you can recover it at any time after taking this action.
-{settingsSections.flatMap((s) => s.items).find((i) => i.id === activeTab)?.label} settings coming soon
-{serverData.description}
-Please read and agree to our community rules
-{rule.description}
-Select roles that match your interests
-Pick channels you want to see
-The Trinity of Communication
-- Building the future of decentralized communication, one line of code at a time. -
-- AeThex was founded on a simple belief: your data belongs to you. - In a world where major platforms profit from your conversations, we chose a different path. -
-- AeThex Connect is our answer to the centralized communication monopoly. - It's not just an alternative to Discord—it's a statement that privacy, security, - and user ownership can coexist with a world-class communication experience. -
-- As an open-source project, every line of our code is public. - We believe transparency isn't just nice to have—it's essential for trust. -
-End-to-end encryption by default. We can't read your messages even if we wanted to.
-100% of our code is public. Audit it, fork it, contribute to it.
-Your identity, your data, your control. Forever.
-AeThex operates as three interconnected divisions
-The core. Authentication, security infrastructure, and the Passport identity system.
-Enterprise solutions, business integrations, and commercial support services.
-Experimental features, R&D, and cutting-edge technology development.
-{item.desc}
-{member.role}
-Be part of the community shaping the future of communication.
-- All the features you love from Discord, with the privacy and ownership you deserve. -
-{feature.desc}
-| Feature | -AeThex Connect | -Discord | -Slack | -
|---|---|---|---|
| {row.feature} | -{row.aethex ? '✓' : '✕'} | -{row.discord ? '✓' : '✕'} | -{row.slack ? '✓' : '✕'} | -
Join thousands of users who've made the switch.
-- The next-generation communication platform built for gamers, developers, - and communities who value privacy, security, and true ownership of their data. -
- -- Built from the ground up with the features that matter most -
-Every message, call, and file is encrypted. Only you and your recipients can read them.
-Rich presence, game invites, and overlay support for your favorite games.
-HD voice and video calls with screen sharing, powered by WebRTC.
-Web, Desktop, iOS, and Android. Your conversations sync everywhere.
-Fully auditable code. No hidden backdoors. Community-driven development.
-Optimized for performance. No bloat, no lag, just pure speed.
-Three divisions, one ecosystem
-Core security, authentication, and identity. The bedrock of trust.
-Enterprise solutions and professional services. Built for scale.
-Research and experimental features. Tomorrow's technology today.
-Join the community that values your privacy as much as you do.
- - Create Your Account - -We're so excited to see you again!
- - {error && ( -- Need an account? Register -
-Join the future of communication
- - {error && ( -- Already have an account? Log In -
-Foundation • Corporation • Labs
-