diff --git a/app/(footer)/about/page.tsx b/app/(footer)/about/page.tsx index 49ff391..cd2f8b5 100644 --- a/app/(footer)/about/page.tsx +++ b/app/(footer)/about/page.tsx @@ -13,8 +13,6 @@ import { Zap, Scale, CheckCircle2, - BookOpen, - Cpu, Network, Binary, Search, @@ -22,35 +20,42 @@ import { TrendingUp, Heart } from "lucide-react"; +import { siteConfig } from "@/lib/seo"; export const metadata: Metadata = { title: "About FlagForge | CTF Platform for Cybersecurity Learning", - description: "FlagForge is a dynamic CTF platform promoting cybersecurity awareness and hands-on coding challenges. Join our global community of learners.", + description: + "Learn what FlagForge is, how the platform teaches capture the flag skills, and why the community focuses on practical cybersecurity learning.", keywords: [ - "CTF", - "cybersecurity", - "capture the flag", - "coding challenges", - "hacking", - "security learning", - "FlagForge", + "About FlagForge", + "FlagForge CTF platform", + "cybersecurity learning", + "capture the flag training", "Nepal cybersecurity community", ], authors: [{ name: "FlagForge Team" }], + alternates: { + canonical: "/about", + }, + robots: { + index: true, + follow: true, + }, openGraph: { - title: "About FlagForge | CTF Platform", - description: "Where curiosity meets cybersecurity. Learn, compete, and grow with our global community.", + title: "About FlagForge | CTF Platform for Cybersecurity Learning", + description: + "See how FlagForge helps learners practice cybersecurity skills through hands-on capture the flag challenges.", type: "website", - siteName: "FlagForge", - url: "https://flagforgectf.com/about", + siteName: siteConfig.name, + url: `${siteConfig.url}/about`, + images: [{ url: siteConfig.ogImage, alt: "About FlagForge" }], }, twitter: { card: "summary_large_image", - title: "About FlagForge | CTF Platform", - description: "Where curiosity meets cybersecurity. Learn, compete, and grow with our global community.", - }, - alternates: { - canonical: "/about", + title: "About FlagForge | CTF Platform for Cybersecurity Learning", + description: + "See how FlagForge helps learners practice cybersecurity skills through hands-on capture the flag challenges.", + images: [siteConfig.ogImage], }, }; @@ -58,27 +63,26 @@ export default function About() { const breadcrumbData = { "@context": "https://schema.org", "@type": "BreadcrumbList", - "itemListElement": [ + itemListElement: [ { "@type": "ListItem", - "position": 1, - "name": "Home", - "item": "https://flagforgectf.com/" + position: 1, + name: "Home", + item: `${siteConfig.url}/`, }, { "@type": "ListItem", - "position": 2, - "name": "About", - "item": "https://flagforgectf.com/about" - } - ] + position: 2, + name: "About", + item: `${siteConfig.url}/about`, + }, + ], }; return (
- {/* Background Effects */}
@@ -86,8 +90,6 @@ export default function About() {
- - {/* Header Section */}
@@ -98,22 +100,17 @@ export default function About() { About FlagForge

- "Where curiosity meets cybersecurity." + Capture the flag training built for real cybersecurity growth.

FlagForge is a dynamic and engaging CTF platform dedicated to promoting{" "} - - Cybersecurity - {" "} - awareness and fostering a passion for coding among participants. + Cybersecurity{" "} + awareness and helping learners build practical security skills through hands-on challenge solving.

- {/* Main Content Dashboard */}
- - {/* Platform & Features Card */}
@@ -125,12 +122,10 @@ export default function About() {

Our Platform

- Our platform features a clean, responsive interface and an easy-to-use - experience. Flags are securely submitted and efficiently validated for - fair play. Participants can track scores on a real-time leaderboard. - With Google Authentication, users can sign in instantly and start - solving. Challenges can be filtered by category and difficulty, - helping participants find content that fits their skills and interests. + FlagForge combines guided learning resources, practical CTF challenges, and a community-focused + interface so learners can study cybersecurity by doing. Participants can sign in quickly, filter + challenges by category, track progress, and move from beginner-friendly puzzles into deeper + problem-solving across web, crypto, forensics, and binary analysis.

@@ -141,9 +136,8 @@ export default function About() {

Our Mission

- To make cybersecurity learning accessible and engaging through practical - challenges, collaboration, and gamified experiences that empower learners - worldwide. + To make cybersecurity learning accessible and engaging through practical challenges, + collaboration, and gamified experiences that empower learners worldwide.

@@ -152,8 +146,8 @@ export default function About() {

Our Vision

- To build a global community where future cybersecurity experts and developers - learn, compete, and grow together. + To build a trusted capture the flag community where future security engineers learn, compete, + and grow together.

@@ -161,10 +155,10 @@ export default function About() {
{[ - { icon: Lock, title: "Secure", desc: "End-to-end encrypted communication" }, - { icon: Users, title: "Collaborative", desc: "Direct participant-organizer communication" }, - { icon: Globe, title: "Global", desc: "Worldwide network of participants" }, - { icon: ShieldAlert, title: "Private", desc: "Responsible disclosure practices" }, + { icon: Lock, title: "Secure", desc: "Practice in a controlled learning environment" }, + { icon: Users, title: "Collaborative", desc: "Built for students, teams, and communities" }, + { icon: Globe, title: "Open", desc: "Rooted in Nepal and accessible to global learners" }, + { icon: ShieldAlert, title: "Responsible", desc: "Focused on ethical hacking and safe skill-building" }, ].map((feature, i) => (
- {/* Ethical Hacking Disclosure Card */}
@@ -196,7 +189,7 @@ export default function About() {

- Educational Purpose & Ethical Hacking + Educational Purpose and Ethical Hacking

@@ -205,9 +198,7 @@ export default function About() {

All challenges and activities on FlagForge are intended to teach responsible security practices. We strictly prohibit the use of knowledge gained on our platform for any illegal activities, unauthorized access to systems, or malicious purposes.

-

- By participating in FlagForge challenges, users agree to: -

+

By participating in FlagForge challenges, users agree to:

    {[ "Use their skills only for legal and ethical purposes", @@ -231,45 +222,44 @@ export default function About() {
- {/* Learning Categories Grid */}

- What You'll Learn + What You'll Learn

-

Comprehensive cybersecurity skills development

+

Core challenge areas available across the FlagForge learning experience

{[ { title: "Web Security", icon: Globe, - skills: ["XSS Prevention", "SQL Injection Defense", "CSRF Protection", "Secure Authentication"] + skills: ["XSS prevention", "SQL injection defense", "CSRF protection", "Secure authentication"] }, { title: "Cryptography", icon: Lock, - skills: ["Encryption Basics", "Hash Functions", "Digital Signatures", "Secure Communication"] + skills: ["Encryption basics", "Hash functions", "Digital signatures", "Secure communication"] }, { title: "Network Security", icon: Network, - skills: ["Protocol Analysis", "Packet Inspection", "Firewall Configuration", "Intrusion Detection"] + skills: ["Protocol analysis", "Packet inspection", "Firewall concepts", "Intrusion detection"] }, { title: "Reverse Engineering", icon: Binary, - skills: ["Binary Analysis", "Debugging Techniques", "Code Decompilation", "Malware Analysis"] + skills: ["Binary analysis", "Debugging techniques", "Code decompilation", "Malware analysis"] }, { title: "Forensics", icon: Search, - skills: ["Data Recovery", "Log Analysis", "Memory Forensics", "Evidence Collection"] + skills: ["Data recovery", "Log analysis", "Memory forensics", "Evidence collection"] }, { title: "Problem Solving", icon: Puzzle, - skills: ["Critical Thinking", "Pattern Recognition", "Logical Reasoning", "Creative Solutions"] + skills: ["Critical thinking", "Pattern recognition", "Logical reasoning", "Creative solutions"] } ].map((category, i) => (
- {/* Stats & Community Card */}
@@ -302,15 +291,15 @@ export default function About() {

Join Our Growing Community

- Built by passionate developers and cybersecurity enthusiasts, FlagForge is more than just a platformβ€”it's a community dedicated to helping others learn, grow, and forge their own path in technology and cybersecurity. + Built by passionate developers and cybersecurity enthusiasts, FlagForge is more than just a platform. It is a community dedicated to helping others learn, grow, and build practical security confidence.

{[ - { label: "Active Users", value: "1000+", icon: Users }, - { label: "Challenges Solved", value: "500+", icon: TrendingUp }, - { label: "Learning Support", value: "24/7", icon: Heart } + { label: "Active users", value: "1000+", icon: Users }, + { label: "Challenges solved", value: "500+", icon: TrendingUp }, + { label: "Learning support", value: "24/7", icon: Heart } ].map((stat, i) => (
@@ -326,7 +315,6 @@ export default function About() {
- {/* Call to Action */}
-
diff --git a/app/(footer)/contact/page.tsx b/app/(footer)/contact/page.tsx index a0b41d6..17952bb 100644 --- a/app/(footer)/contact/page.tsx +++ b/app/(footer)/contact/page.tsx @@ -7,33 +7,35 @@ import { Send, Home } from "lucide-react"; +import { siteConfig } from "@/lib/seo"; export const metadata: Metadata = { - title: "Contact Us - FlagForge CTF Platform", + title: "Contact FlagForge | CTF Support and Cybersecurity Collaboration", description: - "Contact FlagForge for CTF support and cybersecurity inquiries via email, phone, or our Lalitpur office.", + "Contact FlagForge for platform support, partnerships, CTF collaboration, or general cybersecurity learning inquiries.", keywords: [ "contact FlagForge", - "CTF support", - "cybersecurity help", - "FlagForge team", - "Nepal cybersecurity support", - "Nepal CTF community", + "FlagForge support", + "CTF platform contact", + "cybersecurity collaboration", + "Nepal cybersecurity community", ], authors: [{ name: "FlagForge Team" }], openGraph: { - title: "Contact FlagForge - Get in Touch", + title: "Contact FlagForge | CTF Support and Cybersecurity Collaboration", description: - "Contact the FlagForge team for inquiries, support, or collaboration opportunities.", - url: "https://flagforgectf.com/contact", + "Contact the FlagForge team for platform support, partnerships, or cybersecurity collaboration.", + url: `${siteConfig.url}/contact`, type: "website", - siteName: "FlagForge", + siteName: siteConfig.name, locale: "en_US", + images: [{ url: siteConfig.ogImage, alt: "Contact FlagForge" }], }, twitter: { - card: "summary", - title: "Contact FlagForge - Get in Touch", + card: "summary_large_image", + title: "Contact FlagForge | CTF Support and Cybersecurity Collaboration", description: "Reach out to the FlagForge team for support, inquiries, or collaboration.", + images: [siteConfig.ogImage], }, alternates: { canonical: "/contact", @@ -47,31 +49,24 @@ export const metadata: Metadata = { export default function Contact() { return (
- - {/* Background Effects */}
-
+
+
- - {/* Compact Glass Dashboard */}
-
- - {/* Left Column: Header & Info */}
-

- Contact Us + Contact FlagForge

- Get in touch with us. We'd love to hear from you! + Reach the team for platform support, partnership conversations, and CTF or cybersecurity learning inquiries.

-

FlagForge Contact Details

+

FlagForge contact details

Email, phone, and office location

@@ -79,7 +74,7 @@ export default function Contact() {

Get in Touch

{[ - { icon: Mail, label: "Email", value: "info@flagforgectf.com", href: "mailto:info@flagforgectf.com" }, + { icon: Mail, label: "Email", value: "info@flagforge.xyz", href: "mailto:info@flagforge.xyz" }, { icon: Phone, label: "Phone", value: "+977 9828137085", href: "tel:+9779828137085" }, { icon: MapPin, label: "Address", value: "Lalitpur, 44600" } ].map((item, idx) => ( @@ -108,10 +103,9 @@ export default function Contact() {
- {/* Right Column: Contact Form */}

- Send us a Message + Send Us a Message

@@ -155,7 +149,6 @@ export default function Contact() {
-
diff --git a/app/(main)/blogs/[id]/page.tsx b/app/(main)/blogs/[id]/page.tsx index a100804..a85c03f 100644 --- a/app/(main)/blogs/[id]/page.tsx +++ b/app/(main)/blogs/[id]/page.tsx @@ -6,6 +6,7 @@ import type { PartialBlockObjectResponse, } from "@notionhq/client/build/src/api-endpoints"; import JsonLd from "@/components/JsonLd"; +import { siteConfig } from "@/lib/seo"; import BlogPostClient from "./BlogPostClient"; export const revalidate = 300; @@ -228,13 +229,13 @@ export async function generateMetadata({ description, keywords, alternates: { - canonical: `/blogs/${canonicalSlug}`, + canonical: `${siteConfig.blogUrl}/${canonicalSlug}`, }, openGraph: { title: post.title, description, type: "article", - url: `/blogs/${canonicalSlug}`, + url: `${siteConfig.blogUrl}/${canonicalSlug}`, images: imageUrl ? [{ url: imageUrl, alt: post.title }] : [], }, twitter: { @@ -254,8 +255,7 @@ export default async function BlogPostPage({ const { id } = await params; const post = await fetchBlogPost(id); const postSlug = post?.slug || id; - const seoImage = - post?.cover || post?.thumbnail || post?.image || "https://flagforgectf.com/flagforge-logo.png"; + const seoImage = post?.cover || post?.thumbnail || post?.image || siteConfig.ogImage; const wordCount = post?.content ? post.content.split(/\s+/).filter(Boolean).length : undefined; @@ -286,18 +286,18 @@ export default async function BlogPostPage({ name: "FlagForge", logo: { "@type": "ImageObject", - url: "https://flagforgectf.com/flagforge-logo.png", + url: siteConfig.ogImage, }, }, mainEntityOfPage: { "@type": "WebPage", - "@id": `https://flagforgectf.com/blogs/${postSlug}`, + "@id": `${siteConfig.blogUrl}/${postSlug}`, }, keywords: post.tags?.join(", ") || "", isPartOf: { "@type": "Blog", name: "FlagForge Blog", - url: "https://flagforgectf.com/blogs", + url: siteConfig.blogUrl, }, }} /> @@ -310,19 +310,19 @@ export default async function BlogPostPage({ "@type": "ListItem", position: 1, name: "Home", - item: "https://flagforgectf.com/", + item: `${siteConfig.url}/`, }, { "@type": "ListItem", position: 2, name: "Blogs", - item: "https://flagforgectf.com/blogs", + item: siteConfig.blogUrl, }, { "@type": "ListItem", position: 3, name: post.title, - item: `https://flagforgectf.com/blogs/${postSlug}`, + item: `${siteConfig.blogUrl}/${postSlug}`, }, ], }} diff --git a/app/(main)/blogs/layout.tsx b/app/(main)/blogs/layout.tsx index 88ee465..0a33b42 100644 --- a/app/(main)/blogs/layout.tsx +++ b/app/(main)/blogs/layout.tsx @@ -1,26 +1,29 @@ import type { Metadata } from "next"; import type { ReactNode } from "react"; +import { siteConfig } from "@/lib/seo"; export const metadata: Metadata = { - title: "FlagForge Blog", + title: "FlagForge Blog | CTF Guides and Cybersecurity Tutorials", description: - "Read FlagForge blog posts on CTF challenges, cybersecurity tutorials, and competition guides.", + "Read FlagForge blog posts covering capture the flag walkthroughs, cybersecurity tutorials, learning paths, and community updates.", alternates: { - canonical: "/blogs", + canonical: siteConfig.blogUrl, }, openGraph: { - title: "FlagForge Blog", + title: "FlagForge Blog | CTF Guides and Cybersecurity Tutorials", description: - "Read FlagForge blog posts on CTF challenges, cybersecurity tutorials, and competition guides.", - url: "https://flagforgectf.com/blogs", + "Read FlagForge blog posts covering capture the flag walkthroughs, cybersecurity tutorials, learning paths, and community updates.", + url: siteConfig.blogUrl, type: "website", - siteName: "FlagForge", + siteName: siteConfig.name, + images: [{ url: siteConfig.ogImage, alt: "FlagForge Blog" }], }, twitter: { card: "summary_large_image", - title: "FlagForge Blog", + title: "FlagForge Blog | CTF Guides and Cybersecurity Tutorials", description: - "Read FlagForge blog posts on CTF challenges, cybersecurity tutorials, and competition guides.", + "Read FlagForge blog posts covering capture the flag walkthroughs, cybersecurity tutorials, learning paths, and community updates.", + images: [siteConfig.ogImage], }, }; diff --git a/app/(main)/blogs/page.tsx b/app/(main)/blogs/page.tsx index d9c088a..8110dcd 100644 --- a/app/(main)/blogs/page.tsx +++ b/app/(main)/blogs/page.tsx @@ -38,7 +38,7 @@ export default function BlogsPage() { "@type": "ListItem", "position": 2, "name": "Blogs", - "item": "https://flagforgectf.com/blogs" + "item": "https://blogs.flagforgectf.com" } ] }; @@ -135,11 +135,11 @@ export default function BlogsPage() { "@type": "Blog", name: "FlagForge Blog", description: "Discover insights, tutorials, and stories from our team at FlagForge.", - url: "https://flagforgectf.com/blogs", + url: "https://blogs.flagforgectf.com", blogPost: posts.map((post) => ({ "@type": "BlogPosting", headline: post.title, - url: `https://flagforgectf.com/blogs/${post.slug || post.id}`, + url: `https://blogs.flagforgectf.com/${post.slug || post.id}`, datePublished: post.created, description: post.excerpt, })), diff --git a/app/(main)/resources/layout.tsx b/app/(main)/resources/layout.tsx index db1266a..e5b8f04 100644 --- a/app/(main)/resources/layout.tsx +++ b/app/(main)/resources/layout.tsx @@ -1,26 +1,29 @@ import type { Metadata } from "next"; import type { ReactNode } from "react"; +import { siteConfig } from "@/lib/seo"; export const metadata: Metadata = { - title: "Learning Resources", + title: "FlagForge Resources | CTF Learning Materials and Security Study Guides", description: - "Explore FlagForge learning resources and CTF training materials organized by category to build cybersecurity skills.", + "Explore FlagForge resources for capture the flag preparation, cybersecurity study paths, curated tools, and practical learning materials.", alternates: { canonical: "/resources", }, openGraph: { - title: "Learning Resources - FlagForge", + title: "FlagForge Resources | CTF Learning Materials and Security Study Guides", description: - "Explore FlagForge learning resources and CTF training materials organized by category to build cybersecurity skills.", - url: "https://flagforgectf.com/resources", + "Explore FlagForge resources for capture the flag preparation, cybersecurity study paths, curated tools, and practical learning materials.", + url: `${siteConfig.url}/resources`, type: "website", - siteName: "FlagForge", + siteName: siteConfig.name, + images: [{ url: siteConfig.ogImage, alt: "FlagForge Resources" }], }, twitter: { card: "summary_large_image", - title: "Learning Resources - FlagForge", + title: "FlagForge Resources | CTF Learning Materials and Security Study Guides", description: - "Explore FlagForge learning resources and CTF training materials organized by category to build cybersecurity skills.", + "Explore FlagForge resources for capture the flag preparation, cybersecurity study paths, curated tools, and practical learning materials.", + images: [siteConfig.ogImage], }, }; diff --git a/app/globals.css b/app/globals.css index f9010ef..ddad2f5 100644 --- a/app/globals.css +++ b/app/globals.css @@ -65,6 +65,7 @@ body { @apply bg-background text-foreground; + font-family: "Segoe UI", "Aptos", "Helvetica Neue", Arial, sans-serif; } /* Custom dark mode styles */ diff --git a/app/layout.tsx b/app/layout.tsx index 18f52c1..8ae81d0 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,5 +1,4 @@ import type { Metadata, Viewport } from "next"; -import { DM_Sans } from "next/font/google"; import Script from "next/script"; import "./globals.css"; import Navbar from "@/components/Navbar"; @@ -8,40 +7,20 @@ import CookieConsent from "@/components/CookieConsent"; import Authprovider from "@/providers/auth-provider"; import { ThemeProvider } from "@/context/ThemeContext"; import { Analytics } from "@vercel/analytics/react"; - -const dmSans = DM_Sans({ - subsets: ["latin"], - display: "swap", - preload: true, -}); +import { defaultKeywords, siteConfig } from "@/lib/seo"; export const metadata: Metadata = { + metadataBase: new URL(siteConfig.url), title: { - default: "FlagForge - The Ultimate CTF Platform", + default: "FlagForge | Capture the Flag Platform for Cybersecurity Training", template: "%s | FlagForge", }, - description: - "Join FlagForge, the premier CTF platform to hone your cybersecurity skills with engaging challenges. Compete, learn, and grow your hacking expertise.", - metadataBase: new URL("https://flagforgectf.com"), - applicationName: "FlagForge CTF", + description: siteConfig.description, + applicationName: siteConfig.name, referrer: "origin-when-cross-origin", - keywords: [ - "CTF", - "Capture The Flag", - "Cybersecurity", - "Ethical Hacking", - "FlagForge", - "CTF Challenges", - "Cybersecurity Platform", - "Online CTF Competitions", - "Nepal cybersecurity", - "Nepal CTF platform", - ], - authors: [{ name: "@Aryanstha", url: "https://github.com/aryan4859" }], - publisher: "FlagForge", - alternates: { - canonical: "/", - }, + keywords: defaultKeywords, + authors: [{ name: "FlagForge Team", url: "https://github.com/FlagForgeCTF/" }], + publisher: siteConfig.name, robots: { index: true, follow: true, @@ -57,17 +36,16 @@ export const metadata: Metadata = { "google-adsense-account": "ca-pub-2506540900080142", }, openGraph: { - title: "FlagForge - The Ultimate CTF Platform", - description: - "FlagForge is the go-to platform for Capture The Flag (CTF) competitions. Test your hacking skills with thrilling challenges in cybersecurity.", - url: "https://flagforgectf.com", - siteName: "FlagForge", + title: "FlagForge | Capture the Flag Platform for Cybersecurity Training", + description: siteConfig.description, + url: siteConfig.url, + siteName: siteConfig.name, images: [ { - url: "/flagforge.gif", + url: siteConfig.ogImage, width: 1200, height: 630, - alt: "FlagForge - Capture The Flag Platform", + alt: "FlagForge CTF Platform", }, ], locale: "en_US", @@ -75,11 +53,9 @@ export const metadata: Metadata = { }, twitter: { card: "summary_large_image", - site: "@Aryanstha", - title: "FlagForge - The Ultimate CTF Platform", - description: - "Join FlagForge, the leading Capture The Flag platform to enhance your cybersecurity skills. Compete and learn with exciting CTF challenges.", - images: ["/flagforge.gif"], + title: "FlagForge | Capture the Flag Platform for Cybersecurity Training", + description: siteConfig.description, + images: [siteConfig.ogImage], }, icons: { icon: "/favicon.ico", @@ -95,37 +71,6 @@ export const viewport: Viewport = { userScalable: true, }; -const structuredData = { - "@context": "https://schema.org", - "@graph": [ - { - "@type": "WebSite", - "@id": "https://flagforgectf.com/#website", - url: "https://flagforgectf.com", - name: "FlagForge", - alternateName: "FlagForge CTF Platform", - potentialAction: { - "@type": "SearchAction", - target: "https://flagforgectf.com/search?q={search_term_string}", - "query-input": "required name=search_term_string", - }, - publisher: { - "@id": "https://flagforgectf.com/#organization", - }, - }, - { - "@type": "Organization", - "@id": "https://flagforgectf.com/#organization", - name: "FlagForge", - url: "https://flagforgectf.com", - logo: { - "@type": "ImageObject", - url: "https://flagforgectf.com/flagforge-logo.png", - }, - }, - ], -}; - export default function RootLayout({ children, }: { @@ -133,22 +78,13 @@ export default function RootLayout({ }) { return ( - -