Welcome to Tauri
+ + +Click on the Tauri logo to learn more about the framework
+ + + +diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..24d7cc6 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"] +} diff --git a/README.md b/README.md index a1fe633..d433441 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,333 @@ -# Nebula-OS +# Nebula OS v0 – Windows-first Development Plan +## Vision + +Nebula OS is a **controller-first, open source operating system experience** built on Linux. + +It has two equally important jobs: + +1. **A custom controller-first way to navigate the OS** (like a console shell) +2. **An open source library and launcher layer** for games and apps + +Nebula OS is not a skin that launches Steam. +It is an independent UI layer that: + +* Acts as the primary **controller-first shell** for the OS +* Provides a unified Home experience for **games, apps, and media** +* Ships with core Nebula apps such as **Nebula Browser** +* Exposes **system settings** through controller-friendly panels +* Manages game libraries directly (Steam, GOG, Epic, and others) + +Nebula OS v0 focuses on building the foundation for this console-grade OS shell. + +--- + +# Core Principles + +1. Controller-first, not controller-compatible +2. Replace proprietary frontends with an open interface +3. Separate system layer from UI layer +4. Build modular infrastructure for long-term independence +5. Develop iteratively, but architect for autonomy + +--- + +# What Nebula OS v0 Actually Is + +Nebula OS v0 consists of: + +* Base OS: Ubuntu LTS (or Ubuntu-based) +* Desktop Environment: KDE Plasma (recommended) +* Display Manager: SDDM +* Two login sessions: + + * Nebula Desktop + * Nebula Game UI +* Nebula Shell (Tauri + HTML/CSS/JS) +* Nebula Library (core application responsible for: + + * Game discovery + * Installation + * Updates + * Launching + * Compatibility management) + +Unlike SteamOS, Nebula OS does not rely on launching Steam Big Picture. +Nebula Library is the primary game management layer. + +--- + +# High-Level Architecture + +## Desktop Mode + +A standard KDE session for: + +* Productivity workflows +* File browsing and system tools +* Development and troubleshooting +* Advanced configuration + +Desktop Mode remains a normal Linux desktop. + +## Game UI Mode + +A dedicated login session that launches **Nebula Shell** fullscreen. + +Game UI Mode contains: + +* Lock screen with controller PIN entry +* Nebula Home dashboard +* Nebula Browser +* Nebula Library +* Controller-friendly Settings +* Power and session controls + +Game UI Mode is the **console experience** for the entire OS. + +## System Integration Layer (behind the UI) + +Nebula OS needs a clean boundary between UI and system operations. + +Recommended approach: + +* A small privileged backend service (later) that exposes safe operations: + + * Wi-Fi and networking + * Audio and output device selection + * Display resolution and scaling + * Bluetooth pairing + * Storage overview + * Power controls +* The UI talks to that layer through a stable API + +v0 scope can start with non-privileged read-only data and a few safe commands. + +--- + +# Technology Stack + +## UI Layer + +* Tauri +* HTML +* CSS +* JavaScript + +Why Tauri: + +* Lightweight +* Native system integration via Rust backend +* Cross-platform development +* Efficient resource usage + +## Controller Input + +* Web Gamepad API +* Custom focus/navigation system + +Controller mappings: + +* D-pad / left stick: navigation +* A: activate +* B: back +* Start: menu +* Shoulder buttons: future navigation layers + +Keyboard mirrors controller during development. + +--- + +# Nebula Shell – The OS UI Layer + +Nebula Shell is the **controller-first OS shell**. + +It is the primary interface in Game UI Mode and should feel like a console dashboard, not a desktop. + +Nebula Shell responsibilities: + +* Home dashboard (games, apps, recent activity) +* App launcher for Nebula apps (Nebula Browser, Nebula Library, Settings) +* System navigation (network, audio, display, storage, accounts) +* Power menu and session switching (Game UI ↔ Desktop) +* Notifications and downloads (later) +* Controller-first focus navigation everywhere + +Nebula Shell is built with Tauri + HTML/CSS/JS. + +--- + +# Nebula Library – The Game and App Management Layer + +Nebula Library is the **content manager** inside Nebula OS. + +It is not a bridge to proprietary UIs. +It should eventually handle: + +* Steam installs via SteamCMD and/or open APIs +* GOG installs via open or community tooling +* Epic installs via open tooling (for example Legendary) +* Proton/Wine configuration and per-title settings +* Game launch parameters and runtime selection +* Updates, integrity checks, and metadata + +Initial v0 scope: + +* Library UI skeleton and data model +* Local entries (manual add) +* Launch local executables +* Foundation for compatibility and store backends + +Long-term direction: + +Nebula Library becomes a unified open source platform for managing games and apps. + +--- + +# Development Strategy + +Nebula OS is developed in two environments: + +## Windows (Primary UI Development) + +Used for: + +* Building Nebula Shell UI +* Implementing controller navigation +* Designing lock screen +* Designing Library UI +* Building system state architecture + +UI and logic are platform-agnostic. + +## Linux VM (Integration & Replacement Layer) + +Used for: + +* Building Linux binaries +* Session integration +* SteamCMD integration testing +* Proton/Wine configuration +* System-level testing + +Rule: + +Develop UI on Windows. +Build and test Linux features inside the VM. + +--- + +# Phase Roadmap + +## Phase 1 – Nebula Shell (Controller Console Layer) + +Objective: +Build a polished, console-grade Game UI independent of store integration. + +Deliverables: + +* Lock screen with PIN keypad +* Home dashboard +* Library screen (mock data) +* Settings screen +* Power menu +* Controller navigation grid system +* Fullscreen window behavior + +No external integrations yet. + +--- + +## Phase 2 – Session Integration + +Objective: +Make Nebula Shell a selectable login session. + +Milestones: + +* Nebula Game UI appears at login +* Launches fullscreen +* Exiting returns to login +* Controller works reliably + +--- + +## Phase 3 – Nebula Library Foundations + +Objective: +Begin true replacement behavior. + +Milestones: + +* Launch local Linux games +* Integrate Proton/Wine execution layer +* Add SteamCMD support for installing Steam titles +* Track installed game metadata +* Unified library view + +This is where Nebula begins diverging from SteamOS. + +--- + +## Phase 4 – Store Integrations + +Objective: +Add real backend integration without proprietary UI. + +Potential directions: + +* SteamCMD for Steam installs +* Legendary (Epic CLI) integration +* Heroic backend reuse (without UI dependency) +* OpenGOG community tools + +Nebula Library becomes the single UI. + +--- + +# Security Strategy + +Game UI lock screen: + +* Local PIN authentication +* Optional profile system (future) + +Linux account authentication remains system-level. + +--- + +# What Nebula OS Is Not + +* Not a Steam skin +* Not Big Picture mode +* Not a launcher aggregator +* Not dependent on proprietary UIs + +It is an open system layer that manages games directly. + +--- + +# Immediate Action Plan + +1. Build Nebula Shell UI on Windows +2. Implement controller navigation framework +3. Build lock screen system +4. Build Library UI skeleton +5. Set up Linux VM +6. Create Nebula Game UI login session +7. Begin local executable launching support +8. Research SteamCMD integration + +--- + +# Success Criteria for v0 + +Nebula OS v0 is successful when: + +* You can log into Nebula Game UI +* The entire UI is controller navigable +* Lock screen works +* You can launch locally managed games +* You can return to Desktop Mode + +From there, Nebula Library evolves into a true open source game management platform. diff --git a/package.json b/package.json new file mode 100644 index 0000000..665ecf5 --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "name": "nebula-os", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "tauri": "tauri" + }, + "devDependencies": { + "@tauri-apps/cli": "^2" + } +} diff --git a/src-tauri/.gitignore b/src-tauri/.gitignore new file mode 100644 index 0000000..b21bd68 --- /dev/null +++ b/src-tauri/.gitignore @@ -0,0 +1,7 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Generated by Tauri +# will have schema files for capabilities auto-completion +/gen/schemas diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml new file mode 100644 index 0000000..6a3efc2 --- /dev/null +++ b/src-tauri/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "nebula-os" +version = "0.1.0" +description = "A Tauri App" +authors = ["you"] +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +# The `_lib` suffix may seem redundant but it is necessary +# to make the lib name unique and wouldn't conflict with the bin name. +# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519 +name = "nebula_os_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[dependencies] +tauri = { version = "2", features = [] } +tauri-plugin-opener = "2" +serde = { version = "1", features = ["derive"] } +serde_json = "1" + diff --git a/src-tauri/build.rs b/src-tauri/build.rs new file mode 100644 index 0000000..d860e1e --- /dev/null +++ b/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json new file mode 100644 index 0000000..4cdbf49 --- /dev/null +++ b/src-tauri/capabilities/default.json @@ -0,0 +1,10 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Capability for the main window", + "windows": ["main"], + "permissions": [ + "core:default", + "opener:default" + ] +} diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png new file mode 100644 index 0000000..6be5e50 Binary files /dev/null and b/src-tauri/icons/128x128.png differ diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000..e81bece Binary files /dev/null and b/src-tauri/icons/128x128@2x.png differ diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png new file mode 100644 index 0000000..a437dd5 Binary files /dev/null and b/src-tauri/icons/32x32.png differ diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000..0ca4f27 Binary files /dev/null and b/src-tauri/icons/Square107x107Logo.png differ diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png new file mode 100644 index 0000000..b81f820 Binary files /dev/null and b/src-tauri/icons/Square142x142Logo.png differ diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png new file mode 100644 index 0000000..624c7bf Binary files /dev/null and b/src-tauri/icons/Square150x150Logo.png differ diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000..c021d2b Binary files /dev/null and b/src-tauri/icons/Square284x284Logo.png differ diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000..6219700 Binary files /dev/null and b/src-tauri/icons/Square30x30Logo.png differ diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000..f9bc048 Binary files /dev/null and b/src-tauri/icons/Square310x310Logo.png differ diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png new file mode 100644 index 0000000..d5fbfb2 Binary files /dev/null and b/src-tauri/icons/Square44x44Logo.png differ diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000..63440d7 Binary files /dev/null and b/src-tauri/icons/Square71x71Logo.png differ diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png new file mode 100644 index 0000000..f3f705a Binary files /dev/null and b/src-tauri/icons/Square89x89Logo.png differ diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png new file mode 100644 index 0000000..4556388 Binary files /dev/null and b/src-tauri/icons/StoreLogo.png differ diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns new file mode 100644 index 0000000..12a5bce Binary files /dev/null and b/src-tauri/icons/icon.icns differ diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico new file mode 100644 index 0000000..b3636e4 Binary files /dev/null and b/src-tauri/icons/icon.ico differ diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png new file mode 100644 index 0000000..e1cd261 Binary files /dev/null and b/src-tauri/icons/icon.png differ diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs new file mode 100644 index 0000000..4a277ef --- /dev/null +++ b/src-tauri/src/lib.rs @@ -0,0 +1,14 @@ +// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ +#[tauri::command] +fn greet(name: &str) -> String { + format!("Hello, {}! You've been greeted from Rust!", name) +} + +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() { + tauri::Builder::default() + .plugin(tauri_plugin_opener::init()) + .invoke_handler(tauri::generate_handler![greet]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs new file mode 100644 index 0000000..9445f39 --- /dev/null +++ b/src-tauri/src/main.rs @@ -0,0 +1,6 @@ +// Prevents additional console window on Windows in release, DO NOT REMOVE!! +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +fn main() { + nebula_os_lib::run() +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json new file mode 100644 index 0000000..e7d91f3 --- /dev/null +++ b/src-tauri/tauri.conf.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "nebula-os", + "version": "0.1.0", + "identifier": "com.user.nebula-os", + "build": { + "frontendDist": "../src" + }, + "app": { + "withGlobalTauri": true, + "windows": [ + { + "title": "nebula-os", + "width": 800, + "height": 600 + } + ], + "security": { + "csp": null + } + }, + "bundle": { + "active": true, + "targets": "all", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ] + } +} diff --git a/src/assets/javascript.svg b/src/assets/javascript.svg new file mode 100644 index 0000000..f9abb2b --- /dev/null +++ b/src/assets/javascript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/tauri.svg b/src/assets/tauri.svg new file mode 100644 index 0000000..31b62c9 --- /dev/null +++ b/src/assets/tauri.svg @@ -0,0 +1,6 @@ + diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..aefce2a --- /dev/null +++ b/src/index.html @@ -0,0 +1,39 @@ + + +
+ + + +Click on the Tauri logo to learn more about the framework
+ + + +