DaemonOS is a playful, browser‑based “operating system” interface. It’s built as a fun experiment in UI/UX, app modularity, and safe client‑side execution. There is no server‑side code and no interpreted user input — everything runs locally in the user’s browser. A live demo is available at https://daemonos.jasondaemon.net, but the live version may change multiple times per day and some features can be broken (Pinball included).
- A creative playground for desktop‑style UI experiments
- A lightweight app shell for browser‑native “apps”
- A static, client‑only deployment that minimizes attack surface
DaemonOS is licensed under the GNU General Public License v3.0 (GPL‑3.0). See LICENSE.
Asset licensing notes are in ASSETS_LICENSES.md.
- Games: Paddle Duel, Minesweeper, Road Hopper, Pinball (Planck.js), Racecar, Chess, Checkers, 4 'n' a Row, Snake, Space Rocks!, Space Defender, Spacefighter.
- Music Player: Winamp‑inspired playback with playlists and multiple visualizer modes.
- Screensavers: Starfield, Aurora Lines, Matrix code rain, and Flying Toasters.
- System Monitor: top‑bar memory/pressure widget with per‑app suspend controls.
- Desktop OS UX: dock with tray launchers, menu bar with volume + fullscreen, window management, and theming.
- Static front‑end served by Nginx (containerized)
- OS shell in
site/os.jsmanages windows, dock, menus, settings, and app loading - Apps are modular JS entrypoints defined in
site/apps/registry.json - Lazy loading uses dynamic
import()so apps load only when opened
Key directories:
site/index.html— shell UI and CSPsite/styles.css— visual systemsite/os.js— runtime, window manager, menussite/apps/registry.json— app registrysite/apps/**— app entrypoints
DaemonOS is intentionally conservative:
- Client‑side only: no backend execution, no server‑side rendering, no proxying
- Strict CSP in
site/index.htmlto limit script origins - No eval / interpreted user input in core app system
- Iframe sandbox for the browser app (local pages only; external links open in new tabs)
- Read‑only container with dropped Linux capabilities
- No privileged operations; Nginx runs with restricted permissions
These controls keep the attack surface small while still enabling a rich UI.
From the repo root:
docker compose upBy default the container serves ./site.
Add apps by:
- Creating an entrypoint under
site/apps/<category>/<app>/<app>.js - Registering it in
site/apps/registry.json
Apps should export createApp(osAPI) and return a window payload:
export function createApp(osAPI) {
return {
title: "My App",
width: 500,
height: 350,
content: document.createElement("div"),
};
}- Screensaver behavior is configurable in Settings (enable, timeout, style).
- Global volume control in the menu bar affects all app audio.
- Music playlists are defined by
site/media/music/playlist.json(Suno-generated tracks by default; you can add more).
- The top‑bar widget provides estimated memory pressure and per‑app controls.
- Details and integration guide:
docs/system-monitor.md.
Third‑party components and their licenses are listed in THIRD_PARTY_LICENSES.md.
This is a hobby project and an experiment. Expect rapid iteration, playful UI changes, and occasional breaking changes.
Legal notice: see LEGAL.md.