+ Add Extension

Add your extension

You can add your extension to this gallery as part of your build automation using one of these methods:

  1. GitHub Actions (recommended)
  2. PowerShell
  3. AppVeyor

Use GitHub Actions

GitHub Actions is the recommended way to build and publish your Visual Studio 2026 extension. It provides free CI/CD directly in your GitHub repository.

Create a file at .github/workflows/build.yaml in your repository with the following content:

# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json

name: "Build"

permissions:
  actions: write
  contents: write

on:
  push:
    branches: [master]
  pull_request:
    branches: [master]
  workflow_dispatch:

jobs:
  build:
    outputs:
      version: ${{ steps.vsix_version.outputs.version-number }}
    name: Build
    runs-on: windows-latest
    env:
      Configuration: Release
      DeployExtension: False
      VsixManifestPath: src\source.extension.vsixmanifest
      VsixManifestSourcePath: src\source.extension.cs

    steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 1

    - name: Setup .NET build dependencies
      uses: timheuer/bootstrap-dotnet@v1
      with:
        nuget: 'false'
        sdk: 'false'
        msbuild: 'true'

    - name: Increment VSIX version
      id: vsix_version
      uses: timheuer/vsix-version-stamp@v2
      with:
        manifest-file: ${{ env.VsixManifestPath }}
        vsix-token-source-file: ${{ env.VsixManifestSourcePath }}

    - name: Build
      run: msbuild /v:m -restore /m /p:OutDir=\_built

    - name: Upload artifact
      uses: actions/upload-artifact@v4
      with:
        name: ${{ github.event.repository.name }}.vsix
        path: /_built/**/*.vsix

  publish:
    if: ${{ github.event_name == 'push' || github.event_name == 'workflow_dispatch' }}
    needs: build
    runs-on: windows-latest

    steps:
    - uses: actions/checkout@v4

    - name: Download Package artifact
      uses: actions/download-artifact@v4
      with:
        name: ${{ github.event.repository.name }}.vsix

    - name: Upload to Open VSIX
      uses: timheuer/openvsixpublish@v1
      with:
        vsix-file: ${{ github.event.repository.name }}.vsix

    - name: Publish extension to Marketplace
      if: ${{ github.event_name == 'workflow_dispatch' || contains(github.event.head_commit.message, '[release]') }}
      uses: cezarypiatek/VsixPublisherAction@1.0
      with:
        extension-file: '${{ github.event.repository.name }}.vsix'
        publish-manifest-file: 'vs-publish.json'
        personal-access-code: ${{ secrets.VS_PUBLISHER_ACCESS_TOKEN }}

Key GitHub Actions

Real-world examples using GitHub Actions:

Use PowerShell

First you must execute the VSIX script

(new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex

That allows you to call methods upload the .vsix extension file to the gallery.

Vsix-PublishToGallery

That will find all .vsix files in the working directory recursively and upload them. To specify the path, simply pass it in as the first parameter:

Vsix-PublishToGallery .\src\WebCompilerVsix\**\*.vsix

Use AppVeyor

AppVeyor is a build server hosted in the cloud and it's free.

After you've created an account, you can start doing automated builds. A really nice thing is that AppVeyor can automatically kick off a new build when you commit code to either GitHub, VSO or other code repositories.

To automatically upload your extension to vsixgallery.com when the build has succeeded, all you have to do is to add an appveyor.yml file to the root of your repository. The content of the file should look like this:

version: 1.0.{build}

install:
  - ps: (new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex

before_build:
  - ps: Vsix-IncrementVsixVersion | Vsix-UpdateBuildVersion

build_script:
  - msbuild /p:configuration=Release /p:DeployExtension=false /p:ZipPackageCompressionLevel=normal /v:m

after_test:
  - ps: Vsix-PushArtifacts | Vsix-PublishToGallery

You might want to check out these real-world uses:

Unlisted extensions

An unlisted extension is one that you need to know the direct link to, otherwise it won't show up anywhere. The only places it will show up are:

  • Direct link (example: vsixgallery.com/extension/[ID])
  • Author page
  • Author gallery feed
  • Extension gallery feed

That means it won't show up in the usual places on this website such as:

  • Front page
  • Search results
  • Main gallery feed

To unlist an extension, simply add the tag "unlisted" in the .vsixmanifest file. The tags specified in the .vsixmanifest are not shown on either the Open VSIX Gallery nor inside Visual Studio, so it won't be visible to anyone.

Here's what it could look like:

<Tags>foo, bar, unlisted</Tags>