I built a Chrome/Edge extension to X-ray Dynamics 365 forms — and 130+ devs now use it daily
If you build on Microsoft Dynamics 365 model-driven apps, you know the ritual. A field is hidden. Or locked. Or something fires OnChange and you have no idea what. So you open the form editor… then the Plugin Registra
If you build on Microsoft Dynamics 365 model-driven apps, you know the ritual.
A field is hidden. Or locked. Or something fires OnChange and you have no idea what. So you open the form editor… then the Plugin Registration Tool… then Advanced Find… then you hand-write a Web API query just to confirm one value. Twenty minutes gone — to understand a single form.
I got tired of it. So I built CRM Dev Helper — a Manifest V3 browser extension that puts everything you need to inspect and test a Dynamics 365 form into one panel, right on the page you're already looking at.
It started as a weekend itch-scratcher. It's now part of the daily workflow for 130+ developers on Microsoft Edge, and today it's live on the Chrome Web Store too.
Here's what it does and how it works.
The idea: stop leaving the form
Everything in CRM Dev Helper happens inside the CRM page. No separate tool, no copy-pasting GUIDs, no context switching. You get two surfaces:
- a toolbar popup for instant form actions, and
- a floating, draggable dev panel with seven tabs for deeper inspection.
Quick actions (the popup)
These are the things I reach for a hundred times a day:
- Unhide all fields — reveal every hidden field, tab, and section. Click again to re-hide only the ones that were originally hidden.
- Unlock all fields — strip the disabled state off every control so you can test. Click again to restore only what was locked.
- Fill dummy data — auto-fill the whole form with type-aware test data (strings, numbers, dates, option sets, booleans, emails, phones, addresses…). Click again to restore the original values.
Each action snapshots the form before it mutates it, so the reverse operation only touches what it changed. No "oops, which fields did I unhide again?"
The panel: seven tabs of X-ray vision
📋 Fields — including which fields run JavaScript
The Fields tab lists every attribute on the form with logical name, type, required level, current value, visibility, and lock state. The new part I'm most excited about: it flags which fields have an OnChange handler declared on the form with a small ƒ badge. Expand it and you see the exact function name, source library, and enabled state.
The interesting bit is why this needs the form XML: the Xrm client API has addOnChange(), but there's no getter to ask "what handlers are registered on this attribute?" So the runtime can't tell you. The handlers are, however, declared in the form's formxml. So the extension parses the <event name="onchange" attribute="..."> nodes from the form definition to map each field to its declared handlers. (Caveat, stated plainly in the UI: handlers wired at runtime via addOnChange() in code aren't visible to either the form XML or the client API.)
🔗 Relationships
Live relationship metadata for the current entity — One-to-Many, Many-to-One, Many-to-Many — in a collapsible tree with schema names and referencing attributes.
</> API Generator
Pick an entity and some fields, and instantly get a JavaScript Web API call, a C# QueryExpression, and FetchXML, ready to copy. Works on any Dynamics page — no open form required.
▶ API Tester
Search any entity, browse fields with type badges (it auto-builds $select), then write and run JavaScript against Xrm directly in the page context and read the result as a collapsible JSON tree — with execution time.
λ Plugins
Every registered plugin step for the current entity, grouped by message (Create, Update, Delete…), with stage, sync/async mode, execution rank, plugin class, and assembly. No more opening the Plugin Registration Tool just to check what's attached.
{} Form Scripts

Every JS library and event handler on the form, grouped by event type (OnLoad, OnSave, OnChange) with function name, source library, enabled state, and the pass-execution-context flag.
⚖️ Business Rules
All business rules for the entity with active/inactive status, scope, and condition/action counts — expand any rule to read its description, without touching the solution editor.
How it works (the fun part)
The tricky constraint with a browser extension on Dynamics is that content scripts run in an isolated world — they can't touch the page's Xrm global. So CRM Dev Helper relays commands across four layers:
Popup / Panel (React, isolated)
│ chrome.tabs.sendMessage / window.postMessage
▼
content.js (content-script sandbox — no Xrm access)
│ window.postMessage
▼
crmBridge.js (injected into the PAGE context — full Xrm + Web API access)
│ returns results back up the chain
The bridge is injected into the real page context, where it can read the Xrm form context and call the org's own Web API (/api/data/v9.2/...) for metadata like plugin steps, form scripts, and business rules. The React UIs (popup + an injected iframe panel) talk to it through postMessage.
A few deliberate choices:
- Manifest V3, no remote code — everything is bundled in the package.
-
Runs 100% locally. No external servers, nothing leaves your org. The only thing stored is a single UI preference (light/dark theme) via
chrome.storage.sync. -
Narrow permissions. It only requests what it uses (
storage,tabs) plus host access to*.dynamics.comso the content script and Web API calls can run.
v1.1: a new look, too
This release also ships a full UI redesign — a clean, airy light theme with an indigo accent, plus a dark theme and a toggle that applies to both the popup and the panel and follows you across devices.
Try it
CRM Dev Helper is free and available on both stores:
- Google Chrome: https://chromewebstore.google.com/detail/dynamics-crm-dev-helper/hjiehkfjbdccdfdliilnpjciolcjacjn
- Microsoft Edge: https://microsoftedge.microsoft.com/addons/detail/dynamics-crm-dev-helper/cjhdddgcjihpbldjjaaeaeblhiiagokm
If you work with Dynamics 365 daily, give it a try — and tell me what to build next. Feature suggestions are always welcome.
Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.
