# EcoOS - System Documentation

## What Is This?

Custom Ubuntu 24.04 LTS ISO that boots into a kiosk mode with:
- **Sway** (Wayland compositor) - managed by the daemon
- **Chromium Browser** in kiosk mode - managed by the daemon
- **eco-daemon** - Deno binary that orchestrates everything
- **Management UI** on port 3006

## REQUIREMENT: Sway + Chromium Browser

**The system MUST use Chromium browser, NOT Google Chrome.**

### Challenge
Ubuntu 24.04 made `chromium-browser` snap-only. Snap doesn't work in live-build chroot environments.

### Solution
Download Chromium directly from official builds or use Debian's chromium package:
- Option A: Download from https://download-chromium.appspot.com/ (Linux_x64)
- Option B: Use Debian's chromium .deb package from sid/unstable
- Option C: Use ungoogled-chromium from OBS (OpenSUSE Build Service)

The daemon must call `chromium-browser` or `chromium` command.

## CRITICAL: Boot Flow

### GRUB Boot Menu (60s timeout)
When the ISO boots, GRUB shows:
1. **"Install EcoOS"** - DEFAULT, auto-selects after 60 seconds
2. "EcoOS Live" - Try without installing
3. "EcoOS Live (Safe Mode)"

### Install Mode (`ecoos_install=1`)
When "Install EcoOS" is selected:
1. Kernel boots with `ecoos_install=1` parameter
2. `ecoos-installer.service` runs (has `ConditionKernelCommandLine=ecoos_install=1`)
3. Installer at `/opt/eco/installer/install.sh` runs interactively on tty1
4. Installer writes to disk, sets up GRUB bootloader
5. System reboots
6. **Now boots from installed disk, NOT the ISO**

### Live Mode (No install)
When "EcoOS Live" is selected:
1. Boots into RAM (squashfs)
2. eco-daemon starts via systemd
3. Sway + Chromium should start
4. **No persistent storage** - changes lost on reboot

### After Installation (Normal Boot)
1. System boots from installed disk
2. eco-daemon.service starts
3. Daemon writes Sway config to `~/.config/sway/config`
4. Daemon starts Sway compositor
5. Daemon starts Chromium in kiosk mode pointing to localhost:3006
6. Management UI serves on port 3006

## Architecture

```
eco_os/
├── ecoos_daemon/           # Deno daemon source
│   └── ts/
│       ├── daemon/
│       │   ├── index.ts         # Main daemon orchestration
│       │   ├── process-manager.ts # Sway/Chromium process control
│       │   └── system-info.ts   # CPU/memory stats
│       └── ui/
│           └── server.ts        # HTTP server + WebSocket
├── isobuild/
│   ├── Dockerfile              # Docker build environment
│   ├── config/
│   │   ├── hooks/normal/       # Chroot hooks (MUST BE EXECUTABLE)
│   │   │   ├── 0050-setup-ecouser.hook.chroot
│   │   │   ├── 0055-fix-networkmanager.hook.chroot
│   │   │   ├── 0060-install-chromium.hook.chroot  # Installs Chromium
│   │   │   └── 0100-enable-services.hook.chroot
│   │   ├── includes.chroot/    # Files copied into ISO
│   │   │   ├── etc/
│   │   │   │   ├── NetworkManager/system-connections/wired.nmconnection
│   │   │   │   └── systemd/system/
│   │   │   │       ├── eco-daemon.service
│   │   │   │       └── ecoos-installer.service
│   │   │   └── opt/eco/
│   │   │       ├── bin/eco-daemon    # Compiled daemon binary
│   │   │       └── installer/install.sh
│   │   └── systemd/eco-daemon.service
│   └── output/                 # Built ISOs
└── isotest/                    # QEMU test environment
    ├── run-test.sh
    ├── test-disk.qcow2         # Persistent test disk
    └── screenshots/
```

## Daemon Behavior

### Sway Config Generation
The daemon **generates Sway config at runtime** - there is NO static config file.

Location: `~/.config/sway/config` (written before Sway starts)

Features:
- Black background
- 1920x1080 resolution
- No window borders
- All windows forced fullscreen
- Chromium app_id rules for fullscreen

### Chromium Launch
Command: `chromium-browser` (or `chromium`)
Flags:
- `--ozone-platform=wayland`
- `--kiosk`
- `--no-first-run`
- `--disable-infobars`
- URL: `http://localhost:3006`

### Port 3006 Management UI
- Serves HTML dashboard
- Shows Sway/Chromium status
- Shows CPU/memory stats
- Shows daemon logs
- WebSocket for live updates

## Build Process

### Prerequisites
```bash
docker  # For isolated build environment
```

### Build Commands
```bash
# 1. Build Docker image (includes daemon compilation)
npm run build:docker

# 2. Build ISO (takes ~5-10 minutes)
npm run build

# ISO output: isobuild/output/ecoos.iso
```

### IMPORTANT: Hook Permissions
All files in `isobuild/config/hooks/normal/*.hook.chroot` MUST be executable:
```bash
chmod +x isobuild/config/hooks/normal/*.hook.chroot
```

If hooks aren't executable, Chromium won't be installed!

## Testing in QEMU

### Start Test VM
```bash
npm run test
```
This:
- Creates test-disk.qcow2 if needed (20GB)
- Boots ISO with UEFI
- Port forwards 3006 and 22
- Runs headless with VNC on :0

### Access
- **VNC**: `localhost:5900` (view display)
- **SSH**: `localhost:2222` (after install, user: ecouser)
- **Management UI**: `localhost:3006` (after eco-daemon starts)

### Check Progress
```bash
# View serial console
tail -f isotest/serial.log

# Take screenshot
npm run test:screenshot

# Stop VM
npm run test:stop
```

### Fresh Install Test
To test a fresh installation:
```bash
npm run test:stop
rm isotest/test-disk.qcow2
npm run test
# Wait 60s for auto-install, or use VNC to watch
```

## Network Configuration

### QEMU User Mode Networking
- VM gets IP via DHCP (usually 10.0.2.15)
- Port 3006 forwarded: host:3006 -> guest:3006
- Port 2222 forwarded: host:2222 -> guest:22

### NetworkManager Config
File: `/etc/NetworkManager/system-connections/wired.nmconnection`
- Configures wired ethernet with DHCP
- Permissions fixed by 0055-fix-networkmanager.hook.chroot

## Troubleshooting

### Chromium Not Starting
1. Check if Chromium is installed: `which chromium-browser`
2. Check hook permissions: `ls -la isobuild/config/hooks/normal/`
3. Rebuild Docker image: `npm run build:docker`

### Port 3006 Not Accessible
1. Check eco-daemon status: `systemctl status eco-daemon`
2. Check daemon logs: `journalctl -u eco-daemon -f`
3. Check NetworkManager: `nmcli device status`

### Sway Not Starting
1. Check seatd: `systemctl status seatd`
2. Check daemon logs for Sway errors
3. Verify ecouser exists: `id ecouser`

### Boot Stuck in Live Mode
- GRUB menu shows for 60 seconds
- Default option should be "Install EcoOS"
- Check if `ecoos_install=1` is in kernel cmdline

## Version Info

- Base: Ubuntu 24.04 LTS (Noble)
- Kernel: 6.8.0-90
- Sway: From Ubuntu repos
- Chromium: From Debian sid/unstable or official Chromium builds
- Deno: Latest (for daemon compilation)
