Your model file, the application generated from it, and the database it fills never leave your browser. What does leave is a count of which step you reached. This page says exactly which, and gives you three ways to stop it.
.mmd model you upload or paste — its contents are read in the tab and are never uploaded.Analytics are processed by PostHog. The library itself is served from this site rather than from a content delivery network, and it is configured not to fetch any further code from one. When analytics are on, your browser makes exactly three kinds of request to PostHog and no others: one asking for this project’s settings, one asking which features are on, and the events below. When you have opted out, or before the site is configured with a key at all, it makes none of them — the library is not even downloaded.
This is the whole list. It is short on purpose: the point is a funnel — how many readers who arrive get as far as an application they can click on — not a profile of anybody.
| Event | When it fires | What travels with it |
|---|---|---|
try_it_viewed | The Try It Yourself page opens, or its section on the home page scrolls into view | Which of the two |
prompt_copied | The “Copy the prompt” button is pressed | Which block was copied |
upload_started | The upload or paste choice is selected | — |
model_uploaded | A model is loaded, whether an example or your own | File name, size in bytes, line count, and whether it was an example |
checker_started | The model is handed to the EML checker | File name |
checker_passed / checker_failed | The checker returns | How many errors, warnings and notes; which diagnostic codes; how long it took |
generate_started | Generate is pressed | Sample rows requested |
generate_succeeded | The application is assembled | Milliseconds taken, file count, total bytes, entity count, sample rows |
generate_failed | Assembly stops | Whether the checker or the compiler refused, and the compiler’s message |
run_started | Run the application is pressed | Whether it is a fresh database |
app_ready / run_failed | The generated server answers, or does not | Milliseconds from press to answer |
app_interaction | The first click or keystroke lands inside the running application | Milliseconds since it became ready |
model_viewed | A model is drawn by the model viewer | How many entities, relationships, rules, state machines and sagas it declares, and the checker’s error and warning counts — never a name, a column or a line of it |
app_downloaded, stack_downloaded, model_downloaded | A download is started | File count and archive size |
github_clicked, guide_clicked | A link to the source or to the guide is followed | The link’s address and its text |
contact_submitted | The contact form is submitted | — (the form’s own contents go to email, not to analytics) |
Note what is not in that list. No event carries a line of your model, a field name, an entity name or a checker message — only the diagnostic codes, because a message can quote your own names back and a code is what a report would group by anyway.
Four pages record the page itself, so that a reader stuck at a dropzone or staring at a report they cannot read is something we can actually see: Try It Yourself, and guide chapters 09, 10 and 11. The marketing pages do not, and neither does the model viewer.
A recording is of this site’s own interface, and three things are blanked out of it:
Three ways, and the first two need nothing from you at all.
If your browser or an extension sends GPC, this site collects nothing. The analytics library is never even fetched.
Same. DNT is widely ignored on the web; it is honoured here, before any request is made.
Open ?analytics=off on any page of this site. The choice is remembered in this browser. ?analytics=on undoes it.
An ad or tracker blocker also works, and nothing on this site depends on analytics loading — the demo generates and runs an application either way. If you would rather see for yourself, the whole of it is one readable file: assets/js/analytics.js.
Analytics store an anonymous identifier in this browser so that two page views in one visit count as one visit rather than two. There is no advertising, no cross-site tracking and no data sold or shared with anybody. Opting out above removes the identifier.
The contact form posts what you write in it to a mail relay (FormSubmit), which forwards it to us by email. Only what you typed is sent, and it is used to answer you.
The two videos are hosted on YouTube, and their players are not embedded until
you press play. Until then the page holds a picture of a play button drawn in CSS and asks
YouTube for nothing — no player script, no fonts, no cookies. Pressing play loads the
player from youtube-nocookie.com, at which point YouTube sees the request and
applies its own terms; the section says as much next to the buttons. Not pressing play is a
complete opt-out, and needs no setting.
The site is served by GitHub Pages, which keeps its own request logs. The guide’s chapter 10 downloads its runtime from StackBlitz and its packages from npm when you run it. That and the video players above are the only things on this site that reach a host other than this one, and both of them say so where they are.
Ask on GitHub or through the contact page. This page is versioned with the site, so its history is the change log.