Draw your model. Keep your text.
A graphical viewer and editor for SysML v2 models in the textual notation,
with the .sysml files themselves as the source of truth.
Website · Download · Diagrams · Development
Open a folder of .sysml files, browse the model as a tree, read it as
diagrams, change it, and save. Saving writes a minimal patch over the text, so
comments, doc blocks and formatting survive an edit and a diff shows only what
actually changed. It is the Enterprise Architect idea, on .NET, cross-platform,
without a project database.
Get the latest release. Nothing else needs to be installed, and a sample model comes with it.
| System | Package |
|---|---|
| Windows | x64 · ARM64 |
| macOS | Apple silicon · Intel |
| Debian, Ubuntu | amd64 · arm64 |
| Other Linux | x64 · ARM64 |
The builds are not code-signed yet, so Windows and macOS ask once before they open it.
- Lossless edits. An edit rewrites only the tokens it has to. Comments,
docblocks, blank lines and your formatting stay as they are. - Nothing to import. Point it at a folder. Every file is parsed with the SysML v2 grammar and names resolve across files.
- Works with git. No binary model, no database. Branch, review and merge models the way you already work with code, and keep editing them in any text editor too.
- Standard formats out. Export the whole workspace as SysML v2 JSON or XMI, and any diagram as SVG or PNG.
Select an element and the switcher in the title bar offers the diagrams it can be drawn as. Boxes are laid out automatically, kept apart, with edges routed around them; drag anything where you want it.
| Requirements | Action | State |
|---|---|---|
![]() |
![]() |
![]() |
| Requirements with ids and text, and the parts that satisfy them. | The steps of an action and the successions between them. | States and the transitions between them. |
Right-click an element to add inside it, rename it, type it, mark its maturity or delete it. Each dialog says what it will change before it writes. The toolbar under a diagram adds elements and draws relations between two clicked boxes: connect, flow, succession, transition, satisfy, dependency, allocate, specialization and composition.
That rename touches exactly two lines:
#implemented
- part def <'D.2'> FlightController {
+ part def <'D.2'> Autopilot {
doc /* Runs the attitude and navigation loops. */
…
- part fc : FlightController;
+ part fc : Autopilot;Every edit is a patch over the text, re-parsed before it is accepted, kept in memory with undo until Save writes the changed files. Source tabs show the text itself; errors appear inline and in the problems list, and diagram edits wait until the file parses again.
Nearly every command has a keyboard shortcut; the cogwheel at the bottom left
opens the settings, where each one can be changed (click it, press the new
keys) and the theme chosen. They are kept in settings.json in the user's
application data.
Needs the .NET 10 SDK and a JDK (ANTLR generates the parser at build time;
Antlr4BuildTasks downloads a JDK if there is none).
git clone https://github.com/ferrix-os/sysml-studio
cd sysml-studio
dotnet build SysmlStudio.slnx
dotnet run --project src/SysmlStudio.App -- samples/drone
Give it any folder of .sysml files in place of samples/drone. With no
folder given, the window offers a folder picker, the recent folders and the
sample model in samples/vehicle.
What the model holds can also be printed without the window:
dotnet run --project tools/ParseCheck -- samples/drone
Nothing here reimplements what a library already does.
| Need | Dependency |
|---|---|
| SysML v2 grammar | grammars-v4/sysml-v2, vendored in grammar/ (MIT), generated to C# at build time by Antlr4BuildTasks |
| Lossless edits | ANTLR's TokenStreamRewriter over the token stream |
| Model interchange | SysML2.NET for JSON/XMI export |
| Graph layout | MSAGL |
| UI | Avalonia 12, Nodify.Avalonia (canvas), AvaloniaEdit (source), FluentIcons.Avalonia |
| Type | IBM Plex Sans Condensed and IBM Plex Mono, bundled under the SIL Open Font Licence (src/SysmlStudio.App/Assets/Fonts/OFL.txt) |
| Piece | State |
|---|---|
SysmlStudio.Syntax |
works |
SysmlStudio.Model |
works |
SysmlStudio.Diagrams |
works |
SysmlStudio.Editing |
rename (every reference, across files), delete, add, set type, specialize, maturity, doc comment, and drawing connect / flow / succession / transition / satisfy / dependency / allocate / specialization / composition; each re-parsed before it is accepted |
SysmlStudio.App |
model tree, diagram tabs with a kind switcher, inspector, problems and usages, right-click menus on the tree and the canvas, edit dialogs that say what they will change, a relation tool, undo/redo, source tabs, SysML v2 JSON and XMI export; Save writes the changed files |
dotnet build SysmlStudio.slnx
dotnet test SysmlStudio.slnx
Every gate CI runs, cheapest first, in one command:
scripts/gate.sh # or: .\scripts\gate.ps1
scripts/gate.sh format # one gate by name
| Gate | What it is |
|---|---|
format |
dotnet format --verify-no-changes --severity info: whitespace, using order and the code style .editorconfig fixes |
build |
the build with the .NET analyzers, Roslynator and SonarAnalyzer on and every warning an error |
test |
the xUnit suites, including a headless run of the real window: every diagram kind, a source tab with an error, the dark theme. SYSML_STUDIO_SHOTS=<folder> saves what each test rendered |
sample |
the sample models parse |
model |
loads a real model and fails if a file does not parse |
Judge a gate by its exit status, not by its last line. scripts/gate.sh stops
at the first gate that fails.
The version lives in <VersionPrefix> in Directory.Build.props. To release,
set it, commit, and push a tag of that version:
git tag v0.2.0 && git push origin v0.2.0
The Release workflow then builds every package with scripts/package.sh,
starts the Windows, Linux and macOS ones with scripts/smoke.sh to check
they open, and publishes them with checksums as a GitHub release. It refuses
a tag that does not match VersionPrefix. Run by hand, it builds and checks
the packages without publishing. Package names carry no version, so
releases/latest/download/<name> always
serves the newest one.
The pictures in this README and on the website
are rendered from the real window, headless, over samples/drone, each in the
light and the dark theme:
dotnet run --project tools/Screenshots -- docs/images
The website is docs/index.html, served by GitHub Pages from docs/ on
main.
A commit message is a subject, a blank line, and a body that argues the why.
No Co-authored-by: trailer, no "Generated with" line, no tool signature.
MIT. The vendored grammar in grammar/ is MIT too;
the bundled IBM Plex fonts are under the SIL Open Font Licence.





