A minimal, high-performance portfolio built with Next.js, Tailwind CSS, and Framer Motion.
Real-time Discord presence, Spotify/Trakt.tv/MyAnimeList integration, useful slide-to-vibe page, and a chat-style contact form.
One‑click deploy on Vercel:
- Discord presence (via Lanyard)
- Trakt.tv & MyAnimeList Stats
- Spotify “Now Playing”
- GitHub contributions heatmap
- Slide to Vibe with audio + animations
- Chat-style contact form (Discord webhook)
- Dark/Light theme toggle
- Next.js App Router, TypeScript, Tailwind, Framer Motion
- Suggestions are open, no new ideas in my mind rn 🙂
- Framework: Next.js (App Router)
- Language: TypeScript
- Styling: Tailwind CSS
- Animations: Framer Motion (spring physics, scroll-triggered reveals)
- Theme: next-themes
- Icons: lucide-react, react-icons
- Analytics: Vercel Analytics
Clone and install:
git clone https://github.com/shahriaravi/cooked-folio.git
cd cooked-folio
npm install
# or
bun installRun dev:
npm run dev
# or
bun devThen open: http://localhost:3000
Create a .env.local file in the project root. You can start from .env.example:
Example command:
cp .env.example .env.localRequired variables:
| Variable | Description |
|---|---|
NEXT_PUBLIC_URL |
Your live site URL (for example: https://your-site.com) |
DISCORD_WEBHOOK_URL |
Discord webhook URL to receive contact form messages |
NEXT_PUBLIC_DISCORD_USER_ID |
Your Discord User ID (Developer Mode → Copy ID) |
SPOTIFY_CLIENT_ID |
Spotify app Client ID |
SPOTIFY_CLIENT_SECRET |
Spotify app Client Secret |
SPOTIFY_REFRESH_TOKEN |
Spotify refresh token to fetch now-playing |
GITHUB_USERNAME |
Your GitHub username for contributions |
GITHUB_TOKEN |
GitHub Personal Access Token (classic) with read:user |
Analytics are handled by Vercel Analytics, enabled from your Vercel project settings (no extra env needed).
Site configuration is split into two main files.
Edit your personal data here:
- Banner image
- Social links
- Tech stack (
STACK) - Experience (
EXPERIENCE) - Education (
EDUCATION) - Projects (
PROJECTS) - External links (Cal.com, Fiverr, etc.)
Controls site-wide metadata:
- Site name and description
- Base URL and OG image
- Twitter / X card settings
Example shape:
export const siteConfig = {
name: "avi",
username: "shahriaravi_",
description: "founder & swe @ byontriq. building things with next.js, caffeine & monke energy.",
url: process.env.NEXT_PUBLIC_URL || "https://yoavi.fun",
ogImage: "/og-img.png",
links: {
twitter: "https://twitter.com/shahriaravi_",
github: "https://github.com/shahriaravi",
},
};
export function constructMetadata(/* overrides */) {
// returns a Next.js Metadata object
}src/
├─ app/
│ ├─ api/
│ │ ├─ contact/route.ts
│ │ ├─ discord/current-activity/route.ts
│ │ ├─ discord/presence/route.ts
│ │ ├─ github/contributions/route.ts
│ │ └─ spotify/now-playing/route.ts
│ ├─ contact/page.tsx # wraps ContactForm
│ ├─ donate/page.tsx # donation page
│ ├─ donate/thanks/page.tsx # post-donation thank you
│ ├─ resume/page.tsx # wraps ResumeViewer
│ ├─ ty/page.tsx # thank-you screen
│ ├─ what/page.tsx # Slide to Vibe page
│ ├─ layout.tsx
│ ├─ loading.tsx
│ ├─ not-found.tsx
│ └─ page.tsx # home
├─ components/
│ ├─ common/ # Container, ThemeToggle, HelloLoader, CustomScrollArea, InitialSplash
│ ├─ layout/ # Hero, Footer, Providers
│ ├─ sections/ # ExperienceList, EducationList, ProjectList, StackList
│ ├─ integrations/ # DiscordPresenceDot, NowPlaying, GithubActivityCard
│ ├─ vibe/ # Vibing, SlideToVibeButton
│ ├─ contact/ # ContactForm
│ ├─ donate/ # DonateContent, DonateThanks
│ └─ ui/ # Button, Input, Return, ResumeViewer, TimeDisplay, ThankYouContent
├─ hooks/
│ └─ useDiscordPresence.ts
└─ lib/
├─ animations.ts # shared animation variants & utilities
├─ config.ts # content & links
├─ site-config.ts # metadata/SEO
└─ utils.ts
The /donate page is specific to me. If you're forking this repo, you'll likely want to remove it:
-
Delete these directories:
rm -rf src/app/donate rm -rf src/app/api/donate rm -rf src/components/donate
-
Remove any links to
/donatefrom your site (e.g. insrc/lib/config.tsor navigation)
That's it — no other files depend on the donate feature.
PRs are welcome.
- Fork the repo
- Create a branch:
git checkout -b feat/cool-thing - Commit:
git commit -m "feat: add cool thing" - Push:
git push origin feat/cool-thing - Open a pull request
MIT © 2025 Shahriar Avi