From 5c6d4f48028e60833c1bb4e81006b963de35942f Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Fri, 9 Jan 2026 17:22:31 +0000 Subject: [PATCH] fix(release): bump package and daemon to v0.3.1, add project README, and fix Gitea release upload flag --- .gitea/workflows/release.yml | 2 +- changelog.md | 9 + ecoos_daemon/ts/version.ts | 2 +- .../includes.chroot/opt/eco/bin/eco-daemon | Bin 86979372 -> 86979372 bytes package.json | 2 +- readme.md | 268 ++++++++++++++++++ 6 files changed, 280 insertions(+), 3 deletions(-) create mode 100644 readme.md diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 7c2b6cf..83e8be8 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -82,7 +82,7 @@ jobs: curl -X POST -s \ -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ -H "Content-Type: application/octet-stream" \ - --data-binary "@$asset" \ + -T "$asset" \ "https://code.foss.global/api/v1/repos/${{ gitea.repository }}/releases/$RELEASE_ID/assets?name=$filename" done diff --git a/changelog.md b/changelog.md index a659fe2..488feeb 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,14 @@ # Changelog +## 2026-01-09 - 0.3.2 - fix(release) +bump package and daemon to v0.3.1, add project README, and fix Gitea release upload flag + +- package.json version updated from 0.3.0 to 0.3.1 +- ecoos_daemon/ts/version.ts updated to export VERSION = "0.3.1" +- Added comprehensive readme.md documenting the project, development and release workflow +- Fix .gitea/workflows/release.yml: use curl -T for uploading release assets instead of --data-binary +- Updated bundled eco-daemon binary in isobuild/config/includes.chroot/opt/eco/bin/ (new build artifact) + ## 2026-01-09 - 0.3.0 - feat(daemon) add automatic update mechanism (Updater), switch to system journal logs, and expose update controls in the UI diff --git a/ecoos_daemon/ts/version.ts b/ecoos_daemon/ts/version.ts index f6c20ef..767a57d 100644 --- a/ecoos_daemon/ts/version.ts +++ b/ecoos_daemon/ts/version.ts @@ -1 +1 @@ -export const VERSION = "0.2.3"; +export const VERSION = "0.3.1"; diff --git a/isobuild/config/includes.chroot/opt/eco/bin/eco-daemon b/isobuild/config/includes.chroot/opt/eco/bin/eco-daemon index e14c1df403494dc663f0446ee172032111220a9a..e26d9128917d48f7e3e80cc835ff73830401e8c4 100755 GIT binary patch delta 3783 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 delta 3783 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 diff --git a/package.json b/package.json index 8da5a9f..335abae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ecobridge/eco-os", - "version": "0.3.0", + "version": "0.3.1", "private": true, "scripts": { "build": "[ -z \"$CI\" ] && npm version patch --no-git-tag-version || true && node -e \"const v=require('./package.json').version; require('fs').writeFileSync('ecoos_daemon/ts/version.ts', 'export const VERSION = \\\"'+v+'\\\";\\n');\" && pnpm run daemon:bundle && cp ecoos_daemon/bundle/eco-daemon isobuild/config/includes.chroot/opt/eco/bin/ && mkdir -p .nogit/iso && docker build --no-cache -t ecoos-builder -f isobuild/Dockerfile . && docker run --privileged --name ecoos-build ecoos-builder && docker cp ecoos-build:/output/ecoos.iso .nogit/iso/ecoos.iso && docker rm ecoos-build", diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..ddb8c3e --- /dev/null +++ b/readme.md @@ -0,0 +1,268 @@ +# ๐ŸŒ EcoOS + +> **A purpose-built, minimal Linux distribution for kiosk and digital signage deployments.** + +EcoOS is a streamlined operating system that boots directly into a full-screen Chromium browser, managed by a powerful daemon with a built-in web UI. Perfect for digital signage, interactive kiosks, info displays, and any scenario where you need a locked-down, browser-based interface. + +## Issue Reporting and Security + +For reporting bugs, issues, or security vulnerabilities, please visit [community.foss.global/](https://community.foss.global/). This is the central community hub for all issue reporting. Developers who sign and comply with our contribution agreement and go through identification can also get a [code.foss.global/](https://code.foss.global/) account to submit Pull Requests directly. + +--- + +## โœจ Features + +- **๐Ÿš€ Zero-Config Boot** โ€” Boots straight into a Wayland-based kiosk browser +- **๐Ÿ–ฅ๏ธ Sway Compositor** โ€” Modern, tiling Wayland compositor with automatic fallback modes +- **๐ŸŒ Chromium Kiosk** โ€” Full-screen browser in locked-down kiosk mode +- **๐ŸŽ›๏ธ Management UI** โ€” Real-time system monitoring and control via web interface on port 3006 +- **๐Ÿ”„ Auto-Updates** โ€” Daemon self-updates with smart stability checking +- **๐Ÿ“Š System Monitoring** โ€” CPU, memory, disk, network, GPU, and audio device stats +- **๐Ÿ“ Live Logs** โ€” System journal and daemon logs accessible from the UI +- **๐Ÿ”Œ Hardware Support** โ€” Input devices, speakers, microphones detection and display +- **โšก Rapid Recovery** โ€” Auto-restart of crashed services within seconds + +--- + +## ๐Ÿ—๏ธ Architecture + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ EcoOS ISO โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ eco-daemon (systemd) โ”‚ โ”‚ +โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ +โ”‚ โ”‚ โ”‚ Process โ”‚ โ”‚ System โ”‚ โ”‚ Updater โ”‚ โ”‚ โ”‚ +โ”‚ โ”‚ โ”‚ Manager โ”‚ โ”‚ Info โ”‚ โ”‚ (auto-upgrade) โ”‚ โ”‚ โ”‚ +โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ +โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ +โ”‚ โ”‚ โ–ผ โ–ผ โ–ผ โ”‚ โ”‚ +โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ +โ”‚ โ”‚ โ”‚ UI Server (:3006) โ”‚ โ”‚ โ”‚ +โ”‚ โ”‚ โ”‚ REST API โ”‚ WebSocket โ”‚ Dashboard โ”‚ โ”‚ โ”‚ +โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ”‚ โ”‚ +โ”‚ โ–ผ โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ Sway Compositor โ”‚โ”€โ”€โ”€โ”‚ Chromium (kiosk mode) โ”‚ โ”‚ +โ”‚ โ”‚ (Wayland) โ”‚ โ”‚ โ†’ localhost:3006 โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ Ubuntu 24.04 Base โ”‚ systemd โ”‚ seatd โ”‚ pipewire โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +--- + +## ๐Ÿ› ๏ธ Development + +### Prerequisites + +- **Docker** (for ISO building) +- **pnpm** (package manager) +- **Deno** v2.x (for daemon development) +- **QEMU** (for testing) + +### Project Structure + +``` +eco_os/ +โ”œโ”€โ”€ ecoos_daemon/ # Daemon source (Deno/TypeScript) +โ”‚ โ”œโ”€โ”€ mod.ts # Entry point +โ”‚ โ””โ”€โ”€ ts/ +โ”‚ โ”œโ”€โ”€ daemon/ # Core daemon logic +โ”‚ โ”‚ โ”œโ”€โ”€ index.ts # EcoDaemon class +โ”‚ โ”‚ โ”œโ”€โ”€ process-manager.ts # Sway/Chromium management +โ”‚ โ”‚ โ”œโ”€โ”€ system-info.ts # Hardware detection +โ”‚ โ”‚ โ””โ”€โ”€ updater.ts # Auto-update system +โ”‚ โ”œโ”€โ”€ ui/ # Web UI server +โ”‚ โ””โ”€โ”€ utils/ # Utilities +โ”œโ”€โ”€ isobuild/ # ISO build configuration +โ”‚ โ”œโ”€โ”€ Dockerfile # Build container +โ”‚ โ”œโ”€โ”€ config/ # live-build config +โ”‚ โ””โ”€โ”€ scripts/ # Build scripts +โ”œโ”€โ”€ isotest/ # QEMU test scripts +โ””โ”€โ”€ .nogit/ # Generated artifacts (not in git) + โ”œโ”€โ”€ iso/ # Built ISO + โ”œโ”€โ”€ vm/ # QEMU files + โ””โ”€โ”€ screenshots/ # VM screenshots +``` + +### Commands + +```bash +# Build the full ISO (auto-rebuilds daemon first) +pnpm run build + +# Test ISO in QEMU virtual machine +pnpm run test + +# Take screenshot of running VM +pnpm run test:screenshot + +# Stop the QEMU VM +pnpm run test:stop + +# Clean all build artifacts +pnpm run clean + +# Daemon development (watch mode) +pnpm run daemon:dev + +# Bundle daemon to standalone binary +pnpm run daemon:bundle + +# Type-check daemon code +pnpm run daemon:typecheck +``` + +--- + +## ๐Ÿ–ฅ๏ธ Management UI + +The daemon exposes a management interface at `http://localhost:3006` (or the device's IP on port 3006). + +### Dashboard Features + +| Panel | Description | +|-------|-------------| +| **Services** | Status of Sway compositor and Chromium browser | +| **CPU** | Model, core count, real-time usage | +| **Memory** | Used/total with visual progress bar | +| **Network** | Interface names and IP addresses | +| **Disks** | Mount points, usage, and capacity | +| **System** | Hostname, uptime, GPU info | +| **Controls** | Restart browser, reboot system buttons | +| **Updates** | Version info, available updates, upgrade controls | +| **Input Devices** | Keyboards, mice, touchscreens | +| **Audio** | Detected speakers and microphones | +| **Logs** | Daemon logs and system journal viewer | + +### API Endpoints + +| Endpoint | Method | Description | +|----------|--------|-------------| +| `/api/status` | GET | Full system status | +| `/api/logs` | GET | Daemon logs | +| `/api/reboot` | POST | Reboot the system | +| `/api/restart-chromium` | POST | Restart the kiosk browser | +| `/api/updates` | GET | Update information | +| `/api/updates/check` | POST | Check for new updates | +| `/api/upgrade` | POST | Upgrade to specific version | +| `/ws` | WebSocket | Real-time status updates | + +--- + +## ๐Ÿ”„ Update System + +EcoOS features a smart auto-update mechanism: + +1. **Hourly Checks** โ€” Daemon polls for new releases every hour +2. **Stability Period** โ€” New releases wait 24 hours before auto-upgrade (prevents deploying unstable releases) +3. **Seamless Upgrade** โ€” Downloads new daemon binary, replaces, and restarts service +4. **Manual Override** โ€” Force immediate upgrade via UI or API +5. **Version Tracking** โ€” UI auto-reloads when daemon version changes + +--- + +## ๐Ÿงช Testing + +### QEMU Virtual Machine + +```bash +# Start VM (creates disk, boots ISO) +pnpm run test + +# Take screenshots to monitor progress +pnpm run test:screenshot + +# Screenshot loop (every 5 seconds) +pnpm run test:screenshot:loop + +# Stop VM +pnpm run test:stop + +# Clean and restart fresh +pnpm run test:clean && pnpm run test +``` + +### Serial Console + +For debugging without graphics: + +```bash +socat - UNIX-CONNECT:.nogit/vm/serial.sock +# Login: ecouser / ecouser +# Root: sudo -i +``` + +--- + +## ๐Ÿ“ฆ Release Assets + +Each release includes: + +| File | Description | +|------|-------------| +| `ecoos-vX.X.X.iso` | Full bootable ISO image (~2GB) | +| `eco-daemon-vX.X.X` | Standalone daemon binary for in-place upgrades | +| `SHA256SUMS.txt` | Checksums for verification | + +--- + +## ๐Ÿ”ง Boot Menu Options + +1. **Install EcoOS** *(default, auto-selects in 10s)* โ€” Full installation to disk +2. **EcoOS Live** โ€” Try without installing (runs from RAM) +3. **EcoOS Live (Safe Mode)** โ€” Minimal boot for troubleshooting + +--- + +## โš™๏ธ Technical Details + +### Daemon + +- **Runtime**: Deno (compiled to standalone binary) +- **Process Management**: Spawns and monitors Sway + Chromium +- **Backend Fallback**: Tries DRM first, falls back to headless/pixman +- **Auto-Recovery**: Restarts crashed services within 5 seconds +- **Logging**: Integrates with systemd journal + +### Kiosk Browser + +- **Browser**: Chromium (official snapshots, not snap) +- **Flags**: `--ozone-platform=wayland --kiosk --no-first-run --disable-infobars` +- **Default URL**: `http://localhost:3006` (management UI) + +### System Stack + +- **Base**: Ubuntu 24.04 LTS +- **Init**: systemd +- **Display**: Sway (Wayland compositor) +- **Seat Manager**: seatd +- **Audio**: PipeWire + +--- + +## License and Legal Information + +This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [LICENSE](./LICENSE) file. + +**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file. + +### Trademarks + +This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH or third parties, and are not included within the scope of the MIT license granted herein. + +Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines or the guidelines of the respective third-party owners, and any usage must be approved in writing. Third-party trademarks used herein are the property of their respective owners and used only in a descriptive manner, e.g. for an implementation of an API or similar. + +### Company Information + +Task Venture Capital GmbH +Registered at District Court Bremen HRB 35230 HB, Germany + +For any legal inquiries or further information, please contact us via email at hello@task.vc. + +By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.