A web-based OS simulation built as an interactive developer portfolio — featuring a full window manager, process lifecycle, theming engine, and dual desktop/mobile environments.
Launch apps, move windows, and showcase your projects like a living operating system.
- Getting Started
- Add Your Projects or Apps
- Extend System Programs
- Modifying Themes
- Project Structure (High‑Level)
- Architecture Overview
- Testing Strategy
- Connect
- Credits & Assets
git clone https://github.com/ronbodnar/showcase-os.git
cd showcase-os
Note: This step can be skipped if you are running with docker.
npm install
npm run dev # Local development
npm run devhost # Locally hosted server
npm run build
docker build -t showcase-os .
docker run --rm -p 8080:80 showcase-os
Open http://localhost:8080 in your browser.
- Add project metadata:
src/config/programs-developer.ts - Add project to the Software Center:
src/config/config.ts - Override or customize the launcher:
src/config/launchers.ts
Note: Step 3 is required if you are supplying a URL for the iframe to the browser program, otherwise the system generates a launcher automatically.
Programs are React components wrapped in OS‑managed windows.
src/features/program/components
- App Drawer
- Browser
- Connect (Socials and contact form, powered by Formspree)
- Photo Viewer
- Software Center
- Start Menu
- System Info
- System Settings
- Terminal (command registry–driven, powered by XTerm)
- Visual Studio Code (powered by github1s)
The OS automatically handles:
- Launcher creation
- Window lifecycle
- Process lifecycle
- Environment compatibility
- Add Program metadata:
src/config/programs-system.ts - Create a React Component for your new Program:
src/features/program/components - Register the Component in the program map:
src/features/program/components/index.ts
Note: Programs are lazy-loaded by default and use a resolver to map the component. You can eagerly load it by providing the Component directly (Start Menu is an example)
The Connect program uses Formspree to send email messages.
To enable Formspree for your own form project, you must:
- Sign up or log in to Formspree (It has a great free tier)
- Create a new form and copy the form's public key
https://formspree.io/f/**PUBLIC_KEY** - Replace the form's public key in
src/features/program/components/Connect/ContactForm.tsxwith your own.
src/assets/icons
Icons are loaded asynchronously on demand using loaders within the Theme's skin.
- Update the
ThemeIconSettype insrc/features/theme/types.tswith the new icon name - Add the icon file to
src/assets/icons/themes/THEME_NAME/...(pick a category or create a new one) - Register the icon file with the skin in
src/features/theme/skins/THEME_NAME/icons/(desktop, mobile, or shared).ts
Note: Mobile icons are not available on desktop and vice versa. The shared icon set is available on all platforms.
src/assets/wallpaper
The system will apply the correct wallpaper based on the user's viewport and defaults to 1080p.
You can add or change the supported resolutions in src/features/theme/services/themeService.ts within detectResolution().
- Create a new directory in
src/assets/wallpaper/ - Add the .webp files to the directory (desktop-1080p is the fallback wallpaper)
- Make the wallpaper available in
src/features/theme/assets/wallpaper.ts
src/features/theme/skins
The default theme is Mint-Y (dark) src/features/theme/skins/Mint-Y/index.ts and contains the complete default icon set.
- Copy the Mint-Y (light) skin:
cp -r src/features/theme/skins/Mint-Y-light src/features/theme/skins/YOUR_THEME_NAME - Update the theme config within
index.tswith a new name and scheme - Override desktop, mobile, or shared icons within
icons/. The default icon set is already included as a fallback.
To ensure the system picks up new themes or to change a skin directory name, you must also update the map in src/features/theme/index.ts.
public/ # Static assets for branding and deployment
src/
├── config/ # Static configuration files to easily extend or modify the system
├── core/ # OS hooks, services, overlays, global stores
├── features/ # OS subsystems (environments, grids, windows/app cards, launchers, programs, themes)
├── assets/ # Icons, wallpapers, Software Center previews
├── shared/ # Reusable UI primitives & hooks
├── test/ # Setup for unit tests
├── App.tsx # Root application shell
├── main.tsx # Entry point
└── index.css # Global styles
index.html # Site metadata and root elementEvery subsystem behaves like its real OS counterpart, but implemented in a modern web stack.
- Programs are static definitions
- Processes are runtime instances
- Windows are stateful UI shells
- Services own logic -> components stay thin
- Everything is replaceable, forkable, and extensible
| Service | Responsibility |
|---|---|
osService |
Platform detection, desktop/mobile state |
systemService |
Boot, shutdown, lock, global state |
panelService |
Panel launcher management, pinning/unpinning launchers |
processService |
Program lifecycle, PID tracking, runtime state |
overlayService |
Overlay state and lifecycle |
| Service | Responsibility |
|---|---|
appCardService |
App card management (mobile equivalent of a window) |
programService |
Program registration and metadata |
gridService |
Grid launcher placement, resizing, snapping |
launcherService |
Desktop, menu, panel, and mobile launch flows |
programService |
In-program navigation, Program Component access |
themeService |
Applying theme settings, asset management |
windowService |
Focus, z‑index, resize/maximize/minimize state |
src/features/environments
Dual‑mode OS environments sharing the same services.
- Grid‑based desktop
- Panel + system tray
- Floating resizable windows
- Live window previews (panel hover)
- Home screen launcher
- Fullscreen app cards
- Navigation controls
- Notification shade
- Touch‑first interactions
src/core/overlays
Tooltips, context menus, dialogs, and window compositor (for live previews on the panel/taskbar)
- Syle variant support
- Positional constraints (within viewport, clamp to edge)
- Offset support from client mouse position
src/core/hooks/useOverlayPosition.tsfor consistent functionality
Since the UI is a complex state-driven simulation, I prioritize testing the service logic and state transitions that drive the experience.
- Service-Level Unit Tests — Every service is validated for mathematical accuracy and logical correctness.
- Strict State Mocking — vi.hoisted patterns to deterministically mock Zustand stores, ensuring tests are isolated.
- Environment Simulation — Logic is validated across both Desktop and Mobile modes, ensuring responsive system behavior.
- Idempotency & Caching — Registry services are tested to verify component loaders and asset managers cache correctly, preventing performance leaks.
npm run testCreated by Ron Bodnar
- LinkedIn: https://linkedin.com/in/ronbodnar
- Email: ron.bodnar@outlook.com
This project is an open-source tribute to desktop environments. It utilizes several high-quality asset libraries:
- Mint-Y Icons: Linux Mint Team (GPL)
- Adwaita Icons: GNOME Project (LGPL/CC-BY-SA)
- Material Symbols: Google Fonts (Apache 2.0)
- Tech Icons: techicons.dev
- Backgrounds: Collected from various open-source community sources.
- Note: If you are the creator of an asset used here and would like specific attribution or removal, please open an issue.
This software is licensed under GPL-3.0. This ensures the project remains free and open-source, respecting the licenses of the bundled Linux-based assets.
