A dynamic developer portfolio with a built-in admin panel.
No database Β· Password protected Β· Deploy from your browser
/admin Β Β·Β admin123 Β Β·Β node panel.mjs Β Β·Β npm run dev
|
|
ββββββββββββββββ€βββββββββββββββββββββββββββββββββββ
β React 19 β UI Framework β
β Vite 7 β Build Tool β
β Tailwind 3 β Styling + Animations β
β Zustand 5 β State Management (localStorage) β
β Framer β Motion & Transitions β
β Lucide β Icon Library β
β React Routerβ Client-side Routing β
ββββββββββββββββ§βββββββββββββββββββββββββββββββββββ
No backend server. Everything runs in the browser.
π Cinematic Hero (3D Portrait)
The hero section features an interactive 3D character portrait with scroll + mouse-driven parallax:
- 3D perspective β portrait rotates on X/Y axes using combined mouse tracking and scroll position, with
transform-style: preserve-3dandperspective: 1200px - Scroll depth β portrait scales 1β0.85, translates Z -80px, and tilts -12Β° on scroll for a card-reveal effect
- Mouse tracking β cursor position drives Β±6Β° rotation via spring physics (stiffness 150), throttled with
requestAnimationFrame - Layered effects β rim light, floor glow, gradient overlay, and ambient glow move independently for faux-3D depth
- Ambient background β dark canvas with floating gradient orbs, grain overlay, and vignette
- Particle field β 20 CSS-only twinkling particles (8 on mobile) β zero JavaScript animation overhead
π Splash Screen
A full-screen preloader that animates while the website renders behind it:
- Star field β 250 twinkling stars with randomized sizes, pulse speeds, and delays
- Falling stars β 12 diagonal shooting stars with trailing tails at staggered intervals
- Orbit rings β 8 ultra-thin expanding rings with slight tilts, like solar system orbits
- Portfolio image β circular profile photo with dual pulsing ring borders
- Custom font β "Bagind" font self-hosted via
@font-facefor the name - Loading indicator β 3 pulsing dots at the bottom
- Smart timing β splash stays minimum 2.8s; all website content renders behind it so animations are complete before reveal
π¬ Section Animations
Every section uses framer-motion with whileInView for scroll-triggered reveals:
- Spring stiffness/damping values tuned per element (80β300 stiffness)
- Stagger children β Skills grid items fly in with
staggerChildren: 0.04 - Hover cards β Projects and Achievements lift on hover with spring physics
- Magnetic buttons β CTA buttons scale to 1.02β1.03 on hover, 0.97β0.98 on tap
- Navbar β slides down from top with spring, mobile menu animates with
AnimatePresence - Entrance speed β all section entrance durations reduced to 0.35β0.5s for instant scroll reveal
Each section uses a consistent pattern: initial β whileInView β viewport: { once: true } for efficient re-rendering. Below-fold sections use content-visibility: auto (.lazy-section) for instant paint on scroll.
π΅ Music Player Animations
Custom Tailwind keyframes defined in tailwind.config.js:
| Animation | Duration | Effect |
|---|---|---|
equalizer |
0.8s | 6 bars bounce at staggered heights (20%β100%) with opacity fade |
disc-spin |
4s | Smooth 360Β° rotation on YouTube thumbnail discs |
pulse-glow |
2s | Pulsing box-shadow from 12px to 30px gold blur |
shine |
3s | Gradient sweep across progress bar and card borders |
aurora |
6s | Slow horizontal sway with skew for the wave beneath the progress bar |
twinkle |
3s | Star particles fade and scale between 0.8 and 1.2 |
The collapsed pill button shows a spinning disc (YouTube thumbnail or styled icon), an animated equalizer for audio, and pulsing glow rings when active.
πͺ Glass-morphism UI
The admin panel uses a consistent glass aesthetic:
backdrop-blur-xlon all panels and buttonsborder border-white/10withbg-white/10backgrounds- Dark gradient fallback
from-[#667eea] via-[#764ba2] to-[#f093fb] - Overlay gradient
from-black/40 via-transparent to-black/60over media backgrounds - All interactive elements have
.active:scale-90for tactile feedback
π€ YouTube IFrame API
YouTube music plays entirely in the background β no visible video:
- Player element is
w-0 h-0 opacity-0 pointer-events-none absolute - API script injected on first YouTube song, reused for subsequent tracks
loadVideoById()+playVideo()for seamless song switchingseekTo()for progress bar seekingonStateChangetracks PLAYING/PAUSED/ENDED states- Auto-resets volume to 100% on player ready
- Player destroyed on cleanup to prevent memory leaks
The public Sandbox page (/sandbox) is an interactive playground that showcases developer activities, ongoing learning tracker, startup idea incubator, and mock social integrations.
| Feature Area | Key Capability | Interactive Elements |
|---|---|---|
| 1. Social Feed Switcher | Toggles mock feeds for LinkedIn, Snap Dude, GitHub, and YouTube | Likes, comments, slide-through post carousels |
| 2. Learning Tracker | Tracks active upskilling curves, completed topics, and notes | Status badges, progress rings, study link tabs |
| 3. Project Change-logs | Active project checklist lists, pending tasks, and date logs | Checklist completion states, toggleable logs |
| 4. Startup Idea Repository | Incubator for brainstorming app concepts, pitches, and tech stacks | Conceptual descriptions and constraint logs |
| 5. Activity Log (Devlog) | Chronological timeline of technical progress, features, and updates | Expandable documentation cards, screens |
πΌ High-Fidelity LinkedIn Mock Profile
A pixel-perfect replica of a LinkedIn profile page rendered directly in your portfolio. This allows you to showcase a professional narrative without directing users off-site.
- Profile Header Card: Standard LinkedIn cover banner overlayed with avatar image, name, headline, geographic location, and a mock Connect button.
- Dynamic Experience Timeline: Automatically displays your professional career history (roles, companies, duration, and custom tag pills) synced directly from your database.
- Academic Education History: Lists school name, degree, dates, grade metrics, and academic activities.
- Credentials & Licenses: Dynamic Trophy-badged credentials populated directly from your achievements.
- Interactive Post Feed: Displays updates tagged for LinkedIn. Supports liking posts and viewing comments.
πΈ Snap Dude Feed
An Instagram/Snapchat-style visual gallery feed for quick media updates.
- Double-tap posts to Like with spring-animated heart icons.
- Add comments directly under visual mock posts.
- Supports image slides, tag lists, and timestamps.
π GitHub & π₯ YouTube Views
- GitHub Integration: Renders your open-source projects, contribution stats, and direct links to active repositories.
- YouTube Embeds: Streams video logs, project demonstrations, and tutorials using a custom video player overlay.
β‘ Learning Tracker
Tracks exactly what you are learning with high-fidelity visualization:
- Progress Rings: Smooth SVG circular rings displaying active progress percentage.
- Topic Checklists: Clear lists dividing completed topics (strikethrough) and pending topics.
- Resource Hub: Fast-access link pills linking directly to official documentation, tutorials, or guides.
- Field Notes: Custom insights, tips, and thoughts for each learning path.
πͺ΅ Chronological Activity Log (Devlog)
A week-by-week technical journal representing your progress.
- Update Types: Highlights categories with custom emoji badges β
βοΈ Update,β¨ Feature,π Learning. - Details Cards: Expandable panels that reveal deep-dive technical documentation, checklists of changes made, and links to git commits.
- Embedded Screenshots: Image slides displaying proof-of-work layouts and screenshots directly inside the timeline.
π Password Protection
Default password: admin123
Change it directly in the Settings tab of the Admin Panel, then click Deploy to Production to apply it permanently (stored in data.json under profile.adminPassword).
| Device | Behavior |
|---|---|
| First visit | Enter password β unlock for session |
| Same browser | Stays unlocked until tab closes |
| New device | Password prompt (works on every device) |
π΅ Playlist & Music Player
Manage a playlist in Settings tab. A floating player appears at bottom-right.
- Add multiple songs β audio URLs, YouTube, or Spotify
- Reorder songs with up/down arrows
- Queue playback with next/prev, auto-advance to next song
- YouTube thumbnails shown as spinning disc + banner
- Animated progress bar with seek, star particles, and aurora glow
- Toggle on/off with the floating music button
πΌοΈ Background Image / Video
Set a background in Settings tab:
- Image β URL or upload from device
- Video β URL, upload, or YouTube link (auto-detected!)
- Toggle on/off with the eye button (bottom-left) β smooth crossfade
- Falls back to animated gradient when toggled off
π LinkedIn Sync Scraper (Method 3)
Syncing data from LinkedIn is notoriously difficult due to CORS, authwalls, and bot blocks. This project uses a Browser Bookmarklet Scraper to sync your profile, experiences, and education in real-time under your own logged-in browser session.
flowchart TD
subgraph Browser [Your Browser Session]
A[Visit LinkedIn Profile] --> B[Click Bookmarklet]
B --> C{Scrape profile, experiences, education}
C --> D{POST to http://localhost:5173/api/sync}
end
subgraph DevServer [Local Portfolio Server]
D -- "Success (CORS Preflight OK)" --> E[Vite server mock API]
E --> F[Merge with existing data]
F --> G[Write to public/data.json on disk]
end
subgraph Fallback [Clipboard Backup]
D -- "Failed (Offline / Production)" --> H[Copy JSON to Clipboard]
H --> I[Open Admin Modal]
I --> J[Paste & Import manually]
end
style DevServer fill:#FFB800,stroke:#18112E,stroke-width:2px,color:#18112E
style Fallback fill:#667eea,stroke:#fff,stroke-width:1px,color:#fff
- Copy the Bookmarklet: Inside the Admin Panel (Life Dashboard β Import LinkedIn JSON), copy the bookmarklet code.
- Create a Bookmark: Create a new bookmark in your browser bookmarks bar, name it (e.g., Sync Portfolio), and paste the copied javascript code as the URL.
- Visit LinkedIn: Navigate to your own public LinkedIn profile page (e.g.,
linkedin.com/in/your-name). - Click & Sync: Click the bookmarklet. The script scrapes your profile details, experiences, and education, and immediately POSTs it to the dev server's endpoint (
http://localhost:5173/api/sync) which automatically writes topublic/data.jsonon disk. - Production Fallback: If the local endpoint is unreachable (e.g., when visiting your live production site), the bookmarklet automatically copies the JSON data to your clipboard so you can paste it manually into the import modal text box.
π Deploy to Production
-
Generate a GitHub classic token with
reposcope at
https://github.com/settings/tokens -
Go to
/adminβ Settings β paste token β Save -
Click Deploy to Production
Commits
public/data.jsonto GitHub β Vercel auto-redeploys β all users see updates in ~30s.
π Upload Files
Every media setting supports both:
| Method | How it works |
|---|---|
| URL | Paste a direct link (mp3, mp4, jpg, YouTube, etc.) |
| Upload | Pick a file from your device, stored as data URL in localStorage |
No external storage service needed.
π¦ Portfolio CMS
βββ π public/
β βββ π data.json β deployed content (GitHub commit)
βββ π src/
β βββ π App.jsx β Routes (/ + /admin)
β βββ π main.jsx β React entry point
β βββ π index.css β Tailwind directives + custom scrollbar
β βββ π lib/
β β βββ π store.js β Zustand store (profile, skills, projects, achievements, messages, CRUD + GitHub sync)
β βββ π components/public/
β β βββ π BackgroundScene.jsx β parallax orbs, grid, floating shapes
β β βββ π Navbar.jsx β sticky glass nav + mobile drawer
β β βββ π Hero.jsx β scroll parallax, spring text, CTAs
β β βββ π About.jsx β story section with timeline
β β βββ π Skills.jsx β categorized skill pills with stagger
β β βββ π Projects.jsx β project cards + detail modal
β β βββ π Achievements.jsx β milestone cards + expandable modal
β β βββ π StartupVision.jsx β mission pillars with hover lift
β β βββ π Contact.jsx β form with validation + social info
β β βββ π Footer.jsx β social links + copyright
β βββ π pages/
β βββ π public/
β β βββ π Home.jsx β composes all public sections
β β βββ π PublicLayout.jsx β layout with BackgroundScene
β βββ π admin/
β βββ π AdminPanel.jsx β full admin (Profile, Skills, Projects, Achievements, Messages, Settings tabs)
βββ π panel.mjs β CLI tool for terminal editing
βββ π eslint.config.js β flat config with react-hooks + react-refresh
βββ π jsconfig.json β path alias @/ β ./src/
βββ π tailwind.config.js β custom colors, fonts, keyframes (shine, equalizer, aurora, twinkle, disc-spin, pulse-glow)
βββ π vite.config.js β React plugin + @/ alias
βββ π vercel.json β SPA rewrites for client-side routing
node panel.mjsβββ Portfolio Panel βββββββββββββββββββββββ β [ 0] Edit Profile β β [ 1] List Skills β β [ 2] Add Skill β β [ 3] Edit Skill β β [ 4] Delete Skill β β [ 5] List Projects β β [ 6] Add Project β β ... β β [15] Preview Summary β β [16] Reset to Defaults β β [17] Exit β βββββββββββββββββββββββββββββββββββββββββββ
All portfolio data lives in a single Zustand store (src/lib/store.js):
Store shape:
profile β { name, title, intro, aboutStory, startupVision, characterImage, email, github, linkedin, twitter }
skills[] β { id, name, icon, category }
projects[] β { id, title, description, techStack, imageUrl, githubUrl, liveUrl }
achievements[]β { id, title, date, description, imageUrl }
messages[] β { id, name, email, message, createdAt }
loading β bool
getGithubTokenβ fn() (from localStorage)
Key actions:
fetchAll() β GET /data.json β fallback to localStorage
addSkill / updateSkill / deleteSkill
addProject / updateProject / deleteProject
addAchievement / updateAchievement / deleteAchievement
addMessage β saves locally + pushes to GitHub if token set
deleteMessage β removes locally + syncs to GitHub
fetchMessagesFromGitHub β merges remote messages with local
uploadImage β FileReader β base64 data URL
Data persists to localStorage under key portfolio_data on every mutation.
| Item | Storage |
|---|---|
| Admin password | Stored in public/data.json under profile.adminPassword (changeable via Settings UI) |
| GitHub token | Your browser's localStorage only |
| Portfolio content | public/data.json + localStorage |
| Contact messages | localStorage (per-browser) |
| Uploaded media | Data URLs in localStorage |