Welcome to the official source code for Aarab Nishchal's Developer Portfolio & Dynamic Blog. Built with Next.js 16, React 19, Tailwind CSS v4, Motion, GSAP, and a Notion-powered CMS, this portfolio is designed to be sleek, fast, highly customizable, and expressive.
Whether you're looking for design inspiration, interested in how the Notion CMS integration works under the hood, or want to clone and adapt this template for your own developer journey, this README has everything you need!
- β‘ Modern Next.js 16 & React 19 Architecture: Takes advantage of App Router, Server Components, and optimized client-side hydration.
- π Dynamic Notion CMS for Blogs: Write posts directly in Notion! They get fetched live via the Notion HQ API and converted to clean, high-performance Markdown on your site.
- π§ Nodemailer + React Email Contact System: Receive contact form submissions straight to your inbox with custom-designed HTML emails, input validation, and built-in rate-limiting.
- βοΈ Centralized Configuration (
constant/): Zero back-end code editing required for customization. Easily update your profile, bio, projects, work experience, skills, social links, and SEO from dedicated TypeScript configuration files. - π¨ Interactive Motion & Shaders: Fluid page transitions and visual flair powered by Motion (Framer Motion), GSAP, and Paper Design Shaders.
- π SEO & LLM Ready: Automated OpenGraph tags, dynamic XML sitemap generation, structured metadata, and an
/llms.txtendpoint for AI agents.
| Category | Technology | Description |
|---|---|---|
| Framework | Next.js 16 | App Router, Server Actions, Dynamic Metadata |
| Core Library | React 19 | UI rendering & component architecture |
| Language | TypeScript 5 | Strict type checking and autocompletion |
| Styling | Tailwind CSS v4 | Modern utility-first CSS styling |
| Animations | Motion / GSAP | Fluid layout animations & micro-interactions |
| Shaders | @paper-design/shaders-react | WebGL shader visual effects |
| CMS | @notionhq/client & notion-to-md |
Headless blogging using Notion |
| Email Service | Nodemailer & React Email | Transactional email delivery via Gmail SMTP |
| UI Components | Lucide React & React Icons | Iconography |
| Notifications | Sonner | Toast notification system |
Follow these steps to run the portfolio locally on your machine:
Make sure you have Node.js 18+ installed. You can check with node -v.
git clone https://github.com/aarabii/an.git
cd annpm install
# or
pnpm install
# or
bun installCreate a .env.local file in the root directory:
cp .env.example .env.local(If .env.example is not present, manually create .env.local with the variables listed in the Environment Variables section below).
npm run devOpen http://localhost:3000 in your browser to view your local site!
You don't need to dive deep into complex UI components to change your information! All personal data, projects, work experience, and social handles live inside the constant/ directory:
constant/
βββ profile.ts # Bio, location, education, rotating hero headlines
βββ projects.ts # Selected & featured projects, tech tags, links
βββ experience.ts # Work experience timeline & job roles
βββ skills.ts # Categorized skills & technology badges
βββ social.ts # Social media platforms, URLs, handles & icons
βββ seo.ts # Default SEO title, OpenGraph images, site URL
βββ index.ts # Barrel export for all constants
constant/profile.ts: Update your name, email, current work title, college/education, location, bio paragraphs, and hero rotating quotes (hero_titles).constant/projects.ts: Updateselected_worksandworksarrays with your own projects, tech stack badges, and GitHub/live links.constant/experience.ts: Edit your work history, company names, job titles, start/end dates, and key achievements.constant/skills.ts: Add or remove your core skills and tech categories.constant/social.ts: Set your GitHub, LinkedIn, X (Twitter), LeetCode, and other social media profile links.constant/seo.ts: SetSITE_SEO.siteName,SITE_SEO.siteTitle, andSITE_SEO.siteUrlto match your domain.
This portfolio uses Notion as a headless CMS. You write your articles in Notion, and they render seamlessly on your site at /blogs.
Here is how to set up Notion integration step-by-step:
- Visit Notion My Integrations.
- Click "+ New integration".
- Select your workspace, enter an integration name (e.g.,
My Portfolio Blog), and click Submit. - Copy the Internal Integration Secret (it starts with
secret_orntn_). - Save this token as
NOTION_API_KEYin your.env.localfile.
- Open Notion and create a new Full Page Database (or inline database on a new page).
- Set up the following database properties (property names are case-sensitive):
| Property Name | Property Type in Notion | Description |
|---|---|---|
| Title | Title |
The blog post title |
| Slug | Text (Rich Text) |
URL slug for post (e.g. building-my-portfolio) |
| Description | Text (Rich Text) |
Short excerpt/description displayed on blog list |
| Keywords | Multi-select |
Tags or keywords for SEO & topics |
| Date | Date |
Publication date |
| Published | Checkbox |
Must be checked (true) for the post to show live |
| Cover | Files & media or Notion Page Cover |
Post cover thumbnail image |
- Open your Notion Blog Database page.
- Click the three dots
...(or Share button) in the top-right corner. - Select Add connections (or Connections).
- Search for your integration name (e.g.,
My Portfolio Blog) and grant it access.
- Copy the URL of your Notion Database page.
- The URL looks like this:
https://www.notion.so/myworkspace/3a648e834e8348986e9d7281e46a56e?v=... - The 32-character string between
myworkspace/and?v=is yourNOTION_DATABASE_ID. - Add
NOTION_DATABASE_ID=3a648e834e8348986e9d7281e46a56eto.env.local.
- Add a new row to your Notion database.
- Give it a Title, a unique Slug (e.g.
hello-world), a Description, a Date, and check the Published box. - Open the page inside Notion and write your article content using standard Notion blocks (headings, code blocks, lists, callouts, images).
- Refresh your portfolio's
/blogspage β your article is now live! π
The contact form uses Nodemailer with Gmail SMTP to send notification emails when a visitor sends you a message.
To connect your Gmail account securely:
- Go to your Google Account Settings.
- Navigate to Security.
- Under "How you sign in to Google", make sure 2-Step Verification is turned ON.
- Search for "App passwords" in the Google Account search bar (or go directly to myaccount.google.com/apppasswords).
- Enter an app name (e.g.,
Portfolio Contact Form). - Click Create.
- Google will generate a 16-character passcode (e.g.
abcd efgh ijkl mnop). Copy this passcode.
Add your email address and the generated App Password to .env.local:
email_from=your.email@gmail.com
email_password=abcdefghijklmnopNow, when visitors submit the contact form on your site, Nodemailer will send the message using your Gmail SMTP server!
Create a .env.local file in the project root with the following variables:
# Email Configuration (Nodemailer + Gmail SMTP)
email_from=your.email@gmail.com
email_password=your_16_char_google_app_password
# Notion CMS Integration
NOTION_API_KEY=your_notion_integration_secret_token
NOTION_DATABASE_ID=your_32_character_notion_database_id
# Public Site Configuration (Optional)
NEXT_PUBLIC_SITE_URL=https://aarab.vercel.appThis project is licensed under a Custom Portfolio License (see LICENSE).
- Clone & Fork: Feel free to clone or fork this repository for your own personal use.
- Customize: Modify the content, styling, components, or layout to create your personal portfolio or personal blog.
- Deploy: Host your customized version anywhere (Vercel, Netlify, Cloudflare Pages, custom domain).
- No Resale or Redistribution: You may NOT sell, bundle, or redistribute this codebase (modified or unmodified) as a commercial template, theme, boilerplate, or starter kit on marketplaces like ThemeForest, Gumroad, etc.
- No Client Work Resale: You may NOT clone this project, make cosmetic changes, and sell/deliver it to paid clients as a custom-built website.
Crafted with β€οΈ by Aarab Nishchal