This is my interactive portfolio built with React + Vite and styled to feel like a mini desktop OS.
Instead of a typical one-page scroll site, everything opens like apps/windows:
- a boot screen before the desktop loads
- a top navbar with live clock
- a dock with hover physics + tooltips
- draggable windows with close / minimize / maximize
- Finder-style project explorer
- Photos, Projects, Tech Stack, Contact panels
- a genie minimize/unminimize animation into the dock
The whole idea was to make the portfolio feel playful while still keeping content easy to find.
- React 19
- Vite 7
- Tailwind CSS v4
- Zustand + Immer (window and location state)
- GSAP + @gsap/react + Draggable
- Lucide React (icons)
- dayjs (live time)
- react-tooltip
npm install
npm run devvThen open the local URL shown by Vite.
npm run build
npm run preview
npm run lintntsrc/App.jsxmounts the desktop scene and all window components.src/components/Boot.jsxruns an initial boot progress sequence and fades out.src/components/Welcome.jsxrenders the center intro headline with interactive variable-font hover behavior.
src/store/window.jsmanages open/minimize/maximize/z-index state for each window.src/hoc/WindowWrapper.jsxwraps every app window with shared behavior:- open animation
- drag-to-move
- maximize/restore geometry handling
- z-index focus management
- genie-in animation when restoring from dock
src/components/WindowControls.jsxhandles close/minimize/maximize actions.
src/components/Dock.jsxrenders app icons from constants.- Hover uses distance-based GSAP scaling and lift.
- Clicking an icon toggles that window:
- closed -> openpen
- open -> closeose
- minimized -> unminimizeize
src/constants/index.jsis the main content source (projects, social links, gallery, Finder tree).locationsdefines folder/file-style data used by Finder.src/store/location.jstracks the currently selected Finder location.src/windows/Finder.jsxopens folder/file items:- folder -> navigate in Finderder
urlfile -> opens external link in new tabtabtxt/imgfile -> opens dedicated content windowdow
src/windows/Projects.jsxrecent work cardssrc/windows/Terminal.jsxtech stack panelsrc/windows/Photos.jsxgallery + image preview opener + SIDEBAR DOESN'T WORK (YET)src/windows/Contact.jsxsocial/contact linkssrc/windows/Text.jsxtext content viewersrc/windows/Image.jsximage preview viewer
Most content updates happen in one place:
src/constants/index.js
Edit these collections to customize quickly:
recentWorks-> project cards in Projects windowdowtechStack-> categories + technologies in Terminal windowdowsocials-> Contact linksnksgallery-> Photos window gridridlocations-> Finder folder/file structure and file payloadsads
- Global UI/theme/layout lives in
src/index.css. - Tailwind v4 utilities are mixed with custom component selectors.
- The desktop wallpaper and app icons are loaded from
public/imagesandpublic/icons. - Custom keyframes
genie-outandgenie-indrive the dock minimize effect.
- This portfolio is intentionally desktop/tablet-first.
- Mobile users are shown a small notice in the welcome section.
- If you add a new dock app, also add matching window state in
WINDOW_CONFIG. - Keep
idvalues in constants stable to avoid React key mismatches. - If drag feels off after layout changes, check absolute positioning styles in
src/index.cssand the maximize/restore logic inWindowWrapper.
I wanted a portfolio that feels like an experience, not just a resume page.
If you're exploring this code, feel free to remix the window system for your own projects.