You are browsing as a guest. Sign up (or log in) to start making projects!

ZtionixOS

  • 7 Devlogs
  • 8 Total hours

This is my very own OS that can be run in the web!

Ship #3

What I made

ZtionixOS — a browser fake desktop (boot → login → windows, dock, VFS). Devlog #7 adds a real file lifecycle: drop files on the desktop, get typed icons, double-click opens the right app. ROMs/audio/text route to Z-Retro, ZMusic, Editor, etc. Singleton apps swap files in one window (no duplicate WASM).

Also: Z-Retro (NES/GB/GBA/NDS) with save/load states, save-game thumbnails, close prompt only while playing. Alt+Q window switcher. Glass theme (macOS vibrancy). Font scale 75–150%. Terminal zfetch. Snap layouts on window drag.

What was hard

Getting file open to feel like an OS — singleton re-init, drop-at-cursor icons, unknown-file fallback. Z-Retro save screenshots had to be captured before state serialize (otherwise black thumbs). Glass theme: frosted chrome vs readable inputs/emulator canvas. Font scale broke because html { font-size: 1rem } overwrote the root scale.

What I’m proud of

Desktop → VFS → app feels connected. Z-Retro library with save-state covers. Glass looks premium without killing readability. Still 100% client-side, no backend.

How to test

  1. Live demo — Enter on login
  2. Drop a .gba or .mp3 on the desktop → icon appears → double-click opens Z-Retro / ZMusic
  3. Z-Retro: play a ROM → Save → back to library → thumbnail should match your save
  4. Settings → Glass theme + wallpaper; Appearance → font scale
  5. Alt+Q with several windows open → release Alt to switch
  6. Terminal: zfetch

~25% AI-assisted (CSS, integration, polish). Core OS/VFS/window manager mostly hand-written.

  • 1 devlog
  • 2h
Try project → See source code →
Open comments for this post

2h 24m 49s logged

Devlog #7 — File lifecycle, Z-Retro polish, Glass vibrancy, and shell QoL

This stretch was about making Ztionix feel like one system instead of a pile of separate apps. Files on the desktop should do something, windows should feel premium, and Z-Retro should behave like a real emulator shelf — not a demo page with a canvas in it.

File lifecycle (the big one)

Desktop drag-and-drop was already importing into the VFS, but it felt disconnected: files appeared in generic slots, icons didn’t match types, and opening a ROM while Z-Retro was already running did nothing useful.

So I built a proper file lifecycle:

  • fileTypeHandlers.ts — one place for extension → app routing (Editor, ZMusic, Z-Retro, Paint, Video, etc.)
  • Unknown files — notification + “Open in Editor?” instead of silently failing or guessing wrong
  • Desktop drop polish — icons spawn under the cursor, not the next grid slot
  • Desktop icons — show the target app’s icon (music note, retro pad, editor pen…) instead of generic file glyphs
  • Singleton reopen — ZMusic and Z-Retro don’t spawn a second WASM instance; they call init({ path }) and swap the track/ROM in the existing window

Double-click on the desktop, double-click in Files, and open in Terminal all go through the same path now.

Alt+Q window switcher

Browser Alt+Tab is useless here, and the old instant-cycle felt cheap. Alt+Q opens a centered switcher: tap Q again to cycle, release Alt to focus. Flat dark UI, no glass blur — matches Minimal more than the new Glass theme.

Z-Retro upgrades

Z-Retro got a lot of love:

  • Save / Load toolbar buttons (VFS save states under ROMs/saves/)
  • Close prompt when a game is running — Save & Close, Just Close, or No; no prompt on the library screen
  • Library thumbnails — screenshot captured at save time (while the frame is live, before state serialization); card shows the save-game shot, not a black auto-grab
  • Controls button fix — opens the real control menu, not Restart

Themes & appearance

  • Glass theme overhaul — macOS-style vibrancy: blur(40px) saturate(150%), edge-lit borders, deep layered shadows, frosted chrome vs solid inputs/emulator canvas
  • Minimal + custom wallpaper — presets stay pure black; custom upload/URL works on Minimal too
  • Font scale — Settings slider 75–150% via root --font-scale and rem-based typography (fixed the bug where html { font-size: 1rem } was stomping the scale)

Terminal

  • zfetch / neofetch — system info panel with Ztionix branding
  • Selectable output, Ctrl+C copies selection

Bug fixes worth naming

  • Window drag release glitch (transform commit before removing .dragging)
  • Glass/minimal theme edge cases
  • Font scale actually applying globally after the root CSS fix
0
0
21
Ship #2

Fake desktop OS in the browser — boot, login, windows, dock, IndexedDB filesystem, and a pile of apps (Files, Terminal, Paint, ZMusic, ZVideo, Writer/Calc/Impress, Browser, Doom, Photo Booth, Task Manager, etc.). No React; apps return DOM and plug into a kernel.

Proud of: WebOS2 wave — real Doom (WASM + WAD sound lumps), office-ish apps without fake LibreOffice bookmarks, customizable dock (pin / unpin / drag reorder), and it still feels like my OS after the polish pass (VT323, rust accent, square chrome).

Hard: Doom’s WASM has no audio API, so SFX come from extracted doom1.wad samples on fire/use/menu — not full engine sound. Big media can hit IndexedDB quota. Real LibreOffice can’t run client-side; Writer/Calc/Impress are thin stand-ins.

Try it: https://ztionix-os.vercel.app/ — boot, hit Enter (no password). Ctrl+K for launcher. Drag dock icons to reorder. Open Doom and click the canvas once for sound. Import a video into ZVideo or snap a Photo Booth pic into /home/user/Photos.

  • 2 devlogs
  • 2h
  • 14.70x multiplier
  • 28 Stardust
  • WebOS 2
Try project → See source code →
Open comments for this post

1h 4m 6s logged

Devlog #6 — WebOS2

Devlog #5 was polish and honesty. This one is the opposite problem: the OS felt finished as a demo, not as a place you hang out. So WebOS2 = more apps, denser desktop energy, still client-side, still no React.

Why another wave

After the polish pass, ZtionixOS looked like itself — but the app list was still “Files, Terminal, Paint, music, a snake.” Fine for a fake OS trailer. Not enough if someone actually sits in it for twenty minutes.

I wanted media that isn’t only audio, something office-shaped, a real game, a Task Manager so End Task feels like an OS bit, and a dock you can rearrange instead of hardcoding pinned: true on every new toy.

Also briefly considered Spotify / Jamendo in ZMusic. Spotify needs Premium + their SDK for full tracks. Jamendo’s public test client id is suspended. Dropped both. Local VFS imports stay.

New apps

ZVideo — same idea as ZMusic: import into the VFS, sidebar library, <video controls>. Double-click .mp4 / .webm routes here.

Writer / Calc / Impress — people ask for LibreOffice. Full LibreOffice does not run in a browser without a remote server. I’m not shipping Collabora. So three thin ZtionixOS apps that cover the same jobs: rich text → .html (plus Export .txt), spreadsheet with a formula bar (=SUM(A1:A5), AVERAGE/MIN/MAX/COUNT, =A1+B2), slides with a Present button → .json. Inspired by the LibreOffice suite, not a fake bookmark to libreoffice.org.

Task Manager — open windows as “processes,” fake CPU jitter that wobbles every second, End Task hits windowManager.close. Double-click focuses. Pure OS parody, actually useful when something’s stuck.

Doom — the real shareware game via doom.wasm (jacobenget, GPL-2), canvas blit + keyboard when focused. The WASM has zero audio imports. First pass: synth beeps. Then extracted doom1.wad out of the same binary and play classic lumps (DSPISTOL, DSITMBK, DSSWTCHN…) on fire / use / menu through Web Audio. Mute button in the window. Still not full engine-synced audio (monsters won’t scream from the WASM), but the samples are the real ones. License note under public/doom/.

Photo Booth — webcam, a few filters, countdown snap, mirrored PNG into /home/user/Photos. Tracks stop on window close so the camera LED dies like a grown-up app.

Scientific Calculator — same Calculator app, Scientific toggle: sin/cos/tan (+ inverses), ln/log, √, xʸ, π, e, factorial, DEG/RAD. 67 secret still works.

Dock that isn’t frozen

Pins live in localStorage (ztionixos-dock-pins). Settings → Dock has checkboxes. Right-click a dock icon → pin/unpin. Drag pinned icons to reorder. Running apps that aren’t pinned still show temporarily so you don’t lose the window. Default pin set is curated on purpose — if every new app marks itself pinned the dock becomes a junk drawer.

How it still plugs in

Same kernel pattern as day one: AppManifest, launch() returns DOM, register in kernel.ts, file opens through getAppForPath. No React. Cursor helped move faster on the new apps and the WAD sound glue; I still review and edit everything so it doesn’t read like a template dump.

Honest limits

  • Big videos / audio can hit IndexedDB quota (same as ZMusic always could).
  • Office apps are intentionally thin — not ODF, not Collabora.
  • Doom SFX are real WAD samples on player actions, not full Chocolate Doom audio.
  • Live Vercel won’t show WebOS2 until redeploy.

npm run build and npm test still pass.

What’s next (maybe)

Nothing locked. If I touch it again it’ll probably be small: more Calc formulas, or accepting that Doom sound will never be 1:1 without a different engine.

(photobooth works its just i dont wanna show my face)

0
0
6
Open comments for this post

51m 48s logged

Devlog #5 — polish pass, secrets, and being honest about AI

Got feedback that ZtionixOS wasn’t ready to vote yet. Fair. It still looked a bit too “AI desktop template” and the README felt copy-pasted. So this session was mostly cleanup and personality, not new architecture.

Making it feel less generated

Big CSS pass: dusty blue-gray palette, rust accent, VT323 font, square windows with — □ × controls. Removed Tailwind entirely. Added a dumb comment at the top of dark.css because I genuinely spent too long on colors. Left one Monster joke in there, trimmed the rest.

Went through shell/core files and made the code messier on purpose — for loops instead of .filter(), string concat mixed with templates, nested ifs. Added a few normal comments and a few funny ones.

README rewrite in my own voice, real screenshot (docs/screenshot.png), live demo link fixed to ztionix-os.vercel.app. Removed the chat app for good Redis on Vercel, felt bolted on, everything else is client-side now.

Secrets and dumb stuff

Stuff that was already in but got touched this session:

  • Konami code → party mode (rainbow shell + yellow countdown badge)
  • Triple-click logo → CRT scanlines
  • Ctrl+Shift+S → Snake
  • Terminal secret party / secret pet / snake mention
  • Desktop pet default off now (opt-in via terminal or right-click)

New one: type 67 in Calculator → plays 67.mp3, popup with the Bosnov gif. Tried embedding KLIPY in an iframe first. Zen said no X-Frame-Options. Switched to a local gif in public/gifs/ with a link to open KLIPY in a new tab. Sound works, meme works, no fighting Cloudflare.

Bugs fixed along the way

  • Browser iframe was blank because homepage CSS was covering it — fixed stacking with browser-view--hidden
  • Notes text was unreadable (light on gray) — fixed editor contrast
  • Window drag uses translate3d during move, commits position on mouseup — way smoother

npm run build and npm test still pass.

AI disclosure

Added an AI usage section to the README. Not gonna pretend this was 100% hand-typed Cursor helped on CSS, drag refactor, debugging. Core kernel, VFS, window manager, and most apps are mine. Rough guess ~25% AI-assisted by lines, mostly styling and extras. Reviewers can check git/WakaTime if they want.

0
0
3
Open comments for this post

50m 56s logged

Devlog #4 — Custom wallpapers and fixing light mode

polishing stuff before i submit. two things that were bugging me on the live build.

Custom wallpapers

got tired of only having the 5 preset gradients. added a full custom option in Settings → Desktop:

  • paste an image URL and hit apply
  • upload from your device (jpg, png, webp, gif)
  • gif wallpapers actually animate on the desktop and login screen which is kinda sick
  • custom card in the grid so you can switch back to it after picking a preset
  • remove custom button if you want to clear it

uploads cap at 3mb so localStorage doesnt explode. urls have to be http:// or https://.

Light mode was broken

switched to light theme and the top bar went white but the desktop stayed dark?? icon labels were basically invisible — dark text on a dark wallpaper.

fixed it properly:

  • light versions of every preset wallpaper (slate, dusk, fog, ember, void)
  • desktop icon text readable again
  • login/lock screen matches light theme now
  • dock tiles get pastel colors in light mode
  • noise overlay toned down so it doesnt look muddy

custom uploaded wallpapers still show your image in both themes. only the fallback behind them changes.

also updated the readme

cleaned up the feature list so it actually reflects everything — messages, zmusic, indexeddb vfs, custom wallpapers

pretty much ready to ship. live at https://ztionix-os.vercel.app/ — click enter, no password.

— ander / Ander507

0
0
2
Open comments for this post

35m 36s logged

Devlog #3 — 30 min of app polish

ok so i had like half an hour and instead of doing something smart i went through the apps that looked kinda rough in screenshots lol

Browser

it was opening hacker news on launch which felt weird. ripped that out. now it just shows a blank “ztionix browser” home screen until you actually type a url. added a home button too so you can get back without refreshing the whole window.

Calculator

small thing but it was bugging me. the 0 button text was sitting on the left side of the button and the display felt cramped. threw some padding on the grid and centered everything with flex. operators get a little gold highlight on hover now so it matches the rest of the os.

Music → ZMusic

renamed it and rebuilt the layout. sidebar for playlists (library + downloads), track list in the middle, player bar stuck to the bottom. volume slider lives in the bar now instead of floating in the middle of the screen. imported tracks dedupe so you dont get rick ross twice unless you really want that.

Paint

the eraser was leaving these ugly gray trails because it was using destination-out instead of just painting the actual canvas color (#1a1a1e). fixed that. also added rect/circle tools and made the brush size slider actually show the px value. feels way more usable now.

still need to get this hosted somewhere public but the apps themselves feel way less janky now. login is still just click enter, no password — so once its live anyone can hop straight in.

next up probably deployment + maybe terminal stuff. but honestly the os is in a good spot for submission now.

— ander

0
0
1

Delete project?

Are you sure you want to permanently delete this project? This action cannot be undone.

All devlogs, followers, and associated data will be removed.

Followers

Loading…