diff --git a/app/about/page.tsx b/app/about/page.tsx index 37537c8..20bf797 100644 --- a/app/about/page.tsx +++ b/app/about/page.tsx @@ -82,7 +82,7 @@ export default function AboutPage() {
{[ { value: "20K+", label: "Community Members" }, - { value: "800+", label: "Engineers Trained" }, + { value: "1600+", label: "Engineers Trained" }, { value: "200+", label: "Sessions Delivered" }, { value: "100%", label: "Free Forever" }, ].map((stat, i) => ( diff --git a/app/api/dsoc/applications/[id]/route.ts b/app/api/dsoc/applications/[id]/route.ts index 588f512..8cb1c9a 100644 --- a/app/api/dsoc/applications/[id]/route.ts +++ b/app/api/dsoc/applications/[id]/route.ts @@ -3,6 +3,47 @@ import connectDB from '@/lib/db'; import { DSOCApplication } from '@/models/DSOCApplication'; import { DSOCProject } from '@/models/DSOCProject'; import { DSOCMentee } from '@/models/DSOCMentee'; +import jwt from 'jsonwebtoken'; + +async function getMentorFromToken(request: NextRequest) { + const token = request.cookies.get('dsoc-mentor-token')?.value; + if (!token) return null; + + try { + const decoded = jwt.verify(token, process.env.JWT_SECRET as string) as { id: string; role: string }; + if (decoded.role !== 'dsoc-mentor') return null; + return decoded.id; + } catch { + return null; + } +} + +async function getAdminFromToken(request: NextRequest) { + const token = request.cookies.get('admin-token')?.value; + if (!token) return null; + + try { + const decoded = jwt.verify(token, process.env.JWT_SECRET as string) as { id?: string }; + return decoded.id || null; + } catch { + return null; + } +} + +function hasMentorAccess( + mentorId: string, + project: { mentors?: Array<{ _id?: string } | string> } | null +) { + if (!project || !Array.isArray(project.mentors)) return false; + + return project.mentors.some((mentor) => { + if (!mentor) return false; + if (typeof mentor === 'string') return mentor === mentorId; + if (mentor._id) return mentor._id.toString() === mentorId; + const asAny = mentor as { toString?: () => string }; + return asAny.toString?.() === mentorId; + }); +} // GET single application export async function GET( @@ -12,6 +53,15 @@ export async function GET( try { await connectDB(); const { id } = await params; + + const mentorId = await getMentorFromToken(request); + const adminId = await getAdminFromToken(request); + if (!mentorId && !adminId) { + return NextResponse.json( + { success: false, error: 'Unauthorized' }, + { status: 401 } + ); + } const application = await DSOCApplication.findById(id) .populate('project', 'title organization status mentors') @@ -24,6 +74,16 @@ export async function GET( { status: 404 } ); } + + if (mentorId) { + const project = application.project as { mentors?: Array<{ _id?: string } | string> } | null; + if (!hasMentorAccess(mentorId, project)) { + return NextResponse.json( + { success: false, error: 'Forbidden' }, + { status: 403 } + ); + } + } return NextResponse.json({ success: true, @@ -46,8 +106,16 @@ export async function PUT( try { await connectDB(); const { id } = await params; - - // TODO: Add mentor/admin authentication check + + const mentorId = await getMentorFromToken(request); + const adminId = await getAdminFromToken(request); + if (!mentorId && !adminId) { + return NextResponse.json( + { success: false, error: 'Unauthorized' }, + { status: 401 } + ); + } + const body = await request.json(); const { status, mentorNotes, adminNotes, score } = body; @@ -59,6 +127,19 @@ export async function PUT( { status: 404 } ); } + + if (mentorId) { + const project = await DSOCProject.findById(application.project) + .select('mentors') + .lean(); + + if (!project || !hasMentorAccess(mentorId, project)) { + return NextResponse.json( + { success: false, error: 'Forbidden' }, + { status: 403 } + ); + } + } // Update application if (status) application.status = status; diff --git a/app/api/dsoc/applications/route.ts b/app/api/dsoc/applications/route.ts index 6920ce7..4c6799d 100644 --- a/app/api/dsoc/applications/route.ts +++ b/app/api/dsoc/applications/route.ts @@ -18,6 +18,20 @@ async function getMenteeFromToken(request: NextRequest) { } } +// Helper to get mentor from token +async function getMentorFromToken(request: NextRequest) { + const token = request.cookies.get('dsoc-mentor-token')?.value; + if (!token) return null; + + try { + const decoded = jwt.verify(token, process.env.JWT_SECRET as string) as { id: string; role: string }; + if (decoded.role !== 'dsoc-mentor') return null; + return decoded.id; + } catch { + return null; + } +} + // GET all applications (with filters) export async function GET(request: NextRequest) { try { @@ -26,15 +40,41 @@ export async function GET(request: NextRequest) { const searchParams = request.nextUrl.searchParams; const projectId = searchParams.get('project'); const status = searchParams.get('status'); - const menteeId = await getMenteeFromToken(request); + const mentorOnly = searchParams.get('mentor') === 'true'; + const menteeOnly = searchParams.get('my') === 'true'; + const menteeId = menteeOnly ? await getMenteeFromToken(request) : null; const query: any = {}; - - if (projectId) query.project = projectId; - if (status) query.status = status; - if (menteeId && searchParams.get('my') === 'true') { - query.mentee = menteeId; + + if (mentorOnly) { + const mentorId = await getMentorFromToken(request); + if (!mentorId) { + return NextResponse.json( + { success: false, error: 'Unauthorized' }, + { status: 401 } + ); + } + + const mentorProjects = await DSOCProject.find({ mentors: mentorId }) + .select('_id') + .lean(); + + const mentorProjectIds = mentorProjects.map((project) => project._id.toString()); + + if (projectId) { + if (!mentorProjectIds.includes(projectId)) { + return NextResponse.json({ success: true, data: [] }); + } + query.project = projectId; + } else { + query.project = { $in: mentorProjectIds }; + } + } else { + if (projectId) query.project = projectId; + if (menteeId) query.mentee = menteeId; } + + if (status) query.status = status; const applications = await DSOCApplication.find(query) .populate('project', 'title organization status') diff --git a/app/api/dsoc/mentor/me/route.ts b/app/api/dsoc/mentor/me/route.ts new file mode 100644 index 0000000..4a09d1b --- /dev/null +++ b/app/api/dsoc/mentor/me/route.ts @@ -0,0 +1,45 @@ +import { NextRequest, NextResponse } from 'next/server'; +import connectDB from '@/lib/db'; +import { DSOCMentor } from '@/models/DSOCMentor'; +import jwt from 'jsonwebtoken'; + +export async function GET(request: NextRequest) { + try { + await connectDB(); + + const token = request.cookies.get('dsoc-mentor-token')?.value; + if (!token) { + return NextResponse.json({ success: false }, { status: 200 }); + } + + const decoded = jwt.verify(token, process.env.JWT_SECRET as string) as { + id: string; + role: string; + }; + + if (decoded.role !== 'dsoc-mentor') { + return NextResponse.json({ success: false }, { status: 200 }); + } + + const mentor = await DSOCMentor.findById(decoded.id) + .select('_id name email username isActive') + .lean(); + + if (!mentor || !mentor.isActive) { + return NextResponse.json({ success: false }, { status: 200 }); + } + + return NextResponse.json({ + success: true, + data: { + id: mentor._id, + name: mentor.name, + email: mentor.email, + username: mentor.username, + }, + }); + } catch (error) { + console.error('Error checking DSOC mentor session:', error); + return NextResponse.json({ success: false }, { status: 200 }); + } +} diff --git a/app/api/dsoc/projects/route.ts b/app/api/dsoc/projects/route.ts index 646900a..171ab9a 100644 --- a/app/api/dsoc/projects/route.ts +++ b/app/api/dsoc/projects/route.ts @@ -2,6 +2,20 @@ import { NextRequest, NextResponse } from 'next/server'; import connectDB from '@/lib/db'; import '@/models/DSOCMentor'; import { DSOCProject } from '@/models/DSOCProject'; +import jwt from 'jsonwebtoken'; + +async function getMentorFromToken(request: NextRequest) { + const token = request.cookies.get('dsoc-mentor-token')?.value; + if (!token) return null; + + try { + const decoded = jwt.verify(token, process.env.JWT_SECRET as string) as { id: string; role: string }; + if (decoded.role !== 'dsoc-mentor') return null; + return decoded.id; + } catch { + return null; + } +} // GET all projects with filtering export async function GET(request: NextRequest) { @@ -16,10 +30,22 @@ export async function GET(request: NextRequest) { const search = searchParams.get('search'); const limit = parseInt(searchParams.get('limit') || '50'); const page = parseInt(searchParams.get('page') || '1'); + const mentorOnly = searchParams.get('mentor') === 'true'; // Build query const query: any = { isActive: true }; + if (mentorOnly) { + const mentorId = await getMentorFromToken(request); + if (!mentorId) { + return NextResponse.json( + { success: false, error: 'Unauthorized' }, + { status: 401 } + ); + } + query.mentors = mentorId; + } + if (status) query.status = status; if (difficulty) query.difficulty = difficulty; if (technology) query.technologies = { $in: [technology] }; diff --git a/app/dsoc/components/DSOCNavbar.tsx b/app/dsoc/components/DSOCNavbar.tsx index 08334ec..68bf8da 100644 --- a/app/dsoc/components/DSOCNavbar.tsx +++ b/app/dsoc/components/DSOCNavbar.tsx @@ -2,6 +2,7 @@ import Link from "next/link"; import { useState, useEffect, useRef } from "react"; +import { useRouter } from "next/navigation"; import { Code2, Users, @@ -13,15 +14,19 @@ import { Menu, X, LogIn, - Home + Home, + LogOut } from "lucide-react"; import { HeadlineBar } from "@/components/headline-bar"; import "../styles.css"; export default function DSOCNavbar() { + const router = useRouter(); const [isOpen, setIsOpen] = useState(false); const [exploreOpen, setExploreOpen] = useState(false); const [joinOpen, setJoinOpen] = useState(false); + const [sessionRole, setSessionRole] = useState<'mentee' | 'mentor' | null>(null); + const [sessionChecked, setSessionChecked] = useState(false); const exploreRef = useRef(null); const joinRef = useRef(null); @@ -38,10 +43,60 @@ export default function DSOCNavbar() { return () => document.removeEventListener('mousedown', handleClickOutside); }, []); + useEffect(() => { + checkSession(); + }, []); + + const checkSession = async () => { + try { + const [menteeRes, mentorRes] = await Promise.all([ + fetch('/api/dsoc/mentee/me', { credentials: 'include' }), + fetch('/api/dsoc/mentor/me', { credentials: 'include' }) + ]); + const [menteeData, mentorData] = await Promise.all([ + menteeRes.json(), + mentorRes.json() + ]); + + if (menteeData?.success) { + setSessionRole('mentee'); + } else if (mentorData?.success) { + setSessionRole('mentor'); + } else { + setSessionRole(null); + } + } catch (error) { + console.error('Error checking DSOC session:', error); + setSessionRole(null); + } finally { + setSessionChecked(true); + } + }; + + const handleLogout = async () => { + try { + const endpoint = sessionRole === 'mentor' + ? '/api/dsoc/mentor/logout' + : '/api/dsoc/mentee/logout'; + + await fetch(endpoint, { method: 'POST' }); + } catch (error) { + console.error('Error logging out:', error); + } finally { + setSessionRole(null); + setSessionChecked(true); + router.push('/dsoc/login'); + } + }; + + const dashboardPath = sessionRole === 'mentor' + ? '/dsoc/mentor/dashboard' + : '/dsoc/mentee/dashboard'; + return ( <> -
diff --git a/app/dsoc/mentor/dashboard/page.tsx b/app/dsoc/mentor/dashboard/page.tsx index 681372e..91c8445 100644 --- a/app/dsoc/mentor/dashboard/page.tsx +++ b/app/dsoc/mentor/dashboard/page.tsx @@ -2,12 +2,10 @@ import Link from "next/link"; import { useState, useEffect } from "react"; -import { useRouter } from "next/navigation"; import { Users, FileText, Code2, - LogOut, Plus, Clock, CheckCircle, @@ -47,7 +45,6 @@ interface Application { } export default function MentorDashboard() { - const router = useRouter(); const [projects, setProjects] = useState([]); const [applications, setApplications] = useState([]); const [loading, setLoading] = useState(true); @@ -59,13 +56,22 @@ export default function MentorDashboard() { const fetchData = async () => { try { - // In a real implementation, this would fetch mentor's projects and their applications - const appsRes = await fetch('/api/dsoc/applications'); - const appsData = await appsRes.json(); - + // Fetch applications and projects scoped to the logged-in mentor + const [appsRes, projectsRes] = await Promise.all([ + fetch('/api/dsoc/applications?mentor=true'), + fetch('/api/dsoc/projects?mentor=true&limit=100') + ]); + const [appsData, projectsData] = await Promise.all([ + appsRes.json(), + projectsRes.json() + ]); + if (appsData.success) { setApplications(appsData.data); } + if (projectsData.success) { + setProjects(projectsData.data); + } } catch (error) { console.error('Error fetching data:', error); } finally { @@ -73,10 +79,6 @@ export default function MentorDashboard() { } }; - const handleLogout = async () => { - await fetch('/api/dsoc/mentor/logout', { method: 'POST' }); - router.push('/dsoc/login'); - }; const handleApplicationAction = async (appId: string, status: 'accepted' | 'rejected') => { try { @@ -149,13 +151,6 @@ export default function MentorDashboard() { Discord - @@ -305,12 +300,12 @@ export default function MentorDashboard() { {/* Projects Tab */} {activeTab === 'projects' && (
-
+ {/*
Create New Project -
+
*/} {projects.length === 0 ? (
@@ -319,10 +314,10 @@ export default function MentorDashboard() {

Create your first project to start receiving applications.

- + {/* Create Project - + */}
) : ( projects.map((project) => ( diff --git a/app/dsoc/projects/page.tsx b/app/dsoc/projects/page.tsx index 96ec7b9..ceb8ee0 100644 --- a/app/dsoc/projects/page.tsx +++ b/app/dsoc/projects/page.tsx @@ -405,20 +405,23 @@ export default function ProjectsPage() { )}
-
- - {project.organization} - - {!projectImage && ( -
+
+
+ + {project.organization} + + Paid +
+
+ {!projectImage && ( {project.status} -
- )} - - {project.difficulty} - + )} + + {project.difficulty} + +
diff --git a/app/dsoc/styles.css b/app/dsoc/styles.css index 308c28b..8838641 100644 --- a/app/dsoc/styles.css +++ b/app/dsoc/styles.css @@ -133,11 +133,32 @@ box-shadow: 3px 3px 0px var(--dsoc-dark); } +.dsoc-header-chip { + display: inline-flex; + align-items: center; + padding: 2px 8px; + font-size: 10px; + font-weight: 800; + text-transform: uppercase; + letter-spacing: 0.6px; + border: 2px solid var(--dsoc-dark); + box-shadow: 2px 2px 0px var(--dsoc-dark); + background: var(--dsoc-purple); + color: white; +} + .dark .neo-brutal-badge { border-color: var(--dsoc-light); box-shadow: 3px 3px 0px var(--dsoc-light); } +.dark .dsoc-header-chip { + border-color: var(--dsoc-light); + box-shadow: 2px 2px 0px var(--dsoc-light); + background: var(--dsoc-cyan); + color: var(--dsoc-dark); +} + /* DSOC Navbar */ .dsoc-navbar { background: rgba(255, 248, 240, 0.95); diff --git a/app/fellowship/page.tsx b/app/fellowship/page.tsx index a971cbd..4edf668 100644 --- a/app/fellowship/page.tsx +++ b/app/fellowship/page.tsx @@ -33,6 +33,7 @@ import { useState, useEffect, useRef } from "react" export default function FellowshipPage() { const [isVisible, setIsVisible] = useState(false) const [selectedLevel, setSelectedLevel] = useState(0) + const [selectedTrack, setSelectedTrack] = useState<'fullstack' | 'dataeng'>('fullstack') const [scrollY, setScrollY] = useState(0) const [animatedStats, setAnimatedStats] = useState([0, 0, 0, 0]) const [timelineProgress, setTimelineProgress] = useState(0) @@ -72,7 +73,7 @@ export default function FellowshipPage() { }, [hasAnimatedStats, hasAnimatedTimeline]) const animateStats = () => { - const targets = [30, 12, 300, 3] + const targets = [60, 12, 300, 3] const duration = 2000 const steps = 60 const increment = duration / steps @@ -112,64 +113,69 @@ export default function FellowshipPage() { const levels = [ { - level: 0, - title: "Beginner Track", - subtitle: "All Foundations Covered", - description: "Perfect for absolute beginners starting their coding journey", + track: 'fullstack', + level: "01 - L0", + title: "Full Stack AI Engineering", + subtitle: "Track 01 - Level 0 Foundations", + description: "Master the fundamentals of full stack development with AI-first principles.", duration: "3 months", - intensity: "Beginner Friendly", - dsaSessions: "30 DSA Sessions", - engineeringSessions: "12 Engineering Grind Sessions", + intensity: "Foundation Level", + focus: "Full stack + AI fundamentals", + format: "Guided level (L0)", highlights: [ - "Programming fundamentals", - "Web technologies fundamentals", - "Data structures & algorithms", - "First projects portfolio", - "Mentorship support" + "Frontend & backend fundamentals", + "Prompting and AI workflows", + "APIs, authentication & databases", + "Project-based learning with mentors", + "Capstone project development" ], - icon: , - achievement: "Mentee → Fellow (Bronze)" + icon: , + achievement: "Track 01: L0 -> L1 progression" }, { - level: 1, - title: "Intermediate Track", - subtitle: "4 Advanced Sessions", - description: "For developers with some programming experience", + track: 'fullstack', + level: "01 - L1", + title: "Full Stack AI Engineering", + subtitle: "Track 01 - Level 1 Advanced", + description: "Build production-grade AI features and systems across the full stack.", duration: "3 months", - intensity: "Moderate Pace", - dsaSessions: "30 DSA Sessions", - engineeringSessions: "12 Engineering Grind Sessions", + intensity: "Advanced Level", + focus: "AI systems + production engineering", + format: "Advanced level (L1)", highlights: [ - "Advanced data structures", - "Complex algorithms", - "System design fundamentals", - "Multiple tech stacks", - "Interview preparation" + "Agentic workflows and RAG systems", + "Scalable microservices architecture", + "LLM optimization and quality", + "MLOps and deployment pipelines", + "Industry-ready capstone project" ], - icon: , - achievement: "Fellow (Bronze) → Fellow (Silver)" + icon: , + achievement: "Track 01: L1 expert specialization" }, { - level: 2, - title: "Advanced Track", - subtitle: "4 Expert Sessions", - description: "Intensive program for experienced developers", + track: 'dataeng', + level: "02 - L0", + title: "Data Engineering", + subtitle: "Track 02 - Level 0 Open Track", + description: "Design and build reliable data platforms, pipelines, and analytics solutions.", duration: "3 months", - intensity: "Expert Level", - dsaSessions: "30 DSA Sessions", - engineeringSessions: "12 Engineering Grind Sessions", + intensity: "Flexible Track", + focus: "Data pipelines & warehousing", + format: "Self-paced open track", highlights: [ - "Complex system architecture", - "Advanced algorithms & optimization", - "Leadership & mentoring", - "Industry project collaboration", - "Expert-level certifications" + "Data modeling and warehouse design", + "Batch & streaming pipelines", + "Orchestration and monitoring", + "Cloud infrastructure (AWS, GCP)", + "Data quality and governance" ], - icon: , - achievement: "Fellow (Silver) → Fellow (Gold)" + icon: , + achievement: "Track 02: data platform specialization" } ] + const filteredLevels = levels.filter(level => level.track === selectedTrack) + const timelineData = [ { week: "Week 1-4", @@ -210,11 +216,16 @@ export default function FellowshipPage() { icon: , sessions: "12 Weekend Sessions", description: "Hands-on engineering and project development with 20+ hours of pre-recorded content", - details: [ + details: [ "Every weekend session", "20+ hours of pre-recorded content", "JS, React, Redux, Node.js", "Database design & architecture", + "Data Modeling & Warehousing", + "ETL / ELT pipelines & CDC", + "Spark & Structured Streaming", + "Apache Airflow orchestration", + "Airflow DAG design & modularization", "Microservices & system design", "AWS, Docker, Kubernetes", "CI/CD & DevOps practices" @@ -242,6 +253,10 @@ export default function FellowshipPage() { { name: "Redux", sessions: "2 hours", icon: }, { name: "Node.js", sessions: "2 hours", icon: }, { name: "Database Design", sessions: "2 hours", icon: }, + { name: "Data Modeling", sessions: "2 hours", icon: }, + { name: "Spark & Streaming", sessions: "2 hours", icon: }, + { name: "Cloud Warehouses (BigQuery/Snowflake)", sessions: "2 hours", icon: }, + { name: "Delta Lake / Lakehouse", sessions: "2 hours", icon: }, { name: "System Architecture", sessions: "2 hours", icon: }, { name: "Next.js", sessions: "2 hours", icon: }, { name: "Microservices", sessions: "3x HLD Design", icon: }, @@ -255,7 +270,7 @@ export default function FellowshipPage() { "Recommendations to Companies", "Personal Referral to Companies", "VIP Access to all Events", - "Personalized Mentorship", + "Personalized Guidance", "Mock Interviews", ] @@ -270,8 +285,8 @@ export default function FellowshipPage() { const stats = [ { number: animatedStats[0], - suffix: "", - label: "DSA Grind Sessions", + label: "Tech Sessions", + suffix: "+", icon: , }, { @@ -301,6 +316,47 @@ export default function FellowshipPage() { { label: "Interview Ready", value: 90, icon: }, ] + const transformationSteps = [ + { + number: "01", + title: "Join a Clan", + description: "Get assigned to one of 25 focused clans", + }, + { + number: "02", + title: "Meet Your Mentors", + description: "2-3 mentors per clan tracking progress", + }, + { + number: "03", + title: "Weekly Tracking", + description: "Progress reviews with accountability", + }, + { + number: "04", + title: "Earn Certification", + description: "Bronze, Silver, or Gold", + }, + ] + + const transformationHighlights = [ + { + title: "Personal Mentor", + description: "1:1 guidance from engineers at top companies.", + detail: "Direct support.", + }, + { + title: "30+ Live Sessions", + description: "DSA deep dives, engineering grinds, and mock interviews.", + detail: "", + }, + { + title: "Up to 5 Mock Interviews", + description: "Practice with real engineers. Get feedback. Land your job.", + detail: "", + }, + ] + return ( <>
@@ -355,32 +411,86 @@ export default function FellowshipPage() { Apply for 2026 Fellowship - + */}
- {/* Achievement Tags Preview */} -
- {achievementTags.map((tag, index) => ( - - {tag.level} - - ))} +

+ Whether you're starting from scratch or already have experience and feel stuck, this fellowship is for you. Already building? Use our 1:1 guidance to level up and target better opportunities. +

+ + {/* Palestine Support Banner */} +
+
+ {/* Palestine Flag */} +
+ {/* Black stripe */} +
+ {/* White stripe */} +
+ {/* Green stripe */} +
+ {/* Red triangle */} +
+
+
+ + 🇵🇸 We Stand With Palestine + + + Exclusive Access for Palestinians + +
+
+ {/* 3-Month Transformation Section */} +
+
+
+

+ Your 3-Month Transformation +

+

+ A structured journey from wherever you are to wherever you want to be +

+
+ +
+ {transformationSteps.map((step) => ( +
+
+ {step.number} +
+

{step.title}

+

{step.description}

+
+ ))} +
+ +
+ {transformationHighlights.map((highlight) => ( +
+

{highlight.title}

+

{highlight.description}

+ {highlight.detail ? ( +

{highlight.detail}

+ ) : null} +
+ ))} +
+
+
+ {/* Stats Section */}
- Choose Your Level + Choose Your Track

- DSA & Engineering Tracks + Fellowship Tracks

- Progress through our structured levels designed for different experience stages + Select your preferred learning track and level

-
- {levels.map((level, index) => ( + {/* Track Tabs */} +
+ + +
+ +
+ {filteredLevels.map((level, index) => ( {level.icon}
-
LEVEL {level.level}
+
TRACK {level.level}
@@ -715,12 +857,12 @@ export default function FellowshipPage() {
-
DSA Sessions
-
{level.dsaSessions}
+
Core Focus
+
{level.focus}
-
Engineering
-
{level.engineeringSessions}
+
Track Format
+
{level.format}
@@ -734,7 +876,7 @@ export default function FellowshipPage() {
-
Achievement Path
+
Track Path
{level.achievement}
@@ -798,7 +940,7 @@ export default function FellowshipPage() {

Plus Advanced Topics

- {["ORM (Prisma/TypeORM)", "Microservices", "System Design", "Interview Prep"].map((topic, index) => ( + {["ORM (Prisma/TypeORM)", "Data Modeling", "ETL / ELT & CDC", "Spark & Streaming", "Airflow & Orchestration", "Microservices", "System Design", "Interview Prep"].map((topic, index) => (

- Join 20,000+ students and 800+ successful engineers who transformed their careers through + Join 20,000+ students and 1600+ successful engineers who transformed their careers through FREE mentorship, world-class training, and a community that believes in giving back.

@@ -147,7 +147,7 @@ export default function OurStoryPage() { {[ { number: '7', label: 'Countries' }, { number: '50+', label: 'Universities' }, - { number: '800+', label: 'Engineers Trained' }, + { number: '1600+', label: 'Engineers Trained' }, { number: '100%', label: 'Free Forever' }, ].map((stat, i) => (
@@ -536,7 +536,7 @@ export default function OurStoryPage() { Ready to Transform Your Career?

- Join the community that has helped 800+ engineers level up. It's free. It's intense. It works. + Join the community that has helped 1600+ engineers level up. It's free. It's intense. It works.

diff --git a/app/our-story/page.tsx b/app/our-story/page.tsx index e3a3ff2..844bf32 100644 --- a/app/our-story/page.tsx +++ b/app/our-story/page.tsx @@ -127,7 +127,7 @@ export default function OurStoryPage() { {/* Subheadline */}

- Join 20,000+ members and 800+ successful engineers who transformed their careers through + Join 20,000+ members and 1600+ successful engineers who transformed their careers through FREE mentorship, world-class training, and a community that believes in giving back.

@@ -155,7 +155,7 @@ export default function OurStoryPage() { {[ { number: "7", label: "Countries" }, { number: "50+", label: "Universities" }, - { number: "800+", label: "Engineers Trained" }, + { number: "1600+", label: "Engineers Trained" }, { number: "100%", label: "Free Forever" }, ].map((stat, i) => (
@@ -1056,7 +1056,7 @@ export default function OurStoryPage() { Ready to Transform Your Career?

- Join the community that has helped 800+ engineers level up. + Join the community that has helped 1600+ engineers level up. It's free. It's intense. It works.

diff --git a/components/navbar.tsx b/components/navbar.tsx index 772cec4..5b4dde3 100644 --- a/components/navbar.tsx +++ b/components/navbar.tsx @@ -30,8 +30,8 @@ export default function Navbar() { const applyOptions = [ { href: "/dsoc", label: "DSOC" }, { href: "/fellowship", label: "Fellowship" }, - { href: "/mentorship", label: "Mentorship" }, - //{ href: "/ambassador-program", label: "Ambassadorship" }, + // { href: "/mentorship", label: "Mentorship" }, + // { href: "/ambassador-program", label: "Ambassadorship" }, { href: "/weekend-tech-grind", label: "Weekend Grind" }, ]; diff --git a/images/templates/initiatives/palestine-fellowship-2-summary.svg b/images/templates/initiatives/palestine-fellowship-2-summary.svg index 08b5319..b445f74 100644 --- a/images/templates/initiatives/palestine-fellowship-2-summary.svg +++ b/images/templates/initiatives/palestine-fellowship-2-summary.svg @@ -53,7 +53,7 @@ 50+ Active Mentors - 800+ + 1600+ Engineers Trained 70% diff --git a/scripts/generate-fellowship-ppt.js b/scripts/generate-fellowship-ppt.js index 84b299c..8611523 100644 --- a/scripts/generate-fellowship-ppt.js +++ b/scripts/generate-fellowship-ppt.js @@ -798,7 +798,7 @@ function createFellowshipPresentation() { fill: { color: "2563EB" }, }); const bottomStats = [ - { num: "800+", label: "Engineers Trained" }, + { num: "1600+", label: "Engineers Trained" }, { num: "1000+", label: "Job Placements" }, { num: "67%", label: "Success Rate" }, { num: "50+", label: "Universities Reached" }, @@ -1051,7 +1051,7 @@ function createFellowshipPresentation() { bold: true, color: colors.light, align: "center", lineSpacing: 58, }); - slide15.addText("Join 800+ engineers who have transformed their careers\nthrough the Dev Weekends Fellowship.", { + slide15.addText("Join 1600+ engineers who have transformed their careers\nthrough the Dev Weekends Fellowship.", { x: 0.6, y: 2.5, w: 11.5, fontSize: 16, fontFace: "Arial", color: colors.lightGray, align: "center", lineSpacing: 24, }); diff --git a/scripts/generate-mindmaster-ppt.js b/scripts/generate-mindmaster-ppt.js index 9b1b496..dd2df8c 100644 --- a/scripts/generate-mindmaster-ppt.js +++ b/scripts/generate-mindmaster-ppt.js @@ -888,7 +888,7 @@ function createMindMasterPresentation() { }); const ecoStats = [ { num: "20,000+", label: "Community Members" }, - { num: "800+", label: "Engineers Trained" }, + { num: "1600+", label: "Engineers Trained" }, { num: "7", label: "Countries Reached" }, ]; ecoStats.forEach((stat, i) => { diff --git a/scripts/generate-palestine-fellowship-pdf.js b/scripts/generate-palestine-fellowship-pdf.js index fd4c841..79921b5 100644 --- a/scripts/generate-palestine-fellowship-pdf.js +++ b/scripts/generate-palestine-fellowship-pdf.js @@ -137,7 +137,7 @@ This initiative leverages our existing infrastructure, mentor network, and prove const whyText = `Palestinian youth possess exceptional talent and determination. However, access to quality technical education and mentorship remains severely limited. Remote work opportunities in technology offer a pathway to economic independence that transcends geographical and political constraints. -Dev Weekends has successfully trained 800+ engineers across Pakistan, achieving a 70% placement rate over 8+ years of operation. We are prepared to extend this proven model to serve Palestinian students immediately.`; +Dev Weekends has successfully trained 1600+ engineers across Pakistan, achieving a 70% placement rate over 8+ years of operation. We are prepared to extend this proven model to serve Palestinian students immediately.`; doc.fontSize(11).fillColor(GRAY).text(whyText, 60, 525, { width: 475, @@ -150,7 +150,7 @@ Dev Weekends has successfully trained 800+ engineers across Pakistan, achieving doc.fontSize(10).fillColor(BLACK).text("OUR TRACK RECORD", 80, 665, { characterSpacing: 2 }); - const stats = ["50+ Active Industry Mentors", "800+ Engineers Trained", "70% Placement Rate", "8+ Years of Operation"]; + const stats = ["50+ Active Industry Mentors", "1600+ Engineers Trained", "70% Placement Rate", "8+ Years of Operation"]; stats.forEach((stat, i) => { const xPos = 80 + (i % 2) * 220; const yPos = 690 + Math.floor(i / 2) * 20; diff --git a/university-proposal.html b/university-proposal.html index 1693879..827e73b 100644 --- a/university-proposal.html +++ b/university-proposal.html @@ -421,7 +421,7 @@

Who We Are

- Founded in 2017, we started with a simple belief: talent is everywhere, opportunity is not. What began as weekend coding sessions for a small group of students has grown into a national movement. Today, we operate across 60+ university campuses with a community of 20,000+ members and 800+ successfully placed engineers. + Founded in 2017, we started with a simple belief: talent is everywhere, opportunity is not. What began as weekend coding sessions for a small group of students has grown into a national movement. Today, we operate across 60+ university campuses with a community of 20,000+ members and 1600+ successfully placed engineers.

@@ -434,7 +434,7 @@

Who We Are

Community Members
- 800+ + 1600+
Engineers Trained