Added a dual-path recommender: vibe prompt / genres go through Gemini, and “like this title” goes through TMDB similar — then both get posters + region watch providers.
The painful part wasn’t the AI. It was Gemini’s JSON. Trailing commas, curly quotes, markdown fences mid-object. Spent a chunk writing a repair/parse loop and bumping maxOutputTokens to 3072 after it kept truncating mid-array.
Also shipped songs mode (Gemini → iTunes covers/listen links) and a local catalog fallback so the app still picks something when keys die. UI has two themes now (minimal / desktop)
Date: 19 Jul 2026
Project: Ander507 personal site
Stack: HTML + CSS + a little JS (no frameworks)
Today I started the Stardance personal-site challenge. Goal was simple on paper: public site, at least 3 sections, custom CSS, README with AI notes, and something that doesn’t look like every other dark portfolio on the internet.
about.txt, projects/ (OmniTab + ZtionixOS).C:\Users\Ander507\.First pass was dark + amber + glow + drifting grid. Looked AI. Scrapped it.
Tried making the hero full-viewport so nav could scroll. User feedback: no scrolling. Reverted to a compact one-screen layout. Nav just highlights the matching window instead.
Cursor helped with scaffolding and a first design pass. I pushed back hard on the look, removed Contact. Concept, copy, and “make it feel like a fake desktop” are mine.
Date: July 2026
Project: OmniTab — custom new-tab command center
AI disclosure: under 25%. Cursor helped scaffold Vite/Tailwind and wire the Gemini proxy / key rotation. Omni-Bar mode detection, typo redirects, setup wizard, layout prefs, engines, news RSS, calc/easter eggs, and most of the UI/CSS I wrote or heavily edited. No website builder, no “generate whole app” dump.
A new tab that isn’t just bookmarks + a clock. One input that can:
/ask, /explain, /fix, /translate)/calc, /weather, /rickroll, /67)Plus the ambient junk I actually look at when I open a tab: weather, focus list, headlines, a quote.
Core
@google cats one-shotsAmbient / widgets
Pain points that ate time
gemini-2.0-flash returned limit: 0 even with valid keys. Fixed by listing models + rotating keys the same way as my old Python tester.Vite · React · TypeScript · Tailwind · Gemini (serverless /api/gemini) · Open-Meteo · BBC RSS
Prefs live in localStorage. No accounts.
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.
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.
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.
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.
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.
npm run build and npm test still pass.
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)
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.
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.
Stuff that was already in but got touched this session:
secret party / secret pet / snake mentionNew 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.
browser-view--hidden
translate3d during move, commits position on mouseup — way smoothernpm run build and npm test still pass.
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.
polishing stuff before i submit. two things that were bugging me on the live build.
got tired of only having the 5 preset gradients. added a full custom option in Settings → Desktop:
uploads cap at 3mb so localStorage doesnt explode. urls have to be http:// or https://.
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:
custom uploaded wallpapers still show your image in both themes. only the fallback behind them changes.
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
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
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.
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.
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.
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
Polished the UI
My custom WebOS called ZtionixOS