macOS-style developer portfolio built with React, TypeScript and Vite.
This project mimics a macOS desktop: a dock, draggable windows (Finder, Terminal, Safari, Photos, Resume, Text, Contact, etc.), and various apps that showcase my projects, experience and contact information.
- macOS-inspired UI: Dock, top bar, window controls, wallpaper-style background.
- Multiple “apps”: Finder/projects, Photos, Resume (PDF viewer), Terminal, Text, Contact and more.
- Smooth animations: Powered by GSAP and
@gsap/react. - State management: Window positions, visibility and navigation handled via Zustand stores.
- Responsive layout: Works on modern desktop browsers, with basic support for smaller screens.
- Frontend: React 19, TypeScript
- Bundler/Dev server: Vite
- Styling: Tailwind CSS
- Animations: GSAP, @gsap/react
- State Management: Zustand, Immer
- Icons & UI: lucide-react + custom SVG icons
- PDF rendering: react-pdf
- Node.js: v18+ (LTS recommended)
- npm: v9+ (comes with Node)
npm installnpm run devThen open the printed local URL in your browser (usually http://localhost:5173).
npm run buildThis outputs a production build to the dist folder.
npm run previewnpm run dev: Start Vite dev server with HMR.npm run build: Type-check viatsc -band build with Vite.npm run preview: Preview the production build locally.npm run lint: Run ESLint over the project.
src/App.tsx: Root macOS desktop layout and window orchestration.src/components: Dock, navbar, welcome screen, window controls, shared UI.src/windows: Individual “apps” (Finder, Terminal, Photos, Resume, Safari, Contact, etc.).src/store: Zustand stores for location/navigation and window state.src/constants: Data for projects, links and other content rendered in the UI.src/hoc: Higher-order components such as the window wrapper.public: Static assets such as icons, wallpapers andresume.pdf.- Root config:
vite.config.ts,tsconfig*.json,eslint.config.js,index.html.
macos-portfolio/
├─ public/
│ ├─ files/
│ ├─ icons/
│ └─ images/
├─ src/
│ ├─ components/
│ ├─ constants/
│ ├─ hoc/
│ ├─ store/
│ ├─ windows/
│ ├─ App.tsx
│ ├─ main.tsx
│ └─ index.css
├─ package.json
├─ vite.config.ts
└─ tsconfig*.json
- Change resume: Replace
public/files/resume.pdfwith your own file (keep the same name or adjust the Resume window component). - Update projects & content: Edit entries in
src/constantsand the relevant window components undersrc/windows. - Branding & theme: Swap wallpapers and icons in
public/imagesandpublic/icons, and adjust global styles insrc/index.css.
I’m happy for you to explore or extend this project:
- Fork the repository.
- Create a feature branch for your idea or fix.
- Run
npm run lintandnpm run buildto make sure everything passes. - Open a pull request describing what you changed and why.
This project is for personal portfolio use. You can adapt it for your own portfolio; please keep or add appropriate attribution if you share it publicly.