Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
766 changes: 766 additions & 0 deletions Backend/package-lock.json

Large diffs are not rendered by default.

12 changes: 10 additions & 2 deletions Backend/package.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
{
"name": "backend",
"version": "1.0.0",
"main": "index.js",
"main": "app.js",
"type": "module",
"scripts": {
"start":"node app.js"
"dev": "node --watch app.js",
"start": "node app.js"
},
"keywords": [],
"author": "",
Expand All @@ -13,5 +15,11 @@
"cors": "^2.8.6",
"express": "^5.2.1",
"ws": "^8.19.0"
},
"devDependencies": {
"@types/node": "^25.3.3",
"ts-node": "^10.9.2",
"tsx": "^4.21.0",
"typescript": "^5.9.3"
}
Comment on lines +19 to 24
Copy link

Copilot AI Mar 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR adds TypeScript-related devDependencies (@types/node, ts-node, tsx, typescript) to the backend, but the backend has no TypeScript files (only app.js). These packages appear unrelated to the dark mode feature described in this PR. Adding "type": "module" and the dev script can be justified as a bug fix (since app.js already uses ES module syntax), but the TypeScript toolchain deps add unnecessary bloat to the backend's devDependencies with no current use case.

Copilot uses AI. Check for mistakes.
}
8 changes: 4 additions & 4 deletions Frontend/client/app/Components/BottomContainer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ import Link from "next/link"
export function BottomContainer(){
return(
<>
<div className="w-full p-5 mt-[6rem] md:mt-[10rem] bg-slate-50 border border-t-slate-300 border-b-slate-300 flex flex-col items-center justify-center">
<div className="w-full p-5 mt-[6rem] md:mt-[10rem] bg-slate-50 dark:bg-gray-800 border border-t-slate-300 dark:border-t-gray-600 border-b-slate-300 dark:border-b-gray-600 flex flex-col items-center justify-center">

<div className="md:w-[40%] w-full flex flex-col items-center mt-[30px]">
<h1 className="md:text-[40px] text-[25px] maintext text-center">Make your first call in seconds.</h1>
<h1 className="md:text-[40px] text-[25px] maintext text-center dark:text-white">Make your first call in seconds.</h1>
</div>

<div className="md:flex md:flex-row flex-col md:space-y-0 items-center justify-center space-x-7 mt-[50px]">
<Link href={"/roomsection"}><button className="text-white w-full font-bold rounded-lg bg-orange-500 p-2">Start a free call</button></Link>
<Link href={"https://github.com/SuperexMack/Callify"}><button className="text-slate-500 w-full md:w-auto mt-5 md:mt-0 hover:text-black font-bold p-2">Contribute to it</button></Link>
<Link href={"/roomsection"} className="text-white w-full font-bold rounded-lg bg-orange-500 p-2 text-center">Start a free call</Link>
<Link href={"https://github.com/SuperexMack/Callify"} className="text-slate-500 w-full md:w-auto mt-5 md:mt-0 hover:text-black dark:hover:text-white font-bold p-2 text-center">Contribute to it</Link>
</div>

</div>
Expand Down
4 changes: 2 additions & 2 deletions Frontend/client/app/Components/Features.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { AnimatedTestimonialsDemo } from "./FeaturesContent";
export function Features(){
return(
<>
<div className="md:w-[60%] w-full mt-[4rem] md:mt-[9rem] flex flex-col md:space-y-0 space-y-5">
<div className="md:w-[60%] w-full mt-[4rem] md:mt-[9rem] flex flex-col md:space-y-0 space-y-5 dark:text-white">

<div>
<h1 className="text-orange-400 text-[20px] font-bold md:text-start md:ml-10 text-center">Features</h1>
Expand All @@ -16,7 +16,7 @@ export function Features(){
</div>

<div className="md:w-[45%] w-full">
<p className="md:text-[18px] text-[15px] text-center font-medium text-slate-500">
<p className="md:text-[18px] text-[15px] text-center font-medium text-slate-500 dark:text-slate-400">
Built lean and focused. We didn't add meeting rooms,
scheduling, or whiteboards we just made one-on-one
calling really, really good.
Expand Down
13 changes: 10 additions & 3 deletions Frontend/client/app/Components/Footer.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
"use client"
import { Linkedin, Github, Twitter, Pentagon } from "lucide-react";
import { Videotape } from 'lucide-react';
import Link from "next/link";
import { useState, useEffect } from "react";

export default function Footer({ myref }: any) {
const [year, setYear] = useState<number | null>(null)

useEffect(() => {
setYear(new Date().getFullYear())
}, [])
Comment on lines +8 to +12
Copy link

Copilot AI Mar 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Footer component was converted to "use client" and the copyright year was changed from the simple {new Date().getFullYear()} to a useState/useEffect pattern that initializes year as null. This causes the copyright year to briefly appear blank (since year ?? "" renders an empty string) until after the component mounts and the effect runs. The original new Date().getFullYear() would render the same value on both server and client, so there's no hydration mismatch risk. The year ?? "" approach needlessly introduces a visual flash and layout shift. The "use client" directive was still correctly needed for the dark mode classes to work with next-themes, but the year can simply remain as {new Date().getFullYear()}.

Copilot uses AI. Check for mistakes.
return (
<>
<div
ref={myref}
className="w-full mt-[100px] hover:cursor-pointer h-auto p-3 z-40 flex flex-col items-center"
className="w-full mt-[100px] hover:cursor-pointer h-auto p-3 z-40 flex flex-col items-center dark:text-gray-200"
>
<div className="md:w-[90%] w-full h-[90%] mt-6 flex justify-around md:flex flex-wrap">
<div className="w-[500px] h-full p-7 flex flex-col space-y-5">
Expand Down Expand Up @@ -37,7 +44,7 @@ export default function Footer({ myref }: any) {

<div>
<p className="">
&copy; {new Date().getFullYear()} Callify. all rights reserved
&copy; {year ?? ""} Callify. all rights reserved
</p>
</div>
</div>
Expand All @@ -60,7 +67,7 @@ export default function Footer({ myref }: any) {
</div>

<div className="w-full h-auto mt-7 overflow-hidden flex items-center justify-center">
<h1 className="font-bold md:text-[120px] sm:text-[100px] text-[50px] text-center mt-10 md:mt-24 bg-gradient-to-b from-neutral-950 to-yellow-200 bg-clip-text text-transparent">
<h1 className="font-bold md:text-[120px] sm:text-[100px] text-[50px] text-center mt-10 md:mt-24 bg-gradient-to-b from-neutral-950 to-yellow-200 dark:from-white dark:to-yellow-400 bg-clip-text text-transparent">
Callify
</h1>
</div>
Expand Down
2 changes: 1 addition & 1 deletion Frontend/client/app/Components/HowtoUser.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ export function Howtouse(){
return(
<>
<div className="md:w-[60%] w-full h-auto flex flex-col space-y-6 mt-[1rem] md:mt-[9rem]">
<h1 className="maintext md:text-[50px] text-[40px] text-center">How to use?</h1>
<h1 className="maintext md:text-[50px] text-[40px] text-center dark:text-white">How to use?</h1>
<div className="w-full h-auto flex items-center justify-center mt-[3rem]">
<HeroVideoDialogDemo></HeroVideoDialogDemo>
</div>
Expand Down
15 changes: 9 additions & 6 deletions Frontend/client/app/Components/Navbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import Link from "next/link"
import { Github , List} from 'lucide-react';
import { Videotape } from 'lucide-react';
import { useState } from "react";
import { ThemeToggle } from "./ThemeToggle";
export default function Navbar({feature,works,pricing}:any){

const [touched,setTouched] = useState(false)
Expand Down Expand Up @@ -37,28 +38,30 @@ export default function Navbar({feature,works,pricing}:any){

return(
<>
<div className="w-full z-50 fixed top-0 bg-white h-[80px] border-b border-b-slate-200 flex items-center justify-center">
<div className="w-full z-50 fixed top-0 bg-white dark:bg-gray-900 h-[80px] border-b border-b-slate-200 dark:border-b-gray-700 flex items-center justify-center">
<div className="absolute left-[10%] flex items-center justify-center space-x-2">
<Videotape className="h-[50px] w-[50px] text-blue-900"></Videotape>
<Link href={"/"}><h1 className="text-[40px] font-bold text-black toptext">Callify</h1></Link>
<Link href={"/"}><h1 className="text-[40px] font-bold text-black dark:text-white toptext">Callify</h1></Link>
</div>

<div className="flex max-[1000px]:hidden justify-center items-center space-x-5">
<div className="flex max-[1000px]:hidden justify-center items-center space-x-5 dark:text-gray-200">
<Link onClick={moveToFeature} href={"/"}>Features</Link>
<Link onClick={moveToworks} href={"/"}>How it works</Link>
<Link onClick={moveToprice} href={"/"}>Contact us</Link>
<Link href={"https://github.com/SuperexMack"}><Github></Github></Link>
<ThemeToggle />
</div>

<div className="absolute min-[1000px]:hidden right-[10%]">
<List onClick={toogle} className="text-black h-[30px] w-[30px]"></List>
<div className="absolute min-[1000px]:hidden right-[10%] flex items-center space-x-3">
<ThemeToggle />
<List onClick={toogle} className="text-black dark:text-white h-[30px] w-[30px]"></List>
</div>

</div>

{touched?(
<>
<div className="flex z-50 fixed top-0 bg-white absolute top-20 p-4 flex-col space-y-5 items-center w-full h-auto border-b border-slate-200 shadow-2xl shadow-slate-300">
<div className="flex z-50 fixed top-0 bg-white dark:bg-gray-900 absolute top-20 p-4 flex-col space-y-5 items-center w-full h-auto border-b border-slate-200 dark:border-gray-700 shadow-2xl shadow-slate-300 dark:shadow-gray-900 dark:text-gray-200">
<Link onClick={moveToFeature} href={"/"}>Features</Link>
<Link onClick={moveToworks} href={"/"}>How it works</Link>
<Link onClick={moveToprice} href={"/"}>Contact us</Link>
Expand Down
17 changes: 17 additions & 0 deletions Frontend/client/app/Components/ThemeProvider.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
"use client"

import { ThemeProvider as NextThemesProvider } from "next-themes"
import { type ReactNode } from "react"

export function ThemeProvider({ children }: { children: ReactNode }) {
return (
<NextThemesProvider
attribute="class"
defaultTheme="light"
enableSystem={false}
disableTransitionOnChange={false}
>
{children}
</NextThemesProvider>
)
}
41 changes: 41 additions & 0 deletions Frontend/client/app/Components/ThemeToggle.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
"use client"

import { useTheme } from "next-themes"
import { Sun, Moon } from "lucide-react"
import { useEffect, useState } from "react"

export function ThemeToggle() {
const { resolvedTheme, setTheme } = useTheme()
const [mounted, setMounted] = useState(false)

useEffect(() => {
setMounted(true)
}, [])

if (!mounted) {
// Return a button placeholder with same dimensions to prevent hydration mismatch
return (
<button
className="p-2 rounded-lg hover:bg-slate-200 dark:hover:bg-slate-700 transition-colors"
aria-label="Toggle theme"
disabled
>
<span className="block h-5 w-5" />
</button>
)
}

return (
<button
onClick={() => setTheme(resolvedTheme === "dark" ? "light" : "dark")}
className="p-2 rounded-lg hover:bg-slate-200 dark:hover:bg-slate-700 transition-colors"
aria-label="Toggle theme"
>
{resolvedTheme === "dark" ? (
<Sun className="h-5 w-5 text-yellow-400" />
) : (
<Moon className="h-5 w-5 text-slate-700" />
)}
</button>
)
}
19 changes: 14 additions & 5 deletions Frontend/client/app/Components/TopPage.tsx
Original file line number Diff line number Diff line change
@@ -1,28 +1,37 @@
"use client"
import "../globals.css"
import Link from "next/link"
import { useRef, useEffect } from "react"

export function TopPagecontent(){
const videoRef = useRef<HTMLVideoElement>(null)

useEffect(() => {
if (videoRef.current) {
videoRef.current.muted = true
}
}, [])
return(
<>
<div className="md:w-[60%] w-full h-auto p-2 flex flex-col items-center space-y-4">
<h1 className="md:text-[70px] text-[34px] font-bold text-black maintext text-center">Video calls that just</h1>
<h1 className="md:text-[70px] text-[34px] font-bold text-black dark:text-white maintext text-center">Video calls that just</h1>
<h1 className="md:text-[70px] text-[40px] font-bold text-orange-500 maintext text-center">Works.</h1>

<div className="md:w-[70%] w-full">
<p className="md:text-[18px] text-[15px] font-light text-center text-slate-600">
<p className="md:text-[18px] text-[15px] font-light text-center text-slate-600 dark:text-slate-400">
One link. No installs. No accounts for guests. Instant peer-to-peer
video calls powered by WebRTC private, fast, and free to start.
Create rooms and start instantly
</p>
</div>

<div className="md:flex md:flex-row md:space-y-0 flex-col space-y-6 items-center justify-center space-x-7 mt-[50px]">
<Link href={"/roomsection"}><button className="text-white w-full bg-amber-600 font-bold rounded-lg p-3">Start a free call</button></Link>
<Link href={"https://github.com/SuperexMack/Callify"}><button className="text-slate-500 md:w-auto hover:cursor-pointer w-full hover:text-black font-bold mt-5 md:mt-0 p-2">Contribute to it</button></Link>
<Link href={"/roomsection"} className="text-white w-full bg-amber-600 font-bold rounded-lg p-3 text-center">Start a free call</Link>
<Link href={"https://github.com/SuperexMack/Callify"} className="text-slate-500 md:w-auto hover:cursor-pointer w-full hover:text-black dark:hover:text-white font-bold mt-5 md:mt-0 p-2 text-center">Contribute to it</Link>
</div>

<div className="p-2 md:w-[70%] w-full md:h-[500px] h-[200px] md:mt-3 flex items-center justify-center">
<video muted autoPlay={true} loop src={"/videostream.mp4"}></video>
<video ref={videoRef} autoPlay loop playsInline src={"/videostream.mp4"}></video>
Copy link

Copilot AI Mar 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The muted attribute has been removed from the <video> JSX element and replaced with a programmatic videoRef.current.muted = true inside useEffect. Without muted in the JSX, the server-side rendered HTML won't include the muted attribute. This means the video element will initially be rendered without muted, which browsers require for autoplay to work. Before the useEffect fires on the client, the autoplay attempt may be blocked by the browser's autoplay policy. The muted attribute should be kept directly on the <video> element as well (e.g., muted={true} or just muted), and the useEffect can remain as a workaround for React's known issue with the muted prop not being set as an HTML attribute.

Suggested change
<video ref={videoRef} autoPlay loop playsInline src={"/videostream.mp4"}></video>
<video ref={videoRef} autoPlay loop playsInline muted src={"/videostream.mp4"}></video>

Copilot uses AI. Check for mistakes.
</div>

</div>
Expand Down
4 changes: 2 additions & 2 deletions Frontend/client/app/Receiver/[id]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -116,13 +116,13 @@ export default function(){

<div className="mt-[9rem] w-full h-auto p-2 md:flex md:flex-row flex-col md:space-y-0 space-y-5 justify-between">

<div className="md:w-[45%] w-full md:h-[500px] h-[300px] object-cover border-2 border-slate-200 rounded-2xl">
<div className="md:w-[45%] w-full md:h-[500px] h-[300px] object-cover border-2 border-slate-200 dark:border-gray-700 rounded-2xl">

<video ref={localVideoRef} autoPlay playsInline muted className="w-full h-full loc"></video>

</div>

<div className="md:w-[45%] w-full md:h-[500px] h-[300px] object-cover border-2 border-slate-200 rounded-2xl">
<div className="md:w-[45%] w-full md:h-[500px] h-[300px] object-cover border-2 border-slate-200 dark:border-gray-700 rounded-2xl">

<video ref={remoteVideoRef} autoPlay playsInline muted className="w-full h-full rem"></video>

Expand Down
4 changes: 2 additions & 2 deletions Frontend/client/app/Sender/[id]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -131,13 +131,13 @@ export default function(){

<div className="mt-[9rem] w-full h-auto p-2 md:flex md:flex-row flex-col md:space-y-0 space-y-5 justify-between">

<div className="md:w-[45%] w-full md:h-[500px] h-[300px] object-cover border-2 border-slate-200 rounded-2xl">
<div className="md:w-[45%] w-full md:h-[500px] h-[300px] object-cover border-2 border-slate-200 dark:border-gray-700 rounded-2xl">

<video ref={LocalvideoRef} autoPlay playsInline muted className="w-full h-full loc"></video>

</div>

<div className="md:w-[45%] w-full md:h-[500px] h-[300px] object-cover border-2 border-slate-200 rounded-2xl">
<div className="md:w-[45%] w-full md:h-[500px] h-[300px] object-cover border-2 border-slate-200 dark:border-gray-700 rounded-2xl">

<video ref={RemotevideoRef} autoPlay playsInline muted className="w-full h-full rem"></video>

Expand Down
1 change: 1 addition & 0 deletions Frontend/client/app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@

body{
overflow-x: hidden;
transition: background-color 0.3s ease, color 0.3s ease;
}

@theme inline {
Expand Down
11 changes: 7 additions & 4 deletions Frontend/client/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import "./globals.css";
import Navbar from "./Components/Navbar";
import Footer from "./Components/Footer";
import NavbarWrapper from "./Components/NavbarWrapper";
import { ThemeProvider } from "./Components/ThemeProvider";

const geistSans = Geist({
variable: "--font-geist-sans",
Expand All @@ -30,11 +31,13 @@ export default function RootLayout({


return (
<html lang="en">
<html lang="en" suppressHydrationWarning>
<body>
<NavbarWrapper></NavbarWrapper>
{children}
<Footer></Footer>
<ThemeProvider>
<NavbarWrapper></NavbarWrapper>
{children}
<Footer></Footer>
</ThemeProvider>
</body>

</html>
Expand Down
12 changes: 6 additions & 6 deletions Frontend/client/app/roomsection/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -63,28 +63,28 @@ export default function() {
<>
<div className="w-full h-auto flex flex-col items-center justify-center">

<div className="md:w-[50%] w-full flex flex-col mt-[9rem] items-center space-y-9 ">
<div className="md:w-[50%] w-full flex flex-col mt-[9rem] items-center space-y-9 dark:text-white">

<div className="w-full p-2">
<h1 className="md:text-[40px] text-[35px] maintext text-center">Video calls and meetings for everyone</h1>
</div>

<div className="md:w-[60%] w-full">
<p className="text-[20px] text-center">Connect to each other to share thoughts and memories or for creatng future</p>
<p className="text-[20px] text-center dark:text-gray-300">Connect to each other to share thoughts and memories or for creatng future</p>
Copy link

Copilot AI Mar 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a spelling error in this line: "creatng" should be "creating".

Suggested change
<p className="text-[20px] text-center dark:text-gray-300">Connect to each other to share thoughts and memories or for creatng future</p>
<p className="text-[20px] text-center dark:text-gray-300">Connect to each other to share thoughts and memories or for creating future</p>

Copilot uses AI. Check for mistakes.
</div>

<div className="md:flex md:flex-row flex-col md:space-y-0 space-y-4 items-center justify-center space-x-4">
<div className="flex space-x-2 p-2 border-2 border-white bg-blue-600 rounded-2xl items-center justify-center">
<Video className="text-white"></Video>
<button onClick={CreateRoom} className="text-white">New Meeting</button>
</div>
<div className="flex space-x-2 p-2 focus-within:ring-2 focus-within:border-blue-600 border border-black rounded-lg items-center justify-center">
<Keyboard className="text-black"></Keyboard>
<input onChange={(e)=>setRoomName(e.target.value)} className="focus:outline-none focus:ring-0" placeholder="Join Instant Meeting"></input>
<div className="flex space-x-2 p-2 focus-within:ring-2 focus-within:border-blue-600 border border-black dark:border-gray-500 rounded-lg items-center justify-center">
<Keyboard className="text-black dark:text-white"></Keyboard>
<input onChange={(e)=>setRoomName(e.target.value)} className="focus:outline-none focus:ring-0 dark:bg-transparent dark:text-white dark:placeholder-gray-400" placeholder="Join Instant Meeting"></input>
</div>

<div className="flex items-center justify-center">
<button onClick={JoinRoom} className="hover:cursor-pointer">Join</button>
<button onClick={JoinRoom} className="hover:cursor-pointer dark:text-white">Join</button>
</div>

</div>
Expand Down
11 changes: 11 additions & 0 deletions Frontend/client/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Frontend/client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"lucide-react": "^0.574.0",
"motion": "^12.34.1",
"next": "16.1.6",
"next-themes": "^0.4.6",
"radix-ui": "^1.4.3",
"random-string-generator": "^1.0.7",
"react": "19.2.3",
Expand Down
Loading