---
title: Contributing
description: How to contribute study materials, exam labs, and content updates to the Microsoft Certification Hub, a free open-source community project.
---

> **NOTE:**
>
> This guide has been updated as per May 2026.

If you're interested in supporting the Hub's development and are familiar with [Markdown](https://starlight.astro.build/guides/authoring-content/), read on to learn how to contribute to the project.

Contributions are very welcome and appreciated. Be sure to review [CONTRIBUTING.md](https://github.com/mscerts/hub/blob/main/.github/CONTRIBUTING.md) before getting started with your contribution!

> **CAUTION:**
>
> Supply chain safety.  npm packages can be compromised in supply chain attacks. The Hub uses [Socket.dev](https://socket.dev) to detect malicious packages and recommends all contributors do the same. See the [Socket Firewall setup](#socketdev-firewall-optional) section below.

### Project Structure

This is not the entire project structure, but it's the most important part of the project structure which we recommend you limit your contributions to.

* public (images and static assets)
  * ...
* src
  * assets (official logos)
    * ...
  * components (reusable UI components)
  * content
    * docs
      * aibusiness/ (AI Business exams)
      * azure/ (Azure exams)
      * dynamics/ (Dynamics exams)
      * github/ (GitHub exams)
      * guide/ (certification guides)
      * labs/ (hands-on lab guides)
      * microsoft365/ (Microsoft 365 exams)
      * power/ (Power Platform exams)
      * security/ (Security exams)
      * vouchers/ (voucher offers)
      * **contributing.mdx**
      * labs.mdx
      * office.mdx
      * privacy.mdx
      * supportus.mdx
      * vouchers.mdx
      * welcome.mdx
      * wiki.mdx (Wiki collection)
    * blog (blog posts)
  * layouts (page layouts)
  * pages (routed pages: news, contact, etc.)
  * utils (utility functions)
* astro.config.mjs (Astro configuration)
* package.json (project dependencies)
* tsconfig.json (TypeScript configuration)
* mcp-worker/ (MCP server worker)

## Web-only Contribution

While this method is limited in terms of what you should contribute, you can still contribute to the project by adding new text content on existing pages, fixing typos, or improving existing text content.

### Requirements

* Good understanding of [Markdown](https://starlight.astro.build/guides/authoring-content/)
* Basic understanding of how to use GitHub
* A brain and patience
* A computer and an internet connection

### Setting up the project

1. Fork the project to your GitHub account.

2. Navigate to the file you want to edit in the GitHub repository of your fork.

3. Click on the edit icon on the top right corner of the file.

4. Make your changes in the editor.

5. After making changes, scroll down to the bottom of the page and write a short description of the changes you made.

6. Create a pull request to the main repository. Wait for the maintainers to review your pull request.

7. Celebrate when your pull request is merged!

## IDE-based Contribution

This method is more advanced and allows you to contribute to the project in a more flexible way. You can add new pages, edit existing pages, and add new components to the Hub.
This also allows you to preview your changes locally before submitting a pull request.

### Requirements

* Basic understanding of [Markdown](https://starlight.astro.build/guides/authoring-content/) and [Starlight Components](https://starlight.astro.build/components/using-components/)
* Basic understanding of how to use GitHub
* [Git](https://git-scm.com/downloads) installed on your machine
* A brain and patience
* A computer and an internet connection
* A code editor like VSCode or a GitHub's Codespace
* Optional: [Socket.dev CLI](https://socket.dev) for supply chain security

### Setting up the project

1. Fork the project, then clone it to your local machine and `cd` into the directory.
   If you don't know what any of this means, refer to this [video here](https://youtu.be/CML6vfKjQss?t=106).

2. Install Node.js and pnpm:

   **macOS / Linux**

   We recommend using [nvm](https://github.com/nvm-sh/nvm) to manage Node.js versions:

   ```bash
   curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
   nvm install 22
   ```

   Then install pnpm:

   ```bash
   curl -fsSL https://get.pnpm.io/install.sh | sh -
   ```

   **Windows**

   Download Node.js from [nodejs.org](https://nodejs.org) or use [fnm](https://github.com/Schniz/fnm):

   ```powershell
   winget install Schniz.fnm
   fnm install 22
   ```

   Then install pnpm:

   ```powershell
   iwr https://get.pnpm.io/install.ps1 -useb | iex
   ```

3. Install dependencies:
   ```bash
   pnpm install
   pnpm approve-builds
   ```
   (`pnpm approve-builds` approves optional native build scripts required by some dependencies.)

4. Start the dev server:
   ```bash
   pnpm dev
   ```

5. Open your browser and navigate to `http://localhost:4321` to see the project running.

6. After making changes, make sure you're not breaking anything by previewing your changes locally.
   If there are no errors, commit your changes and push them to your forked repository.

7. Create a pull request to the main repository. Wait for the maintainers to review your pull request.

8. Celebrate when your pull request is merged!

### Socket.dev Firewall (Optional)

The Hub uses [Socket.dev](https://socket.dev) to detect supply chain attacks in npm packages. Setting up aliases lets you use `pnpm` as normal while scanning every install automatically.

First, install the Socket CLI globally:

```bash
npm i -g sfw
```

Then configure shell aliases for your platform:

#### macOS / Linux (Bash / Zsh)

Add to `~/.bashrc` or `~/.zshrc`:

```bash
alias npm="sfw npm"
alias yarn="sfw yarn"
alias pnpm="sfw pnpm"
alias npx="sfw npx"
```

Then run `source ~/.bashrc` (or `~/.zshrc`) to apply.

#### Windows (PowerShell)

Add to your PowerShell profile (`$PROFILE`):

```powershell
function pnpm { sfw pnpm @args }
function npm { sfw npm @args }
function npx { sfw npx @args }
```

Restart PowerShell to apply. Now `pnpm install` runs through Socket automatically.

## VSCode Support

We recommend using [VSCode](https://code.visualstudio.com) or [GitHub Codespaces](https://github.com/features/codespaces) for contributing. The repo includes a pre-configured `.vscode/settings.json` with Markdown paste and drop settings.

Recommended extensions:

* [Astro VSCode Extension](https://marketplace.visualstudio.com/items?itemName=astro-build.astro-vscode)
* [MDX Extension](https://marketplace.visualstudio.com/items?itemName=unifiedjs.vscode-mdx)

## Where to begin?

If you're new to the project, you can start by fixing typos, adding new studying resources, or improving existing guides.
This will help you get familiar with the project structure and the way content is written.

Here are some resources that will help you understand how the Hub works better:

* [Starlight Documentation](https://starlight.astro.build/)
* [Starlight Components](https://starlight.astro.build/components/using-components/)
* [Starlight Markdown Guide](https://starlight.astro.build/guides/authoring-content/)
* [Astro Documentation](https://docs.astro.build/)