The official digital experience of the Entrepreneurship Cell at RV University, Bengaluru.
An Awwwards-inspired, high-performance web platform engineered with Next.js 16 App Router, React 19, GSAP ScrollTrigger choreography, custom WebGL GLSL shaders, and interactive micro-experiences.
π Live Website β’ π Contributing Guide β’ π Deployments
E-Cell.Web.Demo.mp4
The ECell RV University Website serves as the central flagship platform for RV University's student entrepreneurial ecosystem. Built to move past standard university club websites, it delivers an immersive, motion-rich narrative that showcases:
- Flagship Initiatives & Hackathons (Argonyx Hackathon, Winter Tech Talks, Talk Startup With Me).
- Interactive Community Simulator with live conversational bot Q&A and direct WhatsApp group onboarding.
- In-Browser Arcade with four custom retro and reflex games.
- Interactive Sponsor Constellation featuring animated network graphs and dynamic node connections.
- Team & Speaker Spotlights with 3D carousel stacks, domain filtering, and dedicated director views.
- Events Archive Route (
/events) with search, category filtering, and modal event deep-dives.
- Dual-source responsive background video (
hero2-optimized.mp4on desktop,hero-mobile.mp4on mobile). - Power-efficient video playback controlled via
IntersectionObserver(paused when offscreen or hidden in background tabs, throttled to0.5xplayback speed for a dreamlike feel). - GSAP ScrollTrigger pin sequence that scales down the viewport video into a curved container card, unlocking headline typography and dynamic marquees.
- Central brand mark constructed from hand-calculated SVG curves and stroke paths.
- Animates dynamically across the Hero scroll journey using dynamic
getTotalLength()stroke offsets (strokeDasharray/strokeDashoffset). - Seamlessly flies and docks directly into the sticky top navigation bar (
ecell:logo-in-navcustom event). - Clickable brand mark opens an interactive Logo Breakdown Modal illustrating the brand geometry and symbolism.
- Seamless horizontal viewport scroll chaining Speakers, WhatsApp Community, and Footer into a continuous side-scrolling track.
- Navigation links translate vertical page scroll coordinates into the horizontal track's exact ScrollTrigger progress through the custom
horizontal-flow:navigateevent.
- Custom GLSL vertex and fragment shaders embedded directly in the WhatsApp Community section.
- Procedural volumetric light rays, dynamic fog wisps, mouse-tilt parallax, noise perturbation, and ray decay rendered at native device pixel ratio.
- Real-time simulated WhatsApp interface with pre-configured Q&A matching rules (
COMMUNITY_QA_RULES). - Suggested topic prompt chips ("Say Hello", "What is ECell?", "How to join?", "Upcoming events", "Who can join?").
- Direct one-click invite into the official RV University WhatsApp community group.
Floating interactive game launcher with 4 fully playable, state-managed minigames:
- Founder Sprint: Fast-paced reflex minigame catching moving sparks against the clock.
- Signal Snake: Classic grid-based retro snake with smooth controls and score tracking.
- Memory Match: Card-flipping pattern matching game with fewest-move calculations.
- 2048: Sliding tile puzzle with swipe/arrow key inputs and dynamic tile merging.
- Dynamic network topology organizing sponsors (Nokia, Red Bull, The Belgian Waffle Co., TVS, Herody, Akshaya Motors / Mercedes-Benz, etc.) across 4 tiers.
- Real-time SVG line connection rendering that illuminates adjacent nodes upon cursor hover.
- Fluid 3D card carousel with depth translation, touch swipe gestures, and keyboard navigation.
- Dedicated spotlight detail modal and an expandable, comprehensive Team Directory filterable by departments (Presidential, Advisory, Tech, PR, Partnerships, Logistics).
- Custom reference-counted Lenis singleton wrapper (
acquireLenis) ensuring zero memory leaks or competingrequestAnimationFrameloops across route transitions.
| Category | Technology | Purpose |
|---|---|---|
| Core Framework | Next.js 16 (App Router) | Server rendering, file-based routing, SEO, static asset optimization |
| UI Library | React 19 | Component architecture, React hooks, concurrent features |
| Language | TypeScript 5 | Strict static typing, interfaces for data models and animation options |
| Styling | Tailwind CSS v4 + PostCSS | Modern CSS utility tokens, @theme integration, responsive design |
| Custom Styling | Vanilla CSS Modules & Scoped Styles | Isolated section styling, GPU-accelerated motion classes, CSS variables |
| Animation Engine | GSAP 3.15 + ScrollTrigger | Timeline choreography, scroll-pinned scenes, kinetic typography |
| 3D & Shaders | Three.js 0.185 | Interactive WebGL canvas, custom GLSL vertex/fragment shaders |
| Smooth Scrolling | Lenis 1.3 | Momentum-based smooth wheel scrolling synchronized with GSAP |
| Typography | Next Font Google | Variable font loading (Archivo, Bebas Neue, Fraunces, Inter) |
| Analytics & Web Vitals | @vercel/analytics & @vercel/speed-insights |
Real-time traffic analytics and Core Web Vitals telemetry |
| Testing | Vitest 4 + React Testing Library + JSDOM | Fast unit and component testing suite |
| Code Quality | ESLint 9 (eslint-config-next) + TypeScript Compiler |
Static code analysis, linting, zero TypeScript emit verification |
| CI/CD | GitHub Actions | Automated lint, typecheck, test, preview, and production deploy |
To allow multi-contributor collaboration without merge conflicts or layout degradation:
- Every section is an isolated directory inside
src/sections/<SectionName>/. - Each section encapsulates its own component (
.tsx), scoped styles (.css), and animations (*Animations.ts). - Sections never rely on negative margins or layout assumptions from sibling components.
- Any section can be mounted independently or re-ordered inside
app/page.tsxwithout breaking layout flow.
src/sections/Team/
βββ animations/
β βββ TeamAnimations.ts # Dedicated GSAP logic
βββ components/
β βββ Team.tsx # 3D carousel and section wrapper
β βββ TeamDirectory.tsx # Filterable full-roster modal
βββ data/
β βββ TeamData.ts # Typed roster datasets
βββ styles/
β βββ Team.css
β βββ TeamDirectory.css
β βββ TeamLayout.css
βββ index.ts # Clean unified barrel export
To prevent multiple competing scroll listeners or requestAnimationFrame loops during client-side navigation:
src/utils/lenis.tsmanages an app-wide singleton instance with reference counting (consumerCount).- Calling
acquireLenis()increments the consumer count and activates the RAF loop. - The returned
release()method decrements the counter; when zero consumers remain (e.g., when leaving to a page with native scrolling), the Lenis instance and animation loops are destroyed cleanly.
- Next.js client hydration can cause duplicated plugin registration warnings if
gsap.registerPlugin(ScrollTrigger)is called inside multiple files. src/utils/gsapSetup.tshandles single-point registration:import gsap from "gsap"; import { ScrollTrigger } from "gsap/ScrollTrigger"; gsap.registerPlugin(ScrollTrigger); export { gsap, ScrollTrigger };
- All components import
gsapandScrollTriggerfrom this single utility.
HorizontalFlow embeds vertical-to-horizontal pinning using ScrollTrigger:
const getScrollAmount = () => track.scrollWidth - window.innerWidth;
gsap.to(track, {
x: () => -getScrollAmount(),
ease: "none",
scrollTrigger: {
trigger: container,
start: "top top",
end: () => `+=${getScrollAmount()}`,
pin: true,
scrub: 0.8,
invalidateOnRefresh: true,
},
});When a user clicks a link in the Navbar targeting a panel inside the horizontal track (such as #speakers or #footer), a custom horizontal-flow:navigate event calculates the panel index progress (progress = index / total) and smoothly scrolls the window to the exact vertical trigger offset.
The interactive background in the WhatsApp Community section compiles custom GLSL shaders with Three.js:
- Vertex Shader: Simple full-screen quad geometry passing normalized coordinates.
- Fragment Shader: Computes multi-octave fractional noise, volumetric light falloff, beam convergence points, and dynamic smoke wisps in real-time.
- Mouse movement smoothly tilts the projection vectors using lerped damping values (
mouseSmoothTime).
- Kinetic Jiggle: Words in the Story section are split into individual characters wrapped in
<span className="jiggle-char">, animated with randomized micro-rotations and translations as the user scrolls. - Stroke Drawing: SVG strokes on the loader and floating logo use the
prepareSVGhelper to setstrokeDasharrayandstrokeDashoffsetto the exact path length, animating the offset to0for an organic hand-drawn appearance.
- Every GSAP animation checks
window.matchMedia("(prefers-reduced-motion: reduce)").matches. If active, animations immediately resolve to their final visible state with zero motion overhead. - Videos are throttled and paused when out of the viewport using
IntersectionObserver. - Styles use GPU-accelerated properties (
transform,opacity,filter) to avoid layout thrashing.
- Built-in Schema.org
WebSiteandOrganizationJSON-LD graphs inapp/layout.tsx. - Auto-generated
manifest.webmanifest,robots.txt, andsitemap.xml. - Rich metadata tags for Twitter Cards and OpenGraph with high-resolution WebP banners.
ECell-Web/
βββ .github/
β βββ workflows/
β βββ ci.yml # CI: Typecheck, lint, vitest, and next build
β βββ pr-cd.yml # CD: Automated Vercel preview environments for PRs
β βββ vercel-cd.yml # CD: Automated production deployments on main push
βββ app/ # Next.js 16 App Router
β βββ events/
β β βββ page.tsx # Dedicated /events archive page
β βββ globals.css # Tailwind v4 import & global styles
β βββ layout.tsx # Root HTML, font declarations, JSON-LD, metadata
β βββ manifest.ts # PWA Web App Manifest
β βββ page.tsx # Main Landing Page (Hero, Sections, Horizontal Flow)
β βββ robots.ts # Robots.txt configuration
β βββ sitemap.ts # Dynamic sitemap generator
βββ public/ # Static assets (favicons, logos, videos, manifest)
β βββ assets/videos/ # Optimized MP4 hero videos & poster images
β βββ favicon.* # Multi-resolution icons & SVGs
β βββ og-image.webp # Social preview banner
βββ src/ # Core application source code
β βββ assets/ # Component images, photos, and SVG assets
β βββ components/ # Reusable interactive components
β β βββ EventsArchive.tsx # Filterable events archive grid & modals
β β βββ FloatingLogo/ # Scroll-driven morphing SVG brand mark
β β βββ GameLauncher/ # In-browser arcade (Snake, 2048, Memory, Sprint)
β β βββ HorizontalFlow/ # ScrollTrigger horizontal pinning container
β β βββ LaserFlow/ # Three.js custom GLSL shader canvas
β β βββ LogoModal/ # Brand geometry breakdown dialog
β β βββ PageTransition/ # Full-page curtain transition overlay
β βββ sections/ # Independent modular page sections
β β βββ About/ # Purpose & vision statement with kinetic typography
β β βββ Events/ # Flagship events showcase cards
β β βββ Footer/ # Navigation, social links, watermark emblem
β β βββ Hero/ # Video hero, ScrollTrigger shrink, marquee
β β βββ Loader/ # Initial SVG path-draw preloader
β β βββ Nav/ # Responsive navigation bar & mobile drawer
β β βββ Speakers/ # Keynote speakers spotlight & carousel
β β βββ Sponsors/ # Constellation sponsor graph with SVG connectors
β β βββ Story/ # Narrative reveal section with parallax imagery
β β βββ Team/ # 3D team card stack & full member directory
β β βββ WhatsAppCommunity/ # Interactive simulated chat & WhatsApp link
β β βββ WhyJoin/ # Interactive value-proposition feature cards
β βββ styles/ # Global styles and motion primitives
β β βββ global.css # Color variables, CSS reset, font bindings
β β βββ SectionTransitions.css # Awwwards-tier wipes, blooms, masks
β βββ types/ # Global TypeScript ambient definitions
β β βββ assets.d.ts # Image & video asset module declarations
β βββ utils/ # Core utility helpers
β βββ animations.ts # Shared GSAP tween builders & quickSetters
β βββ constants.ts # Color tokens, animation timings, breakpoints
β βββ gsapSetup.ts # Centralized GSAP & ScrollTrigger registration
β βββ lenis.ts # Shared reference-counted Lenis instance
β βββ math.ts # Lerp, smoothstep, and numeric helpers
βββ tests/ # Automated test suite
β βββ app/ # Route and layout tests
β βββ setup.ts # Vitest test setup and DOM polyfills
β βββ src/ # Component and utility unit tests
βββ .nvmrc # Node.js runtime version pin (24.x)
βββ CONTRIBUTING.md # Contributor guidelines and rules
βββ eslint.config.mjs # ESLint 9 configuration
βββ next.config.ts # Next.js build and security headers configuration
βββ package.json # Project dependencies, scripts, engines
βββ postcss.config.mjs # PostCSS configuration for Tailwind v4
βββ tsconfig.json # TypeScript compiler configuration
βββ vercel.json # Vercel deployment specification
βββ vitest.config.mts # Vitest runner configuration
- Node.js:
24.x(as specified in.nvmrcandpackage.json engines). - npm:
10.xor higher.
If you use nvm or fnm, switch to the compatible Node version:
nvm use-
Clone the repository:
git clone https://github.com/ECell-RVUniversity/ECell-Web.git cd ECell-Web -
Install dependencies:
npm install
-
Start the local development server:
npm run dev
-
Open http://localhost:3000 in your browser.
| Command | Description |
|---|---|
npm run dev |
Starts the Next.js development server with Turbopack |
npm run build |
Compiles the production-ready Next.js application bundle |
npm run start |
Boots the Next.js production server locally |
npm run lint |
Runs ESLint 9 across all TypeScript and React files |
npm run typecheck |
Validates TypeScript types across the entire codebase (tsc --noEmit) |
npm run test |
Executes the Vitest automated test suite once |
npm run test:watch |
Runs Vitest in interactive watch mode for TDD |
The repository uses Vitest along with @testing-library/react and jsdom.
To run the complete test suite:
npm run testTo run tests continuously during feature development:
npm run test:watchAutomated tests cover:
- App Routes: Route mounting and metadata validation (
tests/app/routes.test.ts). - Sections: Renders, interactions, and keyboard accessibility for
Speakers,Team, andWhatsAppCommunity. - Arcade Launcher: Minigame mounting, score progression, and window lifecycle.
- Math & Utilities: Pure math algorithms (
lerp,clamp,smoothstep).
The repository includes a 3-tier GitHub Actions continuous integration and continuous deployment pipeline:
Triggered on every push and pull request to the main branch. Executes:
npm cion Node 24.npm run typecheck(TypeScript type validation).npm run lint(ESLint rule enforcement).npm run test -- --run(Vitest test suite).npm run build(Next.js production compilation).
- Automatically builds a staging preview environment on Vercel for incoming pull requests.
- Attaches the preview URL directly to the GitHub deployment status for testing.
- Triggered automatically on merge/push to
main. - Pre-builds and ships the optimized production build directly to Vercel production.
To configure Vercel deployments, configure these secrets in Repository Settings β Secrets and variables β Actions:
VERCEL_TOKEN: Vercel personal access token with project permissions.VERCEL_ORG_ID: Vercel organization or user ID.VERCEL_PROJECT_ID: Vercel project ID.
We welcome contributions from RV University students, club members, and open-source enthusiasts!
Before opening a pull request, please make sure you:
- Read our complete CONTRIBUTING.md guide.
- Create a dedicated branch:
feature/<feature-name>orfix/<fix-name>. - Keep changes scoped inside your section without modifying shared styles unless coordinated.
- Verify that the build, linter, and tests pass:
npm run typecheck && npm run lint && npm run test && npm run build
Built and maintained with β€οΈ by the ECell RV University Tech Team:
- Akash Bisht β @akash0-real
- Akshay Sujesh β @AkshayS2020git
- Shrisha Poojary β @shrisha77-boop
- Aditya Dixit β @aditya-dixit