Privacy

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.

The short version

What never leaves your browser

  • The .mmd model you upload or paste — its contents are read in the tab and are never uploaded.
  • The application generated from it: every one of its files is assembled in the tab.
  • The database that application fills. It is PostgreSQL compiled to WebAssembly, living in your browser’s IndexedDB.
  • Anything you type into the running application — records, passwords, the lot.

What does leave

  • Anonymous product analytics: which step of the demo ran, whether it succeeded, and how long it took.
  • The usual web request data your browser sends anywhere — page URL, referrer, browser and operating system, and a coarse country from the IP address.
  • On four pages, a session recording of the page itself — with the model editor, the model preview and the application frame blanked out.

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.

Every event, by name

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.

EventWhen it firesWhat travels with it
try_it_viewedThe Try It Yourself page opens, or its section on the home page scrolls into viewWhich of the two
prompt_copiedThe “Copy the prompt” button is pressedWhich block was copied
upload_startedThe upload or paste choice is selected
model_uploadedA model is loaded, whether an example or your ownFile name, size in bytes, line count, and whether it was an example
checker_startedThe model is handed to the EML checkerFile name
checker_passed / checker_failedThe checker returnsHow many errors, warnings and notes; which diagnostic codes; how long it took
generate_startedGenerate is pressedSample rows requested
generate_succeededThe application is assembledMilliseconds taken, file count, total bytes, entity count, sample rows
generate_failedAssembly stopsWhether the checker or the compiler refused, and the compiler’s message
run_startedRun the application is pressedWhether it is a fresh database
app_ready / run_failedThe generated server answers, or does notMilliseconds from press to answer
app_interactionThe first click or keystroke lands inside the running applicationMilliseconds since it became ready
model_viewedA model is drawn by the model viewerHow 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_downloadedA download is startedFile count and archive size
github_clicked, guide_clickedA link to the source or to the guide is followedThe link’s address and its text
contact_submittedThe 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.

Session recordings

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:

Turning it off

Three ways, and the first two need nothing from you at all.

1

Global Privacy Control

If your browser or an extension sends GPC, this site collects nothing. The analytics library is never even fetched.

2

Do Not Track

Same. DNT is widely ignored on the web; it is honoured here, before any request is made.

3

Ask directly

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.

The rest of it

Cookies

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

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 videos on the home page

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.

Hosting

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.

Questions

Ask on GitHub or through the contact page. This page is versioned with the site, so its history is the change log.