matlab.toml is a TOML-based configuration file for MATLAB projects. It defines project structure, dependencies, lifecycle scripts, shortcuts, labels, packaging, deployment, and Simulink settings. Every section is optional — the schema mandates no top-level field — but always set name, which supplies the project's display name.
matlab.toml must be placed at the project root folder — the same folder that would contain a .git/ folder or be the top-level working folder for the project.
For MATLAB R2026b and later, prefer matlab.toml for new projects. Existing .prj
projects remain supported and can be converted in either direction with:
matlab.project.convertDefinitionFiles(pwd, "Toml")
Opening a project with openProject, buildtool, or runtests activates its
configuration. The project's [folders].path entries then control the MATLAB path,
so do not spread addpath calls through source and test files.
- Use
matlab-use-package-managerfor MATLAB packages. - Use
matlab-package-toolboxto author and build.mltbxMATLAB packages. - @references/format-reference.md — complete field documentation with examples, plus the validation rules that govern the whole file
- @references/deployment-reference.md — the
[compiler]deployment targets
When to Use
- The user mentions
matlab.toml, or "project" in a MATLAB context (creating, editing, or inspecting a MATLAB project's configuration). - Setting up MATLAB path folders, test folders, lifecycle scripts, shortcuts, package dependencies, reference projects, file labels, export profiles, MATLAB package metadata, deployment targets, or Simulink project settings.
- Auditing an existing
matlab.tomlfor schema violations before they cause silent failures.
When NOT to Use
- The user wants to drive project state through the MATLAB object API directly (
matlab.project.createProject,proj.addPath, etc.) rather than author or edit the file — that is a legitimate but different task; this skill's workflows assume the file is the artifact being produced. - The task is editing a
.prj-format project definition. Do not carry.prjkeys or concepts over intomatlab.toml— the schemas are not equivalent. A reference project may still target a.prjproject. - The task only concerns
[compiler.*]deployment target internals in depth — read @references/deployment-reference.md directly rather than following the Creation/Editing workflows below, which are file-level, not per-target.
Key Functions
| Function | Purpose |
|---|---|
openProject |
Loads a matlab.toml (or .prj) as the current project. Does not validate the schema — unrecognized keys, missing files, and wrong types all load silently. Use it to confirm the file parses, never as a correctness check. |
currentProject |
Returns the currently open Project object; use its Name, PathFolders, TestFolders, StartupFiles, etc. properties to verify a round-trip after writing the file. |
matlab.project.createProject |
Creates a new project through the imperative API instead of authoring the file. Avoid this as the mechanism for producing matlab.toml — write the TOML directly (see Creation Workflow, step 3). |
Creation Workflow
When a user wants to create a new matlab.toml (no existing file), follow this scan-first approach:
-
Ask for the project name. This is the only required field.
-
Scan the current folder for existing structure:
- Find subfolders containing
.m,.mlx,.slx, or.mlappfiles. Propose these as[folders].pathentries. - Identify folders whose names contain "test" (e.g.,
tests/,test/,unitTests/). Propose these as[folders].testentries. - Look for scripts matching
*startup*or*setup*patterns — propose asstartup-files. - Look for scripts matching
*shutdown*or*cleanup*or*teardown*patterns — propose asshutdown-files. - Exclude hidden folders (
.git,.svn, etc.) and common output folders (derived/,results/,build/).
- Find subfolders containing
-
Generate a draft starting minimal — name, folders, and any discovered lifecycle scripts. Present it to the user.
-
Ask about optional sections as needed, not as a checklist:
- MATLAB packages (not MathWorks products) and reference projects
- Shortcuts to frequently-used scripts
- File labels and export profiles (only if used in code or explicitly requested)
- MATLAB package metadata (
[[package]]) if the project ships as an.mltbx - Deployment targets (
[compiler.*]) if the project builds a standalone app, library, or language package - Simulink settings (if
.slxfiles are present)
-
After generating the TOML file, ask the user if they want the folders listed in
[folders]to be created on disk (for nonexistent folders in new projects).
Start minimal and let the user add sections incrementally. One focused question at a time is better than a long questionnaire.
Editing Workflow
When a matlab.toml already exists and the user wants to modify it:
-
Read the existing
matlab.tomlto understand the current configuration. -
Map the user's request to schema sections. Identify which section(s) need changes — refer to @references/format-reference.md for valid fields and formats.
-
Make targeted edits. Modify only the sections the user asked about. Do not restructure, reformat, or reorder untouched sections. Preserve any user comments (
#lines) in the file. -
Validate against the schema yourself.
openProjectdoes not report schema violations — unknown keys, missing files, and wrong value types all load silently and are simply ignored. A successfulopenProjectis not evidence the file is correct, so check every key against @references/format-reference.md rather than relying on MATLAB errors and warnings:- Dependency values must use one of the three supported formats (package version string, package version with ID, or reference-project path).
- Array-of-tables (
[[project.profile]],[[package]],[[matlab.test.test-suite]],[[compiler.*]]) syntax must be correct. - No unknown keys. Every table except
[user]is closed. Do not invent keys or carry over keys from.prjfiles. - Path keys must resolve. Most path values must point at files that exist and live inside the project root. Few paths (
startup-folder, dependencypath) can be outside the project root. Output paths (cache folders, build output) do not need to exist. The reference annotates each key. Confirming a path means listing the folder and seeing the entry — a truncated, filtered, orhead-limited listing that fails to show it is not a confirmation, and neither is alsof a guessed name that returns nothing. - Required fields must be present:
idandpackage-rootin[[package]],namein[[compiler.standalone]],pathin project-path dependencies and shortcuts,versionin version-with-ID dependencies, and bothcategoryandlabelin every label filter.
-
Present the change — show the user what will be modified before writing the file.
Conventions
- Author the TOML directly. Do not produce
matlab.tomlby drivingmatlab.project.createProjectand reading back what MATLAB wrote — write the file yourself, with the sections in the order given above. - Tables are closed. Every table except
[user]rejects unrecognized keys. Never invent a key or carry one over from a.prjfile; check every key against @references/format-reference.md. openProjectis not a validator. A file that opens cleanly may still contain silently-ignored schema violations — the only way to be sure a key is correct is to look it up.- Path values must be confirmed, not guessed. Listing a folder and seeing the entry is a confirmation; a truncated, filtered, or
head-limited listing that fails to show it is not, and neither is anlsof a guessed name that returns nothing. - MathWorks products are never
[dependencies]entries.[dependencies]accepts any key, so a product name loads silently and wrongly. Record product requirements elsewhere (e.g.[project].summary,[[package]].product-dependencies, or a comment). - Preserve what the user didn't ask you to touch. Comments and section order in an existing file survive an edit unless the user's request required changing them.
Quick Reference
| Section | Purpose | Key Fields |
|---|---|---|
name |
Project name (always set it) | string |
[user] |
Free-form custom data | any keys/nested tables |
[folders] |
MATLAB path and test folders | path, test (arrays) |
[dependencies] |
Declare MATLAB packages (not MathWorks products) or reference projects | packages: version string or {version, id}; references: {path, absolute} |
[project] |
Lifecycle and metadata | summary, startup-folder, startup-files, shutdown-files, custom-tasks |
[project.dependency-analyzer] |
Dependency analysis cache | cache-file |
[project.shortcuts] |
Named script shortcuts | {path, icon} per shortcut; can be grouped |
[project.labels.Category] |
File categorization | LabelName = ["file.m", "dir/"] |
[[project.profile]] |
Export/filter profiles | name, included-files, excluded-files, excluded-labels |
[project.dashboards] |
Dashboard label groupings | component, unit (label references) |
[project.digital-thread] |
Traceability settings | tool-output-tracking, ignore |
[[package]] |
Build a MATLAB package | id (required), package-root (required), name, version, summary, description, folders, apps, provider |
[compiler.*] |
Deployment build targets | 10 targets: standalone (name required), web-app, excel-add-in, dot-net-assembly, c-shared-library, cpp-shared-library, production-server-archive, com-component, java-package, python-package — see @references/deployment-reference.md |
[matlab.test] |
Test runner configuration | coverage-setting, test-suite |
[simulink] |
Simulink settings | start-simulink, cache-folder, codegen-folder, refresh-customizations |
[simulink.process-advisor] |
Process Advisor settings | incremental-build, enable-model-caching, 9 more string properties |
[[package]] can include MATLAB code, Simulink models, apps, documentation, and other
project content in the resulting MATLAB package. Use matlab-package-toolbox for the
authoring and build workflow, or matlab-use-package-manager to install a completed
package.
Package Dependencies and Reference Projects
Each key under [dependencies] names either a MATLAB package or a reference project.
MathWorks products are not packages and must not be listed here.
Package dependency: version string — for a MATLAB package:
mytoolbox = "3.*"
Package dependency: version with ID — when the package ID is available:
motor = {version = "*", id = "9b9e5bc2-a583-4d79-98c5-d2b9af135697"}
Reference project — for a project at a filesystem path (absolute is optional and
defaults to relative):
shared-utils = {path = "../shared_utils_lib"}
The referenced project can use either a legacy .prj definition or a matlab.toml
definition. The key is a display label chosen by the user and is unrelated to the folder
on disk. Confirm path by listing the candidate parent folder — never derive it from the
dependency name or from the other project's name.
Examples
Minimal
name = "My Project"
Typical
name = "Signal Analyzer"
[folders]
path = [
"src",
"utilities",
]
test = [
"tests",
]
[dependencies]
signal-processing = "2.*"
[project]
startup-files = [
"setup/initialize.m",
]
[project.shortcuts]
"Run Analysis" = {path = "scripts/analyze.m"}
Copyright 2026 The MathWorks, Inc.