Swich Design

How to Add a Custom pyRevit Extension to Revit (2026 Guide)

To add a custom pyRevit extension to Revit, you point pyRevit at a folder that contains a *.extension directory described by a valid extension.json manifest, then reload pyRevit so it registers the new tools on the ribbon. This works whether the extension comes from pyRevit's built-in registry or from a private folder you maintain yourself. Once the folder structure is right, the whole process takes a few minutes.

That's the short answer. Here's how the pieces fit together, and how I use this exact system to ship my own tools.

What pyRevit Actually Is

pyRevit is officially described as a Rapid Application Development environment for Autodesk Revit (pyrevitlabs.io). It's free and open source under the GPL-3.0 license, developed in the open on GitHub (pyrevitlabs/pyRevit). The current release as of this writing is v6.5.3, published 2026-06-25.

Extensions and scripts inside pyRevit are written primarily in IronPython, defaulting to version 2.7.12, with support for C# and VB.NET as well. A CPython 3.12 engine also exists in the project, but its integration is still incomplete and in progress, so most extensions, including mine, still target the IronPython environment for compatibility.

How an Extension Is Structured

A pyRevit extension is a folder whose name ends in .extension. Inside that folder sits an extension.json manifest that describes it to pyRevit. Four fields are required: type, name, description, and url. A handful of optional fields let you add more detail: website, image, author, author_profile, rocket_mode_compatible, and dependencies (pyRevit extension package docs).

That's the entire contract. If your folder is named correctly and the manifest has those four required fields filled in, pyRevit can find it, load it, and put its tools on a ribbon tab.

Two Ways to Get an Extension Into Revit

pyRevit gives you two routes for installing extensions, and it's worth knowing both because they serve different purposes.

The first is the bundled public registry. pyRevit ships with a curated list of third-party extensions, and its in-app Extensions Manager reads that registry so you can browse, install, and remove extensions without ever leaving Revit. This is the route most users take, and it's how tools reach the widest audience with the least friction.

The second is a custom extensions folder. In pyRevit's Settings, there's an option for "Custom Extension folders" where you can point pyRevit at any directory on disk, including a network share or a synced folder. This is meant for private, in-house, or unlisted extensions, things you don't necessarily want in the public registry but still want to load the same way (pyRevit architecture docs).

How to Add a Custom Extension Using the Custom Extensions Folder

This is the route to use for an extension you built yourself, downloaded from GitHub directly, or received from a colleague before it's listed anywhere public.

  1. Create or clone a folder on disk whose name ends in .extension, for example MyTools.extension.
  2. Inside that folder, add an extension.json file with at minimum the type, name, description, and url fields filled in.
  3. Open Revit, go to the pyRevit tab, and open the Settings panel.
  4. Find "Custom Extension folders" and add the path to the parent directory that contains your .extension folder, not the extension folder itself.
  5. Save the settings, then reload pyRevit using its Reload command, or restart Revit if the reload doesn't pick up the change.
  6. Confirm the new panel or ribbon tab appears, then run each tool against a non-production model before trusting it on live project data.

That last step matters more than it sounds. Any extension, including the ones I write, is code someone else wrote running inside your model. Test it on a throwaway file first.

Why I Ship My Tools This Way

I build Revit automation tools and give them away free and open source rather than packaging them as paid add-ins. Two of them are already merged into official pyRevit: a Wood Framing extension (PyRevit-Wood-Framing-extension, merged via pull request #3348) and a Relink Textures tool added to pyRevitTools (Texture-Relink, merged via pull request #2883). Both repos are Apache-2.0 licensed and written in Python, and both went through pyRevit's normal review process before landing in the core toolset that every pyRevit user already has installed.

A third tool, an Automatic Dimensions extension, is further along the same path but not there yet. The repository is public (Revit-Automatic-Dimensions), also Apache-2.0, and the pull request into pyRevit, #3492, is open and under review as of this writing. It has not been merged. Until it is, the way to use it is exactly the custom extensions folder process above: clone the repo, point pyRevit's Settings at the parent folder, and reload.

Building this one surfaced a real gap in the documented Revit API. Creating a dimension programmatically means calling Document.Create.NewDimension(view, line, references), where references is an array of geometric references the dimension binds to (Revit API reference, third-party mirror of Autodesk's SDK docs). That call throws an ArgumentException if what you hand it isn't a genuine geometric reference. The problem is that I could not find an officially documented API member that exposes a wall's core face directly as a reference you can pass in. The two workarounds practitioners use are iterating a wall's solid geometry to find the face manually, or hand-building a stable representation string and reconstructing it with Reference.ParseFromStableRepresentation. Neither is documented as the intended path, they're both community workarounds for a gap in the API surface, and that gap is a large part of why this extension took longer to get right than the other two.

The reason I publish this way instead of selling it: pyRevit's whole model is built on a public registry and a review process that anyone can see. Shipping into that ecosystem, under review by the people who maintain it, is a better test of whether a tool actually works than any amount of testing I could do alone. If it's good enough to merge, it's good enough to be free.

Revit automation services

This article reflects the state of pyRevit and the author's tools as of August 2026. Version numbers, pull request status, and API behavior may change; verify against the linked sources before relying on them for production work.