A beveled desktop environment that actually works — built entirely with Dear ImGui's DrawList API. One binary, two moods: silver Windows 95 and dark NeXT Night, switchable at runtime.
Beveled chrome, a real file manager over your actual filesystem, and an MS-DOS Prompt running a live shell (your zsh) through a pty — every bevel, caption bar, scrollbar and icon drawn by hand, pixel by pixel. No stock ImGui styling, no image assets, no web views.
BevelDesk borrows from the two great beveled desktops — Win95 and NeXTSTEP —
which share one visual philosophy (3D edges, light from the top-left, per-window
chrome). So the dark NeXT Night mode isn't a reskin engine; it's a second
Palette + Style the same drawing code reads. Flip it in Display Properties ▸
Appearance and the whole desktop — chrome, dialogs, taskbar, icons — repaints
live. It's BevelDesk's own dark design language, not a NeXTSTEP replica.
| Windows 95 | NeXT Night |
|---|---|
![]() | ![]() |
#C0C0C0 chrome, #000080
captions, #008080 desktop), the four 3D bevel conventions (raised,
pressed, sunken field, window frame — each with its distinct edge-color
order), 18px captions, 16×14 caption buttons, procedurally drawn icons.$SHELL) on a POSIX pty
in an authentic fixed 80×25 terminal: VT100/xterm-subset emulation,
16-color SGR (with 256-color mapping), OSC window titles, scrollback,
Ctrl+C that actually interrupts. The window closes when the shell exits —
just like 1995, except this one runs zsh. (macOS/Linux)+ / - / 0 on a US
keyboard) scales the whole desktop through 1×–3×, with fonts re-rasterized
at each level so text stays crisp (no bitmap blur). Handy on 4K/5K displays.Palette (colors) and a small Style (chiseled vs. Win95
bevel). A third mood would be additive — fill one more Palette.--night.Prebuilt binaries for every release are on the Releases page:
BevelDesk.app. Unsigned:
right-click ▸ Open on first launch, or
xattr -d com.apple.quarantine BevelDesk.app.Requirements: CMake ≥ 3.16, a C++17 compiler, network on first configure (dependencies fetched via FetchContent: GLFW 3.4, Dear ImGui 1.92.8, stb).
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
./build/beveldesk # or double-click "build/BevelDesk.app"
sudo apt install build-essential cmake libgl1-mesa-dev xorg-dev
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
./build/beveldesk
cmake -S . -B build
cmake --build build --config Release
build\Release\beveldesk.exe
(The MS-DOS Prompt is POSIX-only for now — a ConPTY port is a welcome PR.)
| Command | Effect |
|---|---|
./build/beveldesk | normal 1024×768 window (--windowed WxH picks another size) |
./build/beveldesk --fullscreen | total immersion — no host chrome; exit via Start ▸ Shut Down… or Cmd/Ctrl+Q |
./build/beveldesk --borderless | square-cornered undecorated window; drag it by the taskbar's empty area, Cmd+M minimizes |
./build/beveldesk --night | boot straight into the dark NeXT Night scheme (toggle live in Display Properties ▸ Appearance) |
./build/beveldesk --zoom 1.5 | start at a UI zoom level (also Ctrl/Cmd +/-/0 at runtime) |
./build/beveldesk --screenshot [out.png] | headless QA: renders 10 frames, writes a PNG, exits |
…--screenshot s.png --demo start|max|nav|icons|shutdown|dos|sysmenu|appearance | screenshot specific UI states (dos runs a live shell for ~1.4 s first; appearance opens the scheme picker) |
Double-click My Computer to browse /, Recycle Bin for ~/.Trash.
Start ▸ MS-DOS Prompt opens a shell. Inside Explorer: double-click folders
to navigate, click column headers to sort, toolbar buttons switch view modes.
src/
main.cpp entry point: GLFW/ImGui boot, main loop, CLI flags
app/ the model — AppState, windows, terminal emulator (no drawing)
theme95/ the beveled visual language (reusable, app-agnostic)
palette.* Palette + Style schemes (Silver / NeXT Night), live
color globals, ApplyScheme(); metrics
bevel.* the four 3D edge conventions (+ chiseled variant) + dither
widgets.* Button, Radio, ToolButton, CaptionButton, ScrollBarV
window.* window chrome, system menu, dialogs
style.* icons95.* global ImGui style; procedural icons
shell/ the desktop environment, one component per surface
desktop.* taskbar.* explorer.* dosprompt.* shutdown.* displayprops.*
platform/ OS glue: fonts, pty (forkpty), GL textures, screenshots
Adding a mood is additive: fill one more Palette (16-odd colors) plus a
Style flag or two and add it to the Appearance list — every draw call reads
the live t95:: color globals unchanged, so nothing else moves. A new program
(Notepad, Minesweeper…) is one new shell/ component drawing inside
t95::BeginWindow95.
The live demo is the same code
compiled with Emscripten (web/ holds the HTML shell, bundled DejaVu fonts,
and a small mock filesystem for Explorer to browse). To build it locally:
source /path/to/emsdk/emsdk_env.sh
emcmake cmake -S . -B build-web -DCMAKE_BUILD_TYPE=Release
cmake --build build-web -j
python3 -m http.server -d build-web 8000 # then open http://localhost:8000/index.html
The MS-DOS Prompt is native-only (the browser has no pty/forkpty); on the
web it simply doesn't open. Everything else — Explorer, dialogs, zoom, the
Start menu — runs in the browser.
CONTRIBUTING.md — the contributor's field guide:
architecture seams, Win95 authenticity rules, the build/verify loop, and the
Dear ImGui gotchas that each cost a debugging round (read this first)PLAN.md — the Win95 visual-language research (palette, bevels, metrics, Explorer anatomy)DECISIONS.md — every ambiguity resolved, numbered, with reasoningCRITIQUE.md — the compile → screenshot → inspect → fix iterations, including the bugs only play-testing foundSTATUS.md — what works, known limitations, roadmapWindows and Windows 95 are trademarks of Microsoft Corporation. BevelDesk is
an independent homage that reproduces the style of the era for educational
and nostalgic purposes; it ships no Microsoft assets, fonts, or code. Fonts
are probed from your operating system at runtime. Menus deliberately cast no
drop shadow (that's Windows 3.1 / Windows 2000 — see DECISIONS.md #13b).
43 commits
C++
93.9%
CMake
2.2%
C
2.0%
HTML
1.9%
A beveled desktop environment that actually works — built entirely with Dear ImGui's DrawList API. One binary, two moods: silver Windows 95 and dark NeXT Night, switchable at runtime.
Beveled chrome, a real file manager over your actual filesystem, and an MS-DOS Prompt running a live shell (your zsh) through a pty — every bevel, caption bar, scrollbar and icon drawn by hand, pixel by pixel. No stock ImGui styling, no image assets, no web views.
BevelDesk borrows from the two great beveled desktops — Win95 and NeXTSTEP —
which share one visual philosophy (3D edges, light from the top-left, per-window
chrome). So the dark NeXT Night mode isn't a reskin engine; it's a second
Palette + Style the same drawing code reads. Flip it in Display Properties ▸
Appearance and the whole desktop — chrome, dialogs, taskbar, icons — repaints
live. It's BevelDesk's own dark design language, not a NeXTSTEP replica.
| Windows 95 | NeXT Night |
|---|---|
![]() | ![]() |
#C0C0C0 chrome, #000080
captions, #008080 desktop), the four 3D bevel conventions (raised,
pressed, sunken field, window frame — each with its distinct edge-color
order), 18px captions, 16×14 caption buttons, procedurally drawn icons.$SHELL) on a POSIX pty
in an authentic fixed 80×25 terminal: VT100/xterm-subset emulation,
16-color SGR (with 256-color mapping), OSC window titles, scrollback,
Ctrl+C that actually interrupts. The window closes when the shell exits —
just like 1995, except this one runs zsh. (macOS/Linux)+ / - / 0 on a US
keyboard) scales the whole desktop through 1×–3×, with fonts re-rasterized
at each level so text stays crisp (no bitmap blur). Handy on 4K/5K displays.Palette (colors) and a small Style (chiseled vs. Win95
bevel). A third mood would be additive — fill one more Palette.--night.Prebuilt binaries for every release are on the Releases page:
BevelDesk.app. Unsigned:
right-click ▸ Open on first launch, or
xattr -d com.apple.quarantine BevelDesk.app.Requirements: CMake ≥ 3.16, a C++17 compiler, network on first configure (dependencies fetched via FetchContent: GLFW 3.4, Dear ImGui 1.92.8, stb).
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
./build/beveldesk # or double-click "build/BevelDesk.app"
sudo apt install build-essential cmake libgl1-mesa-dev xorg-dev
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
./build/beveldesk
cmake -S . -B build
cmake --build build --config Release
build\Release\beveldesk.exe
(The MS-DOS Prompt is POSIX-only for now — a ConPTY port is a welcome PR.)
| Command | Effect |
|---|---|
./build/beveldesk | normal 1024×768 window (--windowed WxH picks another size) |
./build/beveldesk --fullscreen | total immersion — no host chrome; exit via Start ▸ Shut Down… or Cmd/Ctrl+Q |
./build/beveldesk --borderless | square-cornered undecorated window; drag it by the taskbar's empty area, Cmd+M minimizes |
./build/beveldesk --night | boot straight into the dark NeXT Night scheme (toggle live in Display Properties ▸ Appearance) |
./build/beveldesk --zoom 1.5 | start at a UI zoom level (also Ctrl/Cmd +/-/0 at runtime) |
./build/beveldesk --screenshot [out.png] | headless QA: renders 10 frames, writes a PNG, exits |
…--screenshot s.png --demo start|max|nav|icons|shutdown|dos|sysmenu|appearance | screenshot specific UI states (dos runs a live shell for ~1.4 s first; appearance opens the scheme picker) |
Double-click My Computer to browse /, Recycle Bin for ~/.Trash.
Start ▸ MS-DOS Prompt opens a shell. Inside Explorer: double-click folders
to navigate, click column headers to sort, toolbar buttons switch view modes.
src/
main.cpp entry point: GLFW/ImGui boot, main loop, CLI flags
app/ the model — AppState, windows, terminal emulator (no drawing)
theme95/ the beveled visual language (reusable, app-agnostic)
palette.* Palette + Style schemes (Silver / NeXT Night), live
color globals, ApplyScheme(); metrics
bevel.* the four 3D edge conventions (+ chiseled variant) + dither
widgets.* Button, Radio, ToolButton, CaptionButton, ScrollBarV
window.* window chrome, system menu, dialogs
style.* icons95.* global ImGui style; procedural icons
shell/ the desktop environment, one component per surface
desktop.* taskbar.* explorer.* dosprompt.* shutdown.* displayprops.*
platform/ OS glue: fonts, pty (forkpty), GL textures, screenshots
Adding a mood is additive: fill one more Palette (16-odd colors) plus a
Style flag or two and add it to the Appearance list — every draw call reads
the live t95:: color globals unchanged, so nothing else moves. A new program
(Notepad, Minesweeper…) is one new shell/ component drawing inside
t95::BeginWindow95.
The live demo is the same code
compiled with Emscripten (web/ holds the HTML shell, bundled DejaVu fonts,
and a small mock filesystem for Explorer to browse). To build it locally:
source /path/to/emsdk/emsdk_env.sh
emcmake cmake -S . -B build-web -DCMAKE_BUILD_TYPE=Release
cmake --build build-web -j
python3 -m http.server -d build-web 8000 # then open http://localhost:8000/index.html
The MS-DOS Prompt is native-only (the browser has no pty/forkpty); on the
web it simply doesn't open. Everything else — Explorer, dialogs, zoom, the
Start menu — runs in the browser.
CONTRIBUTING.md — the contributor's field guide:
architecture seams, Win95 authenticity rules, the build/verify loop, and the
Dear ImGui gotchas that each cost a debugging round (read this first)PLAN.md — the Win95 visual-language research (palette, bevels, metrics, Explorer anatomy)DECISIONS.md — every ambiguity resolved, numbered, with reasoningCRITIQUE.md — the compile → screenshot → inspect → fix iterations, including the bugs only play-testing foundSTATUS.md — what works, known limitations, roadmapWindows and Windows 95 are trademarks of Microsoft Corporation. BevelDesk is
an independent homage that reproduces the style of the era for educational
and nostalgic purposes; it ships no Microsoft assets, fonts, or code. Fonts
are probed from your operating system at runtime. Menus deliberately cast no
drop shadow (that's Windows 3.1 / Windows 2000 — see DECISIONS.md #13b).
43 commits
C++
93.9%
CMake
2.2%
C
2.0%
HTML
1.9%