On this page

The manifest

manifest.yaml is the registration, the contract, and the documentation of a module. The SDK validates it locally; the loader validates it again at startup.

manifest.yaml
id: my_module                       # lowercase snake_case, globally unique
name: My Module
version: 0.1.0
category: advanced                  # foundation | attribute | external_input | advanced | comparison | other
description: One line, shown on the module card.
about: >-                           # 2-4 sentences for "About this module"
  What the module does and when it is worth opening.
license: MIT
keywords: [conformance check, playback]   # helps MATE AI route chat to this module
default_enabled: true
isConfidentialSafe: true            # true only if the log never leaves the host

requirements:
  event_log:
    log_model: case_centric         # case_centric (default) | object_centric
    required_columns: [case_id, activity, timestamp]
    optional_columns: [resource, end_timestamp]
    min_events: 100
    min_cases: 5
  modules: [discovery]              # hard dependencies
  optional_modules:
    - id: performance
      reason: Cycle times come from performance when it is installed.

provides: [my_module.metrics]       # capabilities and topics you publish
consumes: [log.imported, discovery.completed]

dependencies:
  python:
    requires-python: ">=3.12"
    packages: ["scikit-learn>=1.5"] # private to this module
    inherit: [pm4py, pandas]        # reuse the platform's copies
    isolation: in_process           # in_process | subprocess
    execution: thread               # thread | worker

runtime:                            # JVM modules instead of dependencies.python
  kind: jvm
  jar: dist/my-module-all.jar
  requires-java: 17
  jvm-args: ["-Xmx1g"]

frontend:
  panel: ./panel/index.tsx
  panel_help: { what: …, read: …, computed: … }
  log_filter: true
  widgets: [...]                    # see the frontend chapter

datasets:
  - id: ranking
    title: Activity ranking
    shape: table                    # table | graph | kpi | tree | blob
    route: /ranking

ai_models:                          # optional generated settings card
  llm: { title: LLM, description: Used to summarise results. }
model_store: { title: Model files, config_key: model }

source:                             # citations, max 20
  - title: A Great Paper
    fullCitation: >-
      J. Doe and J. Smith, "A great paper," in 2024 6th International Conference
      on Process Mining (ICPM), Aachen, Germany, 2024, pp. 1-8
    url: https://doi.org/10.1109/xxxx
artifacts:                          # other links, max 20
  - { name: Reference implementation, url: https://github.com/janedoe/great-miner }

config_schema:                      # renders the per-user settings form
  properties:
    threshold: { type: number, title: Drift threshold, minimum: 0, maximum: 1, default: 0.25 }

Field reference#

FieldNotes
idLowercase snake_case, globally unique, must match the class attribute in module.py.
categoryWhere the card sits in the grid: foundation, attribute, external_input, advanced, comparison, other.
aboutLonger plain-language text for the info box; falls back to description.
requirements.event_logThe availability gate: log model, columns, minimum events and cases.
requirements.modules / optional_modulesHard and soft module dependencies. A cycle or a missing hard dependency drops the affected modules and logs an error; the rest boot.
provides / consumesThe contract you publish and rely on; a boot-time check logs an unmatched job-backed subscription (modules.precompute_subscription_unprovided). Availability and the precompute closure are derived from it.
default_enabledWhether new accounts get the module enabled.
precomputelazy (default) computes the first time a log opens the module; eager also runs it in the background right after every import. Reserve eager for the one module whose output is opened first — it costs CPU on every import, and an admin can override it per module.
isConfidentialSafeSet true only when the log never leaves the host.
source / artifactsCitations and links, at most 20 each.
config_schemaJSON-Schema-flavoured; the platform renders the form.
ai_models / model_storeOpt into generated AI-model selectors or a model-file upload card.

Validation rules#

  • A package cannot be in both packages and inherit.
  • Declaring author, author_url, authors, paper_url, or papers is a hard error — credit belongs in source[].fullCitation, in IEEE style with the DOI omitted (the DOI goes in url).
  • A foreign runtime must not declare packages, inherit, or requires-python, and may not force isolation: in_process; its jar must be folder-relative.
  • log_model is the single switch between the two log worlds: case_centric reads ctx.event_log, object_centric reads ctx.object_log, and a module never appears on the wrong kind of log.
Terminal
# validate before the platform does
uv run python -c "from mate.sdk import Manifest; Manifest.load_yaml('modules/my_module/manifest.yaml')"