Skip to content

krishna3163/portfolio_website

Repository files navigation

πŸ‘» Krishna Kumar's Portfolio - Enter the Void

A horror-themed personal portfolio website built with modern web technologies. This isn't your average portfolio - it's an immersive experience with spooky animations, interactive elements, and a unique dark aesthetic.


🎬 Preview

Homepage Screenshot

Admin Dashboard

Demo Video


✨ Features

🎨 Visual Experience

  • Horror Theme - Blood red & void black color palette
  • Animated Ghost Character - A floating ghost that follows you around
  • Typing Animation - Dynamic "I am a..." text that cycles through roles
  • 3D Page Flip Transitions - Smooth card-flip animation when navigating pages
  • Glitch Effects - CSS glitch animation on titles
  • Fog & Blood Overlays - Atmospheric horror effects

πŸ” Authentication & Admin

  • Firebase Authentication - Email/password + Google Sign-In
  • Protected Admin Dashboard - Only accessible by admin email
  • Media Upload System - Upload project images and videos

πŸ“ Interactive Features

  • Guestbook - Visitors can leave messages with emoji spirits
  • Contact Form - Direct messages saved to database
  • Project Gallery - Dynamic project cards with links to GitHub

πŸ› οΈ Technical Features

  • Responsive Design - Works on all screen sizes
  • Auto-Hide Navigation - Nav bar hides on scroll down
  • Preloader Animation - "Welcome to Krishna's Portfolio Void" intro
  • Smooth Scroll - Polished scrolling experience

πŸ—οΈ Tech Stack

Category Technology
Framework Next.js 14 (App Router)
Language TypeScript
Styling Tailwind CSS + Custom CSS
Animation Framer Motion
Auth Firebase Authentication
Storage Firebase Storage
Database Supabase (PostgreSQL)
Deployment Vercel

πŸ“ Project Structure

portfolio_website/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ components/        # Reusable UI components
β”‚   β”‚   β”œβ”€β”€ LiquidGlassNav.tsx
β”‚   β”‚   β”œβ”€β”€ AnimatedCharacter.tsx
β”‚   β”‚   β”œβ”€β”€ TypewriterEffect.tsx
β”‚   β”‚   β”œβ”€β”€ Preloader.tsx
β”‚   β”‚   └── ...
β”‚   β”œβ”€β”€ admin/             # Admin dashboard (protected)
β”‚   β”œβ”€β”€ guestbook/         # Guestbook page
β”‚   β”œβ”€β”€ projects/          # Projects listing
β”‚   β”œβ”€β”€ project/[id]/      # Individual project pages
β”‚   β”œβ”€β”€ login/             # Login page
β”‚   β”œβ”€β”€ signup/            # Signup page
β”‚   β”œβ”€β”€ contact/           # Contact form
β”‚   β”œβ”€β”€ globals.css        # Global styles & theme
β”‚   └── page.tsx           # Homepage
β”œβ”€β”€ lib/
β”‚   β”œβ”€β”€ firebase.ts        # Firebase configuration
β”‚   β”œβ”€β”€ supabase.ts        # Supabase client
β”‚   └── storage.ts         # File upload utilities
β”œβ”€β”€ public/                # Static assets
└── screenshots/           # README images (add your own!)

πŸš€ Running Locally

Prerequisites

  • Node.js 18+ installed
  • npm or yarn
  • Firebase project (for auth)
  • Supabase project (for database)

Step 1: Clone the Repository

git clone https://github.com/YOUR_USERNAME/portfolio_website.git
cd portfolio_website

Step 2: Install Dependencies

npm install

Step 3: Environment Setup

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

# Firebase Configuration
NEXT_PUBLIC_FIREBASE_API_KEY=your_api_key
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=your_project.firebaseapp.com
NEXT_PUBLIC_FIREBASE_PROJECT_ID=your_project_id
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=your_project.appspot.com
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=your_sender_id
NEXT_PUBLIC_FIREBASE_APP_ID=your_app_id

# Supabase Configuration
NEXT_PUBLIC_SUPABASE_URL=https://your_project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_anon_key

Step 4: Setup Supabase Database

Run this SQL in your Supabase SQL Editor:

-- Contact Submissions Table
CREATE TABLE IF NOT EXISTS contact_submissions (
    id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
    name TEXT NOT NULL,
    email TEXT NOT NULL,
    message TEXT NOT NULL,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- Guestbook Table
CREATE TABLE IF NOT EXISTS guestbook (
    id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
    user_id TEXT NOT NULL,
    author_name TEXT NOT NULL,
    message TEXT NOT NULL,
    emoji TEXT DEFAULT 'πŸ‘»',
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- Project Media Table (for admin uploads)
CREATE TABLE IF NOT EXISTS project_media (
    id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
    repo_name TEXT NOT NULL UNIQUE,
    image_url TEXT,
    video_url TEXT,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- Enable Row Level Security
ALTER TABLE contact_submissions ENABLE ROW LEVEL SECURITY;
ALTER TABLE guestbook ENABLE ROW LEVEL SECURITY;
ALTER TABLE project_media ENABLE ROW LEVEL SECURITY;

-- Create policies for public access
CREATE POLICY "Public can insert contacts" ON contact_submissions FOR INSERT TO public WITH CHECK (true);
CREATE POLICY "Public can read guestbook" ON guestbook FOR SELECT TO public USING (true);
CREATE POLICY "Public can insert guestbook" ON guestbook FOR INSERT TO public WITH CHECK (true);
CREATE POLICY "Public can read media" ON project_media FOR SELECT TO public USING (true);

Step 5: Run the Development Server

npm run dev

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


πŸ”‘ Admin Access

The admin dashboard is protected and only accessible by the configured admin email.

Admin Email: [email protected]

To access:

  1. Go to /login
  2. Sign in with the admin email
  3. Navigate to /admin

πŸ“Έ Screenshots

Add your own screenshots in the screenshots/ folder:

Page Screenshot
Home ![Home](./screenshots/home.png)
Projects ![Projects](./screenshots/projects.png)
Admin ![Admin](./screenshots/admin.png)
Guestbook ![Guestbook](./screenshots/guestbook.png)

πŸŽ₯ Demo Video

Add a screen recording showing the preloader, typing animation, and page transitions.


🌐 Live Demo

View Live Site β†’


πŸ“„ License

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


🀝 Contact

Krishna Kumar


πŸ‘» "Enter if you dare..."

Releases

No releases published

Packages

 
 
 

Contributors