Skip to content
View nolostra's full-sized avatar
🎯
Talk less, code more! πŸ’»πŸ’ͺπŸš€
🎯
Talk less, code more! πŸ’»πŸ’ͺπŸš€

Block or report nolostra

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Maximum 250 characters. Please don't include any personal information such as legal names or email addresses. Markdown supported. This note will be visible to only you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
nolostra/README.md

Personal Portfolio

A minimal, aesthetic portfolio website built with Next.js 14, TypeScript, and Tailwind CSS. Designed with a calm, confident, product-engineer aesthetic.

πŸš€ Features

  • Minimal Design: Clean, content-first layout with neutral colors
  • Modern Tech Stack: Next.js 14 (App Router), TypeScript, Tailwind CSS
  • Subtle Animations: Framer Motion with opacity + translate only (200-350ms)
  • Content First: Grid-based layout emphasizing readability
  • Accessibility: High contrast, keyboard navigable, mobile-first
  • Contact Form: EmailJS integration for seamless email communication
  • Performance: Optimized for speed and performance

πŸ“‹ Prerequisites

  • Node.js 18+ and npm/yarn/pnpm
  • EmailJS account (for contact form) - Sign up here

πŸ› οΈ Setup Instructions

1. Clone and Install

cd personal-portfolio
npm install
# or
yarn install
# or
pnpm install

2. Configure EmailJS

  1. Sign up for a free account at EmailJS
  2. Create an email service (Gmail, Outlook, etc.)
  3. Create an email template
  4. Get your Service ID, Template ID, and Public Key

3. Environment Variables

Create a .env.local file in the root directory:

NEXT_PUBLIC_EMAILJS_SERVICE_ID=your_service_id
NEXT_PUBLIC_EMAILJS_TEMPLATE_ID=your_template_id
NEXT_PUBLIC_EMAILJS_PUBLIC_KEY=your_public_key

4. Customize Content

Update the following files with your personal information:

  • Hero Section: components/sections/Hero.tsx - Update name and title
  • About Section: components/sections/About.tsx - Update bio
  • Experience Section: components/sections/Experience.tsx - Update experience
  • Projects Section: components/sections/Projects.tsx - Add your projects
  • Footer: components/sections/Footer.tsx - Update social links
  • Metadata: app/layout.tsx - Update SEO metadata

5. Run Development Server

npm run dev
# or
yarn dev
# or
pnpm dev

Open http://localhost:3000 in your browser.

🚒 Deployment to Vercel

Option 1: Deploy via Vercel CLI

  1. Install Vercel CLI:
npm i -g vercel
  1. Login to Vercel:
vercel login
  1. Deploy:
vercel
  1. Add environment variables in Vercel dashboard:
    • Go to your project settings
    • Navigate to "Environment Variables"
    • Add the three EmailJS variables

Option 2: Deploy via GitHub

  1. Push your code to GitHub
  2. Go to Vercel
  3. Click "New Project"
  4. Import your GitHub repository
  5. Add environment variables in the project settings
  6. Click "Deploy"

πŸ“ Project Structure

personal-portfolio/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ globals.css          # Global styles
β”‚   β”œβ”€β”€ layout.tsx           # Root layout
β”‚   └── page.tsx             # Home page
β”œβ”€β”€ components/
β”‚   β”œβ”€β”€ animations/          # Animation utilities
β”‚   β”‚   β”œβ”€β”€ ScrollReveal.tsx
β”‚   β”‚   └── variants.ts
β”‚   └── sections/            # Page sections
β”‚       β”œβ”€β”€ Hero.tsx
β”‚       β”œβ”€β”€ About.tsx
β”‚       β”œβ”€β”€ Projects.tsx
β”‚       β”œβ”€β”€ Experience.tsx
β”‚       β”œβ”€β”€ Contact.tsx
β”‚       └── Footer.tsx
β”œβ”€β”€ public/                  # Static assets
β”œβ”€β”€ .env.local              # Environment variables (create this)
β”œβ”€β”€ next.config.js
β”œβ”€β”€ tailwind.config.ts
β”œβ”€β”€ tsconfig.json
└── package.json

🎨 Design Philosophy

This portfolio follows a minimal, product-engineer aesthetic:

  • Neutral Colors: Off-white or near-black backgrounds (respects system dark mode)
  • One Accent Color: Blue (#2563eb) used sparingly
  • No Visual Gimmicks: No gradients, glows, or particles
  • Large Spacing: Generous whitespace for readability
  • Clean Typography: System fonts with proper hierarchy
  • Content First: Grid-based layout emphasizing content
  • Subtle Motion: Animations support readability, never decoration

πŸ”§ Customization

Colors

The portfolio uses CSS variables that automatically adapt to light/dark mode. To customize:

Edit app/globals.css:

:root {
  --color-accent: #2563eb;  /* Change accent color */
  --color-bg: #fafafa;      /* Light mode background */
  --color-text: #171717;    /* Light mode text */
}

@media (prefers-color-scheme: dark) {
  :root {
    --color-bg: #0a0a0a;    /* Dark mode background */
    --color-text: #fafafa;  /* Dark mode text */
  }
}

Animations

Animation variants are defined in components/animations/variants.ts. All animations use:

  • Opacity + translate only
  • Duration: 200-350ms
  • Ease-out timing
  • No spring physics

πŸ”§ Troubleshooting

EmailJS Not Working

  • Verify your environment variables are set correctly
  • Check that your EmailJS service is active
  • Ensure your template has the correct variable names: {{from_name}}, {{from_email}}, {{message}}

Build Errors

  • Clear .next folder: rm -rf .next
  • Reinstall dependencies: rm -rf node_modules && npm install
  • Check TypeScript errors: npm run build

πŸ“ License

This project is open source and available under the MIT License.

πŸ™ Acknowledgments


Built with a focus on clarity, performance, and content.

Pinned Loading

  1. Panora Panora Public

    Forked from panoratech/Panora

    Open-Sourcing the integration engine our platform runs on

    TypeScript

  2. openstatusHQ/openstatus openstatusHQ/openstatus Public

    πŸ«– Status page with uptime monitoring & API monitoring as code πŸ«–

    TypeScript 8.3k 571