Vite dev mode is incompatible with Discord Activity's iframe CSP — the
HMR WebSocket is blocked which breaks the React JSX dev runtime (_jsxDEV).
- Build client (vite build) during Docker image build so dist/spa/ exists
- Add express.static serving dist/spa/ assets in server/index.ts
- Add SPA catch-all to serve dist/spa/index.html for non-API routes
The Activity now loads the production compiled bundle instead of Vite's
dev-mode TypeScript modules, resolving the _jsxDEV crash.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Downloads.tsx has JSX at module initialization (icon fields in const array).
Eagerly importing it crashes the entire app in the Discord Activity iframe
before the React JSX runtime is ready. Lazy loading defers evaluation until
the route is actually navigated to.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove 'server' from .dockerignore so the Express server is baked into
the image (was being excluded, causing 'Cannot find module' on startup)
- Switch from import("./server") to server.ssrLoadModule("/server/index.ts")
so Vite resolves the path from the project root, not the temp compile dir
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Dynamic import("./server") resolves relative to Vite's .vite-temp/
compilation dir, not the project root. ssrLoadModule resolves from
/app root and processes TypeScript correctly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove redirect_uri from Discord token exchange (Activities use proxy auth, not redirect flow)
- Add Content-Security-Policy with frame-ancestors for Discord embedding (was only in vercel.json)
- Wire up subscription create-checkout and manage routes in Express
- Add Studio arm to ArmSwitcher with external link
- Prevent SPA catch-all from serving HTML for missing static assets (fixes script.js Unexpected token error)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Crawlers (Twitter, Discord, Slack) don't execute JavaScript, so the
client-side SEO.tsx useEffect was invisible to them. Every page looked
identical — the hardcoded homepage defaults in index.html.
- node-build.ts: replace simple sendFile with async SSR meta middleware
that injects per-route title/description/og:*/twitter:* before sending
HTML. Static route map covers ~15 routes; dynamic lookup queries
Supabase for /projects/:uuid (title, description, image_url) and
/passport/:username (full_name, bio) so shared project/profile links
render correct cards in Discord/Twitter/Slack unfurls.
- index.html: add twitter:site @aethexcorp; SSO.tsx useEffect still
runs for browser tab updates.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add StaffSubdomainRedirect component: when accessed via staff.aethex.tech,
auto-redirects to /staff prefix so the subdomain serves the right content
- nginx config updated to proxy to aethex-forge (port 5050) instead of
dead port 5054
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
staff.aethex.tech doesn't exist. Re-wired /staff and /candidate to the
existing page components already in the codebase:
Staff: Staff, StaffLogin, StaffDashboard, StaffAdmin, StaffChat,
StaffDocs, StaffDirectory, StaffAchievements, StaffTimeTracking
Candidate: CandidatePortal, CandidateInterviews, CandidateOffers,
CandidateProfile
Unbuilt staff sub-routes (/staff/announcements etc.) now fall back to
/staff/dashboard instead of 404ing through a dead external domain.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Narrow the unhandledrejection error handler: removed "unauthorized"
and "auth/" patterns which were too broad and cleared sessions on
unrelated API 401s or any URL containing "auth/". Now only matches
specific Supabase strings (invalid refresh token, jwt expired, etc.)
- Wire up the Remember Me checkbox in Login — was purely decorative
before. Defaults to checked, stores aethex_remember_me in localStorage
- Authentik SSO callback now sets a 30-day cookie so SSO sessions
survive browser restarts (AuthContext promotes it to localStorage)
- AuthContext clears local session on load if remember-me flag is absent
(respects user's choice to not stay logged in)
- signOut now removes aethex_remember_me from localStorage
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Auth & SSO
- Wire Authentik (auth.aethex.tech) as OIDC PKCE SSO provider
- Server-side only flow with HMAC-signed stateless state token
- Account linking via authentik_sub in user metadata
- AeThex ID connection card in Dashboard connections tab
- Unlink endpoint POST /api/auth/authentik/unlink
- Fix node:https helper to bypass undici DNS bug on Node 18
- Fix resolv.conf to use 1.1.1.1/8.8.8.8 in container
Schema & types
- Regenerate database.types.ts from live Supabase schema (23k lines)
- Fix 511 TypeScript errors caused by stale 582-line types file
- Fix UserProfile import in aethex-database-adapter.ts
- Add notifications migration (title, message, read columns)
Server fixes
- Remove badge_color from achievements seed/upsert (column doesn't exist)
- Rename name→title, add slug field in achievements seed
- Remove email from all user_profiles select queries (column doesn't exist)
- Fix email-based achievement target lookup via auth.admin.listUsers
- Add GET /api/projects/:projectId endpoint
- Fix import.meta.dirname → fileURLToPath for Node 18 compatibility
- Expose VITE_APP_VERSION from package.json at build time
Navigation systems
- DevPlatformNav: reorganize into Learn/Build grouped dropdowns with descriptions
- Migrate all 11 dev-platform pages from main Layout to DevPlatformLayout
- Remove dead isDevMode context nav swap from main Layout
- EthosLayout: purple-accented tab bar (Library, Artists, Licensing, Settings)
with member-only gating and guest CTA — migrate 4 Ethos pages
- GameForgeLayout: orange-branded sidebar with Studio section and lock icons
for unauthenticated users — migrate GameForge + GameForgeDashboard
- SysBar: live latency ping, status dot (green/yellow/red), real version
Layout dropdown
- Role-gate Admin (owner/admin/founder only) and Internal Docs (+ staff)
- Add Internal section label with separator
- Fix settings link from /dashboard?tab=profile#settings to /dashboard?tab=settings
Project pages
- Add ProjectDetail page at /projects/:projectId
- Fix ProfilePassport "View mission" link from /projects/new to /projects/:id
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- TabsList: Add responsive grid columns (grid-cols-2/3 on mobile)
- Headers: Stack vertically on mobile with responsive text sizes
- Dialogs: Use viewport-relative heights (70-80vh on mobile)
- Grids: Add sm: breakpoints for single-column mobile layouts
- Tables: Add overflow-x-auto for horizontal scrolling
- Buttons: Full-width on mobile with flex-1 sm:flex-none
- Select triggers: Full-width on mobile
Files updated: 21 component and page files across admin,
staff, dashboards, and hub sections.
OKR Management:
- Database tables for OKRs, key results, and check-ins
- Full CRUD API with progress auto-calculation
- UI with quarter/year filtering, create/edit dialogs
- Key result progress tracking with status indicators
- Trigger to auto-update OKR progress from key results
Time Tracking:
- Database tables for time entries and timesheets
- API with timer start/stop, manual entry creation
- Week/month/all view with grouped entries by date
- Stats for total hours, billable hours, avg per day
- Real-time timer with running indicator
Both features include RLS policies and proper indexes.
- StaffLearningPortal: Fetches courses from /api/staff/courses, supports
starting courses and tracking progress
- StaffPerformanceReviews: Fetches reviews from /api/staff/reviews,
supports adding employee comments with dialog
- StaffKnowledgeBase: Fetches articles from /api/staff/knowledge-base,
supports search, filtering, view tracking, and helpful marking
- StaffProjectTracking: Fetches projects from /api/staff/projects,
supports task status updates and creating new tasks
- StaffInternalMarketplace: Now points marketplace with /api/staff/marketplace,
supports redeeming items with points and viewing orders
- StaffTeamHandbook: Fetches handbook sections from /api/staff/handbook,
displays grouped by category with expand/collapse
All pages now use real Supabase data instead of mock arrays.
- Add database migration for staff features (announcements, expenses,
courses, reviews, knowledge base, projects, marketplace, handbook)
- Add 8 new API endpoints: announcements, expenses, courses, reviews,
knowledge-base, projects, marketplace, handbook
- Update StaffAnnouncements.tsx to use real API with read tracking
- Update StaffExpenseReports.tsx to use real API with submit dialog
More staff pages to be updated in next commit.
Foundation content now lives at aethex.foundation. This page:
- Shows brief informational overview
- Auto-redirects to aethex.foundation after 10 seconds
- Provides quick links to GameForge, Mentorship, Community, and Axiom
- Maintains Foundation branding while directing users to new home
- Add CandidateInterviews.tsx with interview list, filtering by status,
meeting type badges, and join meeting buttons
- Add CandidateOffers.tsx with offer management, accept/decline dialogs,
expiry warnings, and salary formatting
- Add routes to App.tsx for /candidate, /candidate/profile,
/candidate/interviews, /candidate/offers
- Add database migration for candidate_profiles, candidate_interviews,
and candidate_offers tables with RLS policies
- Add API endpoints: /api/candidate/profile, /api/candidate/interviews,
/api/candidate/offers
- Add CandidatePortal.tsx main dashboard with stats, quick actions,
upcoming interviews, and pending offers
- Add CandidateProfile.tsx profile builder with tabs for basic info,
work experience, education, and portfolio links
- Add StaffOnboarding.tsx main hub with welcome banner, progress ring,
and quick action cards
- Add StaffOnboardingChecklist.tsx with interactive Day 1/Week 1/Month 1
checklist that saves progress to database
- Add database migration for staff_onboarding_progress and
staff_onboarding_metadata tables with RLS policies
- Add API endpoint /api/staff/onboarding for fetching and updating
onboarding progress with admin view for managers
- Add routes to App.tsx for /staff/onboarding and /staff/onboarding/checklist
- Reduced all max-w-7xl containers to max-w-6xl for better readability
- Applied design system standards to GameForge (hero, stats, features, team sections)
- Updated Dashboard main container width
- Normalized Blog page section widths (filter, insights, posts, newsletter)
- Improved visual consistency across high-traffic pages
- Created design-tokens.ts with standardized width, typography, spacing, padding, and grid constants
- Reduced max-w-7xl to max-w-6xl across homepage and major landing pages (Index, Labs, Realms, Foundation)
- Reduced oversized hero text-7xl to text-6xl for better readability
- Applied consistent design standards to dev platform pages (Templates, Marketplace, CodeExamples, DevLanding)
- Improved visual consistency and content readability site-wide
- Created comprehensive integration docs for Spatial (5M+ visitors, web-based)
- Created comprehensive integration docs for Decentraland (800K+ users, Ethereum)
- Created comprehensive integration docs for The Sandbox (2M+ players, Polygon)
- Updated DocsIntegrations page with new platform showcase cards
- Added routes for /docs/integrations/spatial, /decentraland, /thesandbox
- Updated homepage to mention all 8 supported platforms explicitly
- Each integration includes: Quick start, code examples, auth flows, best practices
- Create VRChat integration docs with Udon C# examples
- Create RecRoom integration docs with Circuits visual scripting
- Add VRChat and RecRoom to homepage cross-platform claims
- Add routes for /docs/integrations/vrchat and /docs/integrations/recroom
- Update DocsIntegrations page with platform showcase cards
- Include authentication flows, code examples, and best practices
- Cover 30K+ VRChat users and 3M+ RecRoom MAU
Closes the gap in cross-platform social VR support
- Remove auto-redirect countdown from GameForge, Labs, Foundation
- Add TL;DR collapsible sections in hero for quick info
- Add exit intent modals (triggered on mouse leave)
- Update sticky banners to be persistent (no countdown)
- Maintain multiple CTAs throughout pages
- Support 4 user personas: Impatient, Scanner, Researcher, Undecided
- Add breadcrumbs to all developer platform pages for better navigation context
- Add 'Main Dashboard' link to developer mode navigation for easy exit
- Add prominent developer CTA card to main dashboard to increase discovery
- Wrap developer dashboard route with RequireAccess for authentication
User Flow Improvements:
✓ Users can now easily navigate back to main dashboard from dev platform
✓ Breadcrumbs show clear path: Home > Developer Platform > Current Page
✓ New users see attractive CTA with API keys, docs, and templates links
✓ Authentication enforced on /dev-platform/dashboard
Files changed: 9 (Layout, Dashboard, and 7 dev-platform pages)