Documentation

RST — User Guide

Custom Revit ribbon toolbar profiles. Built on pyRevit.

v0.5.0-beta
← THE EMERGENCE PROJECT

This is the complete guide to RST — what it does, how to set it up, and how to build and share toolbar profiles. Written for Revit admins and users who want a clean, curated ribbon.


What Is RST

v0.5.0-beta — functional but still in active development. Use at your own risk.

RST is a pyRevit extension that lets administrators build custom toolbar profiles from any installed Revit tool or add-in. Instead of digging through default tabs and third-party panels, users load a single profile and get a purpose-built ribbon with only the tools they need.

Admins detect available tools, arrange them into colored panels, add company branding, and export profiles as shareable JSON files. Users load a profile and get a clean ribbon that rebuilds automatically every time Revit starts.

RST doesn't replace your tools — it reorganises them. Every button still executes the original command. RST just decides which ones show up and where.


Install

Requirements

1. Install pyRevit

Download and run the latest pyRevit installer (4.8+) from pyRevit releases. Open Revit once after install to confirm the pyRevit tab appears on the ribbon.

2. Install Python 3.12 + pywebview

Open PowerShell and run:

Then install pywebview and verify:

No winget? It ships with Windows 11 and modern Windows 10. If missing, install App Installer from the Microsoft Store first. Optional: install.bat in the repo root automates this step (winget check + Python 3.12 + pywebview, user-scope only, no admin required).

3. Add the RST Extension

  1. Open Revit
  2. pyRevit tab → ExtensionsAdd Extension
  3. Paste the repo URL: https://github.com/jedbjorn/RST
  4. Reload pyRevit (pyRevit tab → Reload, or restart Revit)

An RST tab appears in the Revit ribbon. Click Profiler to start building toolbar profiles, or Loader to open an existing one.


How It Works

Architecture

RST runs two processes: one inside Revit (IronPython) for ribbon building and button scripts, and one outside (CPython 3.12 + pywebview) for the admin and user UIs. They communicate through temporary JSON files. No persistent services, no background processes.

On Revit Launch

When Revit starts, startup.py reads active_profile.json and rebuilds the ribbon:

  1. Loads the profile referenced in active_profile.json
  2. Removes any existing REST_* tabs from the ribbon
  3. Builds the branding panel (logo, always leftmost)
  4. Creates colored panels with rounded-corner backgrounds
  5. Adds large tool buttons with PostCommand handlers
  6. Adds small tool groups (standard-sized text-only buttons)
  7. Deletes pyRevit's MinifyUI smartbutton folder (if present) to avoid conflicts
  8. On Idling event: styles RST admin panels grey, hides tabs configured in RSTify, sets RSTify icon to orange

The ribbon rebuilds from scratch every launch. Custom tabs don't persist natively in Revit — RST reconstructs them each time.

Profiler Flow (Admin)

  1. Click Profiler — IronPython scans the ribbon (1400+ commands) and loaded add-ins, writes _revit_data.json, launches the CPython UI
  2. Admin detects tools, creates panels, picks colors, adds tools/stacks/URLs, sets branding
  3. Export — saves profile JSON to app/profiles/ + Desktop copy — animated overlay — window auto-closes (3s)

Loader Flow (User)

  1. Click Loader — IronPython collects Revit version + loaded add-ins, writes _loader_data.json, launches the CPython UI
  2. User browses profiles, sees tab preview, checks add-in compatibility (Native / Loaded / Not Loaded)
  3. User configures RSTify tab toggles — choose which tabs to hide (source tabs and core tabs are locked visible)
  4. Load Profile — writes active_profile.json with profile + hidden tabs — animated overlay — window auto-closes (3s)
  5. ProfileLoader detects the change — shows "Reloading pyRevit..." with animated dots — sessionmgr.reload() — ribbon rebuilds with hidden tabs applied

Add-in Detection

RST scans the live Revit session using AdWindows.dll and categorises every tool it finds:

StatusMeaning
NativeBuilt-in Revit tab (Architecture, View, Manage, etc.) — always available
LoadedAdd-in tab detected in current session (DiRootsOne, pyRevit, Kinship, etc.)
Not LoadedRequired by profile but not found in this session

The RST Tab

Tool panels with rounded grey backgrounds.

Profiler

Build and edit toolbar profiles. The admin-facing tool where profile creation happens.

Loader

Load and manage profiles. The user-facing tool for switching between profiles.

RSTify

Custom tab visibility manager that replaces pyRevit's MinifyUI. Click to toggle — orange icon when hiding, blue when showing. Tabs to hide are configured in the Profile Loader at load time. Auto-activates on every startup/reload when a profile has hidden tabs. No configuration from the button itself — reload the profile to change which tabs are hidden.

Update

Downloads the latest zip from GitHub, preserves user data (profiles, active profile, branding logo, config, custom tools, log), copies new files (skipping locked ones), and auto-reloads with an animated message.

Health

Point-in-time snapshot of the workstation and Revit session. Launched via the Snap pushbutton; also runs automatically when RST loads so data is fresh by the time the user opens the window.

What it shows — four collapsible sections, each with a severity dot (ok / soft-warn / warn / danger) driven by threshold rules:

How it gets the data

Triggers

Privacy: everything stays on the workstation. The viewer reads data/health_scan.json from the extension folder. No network calls, nothing sent anywhere.

Clean Junk Files

Bottom-right button in the Health viewer. Opens a modal with per-category toggles (all ON by default):

Confirm → delete → result message with per-category counts. Files locked by running applications are skipped automatically. Safe to run with Revit open — anything Revit holds open survives.

Reload

Triggers a pyRevit reload to apply changes.


Custom URL Tools

Add buttons that open URLs or email clients directly from the Revit ribbon — company wikis, SharePoint, Teams, or any web resource.

  1. In the Profiler, click + Add URL at the bottom of the tool list
  2. Enter a name (e.g. "Company Wiki") and a URL. Email addresses are auto-detected and converted to mailto: links.
  3. The tool appears tagged "Custom" with a link icon (🔗) or @ icon for email — add it to any panel like a regular tool
  4. In Revit, clicking opens the URL in the default browser (or default email client for mailto:)
  5. Revit ribbon automatically uses pack:link_external for URLs and pack:at for email tools

Custom tools persist in app/custom_tools.json. They can be edited, deleted, and survive Detect scans and profile export/import.


RSTify — Tab Visibility

RSTify replaces pyRevit's MinifyUI with profile-aware tab hiding. Instead of a global show/hide, it remembers which tabs to hide per profile and applies them automatically on every load.

How It Works

  1. Open the Profile Loader and select a profile
  2. The RSTify: Hide These Tabs column shows all ribbon tabs with toggles
  3. Core tabs (Modify, Manage, View, Annotate, Add-Ins) are locked — cannot be hidden
  4. Source tabs (tabs containing tools used by your profile) are locked — hiding them would break tools
  5. Everything else can be toggled off
  6. Click Load Profile — hidden tab selections are saved with the profile
  7. On every reload, configured tabs are hidden automatically

Hiding a tab prevents tools from that tab from executing via PostCommand. RST protects source tabs from being hidden — only tabs with no tools in your profile can be toggled off.

The RSTify Button

Icon ColorStateClick Action
OrangeTabs are hiddenShow all tabs
BlueAll tabs visibleRe-hide configured tabs

Previous hidden tab selections are remembered when you reopen the Loader. Tabs you hid last time are pre-toggled.

MinifyUI

RST automatically deletes pyRevit's MinifyUI smartbutton folder when a profile is loaded, to avoid conflicts. To restore MinifyUI after removing RST: unload the RST profile (creates a blank tab), then reinstall pyRevit.


Branding

Every profile tab includes a branding panel as the leftmost element. By default it shows the RST logo. To use your company logo:

  1. In the Profiler, click Add Logo
  2. Upload your image (48×48 recommended — resized automatically)
  3. The logo persists across sessions and updates at icons/branding.png

The branding panel is not stored in the profile JSON — it's injected at runtime so each install can have its own logo.


Panel Styling

Colors

Two rows of swatches: 8 built-in presets (Blue, Green, Purple, Amber, Red, Cyan, Orange, Lime) and 8 custom slots (initially blank, shown as dashed outlines).

Persistent color config — swatch colors are stored in app/panel_colors.json and persist across sessions. Click a swatch to select it, type a hex code (with or without #, spaces stripped), then click to write the color to that swatch. Click to reset — built-in swatches restore factory color, custom swatches clear back to blank. All 16 swatches update live across the panel list, tab preview, and panel slot cards.

Opacity

A per-profile slider controls panel background opacity from 10% to 100%. Applied to all panels in the profile.

Rounded Corners

Panel backgrounds use WPF DrawingBrush with RectangleGeometry for rounded corners. RST admin panels get a light grey background, applied after pyRevit finishes loading.

Tool Name Display

Long tool names are auto-split at the first space for compact two-line display on the ribbon.

Finding Colors

The Profiler includes a link to imagecolorpicker.com — upload a logo or brand guide and click any pixel to grab the hex code.


Profile JSON

Profiles are self-contained JSON files. They can be shared via email, OneDrive, Slack, or any file transfer. Each profile includes:

FieldPurpose
profileProfile name
tabRibbon tab name
min_versionMinimum Revit version
exportDateWhen the profile was exported
panelOpacityBackground opacity (10–100)
requiredAddinsAdd-ins the profile depends on
hideRulesTabs to hide via RSTify
stacksTool stack definitions (2–3 tools each)
panelsPanel definitions with tools, colors, and layout

The branding panel is not included in the JSON — it's injected at runtime from the local install.


Configuration

Add-in Lookup

The file lookup/addin_lookup.json maps ribbon tab names to .addin filenames. This is the single source of truth read by both UIs. Add entries for firm-specific add-ins — changes take effect on next Profiler or Loader open.

Protected Add-ins & Exempt Paths

The file lookup/config.json defines two lists:

Both files are preserved across updates.


Uninstall

Remove the RST entry from pyRevit → Extensions → Manage (or delete the RST folder from any Custom Extension Directory you registered). Reload pyRevit. Python 3.12 and pywebview can stay — they're harmless and may be used by other tools.


Known Limitations

LimitationDetail
pyRevit script toolsCan be detected and placed but may not execute via PostCommand
Some OOTB toolsDropdown/list button CommandIds are filtered out automatically
Locked files on updateIcons loaded by Revit are skipped during update, overwritten on next restart
Tab persistenceCustom tabs don't survive Revit restart — startup.py rebuilds every launch
Hidden tabs break toolsTools from hidden tabs may not execute. RSTify protects source tabs, but manually hiding via MinifyUI can break things
MinifyUI deletedRST removes MinifyUI smartbutton folder on profile load. Reinstall pyRevit to restore it
Add-in disablingUser-scope only. Machine-scope (ProgramData) add-ins are tracked but never disabled. Protected and Autodesk add-ins always exempt.
Memory growth on reloadEvery pyRevit Reload / Update leaves memory behind in the Revit process (~100–150 MB per reload). This is a pyRevit architectural quirk — IronPython types created during extension load can't be unloaded by the CLR, so each reload stacks a new generation on top. RST tightens what it can (icon caching, event-handler teardown, brush de-dup) but the base cost belongs to pyRevit. If memory climbs during heavy profile switching, relaunch Revit.

Tech Stack

ComponentRole
pyRevitExtension framework, ribbon buttons, startup hooks
IronPythonRevit-side scripts — ribbon scanning, building, panel styling, reload UI
CPython 3.12UI windows via pywebview
AdWindows.dllRibbon manipulation — scan tools, build panels, detect add-ins, set colors
WPFImageBrush for branding, DrawingBrush for rounded corners, ToolWindow for reload messages
pywebviewHTML-based UI windows for Profiler and Loader

Part of the Emergence Project. Built by the Design/OS shell team.

Author: CC (Shell — Infrastructure)
April 2026