# NuQloud World Next-Generation Interface Implementation Plan ## Purpose Build NuQloud World as an optional, plugin-delivered theme/interface layer for NuQloud for Nextcloud. The goal is a living cloud command environment that adds spatial navigation, motion, service status, and QDN publishing workflows on top of NuQloud-native surfaces. NuQloud World must be built as a theme-grade Nextcloud app/plugin wherever possible. It must not require a maintained Nextcloud fork, and it must not become a second dashboard product. ## Source Inputs This plan is based on: - The NuQloud World Interface build and rollout plan. - Concept screenshots in `docs/future-plans/NuQloud-world/Concept-Screenshots/Interface-ReBrand-Concept-1/`. - Website and architecture concepts in `docs/future-plans/NuQloud-world/Concept-Screenshots/NuQloud-Website-Concept/`. - Current app and plugin boundary notes in `docs/plugin-roadmap.md`. - Product mode guidance in `docs/nuqloud-blueprint.md`. ## Dependency Note Phaser 4 is now a viable planning target, but the implementation should pin an exact version during Phase 0. Official references checked while preparing this plan: - Phaser 4 overview: `https://phaser.io/phaser4` - Stable Phaser download page: `https://phaser.io/download/stable` - Phaser GitHub releases: `https://github.com/phaserjs/phaser/releases` As of July 6, 2026, Phaser's stable download page lists Phaser `v4.2.0` released on June 19, 2026. Do not depend on unpinned `latest` packages. ## Product Positioning NuQloud World is not a game. It is a spatial cloud interface for: - Files and protected storage. - Private communication. - Deck tasks and projects. - QDN publishing. - Instance health and operational status. - Account and identity state. The existing NuQloud surfaces remain the productivity layer. World Mode is the optional "wow layer" and should feel like a deep theme over the same product, not a separate dashboard users must learn from scratch. ## Theme-Grade Plugin Architecture ### Recommended App Shape Create a new Nextcloud app that behaves as a NuQloud theme/interface shell: ```text nuqloud_world/ +-- appinfo/ | +-- info.xml | +-- routes.php +-- lib/ | +-- AppInfo/Application.php | +-- Controller/PageController.php | +-- Controller/Api/WorldStateController.php | +-- Controller/Api/PublishController.php | +-- Service/WorldStateService.php | +-- Service/FeatureFlagService.php | +-- Service/Integration/ | | +-- CoreIntegration.php | | +-- FilesBridgeIntegration.php | | +-- TalkBridgeIntegration.php | | +-- QdnIntegration.php | +-- Db/ | +-- WorldPreferenceMapper.php | +-- WorldPreference.php +-- src/ | +-- main.tsx | +-- app/ | +-- phaser/ | +-- ui/ | +-- api/ | +-- state/ | +-- events/ | +-- theme/ | +-- i18n/ | +-- types/ +-- templates/ | +-- world.php +-- img/ +-- css/ +-- package.json ``` ### Integration Boundaries The theme/interface plugin should depend on existing app capabilities instead of duplicating them: - `qortal_integration`: account state, identity state, feature flags, QDN API gateway configuration, product language mode. - `qortal_files_bridge`: file publish state, protected folder state, QDN file publish actions. - `qortal_talk_bridge`: conversation summary, unread counts, relay state. - NuQloud Deck surface: task/project summaries. - `custom_pwa`: future install/deep-link affordances only. CHD admin tooling must remain internal-only and must not be exposed through NuQloud World. Q-Deck is the QDN-native app and is out of scope for this NuQloud-native interface plan. Cross-collaboration between NuQloud Deck and Q-Deck should be handled by a separate future plugin. ## Runtime Model ```text Authenticated user -> /apps/nuqloud_world/world -> Nextcloud controller renders shell -> compiled React + Phaser bundle loads -> client requests /apps/nuqloud_world/api/state -> server aggregates allowed state from installed apps -> Phaser renders world state -> HTML panels perform real actions ``` Phaser owns visual interaction only: - Background scene. - Spatial service map. - Hover and focus effects. - Activity pulses. - Service status visualization. - QDN portal animation. - Optional drag/drop affordances. HTML/React owns productive work: - File lists. - Forms. - Publish confirmation. - Message previews. - Task details. - Admin status. - Settings. - Accessibility fallback controls. Rule: Phaser emits intent; the app executes business logic. ## Routes Authenticated routes: ```text GET /apps/nuqloud_world/world GET /apps/nuqloud_world/settings GET /apps/nuqloud_world/api/state GET /apps/nuqloud_world/api/services GET /apps/nuqloud_world/api/activity POST /apps/nuqloud_world/api/preferences POST /apps/nuqloud_world/api/publish/prepare POST /apps/nuqloud_world/api/publish/confirm ``` No public endpoints are required for MVP. If a later public marketing preview is needed, it must be a separate static route with no user, file, identity, health, or service data. ## Interface Modes ### Existing NuQloud Surface Purpose: - Fast productivity. - Full accessibility. - Admin and heavy work. - Default for existing users. Implementation: - Use the existing NuQloud/Nextcloud routes and surfaces. - Do not create a competing dashboard route. - NuQloud World may link back to these surfaces or open focused panels over them. ### NuQloud World Purpose: - Branded spatial interface. - Live service status. - Contextual command panels. - Optional immersive mode. Route: ```text /apps/nuqloud_world/world ``` ### Compact Mobile Purpose: - Touch-first mobile use. - Minimal animation. - Fast loading. - Optional or disabled Phaser scene. Implementation: - Same route as World Mode. - Client selects compact shell based on viewport, user preference, reduced motion, and performance signals. ## Visual Direction From Concepts The screenshots establish the visual target: - Dark command-shell foundation. - Left-side navigation with clear active state. - Dense but calm command content. - Glassy panels with subtle borders. - Blue primary actions. - Green healthy/online signals. - Purple or cyan for publishing/network highlights. - Gold only for credit/plan emphasis. - Large data visualization surfaces where useful. - Side detail panels for Files, Talk, and status. - Enterprise-grade language and layout discipline. NuQloud World should reinterpret these as a spatial command layer: - The concept globe/network becomes the central world backdrop. - Files become a vault/storage island. - Talk/private mail becomes a conversation sphere. - Publishing/redundancy becomes a QDN portal and node map. - Admin/status becomes an operations core. - Cards become HTML overlay panels, not Phaser text-only UI. Avoid: - Cartoon game assets. - RPG-style characters. - Fake metaverse language. - Canvas-only forms. - Heavy 3D dependencies for MVP. - One-off hardcoded colors instead of theme variables. ## Product Language Modes Default mode is Powered Mode. Powered Mode language: - Use `NuQloud`. - Use `QDN` where protocol specificity is needed. - Use `Powered by Qortal` where attribution is needed. - Use `credits` for publishing capacity. - Avoid wallet, coins, and QORT terminology. Full Qortal Mode language: - Crypto-native terminology is allowed. - Qortal-specific labels may be shown. Implementation rules: - Never mix modes in the same view. - All UI labels must come from translatable strings. - Product mode must be read from server-side app config. - Client-side mode is display-only and must not be trusted for authorization. ## MVP World Layout Initial service map: ```text QDN Portal | Talk / Private Mail -- NuQloud Core -- Files Vault | Deck Board | Admin / Status ``` MVP service nodes: - NuQloud Core. - Files Vault. - Talk or Private Mail. - Deck Board. - QDN Portal. - Admin / Status. Each node needs: - Stable `id`. - Translated label. - Translated description. - Status. - Badge count. - Position. - Icon or sprite key. - Hover state. - Click action. - Activity pulse. - HTML fallback action. Example model: ```ts type WorldServiceNode = { id: 'core' | 'files' | 'talk' | 'deck' | 'qdn' | 'admin'; labelKey: string; descriptionKey: string; status: 'healthy' | 'warning' | 'error' | 'unknown'; badgeCount?: number; position: { x: number; y: number; }; panel: 'overview' | 'files' | 'talk' | 'deck' | 'qdn' | 'admin'; requiredCapability?: string; }; ``` ## Panel Scope Panels must be HTML/React components, not Phaser UI. ### Overview Panel MVP content: - Instance name. - Account display label. - Overall health. - Storage summary. - Active apps summary. - Recent activity. - Current mode and World preference. ### Files Panel MVP content: - Storage usage. - Protected folder count. - Recent files. - Recent publish states if Files Bridge is installed. - Open full Files link. - Publish selected file action where authorized. ### Talk Panel MVP content: - Unread count. - Recent conversations. - Relay or bridge state if Talk Bridge is installed. - Open full Talk link. - Message preview placeholder with no raw rendered user HTML. ### Deck Panel MVP content: - Active tasks count. - Recent tasks. - Project links. - Open full Deck link. - Graceful unavailable state if the Deck surface is absent. ### QDN Publish Panel MVP content: - Publish target. - Selected file placeholder. - Service/name/identifier fields. - Server-side validation messages. - Confirmation step. - Pending/success/failure state. - Receipt summary. ### Admin / Status Panel MVP content: - Nextcloud status. - QDN gateway status. - Qortal node status where allowed by product mode and permissions. - Talk backend status. - Office backend status where configured. - Redis status. - Database status. - Storage status. Admin-only data must be withheld from non-admin users. ## Event Architecture Use a typed event bus between Phaser, React state, and API updates. Event rule: - Phaser sends UI intent. - React/store sends state changes. - API services execute actions. - Phaser reacts visually to approved state. Core events: ```text ui.openPanel ui.closePanel ui.focusService ui.clearFocus ui.setMode service.statusChanged service.badgeChanged service.activityPulse service.capabilityUnavailable files.fileSelected files.filePublished talk.messageReceived deck.taskUpdated qdn.publishPrepared qdn.publishStarted qdn.publishCompleted qdn.publishFailed admin.healthChanged preferences.updated ``` Example: ```ts type WorldEvent = | { type: 'ui.openPanel'; panel: 'overview' | 'files' | 'talk' | 'deck' | 'qdn' | 'admin' | 'settings'; context?: Record; } | { type: 'service.statusChanged'; serviceId: WorldServiceNode['id']; status: 'healthy' | 'warning' | 'error' | 'unknown'; } | { type: 'qdn.publishCompleted'; publishId: string; receiptUrl?: string; }; ``` ## State Shape ```ts type WorldState = { mode: 'existing' | 'world' | 'compact'; productMode: 'powered' | 'full_qortal'; user: { id: string; displayName: string; isAdmin: boolean; }; instance: { name: string; baseUrl: string; status: 'healthy' | 'warning' | 'error' | 'unknown'; }; capabilities: Record; services: WorldServiceNode[]; badges: Record; activity: WorldActivityItem[]; preferences: { worldModeEnabled: boolean; reducedMotion: boolean; compactMode: boolean; }; }; ``` ## Data Integration Phase 1 uses fixtures only. Phase 2 adds aggregated server state: - Current user. - Instance name. - Storage used and quota. - Recent files. - Protected folders. - Talk unread count. - Recent conversations. - Active Deck task count. - Pending QDN publishes. - Basic service health. - Recent activity feed. MVP update strategy: - Poll service status every 30 to 60 seconds. - Poll message/Deck task badges every 10 to 30 seconds. - Poll storage every 60 to 300 seconds. - Poll active publish jobs every 5 to 15 seconds. - Add SSE or WebSocket only after the data model is stable. ## Security Requirements Mandatory rules: - All product routes authenticated by default. - All mutating API routes require CSRF protection. - All publish actions require server-side authorization. - All input must be validated and sanitized server-side. - Do not trust node id, service id, file id, path, product mode, or permissions supplied by the client. - Do not expose secrets, broker tokens, private node credentials, or internal service URLs to the browser. - Do not render raw user input in panels, tooltips, activity feeds, or Phaser labels. - Return capability-limited state for non-admin users. - Define public endpoints separately before adding any. QDN publish flow: ```text Client selects file -> server verifies file access -> server prepares publish request -> user confirms in HTML panel -> server submits publish action -> server returns sanitized status/receipt -> Phaser animates pending/success/failure ``` ## Accessibility Requirements NuQloud World cannot be canvas-only. Required: - Every primary Phaser action also exists as an HTML button or navigation item. - Keyboard navigation for service nodes and panels. - ARIA labels on panels, dialogs, command controls, and status indicators. - Focus trap for modal or side-panel workflows. - Escape closes active panel. - Reduced-motion preference. - Compact/mobile fallback. - Visible focus states using theme variables. - No essential text rendered only inside Phaser. ## Theming Requirements Use Nextcloud and NuQloud theme variables: - No hardcoded UI colors in components unless they are token definitions. - Support dark first, with light mode compatibility later. - Preserve concept accent roles: - blue for primary actions and selected navigation. - green for healthy/online/synced. - purple/cyan for publishing/network activity. - gold for credits or plan emphasis only. - Keep panels responsive and mobile-first. - Avoid nested card-heavy layouts in World overlays. ## Performance Requirements MVP targets: - World route should feel immediate after auth. - Mobile should default to compact or simplified mode. - Idle CPU must stay low. - Particle count must be capped. - World assets must lazy-load. - Animations pause or reduce when the tab is inactive. - Reduced-motion mode disables non-essential animation. - Texture assets should be optimized and bundled predictably. - Avoid custom shaders in MVP unless a fallback exists. ## Build Strategy Recommended frontend: - TypeScript. - React. - Phaser 4. - Lightweight store such as Zustand or equivalent. - Typed event bus. - CSS tokens. Recommended packaging: - Build compiled assets into the Nextcloud app's `js/` and `css/` output. - Keep the app loadable through normal Nextcloud script/style registration. - Use Vite if it can emit Nextcloud-compatible static assets cleanly. - Otherwise follow the repository's current app asset pipeline. Do not require a standalone NuQloud frontend server for production. ## Feature Flags Server-side flags: ```ts type NuQloudWorldFlags = { worldModeEnabled: boolean; worldModeDefault: boolean; worldModeBetaBadge: boolean; qdnPortalEnabled: boolean; deckNodeEnabled: boolean; talkNodeEnabled: boolean; filesNodeEnabled: boolean; adminStatusNodeEnabled: boolean; liveActivityEnabled: boolean; reducedMotionDefault: boolean; }; ``` Defaults: - `worldModeEnabled`: false until beta. - `worldModeDefault`: false until proven. - `qdnPortalEnabled`: true only when integration is available. - `adminStatusNodeEnabled`: visible to admins, limited for users. - `reducedMotionDefault`: follow user/system preference. ## Rollout Phases ### Phase 0 - Design and Technical Lock Deliverables: - Confirm plugin app id. - Confirm supported Nextcloud versions. - Pin Phaser 4 version. - Define service node list. - Define panel list. - Define event schema. - Define API state contract. - Define route map. - Define theme tokens. - Define feature flags. - Define MVP acceptance criteria. - Confirm language mode dictionary. Exit criteria: - No ambiguity about Phaser vs HTML responsibilities. - No ambiguity about app/plugin boundaries. - Implementation tickets can be created from this plan. ### Phase 1 - Static Plugin Prototype Build: - New Nextcloud app shell. - Authenticated `/world` route. - Compiled TypeScript frontend bundle. - Phaser boot scene. - Static WorldScene. - Five to six service nodes. - Hover/focus/click effects. - HTML overlay panel host. - Mock panel content. - Mock status badges. - Reduced-motion toggle. Exit criteria: - `/apps/nuqloud_world/world` loads for authenticated users. - Unauthenticated users cannot access it. - Service nodes render. - Hover, keyboard focus, and click open panels. - Panels can open and close. - No real publish action exists yet. ### Phase 2 - State and Event Bus Build: - Typed event bus. - World state store. - Panel store. - Service status store. - Preference store. - Mock activity events. - Phaser subscriptions to store updates. - HTML command bar fallback. Exit criteria: - Phaser does not own business logic. - State updates affect both panels and scene objects. - All primary actions work without clicking the canvas. - Mock activity pulses work. ### Phase 3 - Aggregated Server State Build: - `WorldStateController`. - `WorldStateService`. - Integration services for installed NuQloud apps. - Capability detection. - Sanitized JSON state endpoint. - Loading/error/offline states. - Basic polling. Exit criteria: - Real counts show where integrations are installed. - Missing integrations degrade gracefully. - Non-admin users do not receive admin-only data. - API errors render cleanly. ### Phase 4 - QDN Portal MVP Build: - Select file from Files panel. - Prepare publish request server-side. - Confirmation panel. - Submit publish action server-side. - Pending state. - Success/failure receipt. - Phaser portal animations based on approved server state. Exit criteria: - No destructive or publishing action happens without confirmation. - Invalid file ids, paths, names, services, and identifiers are rejected. - Publish status is visible in both panel and world node. - Errors expose no secrets. ### Phase 5 - Useful Spatial Workflows Build one workflow that makes the theme layer useful beyond visual polish: - Conversation/project room. - Linked files. - Linked Deck tasks. - QDN publish history. - Activity timeline. - Open object -> real panel/detail view. Exit criteria: - A user can move from conversation/project context to files/Deck/publishing without losing context. - Spatial view is not decorative only. ### Phase 6 - Mobile and Accessibility Hardening Build: - Compact shell. - Touch-safe controls. - Keyboard navigation pass. - ARIA audit. - Reduced-motion pass. - Performance budget pass. - Cross-browser sanity pass. Exit criteria: - Mobile users are not forced into heavy world mode. - All core actions work without Phaser. - Focus order is understandable. - Reduced motion meaningfully reduces animation. ### Phase 7 - Private Beta Rollout: - Enable behind feature flag. - Default users to existing NuQloud surfaces. - Allow opt-in to World Mode. - Collect feedback. - Track performance and usage. Metrics: - World Mode activation rate. - Repeat usage. - Time to first useful action. - Panel open counts. - Publish completion rate. - API failure rate. - Slow load rate. - Mobile fallback usage. Exit criteria: - Users understand the interface. - Performance is acceptable. - No major accessibility blocker remains. - World Mode creates clear product differentiation. ### Phase 8 - Public Launch Readiness Build: - Final branded art assets. - Polished animations. - Preference setting. - Admin controls. - Documentation. - Marketing screenshots/video. - Upgrade notes. Exit criteria: - App can ship without a Nextcloud fork. - Feature flags support rollback. - Admins can disable World Mode. - Documentation explains existing, world, and compact modes. ## Implementation Tickets ### Foundation - Create `nuqloud_world` app scaffold. - Add authenticated page controller. - Add route registration. - Add frontend build pipeline. - Add feature flag service. - Add world preference storage. ### Frontend Shell - Add React app shell. - Add Phaser game mount/unmount lifecycle. - Add overlay layer. - Add panel host. - Add command bar. - Add compact shell. - Add theme token file. - Add i18n files. ### Phaser Layer - Add BootScene. - Add PreloadScene. - Add WorldScene. - Add EffectsScene. - Add ServiceNode object. - Add FilesVault object. - Add TalkSphere object. - Add DeckBoard object. - Add QdnPortal object. - Add AdminCore object. - Add reduced-motion behavior. ### State and Events - Add typed world event definitions. - Add world bus. - Add world store. - Add service status store. - Add panel store. - Add preference store. - Add mock event generator for prototype only. ### API and Services - Add state endpoint. - Add service capability endpoint. - Add activity endpoint. - Add preferences endpoint. - Add publish prepare endpoint. - Add publish confirm endpoint. - Add integration adapters for core, Files Bridge, Talk Bridge, and QDN. ### Panels - Add Overview panel. - Add Files panel. - Add Talk panel. - Add Deck panel. - Add QDN Publish panel. - Add Admin Status panel. - Add Settings panel. - Add unavailable integration state. ### Security - Add CSRF coverage for mutating endpoints. - Add server-side authorization checks. - Add input validation helpers. - Add output sanitization policy. - Add permission-limited state shaping. - Add admin-only status filtering. ### Accessibility - Add keyboard node navigation. - Add HTML action equivalents. - Add ARIA labels and roles. - Add focus management. - Add reduced-motion toggle. - Add compact fallback. ### QA and Release - Add unit tests for services and validation. - Add frontend tests for event/store behavior. - Add route/auth tests. - Add manual devcloud verification steps. - Add beta flag rollout docs. - Add rollback docs. ## Acceptance Criteria MVP is complete when: - World Mode is delivered as a theme-grade Nextcloud app/plugin. - No Nextcloud fork is required. - Route is authenticated. - All mutating actions are CSRF protected. - No raw user input is rendered. - Service nodes and HTML fallback actions match. - Panels use translated strings. - Product language mode is consistent per view. - Core state loads from a server endpoint. - Missing integrations degrade gracefully. - QDN publish workflow requires confirmation. - Reduced-motion and compact modes exist. - Admin-only state is not exposed to regular users. ## Devcloud Verification Commands Use devcloud only. Do not run local Docker/Nextcloud for this work. Example commands once implementation begins: ```bash docker compose --env-file .env.devcloud exec nextcloud php occ app:list docker compose --env-file .env.devcloud exec nextcloud php occ app:enable nuqloud_world docker compose --env-file .env.devcloud exec nextcloud php occ app:check-code nuqloud_world docker compose --env-file .env.devcloud exec nextcloud php occ config:app:get nuqloud_world worldModeEnabled docker compose --env-file .env.devcloud exec nextcloud php occ maintenance:repair --include-expensive ``` Frontend build verification, from the app directory: ```bash npm ci npm run build npm test -- --run ``` ## Verify-by-Inspection Checklist - App structure valid: `appinfo/`, `routes.php`, controllers, services. - Auth enforced on all product routes. - Public endpoints explicitly absent or separately documented. - CSRF enforced on all mutating endpoints. - No raw user input rendered. - No secrets exposed to logs or client state. - Imports and exports consistent. - i18n used for UI labels. - Theme variables used instead of hardcoded component colors. - Product language mode not mixed in a view. - CHD admin surfaces not exposed. - Nextcloud version compatibility checked in Phase 0. - Mobile and reduced-motion fallbacks included.