diff --git a/common/routes.js b/common/routes.js index f6225471..a06d3aa3 100644 --- a/common/routes.js +++ b/common/routes.js @@ -30,4 +30,6 @@ export const Y2024 = makePath('/2024') export const NEWS = makePath("/news") -export const PARTNER_PACK = makePath('/partner-pack') \ No newline at end of file +export const PARTNER_PACK = makePath('/partner-pack') + +export const SECURITY_CHALLENGE = makePath('/security-challenge') \ No newline at end of file diff --git a/components/header/Header.jsx b/components/header/Header.jsx index 82d1a187..d07c9ad7 100644 --- a/components/header/Header.jsx +++ b/components/header/Header.jsx @@ -11,6 +11,7 @@ import GitHubLogo from '../../public/icons/github-logo' import IconCalendar from '../../public/icons/calendar' import IconBooks from '../../public/icons/books' import BoxGift from '../../public/icons/box-gift' +import IconShield from '../../public/icons/shield' import { BREAKPOINTS } from '../../common/constants' const Header = () => { @@ -81,7 +82,20 @@ const Header = () => {
  • + + + {getLiteral('navigation:security-challenge')} + + +
  • +
  • + { + // Use a distinctive animation step for Security Challenge + setAnimationStep(3) + }, [setAnimationStep]) + + // Skills course data + const skillsCourses = [ + { + title: "Secure Your Repository's Supply Chain", + description: "Learn how to secure your repository's supply chain with proper dependency management", + link: "https://github.com/skills/secure-repository-supply-chain", + icon: "đź”’" + }, + { + title: "Introduction to Secret Scanning", + description: "Learn how to prevent accidental secret leaks and secure your repositories", + link: "https://github.com/skills/introduction-to-secret-scanning", + icon: "🔍" + }, + { + title: "Introduction to Repository Management", + description: "Learn best practices for effective repository management and security", + link: "https://github.com/skills/introduction-to-repository-management", + icon: "📚" + } + ] + + // Convert markdown content to HTML + const content = marked(` +This Maintainer Month, we’re inviting open source maintainers to build their security skills through a hands-on challenge. Complete **three free GitHub Skills courses** and get a free voucher to earn your [GitHub Advanced Security certification](https://examregistration.github.com/certification/GHAS). + +## How it Works + +### Step 1: Complete these 3 GitHub Skills +Each one takes about 1 hour + `) + + + // Convert markdown content to HTML + const content_end = marked(` +### Step 2: Submit the Completion Form +Once you’ve finished all three, [fill out this form](https://forms.gle/HhPm3VofYDCiXeBB9) to share your progress and **claim your free certification voucher**. + +🗓️ Deadline: Submit your form by May 31, 2025 to be eligible for the voucher. + +### Step 3. Get Certified! +We’ll email you a voucher to register for the GitHub Advanced Security certification (valued at $99 USD) and showcase your expertise - for free! + +## Why This Matters +Maintainers often carry the responsibility of software security—but don’t always have access to the right training or recognition. This challenge helps you build real-world skills and earn a GitHub-backed credential that showcases your expertise. + +## FAQ +#### Who can participate? +Anyone! While we’re celebrating open source maintainers, this challenge is open to all contributors who want to grow their security skills. + +#### How long does it take? +Each GitHub Skill takes about 1 hour, so expect to spend around 3 hours total. + +#### How many vouchers are available? +Vouchers are limited and offered on a first-come, first-served basis. [Submit your form](https://forms.gle/HhPm3VofYDCiXeBB9) by May 31 to qualify! + +#### I have more questions! +If you have any questions about the challenge, please reach out to us at [maintainermonth@github.com](mailto:maintainermonth@github.com). + `) + return ( +
    + + Security Challenge - Maintainer Month 2025 + + + {/* */} + + + + + {/* */} + + + + + + +
    +
    +

    Security Challenge

    +

    Secure Your Open Source Projects & Earn a Free Certification!

    +
    +
    +
    +
    +
    + {skillsCourses.map((course, index) => ( +
    +
    + {course.icon} +
    +
    +

    {course.title}

    +

    {course.description}

    +
    + +
    + ))} +
    +
    + +
    + +
    +
    +
    + ) +} \ No newline at end of file diff --git a/public/icons/shield.js b/public/icons/shield.js new file mode 100644 index 00000000..33f3a1b5 --- /dev/null +++ b/public/icons/shield.js @@ -0,0 +1,32 @@ +const IconShield = () => { + return ( + + + + + ) +} + +export default IconShield \ No newline at end of file