A modern, responsive portfolio website built with React, TypeScript, and Tailwind CSS to showcase my projects, skills, and experience. The site focuses on clean UI, performance, and accessibility.
- ⚛️ Built with React 19 + TypeScript
- 🎨 Styled using Tailwind CSS v4 (CSS-first config, no
tailwind.config.js) - 📱 Fully responsive design
- ⚡ Fast build & dev environment using Vite
- 🧩 Reusable and well-structured components
- 🌙 Dark/light theme with no flash on first paint
- 📬 Contact form wired to EmailJS
- 🔍 SEO-friendly metadata
- Frontend: React 19, TypeScript, React Router
- Styling: Tailwind CSS v4, shadcn/ui, lucide-react
- Build Tool: Vite
- Linting: ESLint
- Deployment: GitHub Pages (custom domain via
public/CNAME)
src/
├── assets/ # Images, icons, logos
├── components/ui/ # shadcn/ui primitives (button, card, sonner)
├── custom_components/ # Page sections (hero, about, skills, projects, …)
├── lib/ # Shared helpers (cn)
├── pages/ # Page-level components (home, notFound)
├── types/ # Shared TypeScript interfaces
├── index.css # Tailwind theme tokens, animations, utilities
├── App.tsx # Root component / routes
├── main.tsx # Entry pointStatic assets (skill icons, project images, resume, CNAME) live in public/.
Make sure you have the following installed:
- Node.js (v18 or later recommended)
- npm or yarn
# Clone the repository
git clone https://github.com/sachinspeaks/Portfolio.git
# Navigate to the project folder
cd Portfolio
# Install dependencies
npm installnpm run devThe app will start on:
http://localhost:5173
npm run buildPreview the production build:
npm run previewDeployed to GitHub Pages on the custom domain in public/CNAME:
npm run deploy # runs the build, then publishes dist/ via gh-pagesBecause the site is served from the domain root, base is "/" in
vite.config.ts. If you fork this and deploy to user.github.io/<repo>/
instead, change base to "/<repo>/" and remove public/CNAME.
The contact form uses EmailJS. Create a .env in
the project root:
VITE_EMAILJS_SERVICE_ID=your_service_id
VITE_EMAILJS_TEMPLATE_ID=your_template_id
VITE_EMAILJS_PUBLIC_KEY=your_public_keyThe form posts three fields — name, email, and message — so the EmailJS
template must reference {{name}}, {{email}} and {{message}}.
⚠️ Do not commit.envfiles to GitHub. Note thatVITE_-prefixed values are embedded in the client bundle and are therefore public; the EmailJS public key is designed for this, but keep quotas and allowed origins configured in the EmailJS dashboard.
- Add dark mode
- Improve animations
- Add blog section
- Enhance accessibility
This project is open source and available under the MIT License.
Sachin
- Portfolio: https://geekysachin.com
- GitHub: https://github.com/sachinspeaks
- LinkedIn: https://www.linkedin.com/in/sachinnsut/
⭐ If you like this project, consider giving it a star!
