This repository contains the source code for my personal portfolio website.
The site is a static showcase of selected projects, engineering work, and professional background.
If you fork this repository, please provide proper attribution by linking back to isaacgitonga.com.
👉 Live site: isaacgitonga.com
- HTML5
- TypeScript
- Tailwind CSS
- GSAP (animations)
- Vite
- ESBuild
- Vercel
- Vercel Serverless Functions
- Nodemailer (email delivery)
git clone https://github.com/gitongaisaac/portfolio.git
cd portfolio# Install dependencies
npm installAn example environment file is provided.
# An example environment file is provided.
cp .env.example .env.localRequired Environment Variables:
EMAIL_USER=your-username@gmail.com
EMAIL_PASS=your-app-password
VERCEL_OIDC_TOKEN="OIDC-token" # This token is usually auto generated by Vercel in .env.local when you run `vercel env pull`VERCEL_OIDC_TOKEN is usually auto-generated by Vercel in .env.local when you run:
vercel env pullFor more details, see:
Vercel OIDC Token documentation
Google App Passwords documentation
The contact form uses Nodemailer with Google App Passwords for secure email delivery.
npm run devOr, to fully emulate the serverless environment:
vercel devnpm run build.
├── api/ # Serverless functions (Contact form POST api —Nodemailer)
├── public/ # Static assets (images, logos)
├── src/
│ ├── animations/ # GSAP animation logic for all the pages and their sections.
│ ├── assets/
│ │ └── data/ # Project and site data
│ ├── pages/ # Page-specific TypeScript logic
│ │ └── home.ts # TypeScript logic specific to `index.html`
│ │ └── project.ts # TypeScript logic specific to `project.html`
│ ├── main.css # Global styles (Tailwind)
│ ├── main.ts # Main entry point
│ └── types.ts # TypeScript type definitions
├── index.html # Home page
├── project.html # Project detail page template
├── package.json # Dependencies and scripts
├── tsconfig.json # TypeScript configuration
├── vercel.json # Vercel deployment configuration
└── vite.config.ts # Vite configuration
- The animations folder contains all the animations for the portfolio except for the global animations; animations belonging to both the
index.htmlandproject.htmlpages are inmain.ts. - Each section in
index.htmlhas its own animation file insrc/animations.project.htmlhas justsrc/animations/project.tsfile for all its animations. main.tsis the main TypeScript file. Bothindex.htmlandproject.htmlmust first load this file before calling their specific TypeScript files insrc/pages.
This project is licensed under the MIT License.
You are free to explore, reuse, and adapt the code with attribution.