Initial Design Proposal — By the Community, For the Community
PHASE 1 — FOUNDATIONBuild a LinkedIn-style social platform for the Xandeum Community. Phase 1 establishes the full foundation: a public landing page, shared authentication (with Asset Hub), user profiles, admin-managed news/CMS, and basic member posting/blog capabilities.
Created BY the community, FOR the community. Not affiliated with Xandeum directly.
Members create profiles, write posts, share ideas, and engage in discussions. Community governance and transparency are core values.
Uses the same hub_users table as the Asset Hub. One account, multiple applications. Seamless cross-platform experience.
Phase 1 is the foundation. Future phases will add messaging, groups, events, reputation systems, and deeper governance integration.
Browser
|
v
+-------------------------+ +----------------------------+
| xandeum.me | | hub.xandeum.me |
| (Community Site) | | (Asset Hub) |
| | | |
| PHP 8.3 + Vanilla JS | | PHP 8.3 + Vanilla JS |
| Session: XANDEUM_COMM | | Session: HUB_SESSION |
| Self-contained code | | Uses hub-shared/ |
| | | |
+----------+--------------+ +-------------+--------------+
| |
| Shared Database |
+------------+------------------------+
|
v
+-------------------+
| MySQL: hub DB |
| |
| hub_users | (shared)
| hub_activity_log | (shared)
| community_* | (community-only)
| hub_wallets | (hub-only)
| hub_daos | (hub-only)
+-------------------+
Cannot access hub-shared/ due to open_basedir. Includes own copies of database, auth, session, and utility code that read the same hub_users table.
Session name XANDEUM_COMMUNITY vs Hub's HUB_SESSION. Different domains = different cookies. Users log in independently on each app.
Only config.php changes when deploying to another domain (chillxand.com, crossovr.io). All branding, DB creds, and URLs centralized there.
All new tables prefixed with community_ in the existing hub database.
Extends hub_users with community-specific profile data.
| Column | Type | Purpose |
|---|---|---|
| id | INT PK AUTO | Profile ID |
| user_id | INT FK | References hub_users.id |
| display_name | VARCHAR(100) | Public display name |
| slug | VARCHAR(100) UNIQUE | URL-friendly username |
| bio | VARCHAR(280) | Short bio (tweet-length) |
| about_me | TEXT | Extended about section |
| avatar_url | VARCHAR(500) | Profile picture |
| banner_url | VARCHAR(500) | Profile banner image |
| location | VARCHAR(100) | User location |
| website_url | VARCHAR(500) | Personal website |
| twitter_handle | VARCHAR(50) | X/Twitter handle |
| discord_handle | VARCHAR(50) | Discord username |
| telegram_handle | VARCHAR(50) | Telegram handle |
| github_handle | VARCHAR(50) | GitHub username |
| interests | VARCHAR(500) | Comma-separated interests |
| is_public | TINYINT(1) | Profile visibility |
| profile_completed | TINYINT(1) | Has completed profile setup |
| Column | Type | Purpose |
|---|---|---|
| id | INT PK AUTO | Category ID |
| name | VARCHAR(50) | Category name |
| slug | VARCHAR(50) UNIQUE | URL slug |
| description | VARCHAR(255) | Category description |
| color | VARCHAR(7) | Badge color hex |
| sort_order | INT | Display order |
| Column | Type | Purpose |
|---|---|---|
| id | INT PK AUTO | Article ID |
| author_id | INT FK | References hub_users.id |
| title | VARCHAR(255) | Article title |
| slug | VARCHAR(255) UNIQUE | URL slug |
| excerpt | VARCHAR(500) | Short description |
| body | LONGTEXT | Article content |
| featured_image | VARCHAR(500) | Hero image URL |
| status | ENUM | draft / published / archived |
| is_featured | TINYINT(1) | Featured on homepage |
| published_at | DATETIME | Publish date |
| Column | Type | Purpose |
|---|---|---|
| id | INT PK AUTO | Post ID |
| author_id | INT FK | References hub_users.id |
| title | VARCHAR(255) | Post title |
| slug | VARCHAR(255) UNIQUE | URL slug |
| body | LONGTEXT | Post content |
| excerpt | VARCHAR(500) | Short preview |
| type | ENUM | blog / update / discussion |
| category_id | INT FK | References community_categories |
| status | ENUM | draft / published / hidden |
| view_count | INT | View counter |
| like_count | INT | Like counter (denormalized) |
| comment_count | INT | Comment counter (denormalized) |
| is_pinned | TINYINT(1) | Pinned to top |
| Column | Type | Purpose |
|---|---|---|
| id | INT PK AUTO | Comment ID |
| user_id | INT FK | References hub_users.id |
| post_id | INT FK NULL | References community_posts |
| news_id | INT FK NULL | References community_news |
| parent_id | INT FK NULL | Parent comment (threading) |
| body | TEXT | Comment text |
| status | ENUM | visible / hidden / deleted |
| Column | Type | Purpose |
|---|---|---|
| id | INT PK AUTO | Like ID |
| user_id | INT FK | References hub_users.id |
| post_id | INT FK | References community_posts |
| UNIQUE(user_id, post_id) — One like per user per post | ||
Heading 1 (2rem / 800)
Heading 2 (1.5rem / 700)
Heading 3 (1.2rem / 600)
Body text (1rem / 400) — Inter font family
Small / muted text (0.85rem)
| Category | Choice | Rationale |
|---|---|---|
| Language | PHP 8.3 | Matches Hub stack, server already configured, no build tools needed |
| Database | MySQL (hub DB) | Shared user accounts, single source of truth |
| CSS | Vanilla CSS + Custom Properties | No build step, theme toggle via data attribute, lightweight |
| JavaScript | Vanilla JS (IIFE) | No frameworks, no dependencies, fast loading |
| Auth | Session-based (PHP native) | Simple, secure, proven pattern |
| Passwords | bcrypt (cost 12) | Industry standard, same as Hub |
| CSRF | Token-per-session | Simple, effective for traditional forms + AJAX header check |
| Routing | .htaccess + clean URLs | Apache mod_rewrite, no router library needed |
Implementation is organized into 8 waves, each building on the previous.
This document. Publish for stakeholder review before writing code.
Create all community_* tables in the hub database. Seed categories.
Config, database, auth, session, functions, bootstrap. Self-contained includes.
CSS design system, JS interactions, header/nav/footer templates, .htaccess.
Login, register, logout. Shared hub_users accounts.
Public homepage, news listing, single article view with comments.
Profile CRUD, public profile view, member directory with search.
Post creation, community feed, likes, threaded comments, categories.
Admin dashboard, user/post/news management, AJAX endpoints.
The entire application can be duplicated to another domain by changing only config.php. This file contains:
| Domain | Instance | Database | Session Name |
|---|---|---|---|
| xandeum.me | Xandeum Community | hub | XANDEUM_COMMUNITY |
| chillxand.com | ChillXand Community | hub | CHILLXAND_COMMUNITY |
| crossovr.io | Crossovr Community | hub | CROSSOVR_COMMUNITY |
config.php with new branding, session name, and URLsroot:psacln)