The browser turns intoModeling surface
TMDL and Model Options come to the service, and with them a question every team has to answer: who is the model's source of truth. Also — organizational apps with audiences, the new theming system, and the list of known bugs.
How the lesson works
July 2026 update: the semantic model moves to the browser, distribution moves to enterprise apps, and design moves to theme sets.
Five minutes of reading that give you the full picture, before diving deep. Published on 22.07.2026.
- TMDL View opens in the browser in preview. Writing model objects in a code editor, with a script, preview and apply cycle — without dropping down to Desktop. Scripts in the browser aren't saved.
- Model Options is available in the service. Type detection, relationships, Auto date/time, parallel loading, Locale and DirectQuery. Two settings take effect immediately, the rest only on the next refresh.
- A key architectural warning: Publishing from Desktop is a full replacement, not a merge. Any change made in the service between download and publish is overwritten and lost, and there's no sync back to the pbix.
- Organizational apps with audiences, now generally available. The audience is a navigation layer, not a filter, and the permission also extends to the semantic model and is revoked together with removing the user.
- No migration tool from workspace apps, and there's no timeline for discontinuing support for them. Migration is a manual rebuild.
- An extended theme system: Three base themes and the Customize current theme experience in the formatting pane. Manual formatting on a visual always overrides the theme.
- Conditional formatting for line charts and visuals with a Legend Generally available, with coloring by a single DAX measure.
- 16 known bugs and limitations documented in Chapter VII, with a workaround for each.
Navigating between topics
the buttons Previous Fnext fixed at the top of the screen. Also available via keyboard shortcut, by swiping on a phone, or by jumping to a topic from the topics list.
Questions and practice
At the end of the lesson, a short quiz with immediate feedback for each question, and application exercises with full solutions.
Progress is saved
The topic where you stopped and the topics you have read are saved only in your browser. You can close and come back, and reset from the topics list.
How each topic is built
Every topic opens with an explanation why The feature exists — the pain point in the field and the vision behind it — and continues into the technical detail. The most important topic in the lesson is Chapter IV: override risks. Don't skip it.
What the lesson covers
July 2026 update, published on 22.07.2026.
TMDL View in the browser
The model as code, with a script, preview, and apply cycle — now even without Desktop.
Model Options in the Service
Model-level settings that were locked in Desktop, and what takes effect when.
Sync and overwrite
Why publishing from Desktop erases changes made in the service, and how to prevent it.
Enterprise apps with audiences
Audience as a navigation layer, and permission that propagates to the model and is revoked with it.
Themes and mobile
Three base themes, the Customize current theme pane, and adaptation for small screens.
Bugs and workarounds
16 known phenomena, the reason for each, and the fix.
The pain that gave birth to the transition
Before the features — the architectural problem they come to solve.
Until now, any change to the model — even renaming a column, even fixing a relationship — required a whole route: download the pbix file, open Desktop on Windows, edit, republish, and hope no one else touched the model in the meantime. This locks out Mac users entirely, prevents two people from working in parallel, and drags a full publish cycle into a two-minute fix.
The main problem
The pbix file is a monolithic artifact. As long as the model lives in a binary file on someone's computer — there's no governance, no real version control and no collaboration.
the vision
The semantic model is a service, not a file. The browser is the client, TMDL is the format, and Git is the source of truth.
the price
Two editing surfaces for the same model create two versions of the truth. Chapter IV in the lesson is entirely about this cost.
What actually came in in July
The update map before diving into each component.
| the component | the status | Does it matter |
|---|---|---|
| TMDL View in the browser | Preview | Writing and editing objects in the model in a code editor, without dropping to Desktop |
| Model Options in the Service | available | Model-level settings, including Auto date/time, Locale, and DirectQuery |
| The semantic model settings pane | Preview, from August by default | The settings open alongside the content instead of a full page |
| Enterprise apps with audiences | General availability | One app that serves different experiences to different groups |
| APIs for apps and audiences | available | Create, read, update, delete, and list — also for Paginated Reports |
| Modern Visual Defaults | Extended preview | The Customize current theme experience in the formatting pane |
| Conditional formatting for line charts and Legend | General availability | Coloring by a single DAX measure, consistent across the report |
| Audiences on mobile | available | The audience experience reaches iOS and Android |
What is TMDL and the workflow
Once you understand that the model is text, mass changes stop being a problem.
TMDL, short for Tabular Model Definition Language, is the textual representation of the semantic model. Every table, column, measure, relationship and perspective is text.
- ScriptDrag an object from the data panel to the editor, or right-click and choose Script TMDL. You can drag an entire section, and select several objects with CTRL.
- EditThe editor includes semantic highlighting, autocomplete (also with Ctrl+Space), tooltips, code actions with a lightbulb, formatting with Shift+Alt+F, and a Problems panel.
- PreviewShows a full diff of the model before and after running the script, in red and green.
- ApplyRuns the script against the model. On failure, an Output pane opens with the error details.
What doesn't have a GUI
The real reason to learn TMDL: objects you can't reach any other way.
Through TMDL you can touch objects and properties that have no interface at all — IsAvailableInMDX, DetailRowsDefinition, translations and perspectives.
perspective SalesView
perspectiveTable Sales
perspectiveMeasure 'Sales Amount'
perspectiveMeasure 'Sales Qty'
perspectiveColumn Quantity
perspectiveColumn 'Amount'
Perspective is a prerequisite for using Personalize this visual effectively in large models — and it can't be created from the interface
/// Adds VAT to the received amount
function AddVat =
( amount : NUMERIC ) =>
amount * 1.18
DAX functions are also written in TMDL — and in a PBIP project they're saved in the functions.tmdl file
Duplicating a table between models
with the full definition: columns, a Power Query expression and a sort definition.
Changing storage mode
Switching between DirectQuery and Import by updating the partition property.
Backup before a big change
Write out the model's script, save it, and if needed rerun it to restore.
Renaming and sourceColumn
The real power of TMDL, and the minutes nobody tells you about.
Renaming an object requires writing a script of the father its: renaming a column requires the table's script, and renaming a table requires the script of the whole model. After that, find and replace with regular expressions does the job.
| Field in the dialog | the value |
|---|---|
| Find | (^\s+column\s+)(.+) |
| Replace | $1\L$2 |
To convert all the column names in the table to lowercase. Make sure Regular Expression is turned on, then Replace All and Apply
TMDL in the browser vs Desktop
The same experience, four differences that change how you work.
| topic | Desktop | Browser (preview) |
|---|---|---|
| Work modes | No separation — can be applied at any time | View mode for writing and previewing, Edit mode to apply. Safe experimentation before committing |
| Saving scripts | Saved as part of the model, and in a PBIP project as tmdl files in the TMDLScripts folder | Not saved at all. They're deleted when the model or browser closes, and previous scripts aren't shown |
| Version history | not available | Relies on the workspace's version history for restoration |
| permissions | Not relevant | Write permission on the semantic model is required |
The settings and validity timing
What used to be locked in Desktop opens up in the browser — with different timing for each setting.
Why Microsoft introduced this
These settings determine fundamental behavior of the model: whether hidden date tables get created, how dates and numbers are parsed, how many parallel connections open to the source. Until now they were locked in Desktop, so even someone managing the model in the service was blind to them. The result: models bloated with unnecessary date tables without anyone noticing.
How to get there
Open a semantic model in Model view in the service, switch to Editing mode, and then File > Options. Write permission is required.
| the setting | What it does | When it takes effect |
|---|---|---|
| Type detection | Automatic detection of column types and headers in unstructured sources | at the next load or refresh |
| Relationships | Importing relationships on the first load, updating or deleting on refresh, and detecting new relationships | at the next load or refresh |
| Auto date/time | Automatic creation of hidden date tables | Immediately upon saving |
| Parallel loading | Parallelism mode when loading tables: Default, One, or Custom | at the next load or refresh |
| Regional settings: Locale | How numbers, dates and times are interpreted in imported text | at the next load or refresh |
| DirectQuery connections | Can other models connect to this model via DirectQuery | Immediately upon saving |
| Max connections per source | A limit on parallel connections to the source, in DirectQuery only | at the next load or refresh |
The three traps of the dialog
One setting in the browser can break dozens of downstream reports.
| limitation | the implication |
|---|---|
| Per model only | There are no defaults for new models and no bulk update in the browser |
| Only from Model view | The dialog isn't available from Report view, from DAX Query View, from TMDL View, or from the settings page |
| Save failed | make sure there are no concurrent changes via XMLA or another client, close and reopen the dialog, and try again |
The override scenario — why it happens
The most important topic in the lesson. It's not a bug, it's architecture.
Desktop settings are saved on publish, so the initial values in the browser reflect what was in Desktop. Once you change a setting in the service, the service's values take precedence. But if you download the pbix, edit it in Desktop, and republish — the Desktop settings overwrite the service's values, and any change made in the service between the download and the publish is lost. Changes in the service do not sync back to the local file.
Sunday 11:00 Amit adds a measure in the browser and changes Locale
Monday 14:00 the pbix from Sunday gets republished
← Amit's measure and Locale disappeared
Blocked models and gaps
Three more facts that change the work routine.
Models that can't be edited in the browser
| the model | the solution |
|---|---|
| Deployed via deployment pipelines | Browser editing only in the development environment — not in test and not in production |
| Not upgraded to the improved metadata format | Open the .pbix in Desktop and republish |
| Automatic aggregations defined | No editing in the browser |
| live connection | No editing in the browser |
| Migrated from Azure Analysis Services | No editing in the browser |
Functional gaps that remain
- ✕Renaming a field in the service doesn't automatically update in downstream visuals
- ✕It's not possible to define a feature table or change its properties
- ✕You can't change a table's storage mode from the interface, and there's no View as
- ✕No Q&A definition and synonyms
- ✕If the conversion to Large Semantic Model storage format fails — you're left in view-only mode
The governance and monitoring rule
How to set a policy that prevents lost work, and how to know that someone touched the model.
The model is managed with Git and PBIP
block browser editing at the permission level, and leave the browser for viewing and TMDL View in View mode only.
The model is managed by the service
You don't download the pbix and you don't republish. Changes are promoted through deployment pipelines or a schema comparison tool.
Three audit actions
| Operation name | When you registered |
|---|---|
| ApplyChangeToPowerBIModel | Any change to the model: writing a measure, managing relationships, and more |
| GetPowerBIDataModel | Opening the model or resyncing it |
| ApplyQueriesExecution | Running Power Query operations like Refresh all and Transform data |
The pain and the vision
What actually broke in the old release — including a silent security exposure.
The distribution pain
One organization, different audiences: management wants three metrics, regional managers want a full breakdown, analysts want everything. The solution was to duplicate — another workspace, another app, another copy of the same report.
The security pain
In the old workspace apps, app permission and model permission were two separate things. A user removed from an app could still be left with access to the model - and through it, to all the data.
the vision
An app is a Fabric item like any other: it lives in a workspace, goes into Git, passes through deployment pipelines, and is controlled via the API.
The audience as navigation, not as a filter
Three architectures and three display configurations.
How many apps in a workspace
Each has its own content and experience: leadership, managers, department, meeting series.
One app with audiences
A consistent look, filtered navigation and content for every audience.
combination
Several apps, and inside each one, audiences for further segmentation.
Three navigation configurations
| the configuration | When is it suitable |
|---|---|
| The All tab together with the audience tabs | When you want movement between a wide view and focused views |
| Hiding the All tab | When the audiences are the main navigation, and the first tab of each audience functions as a home page |
| Hiding the audience tabs | When you want a smooth experience where the visibility rules work in the background without the user being aware of them |
Permissions and lifecycle
The change that really matters is here, not in the interface.
The life cycle
- ✓The items are pulled directly from the workspace content, and updates flow to them automatically
- ✓You can do staging and controlled promotion via deployment pipelines or Git
- ✓API-Full APIs for creating, reading, updating, deleting and listing — for app items and for audience items as child items
- ✓In July, equivalent APIs were also added for Paginated Reports
What else was added in July
bookmarks
both of the report's author and personal, inside the app.
Storytelling for PowerPoint
Adding report pages and live visuals from the app's content to a presentation.
Audiences on mobile
The audience experience reaches iOS and Android.
Migration — what needs to be planned
The most important design point in the chapter.
| Your situation | what to do |
|---|---|
| New distribution project | To start directly with enterprise applications. There's no reason to build on the old track |
| Dozens of existing apps | to plan a gradual transition. A transition is Manual rebuild — don't wait for a tool that doesn't exist |
| One central application | to recreate it as an organizational app in a parallel environment, test permissions, and only then replace |
The three basic sets
Every report sits on a base theme. The choice of it determines the starting point of every visual.
Why Microsoft introduced this
In an organization, visual consistency isn’t aesthetics, it’s trust. A report where every page looks different creates uncertainty for the reader even when the data is correct — they don’t know if the color difference signals something. Until now, consistency was achieved by manual work on every visual, or in a JSON file that only one person in the organization knew how to edit.
| Base set | When to choose it |
|---|---|
| Fluent 2 (preview) | Modern design aligned with Fluent 2. New reports get it automatically after enabling the preview |
| Classic 2026 | the current default for new reports in Desktop |
| Classic 2018 | Reports created before 2026, or when you want consistency with legacy reports in the organization |
Replacement: View ← Themes ← Customize current theme ← the Base theme menu
What changes in Fluent 2
canvas
New pages sized 1920x1080, and a background and wallpaper in gray tones for better contrast.
Uniform formatting
Titles and subtitles are on, axis titles are off, padding is increased, and corners are rounded.
Style themes
For every visual type: a chart with an axis or with labels, a smooth or straight line, a button in Default, Outline, Transparent and Icon & Text states.
Priority order in design
The theme comes out of the JSON file and goes into the Format pane.
When the preview is on and no visual is selected, the format pane shows the theme settings. The change applies immediately to the whole report.
| the segment | What can be changed |
|---|---|
| Colors | A built-in palette like Accessible Default, and data colors, structure, sentiment and diverging scales |
| Visual properties | background, border with thickness and corner radius, header icons, tooltip, shadow and padding — for all visuals at once |
| Page | Default page size, background color and wallpaper for all pages |
| Export theme | Export to a JSON file for use in other reports or to add to organizational theme sets |
Mobile — the report on a small screen
A mobile layout isn't a shrunk desktop, it's a different report.
- Building both layouts togetherDuplicating a page duplicates both, so a page with a title and navigation serves as a template for the other pages.
- Select only what mattersRecommended minimum size: 323 points wide for a large visual, 158 for a small one. Font no smaller than nine points.
- Clean up noiseRemove axis titles, gridlines and legend; arrange navigation and slicers horizontally; reduce white space.
- Testing an interactionTooltips are disabled on the editing canvas but work in the app. Slicer selections on the canvas don't carry over to the grid layout.
16 bugs and workarounds
Based on the constraint clauses and official documentation. Worth reviewing before running this in production.
| the phenomenon | the reason | The workaround |
|---|---|---|
| The script I wrote in the browser disappeared | In the browser, scripts aren't saved and are deleted when the model or browser closes | Copy to a file or to Git before closing the tab; work in VS Code with the TMDL extension |
| Changes in the service disappeared after publishing from Desktop | Publishing is a full replacement, not a merge | A single source of truth; restoration through the model's version history |
| Reports show a broken field error after a refresh | Turning off Auto date/time deleted the hidden date tables | Turn it back on as an immediate fix, and switch to an explicit date table as a permanent fix |
| The Locale field looks empty and can't be brought back | Some locales aren't displayed correctly in the dialog | Don't change the locale when the field is empty; recovery requires republishing from Desktop |
| Saving Model Options fails | Parallel changes through XMLA, or metadata cached in memory | make sure there's no concurrent write, close and reopen the dialog, and then try again |
| Model Options doesn't appear at all | You don't have write permission, or you're not in Model view | Confirm write permission and switch to Model view in Editing mode |
| Visuals broke after a rename in TMDL | Renaming a field doesn't update automatically in downstream visuals | Run Preview before Apply, and scan the dependent reports right after |
| Power Query shows different column names than the model | The sync is based on sourceColumn That keeps the original name | also change sourceColumn in the script if you want full identity, or document the separation |
| A change in a Power Query expression doesn't affect the data | TMDL changes metadata only and doesn't refresh | to refresh the table or the model manually after Apply |
| TMDL scripts didn't go into Git | Setting up an initial Git integration from the workspace doesn't include them | To move important scripts to the repository manually as tmdl files |
| Some commands in the Command palette don't work | A known limitation: the palette shows commands that aren't currently supported | To use the ribbon buttons and the documented keyboard shortcuts |
| Fluent 2 is not available in the service | In preview you can only enable the base theme in Desktop | create or update the report in Desktop and then publish. Also, Customize current theme is not available in the service |
| I swapped the base theme and the columns stayed the old size | Existing pages don't resize; only new pages | to update manually, or through the Page section in the theme pane that updates all the pages |
| The slicer looks like a list styled as a dropdown menu | A known behavior in the Fluent 2 preview | Perform Reset to default on the slicer to return it to dropdown mode |
| Reset to default deleted important settings | Resetting an entire visual removes button actions, conditional formatting, images from a field, and attribution labels | To reset a single section in the Format pane instead of the whole visual |
| The custom theme broke after moving to Fluent 2 | Old themes don't always match the modern defaults | to undo the theme update and go back to the previous base theme until the JSON file is updated |
Quiz — 12 questions
One question at a time. A correct answer is colored green, an incorrect one red, and the correct answer is always revealed along with a full technical explanation.
To rename a column in TMDL, which object needs to be written as a script?
You downloaded the pbix, edited it in Desktop and republished. What happens to settings that were changed in the service in the meantime?
What's the risk of turning off Auto date/time from the browser in an enterprise model?
What happens to the semantic model permission when a user is removed from an enterprise app?
You applied a new theme and half the visuals didn't change. Why?
How do you activate the Fluent 2 base theme in a report edited in the service?
Which settings in Model Options take effect immediately upon saving?
A model deployed through deployment pipelines — where can you edit it in the browser?
How do you move a workspace app to an organizational app?
What happens to the data after Apply of a TMDL script that changed a Power Query expression?
After renaming a column in TMDL, what will the Power Query editor show?
You haven't answered questions yet — 0 out of 12
Summary and next steps
Ten rows that summarize the lesson.
| topic | what to remember |
|---|---|
| the rationale | The semantic model turns from a file into a managed service, with TMDL as the format and Git as the source of truth |
| TMDL | Script, preview, apply cycle. Metadata only, no data refresh |
| TMDL in the browser | Preview, two working modes, scripts aren't saved, write permission required |
| rename | Requires the parent's script, and disconnects the model name fromsourceColumn |
| Model Options | Auto date/time and blocking DirectQuery immediately; everything else on the next refresh |
| override | Publishing from Desktop is a full replacement. There's no sync back to the pbix |
| protection | Automatic saving without undo; version history is the only safety net |
| Enterprise applications | An audience is a navigation structure, not a filter. The permission spreads to the model and disappears with it |
| migration | There's no migration tool — moving is a rebuild |
| Themes | Manual formatting on a visual overrides the theme. Fluent 2 in Desktop only at this stage |
You can also navigate with the buttons at the top of the screen, keyboard arrows, and on phone with a swipe