A production-quality portfolio website for video editor and post-production specialist Kashyap Bera. Built with a dark & cinematic aesthetic, featuring an Instagram/TikTok-style 9:16 vertical reel viewer with view-only video protection (zero third-party video subscriptions), smooth GSAP ScrollTrigger + Lenis animations, and a private admin panel.
#7A1527 & Champagne Cream #F5EDE0, dynamically changeable from the admin panel), Syne display typography, Inter body typography, glassmorphism, and subtle ambient glows.-movflags +faststart and poster thumbnails extracted./backend/storage/videos/ (never exposed as public static files)./api/stream/{reel_id} supporting HTTP 206 Partial Content (Byte Range requests) for instantaneous seeking, requiring a short-lived HMAC signed token.controlsList="nodownload noplaybackrate", disablePictureInPicture, right-click context menu disabled, pointer drag disabled, and an admin-toggleable moving watermark overlay./admin):
[!NOTE] View-Only Protection & Deterrence Notice: While this application implements industry-grade deterrents against direct video downloads (private filesystem storage, signed temporary tokens, HTTP Range chunk streaming, anti-hotlink origin verification, context menu blocking, and dynamic moving watermarks), complete client-side screen recording prevention is technically impossible on the open web (as any frame displayed on a screen or captured by external cameras can be recorded). The implemented architecture successfully blocks direct URL copying, video grabbing software, and casual unauthorized distribution.
Hosting & Bandwidth Considerations: Self-hosted video streaming consumes backend storage and bandwidth. For high-traffic scaling, the backend streaming function
getPlayableVideoUrl(reelId)is decoupled so it can easily map to private object storage buckets (e.g. Cloudflare R2 or AWS S3 with CloudFront signed cookies) in the future without changing the frontend player.
libx264 and aac.Ensure you have Node.js (v18+), Python (v3.11+), and FFmpeg installed.
winget install Gyan.FFmpeg --silent --accept-package-agreements --accept-source-agreements
Or download from gyan.dev/ffmpeg and add the bin folder to your system PATH.
# Navigate to backend directory
cd "backend"
# Install Python dependencies
pip install -r requirements.txt
# Create .env from template
copy .env.example .env
# Seed the database with sample demo reels and default admin account
python -m app.seed
# Start the FastAPI server
uvicorn app.main:app --host 127.0.0.1 --port 8000 --reload
Backend API will be accessible at:
http://127.0.0.1:8000http://127.0.0.1:8000/api/docsDefault Admin Credentials:
admin@kashyapbera.comadmin123 (Change immediately in /admin/settings)# Open a new terminal and navigate to frontend directory
cd "frontend"
# Install NPM packages
npm install
# Start Vite development server
npm run dev
Frontend will be accessible at:
http://127.0.0.1:5173/http://127.0.0.1:5173/reelshttp://127.0.0.1:5173/admin/login/frontend directory as Root Directory on Vercel.npm run builddistVITE_API_URL: Your deployed backend URL (e.g. https://api.kashyapbera.com)Videos are stored in the serverโs storage folder, so deploy to a service with persistent disk storage:
/app/backend/storage (at least 20GBโ50GB depending on your reel library).ffmpeg via Docker or buildpack:
FROM python:3.11-slim
RUN apt-get update && apt-get install -y ffmpeg && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY backend/requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY backend .
EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
ENVIRONMENT=productionBACKEND_PORT=8000FRONTEND_URL=https://kashyapbera.comMONGODB_URL=mongodb+srv://... (MongoDB Atlas cluster URI)JWT_SECRET=your_production_secret_32_charsSTREAM_SECRET=your_production_stream_secret_32_charsADMIN_EMAIL=your_email@domain.comADMIN_PASSWORD=your_secure_password