A modern, responsive portfolio website built with Next.js, TypeScript, Tailwind CSS, and Shadcn UI. Features a blog editor with WYSIWYG capabilities powered by Tiptap.
- Personal Portfolio: Showcase projects, skills, education, and online presence
- Blog System: Full-featured blog with WYSIWYG editor
- Project Showcase: Display projects with images, links, and hackathon winner badges
- Dark/Light Mode: Theme switching support (defaults to dark mode)
- Responsive Design: Mobile-first, works on all devices
- SEO Optimized: Complete SEO setup with meta tags, Open Graph, Twitter Cards, and structured data
- Email Copy Feature: Click email icon to copy email address to clipboard with notification
- Social Links: Quick access to GitHub, LinkedIn, X (Twitter), and email
- Framework: Next.js 16
- Language: TypeScript
- Styling: Tailwind CSS
- UI Components: Shadcn UI
- Blog Editor: Tiptap (WYSIWYG)
- Icons: Lucide React, React Icons
- Node.js 18+
- npm, yarn, pnpm, or bun
- Clone the repository:
git clone <repository-url>
cd portfolio- Install dependencies:
npm install
# or
yarn install
# or
pnpm install- Run the development server:
npm run dev
# or
yarn dev
# or
pnpm dev- Open http://localhost:3000 in your browser.
The portfolio includes a built-in blog editor accessible at /blog/editor. Here's how to use it:
- Directly visit:
http://localhost:3000/blog/editor- Note: The editor is not linked from the blog page for security reasons
- You can bookmark this URL for easy access
- Click "New Post" button in the editor page
- Fill in the details:
- Title: Enter your blog post title
- Excerpt: Write a short summary (appears in blog listings)
- Read Time: Estimated reading time (e.g., "5 min read")
- Content: Use the WYSIWYG editor to write your post
The editor provides a rich text editing experience with the following features:
- Bold: Click the bold icon (B) or use
Ctrl+B - Italic: Click the italic icon (I) or use
Ctrl+I
- H1: Large heading
- H2: Medium heading
- H3: Small heading
- Bullet List: Create unordered lists
- Numbered List: Create ordered lists
- Click the link icon to add hyperlinks
- Enter the URL when prompted
- Upload from File: Click the first image icon to upload an image from your computer
- Images are converted to base64 and embedded in the post
- Insert from URL: Click the second image icon to add an image from a URL
- Resize Images: Hover over an image and drag the resize handle in the bottom-right corner
- Use the undo/redo buttons to revert or reapply changes
- In the editor page, find the post you want to edit
- Click the "Edit" button next to the post
- Modify the title, excerpt, read time, or content
- Click "Save Post" when done
- In the editor page, find the post you want to delete
- Click the "Delete" button (trash icon)
- Confirm the deletion
- Blog posts are stored in Vercel Blob Storage for permanent, cross-device access
- Posts are accessible to all users and persist across sessions
- Storage is configured using Vercel Blob Storage API
- To configure, set the
BLOB_READ_WRITE_TOKENenvironment variable in your Vercel dashboard
- Keep excerpts concise: 1-2 sentences that summarize the post
- Use headings: Break up long content with H2 and H3 headings
- Add images: Visual content makes posts more engaging
- Format text: Use bold and italic to emphasize important points
- Test your post: Preview it on the blog page before publishing
portfolio/
├── src/
│ ├── app/
│ │ ├── blog/
│ │ │ ├── editor/ # Blog editor page
│ │ │ ├── [slug]/ # Individual blog post pages
│ │ │ └── page.tsx # Blog listing page
│ │ ├── projects/ # Projects page
│ │ ├── layout.tsx # Root layout
│ │ └── page.tsx # Homepage
│ ├── components/
│ │ ├── blog-editor.tsx # WYSIWYG editor component
│ │ ├── hero-section.tsx # Hero/profile section
│ │ ├── education.tsx # Education section
│ │ ├── projects-section.tsx # Projects showcase
│ │ ├── blog-section.tsx # Blog preview section
│ │ └── ... # Other components
│ └── lib/
│ ├── blog-data.ts # Blog data management
│ └── utils.ts # Utility functions
└── public/ # Static assets
The portfolio is fully SEO optimized with:
- Meta Tags: Comprehensive meta tags for search engines
- Open Graph: Social media sharing optimization (uses
/card.pngfor previews) - Twitter Cards: Optimized Twitter sharing
- Structured Data: JSON-LD schema for Person, Education, and Skills
- Sitemap: Auto-generated sitemap at
/sitemap.xml - Robots.txt: Search engine crawling instructions
- Canonical URLs: Proper URL canonicalization
If deploying to a different domain, update the following files:
src/app/layout.tsx- UpdatemetadataBaseand all URL referencessrc/app/page.tsx- Update structured data URLssrc/app/sitemap.ts- UpdatebaseUrlpublic/robots.txt- Update sitemap URL
Current domain: shahtab.xyz
Edit src/app/projects/page.tsx and src/components/projects-section.tsx to add or modify projects.
- Profile: Edit
src/components/hero-section.tsx - Education: Edit
src/components/education.tsx - Skills: Edit
src/components/skills-section.tsx - Online Presence: Edit
src/components/online-presence.tsx - Social Links: Update email, GitHub, LinkedIn, and X (Twitter) links in
src/components/hero-section.tsx
The site uses Next.js themes with dark mode as default. Toggle between light/dark mode using the theme switcher in the navigation (yellow icon in dark mode, black in light mode).
npm run build
npm startThe easiest way to deploy is using Vercel:
- Push your code to GitHub
- Import your repository in Vercel
- Configure Environment Variables:
- Go to your Vercel project settings
- Add
BLOB_READ_WRITE_TOKENenvironment variable - Get your token from Vercel Blob Storage
- Optional: Add
BLOB_STORE_IDif using a specific store
- Deploy with default settings
- Update domain references in the codebase if using a custom domain
Required for blog functionality:
BLOB_READ_WRITE_TOKEN: Your Vercel Blob Storage read/write token
Optional:
BLOB_STORE_ID: Specific blob store ID (defaults to provided store)BLOB_BASE_URL: Base URL for blob storage
No environment variables are required for basic functionality. Blog posts are stored in localStorage.
🌐 Live URL: https://shahtab.xyz
MIT
Shahtab Mohtasin
- Email: cloudstack6@gmail.com
- GitHub: @shahtab123
- LinkedIn: shahtab-mohtasin
- X (Twitter): @SMohtasin