
TMD — Tabular Model Designer
A browser-based semantic model editor for Power BI and SSAS — a modern, cross-platform alternative to Tabular Editor. Open a model.bim file or connect straight to a Power BI workspace, explore the full Tabular Object Model, write DAX with IntelliSense, visualise the star schema, run best-practice rules, let AI propose reviewed edits, and deploy back with an incremental diff — all without installing anything.
Problem Solved
Serious Power BI semantic model development happens outside Power BI Desktop — in Tabular Editor, a Windows-only desktop tool. Mac and Linux data modelers, locked-down corporate machines, and anyone wanting a zero-install workflow are left out. And even on Windows, the modelling workflow is disconnected from the modern review culture of software teams: no diff preview before deploy, no audit trail of what changed, and no safe way to let AI touch a production model.
TMD moves the entire workflow into the browser. A round-trip TMSL parser/serializer means a model.bim file opened, edited, and saved in TMD is byte-faithful to what Tabular Editor or Visual Studio would produce. Direct Power BI / Fabric connectivity means the same editor works against live workspace models — with a real change diff and explicit confirmation before anything destructive happens.
Key Features
Full TOM Explorer
A virtualised tree of the complete Tabular Object Model — tables, columns, measures, hierarchies, partitions, relationships, roles, perspectives, calculation groups — with multi-select, inline rename, per-type context menus, display-folder grouping, visibility filters, and Tabular Editor-style keyboard shortcuts (F2, Del, Ctrl+C/V/D/A).
DAX Editor with Model-Aware IntelliSense
Monaco Editor with a custom DAX tokenizer. Completions are sourced live from the open model — table names, column references, measures — alongside the full DAX function catalogue with hover documentation. One click formats every measure in the model.
Relationship Diagram
An interactive schema diagram with three auto-layouts, including a star-schema layout that clusters fact tables and rings the dimensions. Tables carry FACT / DIM badges, conformed dimensions are highlighted, and edges show cardinality and cross-filter direction on hover. Positions persist per model.
AI Editing with a Review Gate
A streaming Claude chat that doesn't just talk about the model — it writes TOM Script, a sandboxed scripting API over the model. Every AI proposal runs against a cloned model first, renders a diff preview card, and waits for Apply/Reject. Applied changes land as a single undo entry, through the exact same mutation layer as manual edits.
Best-Practice Rule Engine
The same TOM Script engine powers a BPA rule library: built-in rules plus importable/exportable JSON rule packs, per-rule severity, and a violations panel with jump-to-object navigation.
Deploy with a Real Diff
Connect to a Power BI workspace via Azure AD, load the model through the Fabric REST API, and deploy back with incremental TMSL — object-scoped alter/create/delete commands instead of an all-or-nothing overwrite. The deploy wizard shows added/modified/removed objects with Monaco before/after views for DAX changes, and destructive deploys require explicit confirmation.
Time-Travel History
200 levels of command-pattern undo/redo with a history panel: every action is described and timestamped, and any past state can be restored with one click — including states from applied AI edits.
Architecture
Architecture Overview
A TypeScript TOM type system with a round-trip TMSL parser/serializer (model.bim JSON ⇄ typed TOM objects) sits at the core, preserving full fidelity across tables, partitions, relationships, roles, perspectives, calculation groups, KPIs, and annotations. On top of it, one sandboxed scripting engine — TOM Script — serves both the AI's script execution tool and the best-practice rule pipeline.
- State: a single Zustand store with Immer, all mutations flowing through pure action functions, wrapped by a custom history middleware implementing command-pattern undo/redo; batch operations collapse to single undo entries
- Scripting: TOM Script — a sandboxed JavaScript API (LINQ-style collections and object proxies over a cloned model) with static validation and runtime scope-shadowing that blocks eval, fetch, DOM access, and timers, capped at 50k mutations and a 5-second timeout
- AI layer: Vercel AI SDK v6 streaming Claude with tool calling; proposals previewed as diffs client-side before commit, with server-side approval gating and per-user token budgets
- Connectivity: MSAL (Azure AD PKCE) with dual-scope token caching; discovery via the Power BI REST API, model load/deploy via the Fabric REST API, proxied through Next.js route handlers with SSRF host allow-listing
- UI: three-panel resizable layout (explorer / tabbed editors / property grid + history) on Radix primitives and Tailwind 4, Monaco for code surfaces, react-arborist for the tree, React Flow + dagre for the diagram
- Auth & persistence: NextAuth.js v5 (email/password, Microsoft Entra ID, Google SSO) with Prisma on Postgres; deployed on Vercel
- Quality: Vitest unit/integration suites (parser round-trips, store history, sandbox security) and Playwright end-to-end flows
Key Decisions
One mutation layer for humans, rules, and AI
Every change — a keystroke in the property grid, a BPA rule fix, an AI-generated script — flows through the same pure action functions and history middleware. That's what makes "undo an AI edit" trivial rather than terrifying, and it eliminated an entire class of state-drift bugs.
AI proposes, never applies
Rather than letting the model call mutation tools directly, the AI writes TOM Script that executes against a sandboxed clone. The user sees the resulting diff and approves or rejects. This keeps a powerful capability — bulk model refactoring in one prompt — inside a review gate: the AI is a junior developer whose PRs always get read.
Incremental TMSL over full overwrite
Deploying a 1,400-object model shouldn't mean replacing the whole database definition. TMD computes an object-scoped diff and emits targeted alter/create/delete TMSL commands, falling back to a full deploy only past a threshold. Smaller blast radius, faster deploys, and a diff the user can actually read before confirming.
Screenshots











Interested in something similar?
We scope, design, and ship data and AI tools that solve the problems your team actually has.
Let's Talk