Tabular Model User Options (.tmuo) File
Tabular Editor 3 introduces a new JSON based file, to store developer- and model-specific preferences. This file is called the Tabular Model User Options file and uses the .tmuo file extension.
When you open a model from disk, the file is created next to it, named after it and after your Windows user name. Tabular Editor looks for a file with that name every time a model is loaded from disk.
| What you opened | User options file |
|---|---|
SpaceParts.bim, or any .bim / .pbit / database.json file |
SpaceParts.<UserName>.tmuo, beside it |
A model.tmdl or database.tmdl file |
model.<UserName>.tmuo, beside it |
A folder containing database.json |
database.<UserName>.tmuo, in that folder |
| A folder containing Tabular Model Definition Language (TMDL) model files | model.<UserName>.tmuo, in that folder |
TMDL always uses the model prefix, for continuity with versions that predate database.tmdl.
For a model opened over a connection rather than from disk there is nowhere beside the model to put the file, so it is kept per server and database under %LocalAppData%\TabularEditor3\UserOptions\.
Whether the file is created for a new model at all is governed by Create user options (.tmuo) file under Controlling preferences.
Important
The .tmuo file contains user-specific preferences, and as such it should not be included in a shared version control environment. If you're using Git for version control, make sure to include the .tmuo extension in your .gitignore file.
File content
The file is JSON and every property is optional. Tabular Editor writes one only when there's something to store, so a real file carries a handful of the blocks below rather than all of them. If nothing needs storing, no file is written at all.
A minimal file, for a model that does nothing but connect to a workspace database:
{
"UseWorkspace": true,
"WorkspaceConnection": {
"ConnectionString": "data source=localhost",
"EncryptedCredentials": "AQAAANCMnd8BFdERjHoAwE..."
},
"WorkspaceDatabase": "WorkspaceDB_MyUser_20260915"
}
Top-level properties
| Property | Type | Written when |
|---|---|---|
UseWorkspace |
Boolean | You've answered the workspace question for this model. While it's absent, Tabular Editor asks each time the model loads. |
WorkspaceConnection |
String or object | A workspace connection is set. Object form when the connection string carries a password. |
WorkspaceConnectionAuthMode |
String | Legacy, and only when it isn't Integrated. The authentication mode is now implied by the connection string. |
WorkspaceDatabase |
String | A workspace database name is set. |
Deployment |
Object | The deployment wizard has run against this model. |
DataSourceOverrides |
Object | At least one data source override is defined. |
TableImportSettings |
Object | At least one data source has import settings. |
RefreshOverrides |
Object | At least one refresh override profile is defined. |
AIConsent |
Object | Legacy. Read when present, never written back. |
Permissions |
Object | At least one per-model AI grant has been given. |
They appear in that order.
Workspace database
UseWorkspacedecides whether Tabular Editor connects to a workspace database when it loads the model. The workspace database is overwritten with the metadata of the loaded file or folder structure.WorkspaceConnectionis the Analysis Services instance or Power BI XMLA endpoint the workspace database is deployed to.WorkspaceDatabaseis the name of that database. Make it unique per developer and per model, since the whole point is that each developer gets their own.
Data source overrides
DataSourceOverrides is usedto give the workspace database different connection details from the ones in the model file, so Analysis Services refreshes from somewhere other than what the model says.
| Property | Type | Written when |
|---|---|---|
ImpersonationMode |
String | Not Default. One of Default, ImpersonateAccount, ImpersonateAnonymous, ImpersonateCurrentUser, ImpersonateServiceAccount, ImpersonateUnattendedAccount. |
Username |
String | Set. |
ConnectionString |
Encrypted object | Set. |
Password |
Encrypted object | Set. |
AccountKey |
Encrypted object | Set. Used for blob storage sources. |
PrivacySetting |
String | Set. |
An override whose data source no longer exists in the model is dropped the next time the file is written, and one whose data source was renamed follows the rename.
Table import settings
TableImportSettings is used when you run Import Table or Schema Update, to browse the available tables and views and to pick up source schema changes.
| Property | Type | Written when |
|---|---|---|
ServerType |
String | Always. One of Sql, Oracle, Odbc, OleDb, Snowflake, Dataflow, PostgreSql, MySql, MariaDb, Db2, Databricks, OneLake. |
Options |
Object of strings | The bag isn't empty. |
UserId |
String | Set. |
Password |
Encrypted object | Set, and you chose to save it. |
Provider |
String | ServerType is OleDb. |
PasswordKey, UserIdKey |
String | ServerType is OleDb and the corresponding value is set. |
Server |
String | ServerType isn't Odbc, and it's set. |
ServerKey, DatabaseKey |
String | ServerType isn't Sql, and the value is set. |
Database |
String | Set. |
Authentication |
String | ServerType is Sql, OleDb or Databricks. One of Sql, WindowsIntegrated, AadInteractive, AadPassword, AadIntegrated, AadServicePrincipal, AccessToken, OAuth. |
Encrypt |
Boolean | Set either way. |
Dsn |
String | Set. Used for ODBC. |
RowLimitClause, IdentifierQuoting |
Number | Not at their defaults. |
Schema |
String | Set. |
Options is where anything specific to one provider ends up, as plain strings: a Snowflake warehouse is Options.warehouse, a OneLake workspace is Options.workspaceid. The …Key properties are the names of connection string keys, such as PWD, not secrets.
Password is the only encrypted value here. UserId, Server, Database, Dsn and everything in Options are stored as plain text, so treat the file as sensitive even when it holds no password. A Power BI access token is stored as Password, and is encrypted.
Deployment
Deployment holds what the deployment wizard last used for this model. The six Boolean options are always written once the block exists, whether they're true or false:
| Property | Type | Written when |
|---|---|---|
DeployDataSources |
Boolean | Always |
DeployPartitions |
Boolean | Always |
DeployRefreshPolicyPartitions |
Boolean | Always |
DeployModelRoles |
Boolean | Always |
DeployModelRoleMembers |
Boolean | Always |
DeploySharedExpressions |
Boolean | Always |
TargetConnectionString |
String or object | Always, null if unset. Object form when the connection string carries a password. |
TargetDatabase |
String | Always, null if unset. |
TargetCredentials |
Object | Both a user name and a password are set. |
Refresh overrides
RefreshOverrides is keyed by profile name, and that key is the only place the name is stored. Each profile holds a single Overrides array describing what the profile changes when it runs. See Refresh Override Profiles for what the profiles do and how to define them.
"RefreshOverrides": {
"Nightly": {
"Overrides": [
{
"scope": { "table": "Sales" },
"partitions": [
{
"originalObject": { "table": "Sales", "partition": "Sales-2025" },
"source": { "query": "SELECT * FROM dbo.FactSales WHERE Year = 2025" }
}
]
}
]
}
}
Per-model AI permissions
Permissions records the AI permission grants that apply to this model alone, written when you answer Allow for this model on a permission card in the AI Assistant.
"Permissions": {
"Grants": { "ModelMetadata": "Write", "ModelData": "Read" },
"LastGrantedAt": "2026-09-15T08:12:44.117Z"
}
Grants carries one entry per resource you've granted: ModelMetadata, ModelData, Bpa, Documents or Macros, each set to Deny, Read or Write. These raise your standing grant for the chat while this model is open. The MCP server reads the global grants only, so nothing here reaches it.
How credentials are encrypted
Everything sensitive is encrypted with the Windows Data Protection API under your own user account, so a file containing encrypted data can't be shared with another user or moved to another machine. Three shapes appear, depending on what's being protected:
A connection string with no password in it isn't encrypted at all and stays a plain JSON string, which is why WorkspaceConnection appears both ways in practice.
If a value can't be decrypted, for instance because the file came from another user, the value is read as empty rather than failing the load.
When the file cannot be read
A model opens with or without a .tmuo file.
If the file cannot be deserialized, for instance because it was hand-edited into invalid JSON, Tabular Editor shows a warning titled Error loading User Options file (.tmuo) carrying the underlying error, and then opens the model with default options. Nothing is lost from the model itself; you lose the settings the file held, and the next save writes a fresh one.