Modelable

Modelable is a compiler and language server for versioned, domain-owned data models. Define canonical models and projections in .mdl files, then validate their compatibility, inspect field-level lineage, detect governance gaps, and generate artifacts for the systems that consume them.

Why Modelable?

Data contracts often become fragmented across application types, database schemas, API definitions, and catalog metadata. Modelable keeps the semantic contract in one versioned source and derives target-specific representations without losing ownership, classification, lineage, or compatibility context.

.mdl sources -> validate and resolve -> plan and govern -> generate artifacts

How it fits together

A canonical entity, its compiler-expanded db/request/reply/event projections, a hand-authored cross-domain projection, and the artifacts and (deferred) streaming path they can drive:

flowchart TB
subgraph CUSTOMER["Domain: customer (owner: customer-platform)"]
V1["entity Customer @1<br/>additive"] --> V2["entity Customer @2<br/>additive"]
end
subgraph AUTO["Auto projections — compiler-expanded from Customer @2"]
direction LR
DB["CustomerDb @2<br/>persistence contract"]
REQ["CustomerRequest @2<br/>write model"]
REP["CustomerReply @2<br/>read model"]
EVT["CustomerEvent @2<br/>created / updated / deleted"]
end
V2 --> DB
V2 --> REQ
V2 --> REP
V2 --> EVT
subgraph BILLING["Domain: billing (owner: billing-platform)"]
JOIN["projection BillingCustomer @1<br/>from customer.Customer @2 as c<br/>join orders.Order @3 as o"]
end
V2 -. "field-level lineage" .-> JOIN
subgraph PIPE["Compiler pipeline"]
direction LR
PARSE["Parse .mdl"] --> VALIDATE["Validate, resolve versions,<br/>check compatibility"] --> PLAN["Plan document (JSON)"]
end
DB --> PARSE
REQ --> PARSE
REP --> PARSE
EVT --> PARSE
JOIN --> PARSE
subgraph ARTIFACTS["Generated artifacts"]
direction LR
JSONSCHEMA["JSON Schema"]
TYPES["TypeScript, C#, Java,<br/>Python, Rust, Go"]
SQLDDL["SQL DDL,<br/>dbt schema.yml"]
PROTO["Protobuf / gRPC"]
GOV["OpenLineage, OpenMetadata,<br/>ODCS, FHIR R4"]
end
PLAN --> JSONSCHEMA
PLAN --> TYPES
PLAN --> SQLDDL
PLAN --> PROTO
PLAN --> GOV
subgraph FUTURE["Streaming runtime — Phase 5, deferred, not implemented"]
direction LR
ENVELOPE["Change event envelope"] --> SUBSCRIPTION["Subscription"] --> MATERIALIZED["Materialized replica<br/>Postgres / Kafka"]
end
EVT -.-> ENVELOPE
Loading

Everything above the "Streaming runtime" box is implemented by the local compiler today. subscription, adapter-driven materialization, and the runtime engine parse and validate but do not execute yet — see Architecture and system specification for the exact implemented/deferred boundary of every concept in the diagram.

Install

Modelable requires Python 3.14.

uv tool install modelable
modelable --version

For an isolated one-off command:

uvx modelable --help

Define a model

domain customer {
owner: "customer-platform"
entity Customer @ 1 (additive) {
@key customerId: uuid
@pii email?: string
displayName: string
}
}

Save the definition as customer.mdl, then validate and compile it:

modelable validate customer.mdl --strict
modelable compile customer.mdl --target json-schema --out generated/schema
modelable compile customer.mdl --target typescript --out generated/types

Capabilities

  • Parse and validate versioned models, projections, annotations, and workspace definitions.
  • Resolve exact versions and compatible version ranges.
  • Detect additive and breaking contract changes and affected projections.
  • Trace projection fields to canonical source fields.
  • Report structurally missing access and classification metadata.
  • Expand automatic database, request, reply, and event projections.
  • Author a model version as a delta against its prior version (evolves @ N { add/remove/rename/replace ... }) instead of repeating its complete field list, with tooling to convert either direction (modelable compact-version / expand-version) and to extract a repeated inline enum shape into a shared, versioned semantic enum (modelable extract-enum).
  • Generate JSON Schema, OpenAPI 3.1, Markdown, TypeScript, C#, Java, Python, Rust, Go, SQL DDL, dbt schema.yml, FHIR R4 profile, OpenMetadata JSON, and OpenLineage event, ODCS, Protobuf, Avro record, event-sink contract, and Scalable-oriented gRPC artifacts.
  • Provide diagnostics, completion, hover, navigation, references, rename, formatting, and other editor features through the language server.
  • Import or assist with models through optional LLM provider integrations.

The local compiler and language-server toolchain are the supported 1.0 stable surface. Apicurio JSON Schema artifact publish/pull and Marquez-compatible OpenLineage event sync are available for derived artifacts. Live catalog publishing, distributed synchronization, OpenLineage runtime event collection, and runtime materialization remain future candidates.

Browser playground

The static Modelable playground runs the compiler locally in the browser. It supports creating, importing, renaming, deleting, selecting, and editing multiple .mdl files, then validating or generating artifacts from the complete workspace.

The one local workspace is restored automatically from IndexedDB. Source text never leaves the page; compiler output is not persisted. If browser storage is unavailable, editing continues in memory with an explicit status. Invalid or incompatible stored data is left untouched until the user exports it or resets the workspace.

Beyond the editor, the playground provides:

  • Protocol v2 language services: 300 ms live diagnostics plus browser-native completion, hover, go-to-definition, references, and rename over the complete local workspace, usable from the last parseable semantic snapshot while current text contains a syntax error.
  • Domain and entity graph visualization with field lineage tracing, version compatibility views with downstream projection impacts, governance findings, and SVG/PNG diagram export.
  • Local AI assistance via WebLLM (or an optional local Ollama server) for entity generation and explanations, always behind validated previews and explicit user acceptance.
  • Offline operation through a service worker, accessibility enforcement, performance budgets, and automatic documentation retrieval (/docs-style questions routed to the bundled RAG index).

Diagnostics, completion results, hover content, and other derived state remain in-memory only and are never persisted.

1.0 stable surface

Modelable 1.0 stabilizes the local compiler and language-server toolchain.

In scope for 1.0:

  • .mdl language: syntax, types, projections, ownership, classification, and access metadata.
  • CLI: validate, compile, diff, generate, attach, spec, and the language server.
  • Generated artifacts: JSON Schema, TypeScript, C#, Java, Python, Rust, Go, SQL DDL, dbt schema.yml, Markdown, FHIR R4 profile, OpenMetadata JSON, OpenLineage event, ODCS, Protobuf, and Scalable-oriented gRPC formats.
  • Compatibility, lineage, and governance report output.
  • Apicurio JSON Schema registry artifact push/pull.
  • Marquez-compatible OpenLineage event sync via modelable sync --lineage.
  • VS Code extension shipped as a VSIX companion artifact with the 1.0 release.

Deferred from 1.0:

  • VS Code Marketplace distribution (post-1.0).
  • Live OpenMetadata catalog synchronization and runtime OpenLineage collection.
  • Remote tracked-spec polling and authenticated source access.
  • Runtime subscriptions, adapters, replay, and materialization.
  • Distributed registry synchronization beyond the current file-first model.

Development

cd cli
uv sync --extra dev --frozen
uv run pytest tests/ --tb=short
uv run modelable validate ../samples/mvp --strict

See CONTRIBUTING.md for the complete contributor workflow.

Documentation

Hosted: https://ktjn.github.io/modelable/

License

Licensed under the Apache License 2.0.

About

Compiler and language server for versioned, domain-owned data models

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Modelable

Modelable is a compiler and language server for versioned, domain-owned data models. Define canonical models and projections in .mdl files, then validate their compatibility, inspect field-level lineage, detect governance gaps, and generate artifacts for the systems that consume them.

Why Modelable?

Data contracts often become fragmented across application types, database schemas, API definitions, and catalog metadata. Modelable keeps the semantic contract in one versioned source and derives target-specific representations without losing ownership, classification, lineage, or compatibility context.

.mdl sources -> validate and resolve -> plan and govern -> generate artifacts

How it fits together

A canonical entity, its compiler-expanded db/request/reply/event projections, a hand-authored cross-domain projection, and the artifacts and (deferred) streaming path they can drive:

flowchart TB
subgraph CUSTOMER["Domain: customer (owner: customer-platform)"]
V1["entity Customer @1<br/>additive"] --> V2["entity Customer @2<br/>additive"]
end
subgraph AUTO["Auto projections — compiler-expanded from Customer @2"]
direction LR
DB["CustomerDb @2<br/>persistence contract"]
REQ["CustomerRequest @2<br/>write model"]
REP["CustomerReply @2<br/>read model"]
EVT["CustomerEvent @2<br/>created / updated / deleted"]
end
V2 --> DB
V2 --> REQ
V2 --> REP
V2 --> EVT
subgraph BILLING["Domain: billing (owner: billing-platform)"]
JOIN["projection BillingCustomer @1<br/>from customer.Customer @2 as c<br/>join orders.Order @3 as o"]
end
V2 -. "field-level lineage" .-> JOIN
subgraph PIPE["Compiler pipeline"]
direction LR
PARSE["Parse .mdl"] --> VALIDATE["Validate, resolve versions,<br/>check compatibility"] --> PLAN["Plan document (JSON)"]
end
DB --> PARSE
REQ --> PARSE
REP --> PARSE
EVT --> PARSE
JOIN --> PARSE
subgraph ARTIFACTS["Generated artifacts"]
direction LR
JSONSCHEMA["JSON Schema"]
TYPES["TypeScript, C#, Java,<br/>Python, Rust, Go"]
SQLDDL["SQL DDL,<br/>dbt schema.yml"]
PROTO["Protobuf / gRPC"]
GOV["OpenLineage, OpenMetadata,<br/>ODCS, FHIR R4"]
end
PLAN --> JSONSCHEMA
PLAN --> TYPES
PLAN --> SQLDDL
PLAN --> PROTO
PLAN --> GOV
subgraph FUTURE["Streaming runtime — Phase 5, deferred, not implemented"]
direction LR
ENVELOPE["Change event envelope"] --> SUBSCRIPTION["Subscription"] --> MATERIALIZED["Materialized replica<br/>Postgres / Kafka"]
end
EVT -.-> ENVELOPE
Loading

Everything above the "Streaming runtime" box is implemented by the local compiler today. subscription, adapter-driven materialization, and the runtime engine parse and validate but do not execute yet — see Architecture and system specification for the exact implemented/deferred boundary of every concept in the diagram.

Install

Modelable requires Python 3.14.

uv tool install modelable
modelable --version

For an isolated one-off command:

uvx modelable --help

Define a model

domain customer {
owner: "customer-platform"
entity Customer @ 1 (additive) {
@key customerId: uuid
@pii email?: string
displayName: string
}
}

Save the definition as customer.mdl, then validate and compile it:

modelable validate customer.mdl --strict
modelable compile customer.mdl --target json-schema --out generated/schema
modelable compile customer.mdl --target typescript --out generated/types

Capabilities

  • Parse and validate versioned models, projections, annotations, and workspace definitions.
  • Resolve exact versions and compatible version ranges.
  • Detect additive and breaking contract changes and affected projections.
  • Trace projection fields to canonical source fields.
  • Report structurally missing access and classification metadata.
  • Expand automatic database, request, reply, and event projections.
  • Author a model version as a delta against its prior version (evolves @ N { add/remove/rename/replace ... }) instead of repeating its complete field list, with tooling to convert either direction (modelable compact-version / expand-version) and to extract a repeated inline enum shape into a shared, versioned semantic enum (modelable extract-enum).
  • Generate JSON Schema, OpenAPI 3.1, Markdown, TypeScript, C#, Java, Python, Rust, Go, SQL DDL, dbt schema.yml, FHIR R4 profile, OpenMetadata JSON, and OpenLineage event, ODCS, Protobuf, Avro record, event-sink contract, and Scalable-oriented gRPC artifacts.
  • Provide diagnostics, completion, hover, navigation, references, rename, formatting, and other editor features through the language server.
  • Import or assist with models through optional LLM provider integrations.

The local compiler and language-server toolchain are the supported 1.0 stable surface. Apicurio JSON Schema artifact publish/pull and Marquez-compatible OpenLineage event sync are available for derived artifacts. Live catalog publishing, distributed synchronization, OpenLineage runtime event collection, and runtime materialization remain future candidates.

Browser playground

The static Modelable playground runs the compiler locally in the browser. It supports creating, importing, renaming, deleting, selecting, and editing multiple .mdl files, then validating or generating artifacts from the complete workspace.

The one local workspace is restored automatically from IndexedDB. Source text never leaves the page; compiler output is not persisted. If browser storage is unavailable, editing continues in memory with an explicit status. Invalid or incompatible stored data is left untouched until the user exports it or resets the workspace.

Beyond the editor, the playground provides:

  • Protocol v2 language services: 300 ms live diagnostics plus browser-native completion, hover, go-to-definition, references, and rename over the complete local workspace, usable from the last parseable semantic snapshot while current text contains a syntax error.
  • Domain and entity graph visualization with field lineage tracing, version compatibility views with downstream projection impacts, governance findings, and SVG/PNG diagram export.
  • Local AI assistance via WebLLM (or an optional local Ollama server) for entity generation and explanations, always behind validated previews and explicit user acceptance.
  • Offline operation through a service worker, accessibility enforcement, performance budgets, and automatic documentation retrieval (/docs-style questions routed to the bundled RAG index).

Diagnostics, completion results, hover content, and other derived state remain in-memory only and are never persisted.

1.0 stable surface

Modelable 1.0 stabilizes the local compiler and language-server toolchain.

In scope for 1.0:

  • .mdl language: syntax, types, projections, ownership, classification, and access metadata.
  • CLI: validate, compile, diff, generate, attach, spec, and the language server.
  • Generated artifacts: JSON Schema, TypeScript, C#, Java, Python, Rust, Go, SQL DDL, dbt schema.yml, Markdown, FHIR R4 profile, OpenMetadata JSON, OpenLineage event, ODCS, Protobuf, and Scalable-oriented gRPC formats.
  • Compatibility, lineage, and governance report output.
  • Apicurio JSON Schema registry artifact push/pull.
  • Marquez-compatible OpenLineage event sync via modelable sync --lineage.
  • VS Code extension shipped as a VSIX companion artifact with the 1.0 release.

Deferred from 1.0:

  • VS Code Marketplace distribution (post-1.0).
  • Live OpenMetadata catalog synchronization and runtime OpenLineage collection.
  • Remote tracked-spec polling and authenticated source access.
  • Runtime subscriptions, adapters, replay, and materialization.
  • Distributed registry synchronization beyond the current file-first model.

Development

cd cli
uv sync --extra dev --frozen
uv run pytest tests/ --tb=short
uv run modelable validate ../samples/mvp --strict

See CONTRIBUTING.md for the complete contributor workflow.

Documentation

Hosted: https://ktjn.github.io/modelable/

License

Licensed under the Apache License 2.0.

About

Compiler and language server for versioned, domain-owned data models

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Modelable

Modelable is a compiler and language server for versioned, domain-owned data models. Define canonical models and projections in .mdl files, then validate their compatibility, inspect field-level lineage, detect governance gaps, and generate artifacts for the systems that consume them.

Why Modelable?

Data contracts often become fragmented across application types, database schemas, API definitions, and catalog metadata. Modelable keeps the semantic contract in one versioned source and derives target-specific representations without losing ownership, classification, lineage, or compatibility context.

.mdl sources -> validate and resolve -> plan and govern -> generate artifacts

How it fits together

A canonical entity, its compiler-expanded db/request/reply/event projections, a hand-authored cross-domain projection, and the artifacts and (deferred) streaming path they can drive:

flowchart TB
subgraph CUSTOMER["Domain: customer (owner: customer-platform)"]
V1["entity Customer @1<br/>additive"] --> V2["entity Customer @2<br/>additive"]
end
subgraph AUTO["Auto projections — compiler-expanded from Customer @2"]
direction LR
DB["CustomerDb @2<br/>persistence contract"]
REQ["CustomerRequest @2<br/>write model"]
REP["CustomerReply @2<br/>read model"]
EVT["CustomerEvent @2<br/>created / updated / deleted"]
end
V2 --> DB
V2 --> REQ
V2 --> REP
V2 --> EVT
subgraph BILLING["Domain: billing (owner: billing-platform)"]
JOIN["projection BillingCustomer @1<br/>from customer.Customer @2 as c<br/>join orders.Order @3 as o"]
end
V2 -. "field-level lineage" .-> JOIN
subgraph PIPE["Compiler pipeline"]
direction LR
PARSE["Parse .mdl"] --> VALIDATE["Validate, resolve versions,<br/>check compatibility"] --> PLAN["Plan document (JSON)"]
end
DB --> PARSE
REQ --> PARSE
REP --> PARSE
EVT --> PARSE
JOIN --> PARSE
subgraph ARTIFACTS["Generated artifacts"]
direction LR
JSONSCHEMA["JSON Schema"]
TYPES["TypeScript, C#, Java,<br/>Python, Rust, Go"]
SQLDDL["SQL DDL,<br/>dbt schema.yml"]
PROTO["Protobuf / gRPC"]
GOV["OpenLineage, OpenMetadata,<br/>ODCS, FHIR R4"]
end
PLAN --> JSONSCHEMA
PLAN --> TYPES
PLAN --> SQLDDL
PLAN --> PROTO
PLAN --> GOV
subgraph FUTURE["Streaming runtime — Phase 5, deferred, not implemented"]
direction LR
ENVELOPE["Change event envelope"] --> SUBSCRIPTION["Subscription"] --> MATERIALIZED["Materialized replica<br/>Postgres / Kafka"]
end
EVT -.-> ENVELOPE
Loading

Everything above the "Streaming runtime" box is implemented by the local compiler today. subscription, adapter-driven materialization, and the runtime engine parse and validate but do not execute yet — see Architecture and system specification for the exact implemented/deferred boundary of every concept in the diagram.

Install

Modelable requires Python 3.14.

uv tool install modelable
modelable --version

For an isolated one-off command:

uvx modelable --help

Define a model

domain customer {
owner: "customer-platform"
entity Customer @ 1 (additive) {
@key customerId: uuid
@pii email?: string
displayName: string
}
}

Save the definition as customer.mdl, then validate and compile it:

modelable validate customer.mdl --strict
modelable compile customer.mdl --target json-schema --out generated/schema
modelable compile customer.mdl --target typescript --out generated/types

Capabilities

  • Parse and validate versioned models, projections, annotations, and workspace definitions.
  • Resolve exact versions and compatible version ranges.
  • Detect additive and breaking contract changes and affected projections.
  • Trace projection fields to canonical source fields.
  • Report structurally missing access and classification metadata.
  • Expand automatic database, request, reply, and event projections.
  • Author a model version as a delta against its prior version (evolves @ N { add/remove/rename/replace ... }) instead of repeating its complete field list, with tooling to convert either direction (modelable compact-version / expand-version) and to extract a repeated inline enum shape into a shared, versioned semantic enum (modelable extract-enum).
  • Generate JSON Schema, OpenAPI 3.1, Markdown, TypeScript, C#, Java, Python, Rust, Go, SQL DDL, dbt schema.yml, FHIR R4 profile, OpenMetadata JSON, and OpenLineage event, ODCS, Protobuf, Avro record, event-sink contract, and Scalable-oriented gRPC artifacts.
  • Provide diagnostics, completion, hover, navigation, references, rename, formatting, and other editor features through the language server.
  • Import or assist with models through optional LLM provider integrations.

The local compiler and language-server toolchain are the supported 1.0 stable surface. Apicurio JSON Schema artifact publish/pull and Marquez-compatible OpenLineage event sync are available for derived artifacts. Live catalog publishing, distributed synchronization, OpenLineage runtime event collection, and runtime materialization remain future candidates.

Browser playground

The static Modelable playground runs the compiler locally in the browser. It supports creating, importing, renaming, deleting, selecting, and editing multiple .mdl files, then validating or generating artifacts from the complete workspace.

The one local workspace is restored automatically from IndexedDB. Source text never leaves the page; compiler output is not persisted. If browser storage is unavailable, editing continues in memory with an explicit status. Invalid or incompatible stored data is left untouched until the user exports it or resets the workspace.

Beyond the editor, the playground provides:

  • Protocol v2 language services: 300 ms live diagnostics plus browser-native completion, hover, go-to-definition, references, and rename over the complete local workspace, usable from the last parseable semantic snapshot while current text contains a syntax error.
  • Domain and entity graph visualization with field lineage tracing, version compatibility views with downstream projection impacts, governance findings, and SVG/PNG diagram export.
  • Local AI assistance via WebLLM (or an optional local Ollama server) for entity generation and explanations, always behind validated previews and explicit user acceptance.
  • Offline operation through a service worker, accessibility enforcement, performance budgets, and automatic documentation retrieval (/docs-style questions routed to the bundled RAG index).

Diagnostics, completion results, hover content, and other derived state remain in-memory only and are never persisted.

1.0 stable surface

Modelable 1.0 stabilizes the local compiler and language-server toolchain.

In scope for 1.0:

  • .mdl language: syntax, types, projections, ownership, classification, and access metadata.
  • CLI: validate, compile, diff, generate, attach, spec, and the language server.
  • Generated artifacts: JSON Schema, TypeScript, C#, Java, Python, Rust, Go, SQL DDL, dbt schema.yml, Markdown, FHIR R4 profile, OpenMetadata JSON, OpenLineage event, ODCS, Protobuf, and Scalable-oriented gRPC formats.
  • Compatibility, lineage, and governance report output.
  • Apicurio JSON Schema registry artifact push/pull.
  • Marquez-compatible OpenLineage event sync via modelable sync --lineage.
  • VS Code extension shipped as a VSIX companion artifact with the 1.0 release.

Deferred from 1.0:

  • VS Code Marketplace distribution (post-1.0).
  • Live OpenMetadata catalog synchronization and runtime OpenLineage collection.
  • Remote tracked-spec polling and authenticated source access.
  • Runtime subscriptions, adapters, replay, and materialization.
  • Distributed registry synchronization beyond the current file-first model.

Development

cd cli
uv sync --extra dev --frozen
uv run pytest tests/ --tb=short
uv run modelable validate ../samples/mvp --strict

See CONTRIBUTING.md for the complete contributor workflow.

Documentation

Hosted: https://ktjn.github.io/modelable/

License

Licensed under the Apache License 2.0.

About

Compiler and language server for versioned, domain-owned data models

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Modelable

Modelable is a compiler and language server for versioned, domain-owned data models. Define canonical models and projections in .mdl files, then validate their compatibility, inspect field-level lineage, detect governance gaps, and generate artifacts for the systems that consume them.

Why Modelable?

Data contracts often become fragmented across application types, database schemas, API definitions, and catalog metadata. Modelable keeps the semantic contract in one versioned source and derives target-specific representations without losing ownership, classification, lineage, or compatibility context.

.mdl sources -> validate and resolve -> plan and govern -> generate artifacts

How it fits together

A canonical entity, its compiler-expanded db/request/reply/event projections, a hand-authored cross-domain projection, and the artifacts and (deferred) streaming path they can drive:

flowchart TB
subgraph CUSTOMER["Domain: customer (owner: customer-platform)"]
V1["entity Customer @1<br/>additive"] --> V2["entity Customer @2<br/>additive"]
end
subgraph AUTO["Auto projections — compiler-expanded from Customer @2"]
direction LR
DB["CustomerDb @2<br/>persistence contract"]
REQ["CustomerRequest @2<br/>write model"]
REP["CustomerReply @2<br/>read model"]
EVT["CustomerEvent @2<br/>created / updated / deleted"]
end
V2 --> DB
V2 --> REQ
V2 --> REP
V2 --> EVT
subgraph BILLING["Domain: billing (owner: billing-platform)"]
JOIN["projection BillingCustomer @1<br/>from customer.Customer @2 as c<br/>join orders.Order @3 as o"]
end
V2 -. "field-level lineage" .-> JOIN
subgraph PIPE["Compiler pipeline"]
direction LR
PARSE["Parse .mdl"] --> VALIDATE["Validate, resolve versions,<br/>check compatibility"] --> PLAN["Plan document (JSON)"]
end
DB --> PARSE
REQ --> PARSE
REP --> PARSE
EVT --> PARSE
JOIN --> PARSE
subgraph ARTIFACTS["Generated artifacts"]
direction LR
JSONSCHEMA["JSON Schema"]
TYPES["TypeScript, C#, Java,<br/>Python, Rust, Go"]
SQLDDL["SQL DDL,<br/>dbt schema.yml"]
PROTO["Protobuf / gRPC"]
GOV["OpenLineage, OpenMetadata,<br/>ODCS, FHIR R4"]
end
PLAN --> JSONSCHEMA
PLAN --> TYPES
PLAN --> SQLDDL
PLAN --> PROTO
PLAN --> GOV
subgraph FUTURE["Streaming runtime — Phase 5, deferred, not implemented"]
direction LR
ENVELOPE["Change event envelope"] --> SUBSCRIPTION["Subscription"] --> MATERIALIZED["Materialized replica<br/>Postgres / Kafka"]
end
EVT -.-> ENVELOPE
Loading

Everything above the "Streaming runtime" box is implemented by the local compiler today. subscription, adapter-driven materialization, and the runtime engine parse and validate but do not execute yet — see Architecture and system specification for the exact implemented/deferred boundary of every concept in the diagram.

Install

Modelable requires Python 3.14.

uv tool install modelable
modelable --version

For an isolated one-off command:

uvx modelable --help

Define a model

domain customer {
owner: "customer-platform"
entity Customer @ 1 (additive) {
@key customerId: uuid
@pii email?: string
displayName: string
}
}

Save the definition as customer.mdl, then validate and compile it:

modelable validate customer.mdl --strict
modelable compile customer.mdl --target json-schema --out generated/schema
modelable compile customer.mdl --target typescript --out generated/types

Capabilities

  • Parse and validate versioned models, projections, annotations, and workspace definitions.
  • Resolve exact versions and compatible version ranges.
  • Detect additive and breaking contract changes and affected projections.
  • Trace projection fields to canonical source fields.
  • Report structurally missing access and classification metadata.
  • Expand automatic database, request, reply, and event projections.
  • Author a model version as a delta against its prior version (evolves @ N { add/remove/rename/replace ... }) instead of repeating its complete field list, with tooling to convert either direction (modelable compact-version / expand-version) and to extract a repeated inline enum shape into a shared, versioned semantic enum (modelable extract-enum).
  • Generate JSON Schema, OpenAPI 3.1, Markdown, TypeScript, C#, Java, Python, Rust, Go, SQL DDL, dbt schema.yml, FHIR R4 profile, OpenMetadata JSON, and OpenLineage event, ODCS, Protobuf, Avro record, event-sink contract, and Scalable-oriented gRPC artifacts.
  • Provide diagnostics, completion, hover, navigation, references, rename, formatting, and other editor features through the language server.
  • Import or assist with models through optional LLM provider integrations.

The local compiler and language-server toolchain are the supported 1.0 stable surface. Apicurio JSON Schema artifact publish/pull and Marquez-compatible OpenLineage event sync are available for derived artifacts. Live catalog publishing, distributed synchronization, OpenLineage runtime event collection, and runtime materialization remain future candidates.

Browser playground

The static Modelable playground runs the compiler locally in the browser. It supports creating, importing, renaming, deleting, selecting, and editing multiple .mdl files, then validating or generating artifacts from the complete workspace.

The one local workspace is restored automatically from IndexedDB. Source text never leaves the page; compiler output is not persisted. If browser storage is unavailable, editing continues in memory with an explicit status. Invalid or incompatible stored data is left untouched until the user exports it or resets the workspace.

Beyond the editor, the playground provides:

  • Protocol v2 language services: 300 ms live diagnostics plus browser-native completion, hover, go-to-definition, references, and rename over the complete local workspace, usable from the last parseable semantic snapshot while current text contains a syntax error.
  • Domain and entity graph visualization with field lineage tracing, version compatibility views with downstream projection impacts, governance findings, and SVG/PNG diagram export.
  • Local AI assistance via WebLLM (or an optional local Ollama server) for entity generation and explanations, always behind validated previews and explicit user acceptance.
  • Offline operation through a service worker, accessibility enforcement, performance budgets, and automatic documentation retrieval (/docs-style questions routed to the bundled RAG index).

Diagnostics, completion results, hover content, and other derived state remain in-memory only and are never persisted.

1.0 stable surface

Modelable 1.0 stabilizes the local compiler and language-server toolchain.

In scope for 1.0:

  • .mdl language: syntax, types, projections, ownership, classification, and access metadata.
  • CLI: validate, compile, diff, generate, attach, spec, and the language server.
  • Generated artifacts: JSON Schema, TypeScript, C#, Java, Python, Rust, Go, SQL DDL, dbt schema.yml, Markdown, FHIR R4 profile, OpenMetadata JSON, OpenLineage event, ODCS, Protobuf, and Scalable-oriented gRPC formats.
  • Compatibility, lineage, and governance report output.
  • Apicurio JSON Schema registry artifact push/pull.
  • Marquez-compatible OpenLineage event sync via modelable sync --lineage.
  • VS Code extension shipped as a VSIX companion artifact with the 1.0 release.

Deferred from 1.0:

  • VS Code Marketplace distribution (post-1.0).
  • Live OpenMetadata catalog synchronization and runtime OpenLineage collection.
  • Remote tracked-spec polling and authenticated source access.
  • Runtime subscriptions, adapters, replay, and materialization.
  • Distributed registry synchronization beyond the current file-first model.

Development

cd cli
uv sync --extra dev --frozen
uv run pytest tests/ --tb=short
uv run modelable validate ../samples/mvp --strict

See CONTRIBUTING.md for the complete contributor workflow.

Documentation

Hosted: https://ktjn.github.io/modelable/

License

Licensed under the Apache License 2.0.

About

Compiler and language server for versioned, domain-owned data models

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Modelable

Modelable is a compiler and language server for versioned, domain-owned data models. Define canonical models and projections in .mdl files, then validate their compatibility, inspect field-level lineage, detect governance gaps, and generate artifacts for the systems that consume them.

Why Modelable?

Data contracts often become fragmented across application types, database schemas, API definitions, and catalog metadata. Modelable keeps the semantic contract in one versioned source and derives target-specific representations without losing ownership, classification, lineage, or compatibility context.

.mdl sources -> validate and resolve -> plan and govern -> generate artifacts

How it fits together

A canonical entity, its compiler-expanded db/request/reply/event projections, a hand-authored cross-domain projection, and the artifacts and (deferred) streaming path they can drive:

flowchart TB
subgraph CUSTOMER["Domain: customer (owner: customer-platform)"]
V1["entity Customer @1<br/>additive"] --> V2["entity Customer @2<br/>additive"]
end
subgraph AUTO["Auto projections — compiler-expanded from Customer @2"]
direction LR
DB["CustomerDb @2<br/>persistence contract"]
REQ["CustomerRequest @2<br/>write model"]
REP["CustomerReply @2<br/>read model"]
EVT["CustomerEvent @2<br/>created / updated / deleted"]
end
V2 --> DB
V2 --> REQ
V2 --> REP
V2 --> EVT
subgraph BILLING["Domain: billing (owner: billing-platform)"]
JOIN["projection BillingCustomer @1<br/>from customer.Customer @2 as c<br/>join orders.Order @3 as o"]
end
V2 -. "field-level lineage" .-> JOIN
subgraph PIPE["Compiler pipeline"]
direction LR
PARSE["Parse .mdl"] --> VALIDATE["Validate, resolve versions,<br/>check compatibility"] --> PLAN["Plan document (JSON)"]
end
DB --> PARSE
REQ --> PARSE
REP --> PARSE
EVT --> PARSE
JOIN --> PARSE
subgraph ARTIFACTS["Generated artifacts"]
direction LR
JSONSCHEMA["JSON Schema"]
TYPES["TypeScript, C#, Java,<br/>Python, Rust, Go"]
SQLDDL["SQL DDL,<br/>dbt schema.yml"]
PROTO["Protobuf / gRPC"]
GOV["OpenLineage, OpenMetadata,<br/>ODCS, FHIR R4"]
end
PLAN --> JSONSCHEMA
PLAN --> TYPES
PLAN --> SQLDDL
PLAN --> PROTO
PLAN --> GOV
subgraph FUTURE["Streaming runtime — Phase 5, deferred, not implemented"]
direction LR
ENVELOPE["Change event envelope"] --> SUBSCRIPTION["Subscription"] --> MATERIALIZED["Materialized replica<br/>Postgres / Kafka"]
end
EVT -.-> ENVELOPE
Loading

Everything above the "Streaming runtime" box is implemented by the local compiler today. subscription, adapter-driven materialization, and the runtime engine parse and validate but do not execute yet — see Architecture and system specification for the exact implemented/deferred boundary of every concept in the diagram.

Install

Modelable requires Python 3.14.

uv tool install modelable
modelable --version

For an isolated one-off command:

uvx modelable --help

Define a model

domain customer {
owner: "customer-platform"
entity Customer @ 1 (additive) {
@key customerId: uuid
@pii email?: string
displayName: string
}
}

Save the definition as customer.mdl, then validate and compile it:

modelable validate customer.mdl --strict
modelable compile customer.mdl --target json-schema --out generated/schema
modelable compile customer.mdl --target typescript --out generated/types

Capabilities

  • Parse and validate versioned models, projections, annotations, and workspace definitions.
  • Resolve exact versions and compatible version ranges.
  • Detect additive and breaking contract changes and affected projections.
  • Trace projection fields to canonical source fields.
  • Report structurally missing access and classification metadata.
  • Expand automatic database, request, reply, and event projections.
  • Author a model version as a delta against its prior version (evolves @ N { add/remove/rename/replace ... }) instead of repeating its complete field list, with tooling to convert either direction (modelable compact-version / expand-version) and to extract a repeated inline enum shape into a shared, versioned semantic enum (modelable extract-enum).
  • Generate JSON Schema, OpenAPI 3.1, Markdown, TypeScript, C#, Java, Python, Rust, Go, SQL DDL, dbt schema.yml, FHIR R4 profile, OpenMetadata JSON, and OpenLineage event, ODCS, Protobuf, Avro record, event-sink contract, and Scalable-oriented gRPC artifacts.
  • Provide diagnostics, completion, hover, navigation, references, rename, formatting, and other editor features through the language server.
  • Import or assist with models through optional LLM provider integrations.

The local compiler and language-server toolchain are the supported 1.0 stable surface. Apicurio JSON Schema artifact publish/pull and Marquez-compatible OpenLineage event sync are available for derived artifacts. Live catalog publishing, distributed synchronization, OpenLineage runtime event collection, and runtime materialization remain future candidates.

Browser playground

The static Modelable playground runs the compiler locally in the browser. It supports creating, importing, renaming, deleting, selecting, and editing multiple .mdl files, then validating or generating artifacts from the complete workspace.

The one local workspace is restored automatically from IndexedDB. Source text never leaves the page; compiler output is not persisted. If browser storage is unavailable, editing continues in memory with an explicit status. Invalid or incompatible stored data is left untouched until the user exports it or resets the workspace.

Beyond the editor, the playground provides:

  • Protocol v2 language services: 300 ms live diagnostics plus browser-native completion, hover, go-to-definition, references, and rename over the complete local workspace, usable from the last parseable semantic snapshot while current text contains a syntax error.
  • Domain and entity graph visualization with field lineage tracing, version compatibility views with downstream projection impacts, governance findings, and SVG/PNG diagram export.
  • Local AI assistance via WebLLM (or an optional local Ollama server) for entity generation and explanations, always behind validated previews and explicit user acceptance.
  • Offline operation through a service worker, accessibility enforcement, performance budgets, and automatic documentation retrieval (/docs-style questions routed to the bundled RAG index).

Diagnostics, completion results, hover content, and other derived state remain in-memory only and are never persisted.

1.0 stable surface

Modelable 1.0 stabilizes the local compiler and language-server toolchain.

In scope for 1.0:

  • .mdl language: syntax, types, projections, ownership, classification, and access metadata.
  • CLI: validate, compile, diff, generate, attach, spec, and the language server.
  • Generated artifacts: JSON Schema, TypeScript, C#, Java, Python, Rust, Go, SQL DDL, dbt schema.yml, Markdown, FHIR R4 profile, OpenMetadata JSON, OpenLineage event, ODCS, Protobuf, and Scalable-oriented gRPC formats.
  • Compatibility, lineage, and governance report output.
  • Apicurio JSON Schema registry artifact push/pull.
  • Marquez-compatible OpenLineage event sync via modelable sync --lineage.
  • VS Code extension shipped as a VSIX companion artifact with the 1.0 release.

Deferred from 1.0:

  • VS Code Marketplace distribution (post-1.0).
  • Live OpenMetadata catalog synchronization and runtime OpenLineage collection.
  • Remote tracked-spec polling and authenticated source access.
  • Runtime subscriptions, adapters, replay, and materialization.
  • Distributed registry synchronization beyond the current file-first model.

Development

cd cli
uv sync --extra dev --frozen
uv run pytest tests/ --tb=short
uv run modelable validate ../samples/mvp --strict

See CONTRIBUTING.md for the complete contributor workflow.

Documentation

Hosted: https://ktjn.github.io/modelable/

License

Licensed under the Apache License 2.0.

About

Compiler and language server for versioned, domain-owned data models

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Modelable

Modelable is a compiler and language server for versioned, domain-owned data models. Define canonical models and projections in .mdl files, then validate their compatibility, inspect field-level lineage, detect governance gaps, and generate artifacts for the systems that consume them.

Why Modelable?

Data contracts often become fragmented across application types, database schemas, API definitions, and catalog metadata. Modelable keeps the semantic contract in one versioned source and derives target-specific representations without losing ownership, classification, lineage, or compatibility context.

.mdl sources -> validate and resolve -> plan and govern -> generate artifacts

How it fits together

A canonical entity, its compiler-expanded db/request/reply/event projections, a hand-authored cross-domain projection, and the artifacts and (deferred) streaming path they can drive:

flowchart TB
subgraph CUSTOMER["Domain: customer (owner: customer-platform)"]
V1["entity Customer @1<br/>additive"] --> V2["entity Customer @2<br/>additive"]
end
subgraph AUTO["Auto projections — compiler-expanded from Customer @2"]
direction LR
DB["CustomerDb @2<br/>persistence contract"]
REQ["CustomerRequest @2<br/>write model"]
REP["CustomerReply @2<br/>read model"]
EVT["CustomerEvent @2<br/>created / updated / deleted"]
end
V2 --> DB
V2 --> REQ
V2 --> REP
V2 --> EVT
subgraph BILLING["Domain: billing (owner: billing-platform)"]
JOIN["projection BillingCustomer @1<br/>from customer.Customer @2 as c<br/>join orders.Order @3 as o"]
end
V2 -. "field-level lineage" .-> JOIN
subgraph PIPE["Compiler pipeline"]
direction LR
PARSE["Parse .mdl"] --> VALIDATE["Validate, resolve versions,<br/>check compatibility"] --> PLAN["Plan document (JSON)"]
end
DB --> PARSE
REQ --> PARSE
REP --> PARSE
EVT --> PARSE
JOIN --> PARSE
subgraph ARTIFACTS["Generated artifacts"]
direction LR
JSONSCHEMA["JSON Schema"]
TYPES["TypeScript, C#, Java,<br/>Python, Rust, Go"]
SQLDDL["SQL DDL,<br/>dbt schema.yml"]
PROTO["Protobuf / gRPC"]
GOV["OpenLineage, OpenMetadata,<br/>ODCS, FHIR R4"]
end
PLAN --> JSONSCHEMA
PLAN --> TYPES
PLAN --> SQLDDL
PLAN --> PROTO
PLAN --> GOV
subgraph FUTURE["Streaming runtime — Phase 5, deferred, not implemented"]
direction LR
ENVELOPE["Change event envelope"] --> SUBSCRIPTION["Subscription"] --> MATERIALIZED["Materialized replica<br/>Postgres / Kafka"]
end
EVT -.-> ENVELOPE
Loading

Everything above the "Streaming runtime" box is implemented by the local compiler today. subscription, adapter-driven materialization, and the runtime engine parse and validate but do not execute yet — see Architecture and system specification for the exact implemented/deferred boundary of every concept in the diagram.

Install

Modelable requires Python 3.14.

uv tool install modelable
modelable --version

For an isolated one-off command:

uvx modelable --help

Define a model

domain customer {
owner: "customer-platform"
entity Customer @ 1 (additive) {
@key customerId: uuid
@pii email?: string
displayName: string
}
}

Save the definition as customer.mdl, then validate and compile it:

modelable validate customer.mdl --strict
modelable compile customer.mdl --target json-schema --out generated/schema
modelable compile customer.mdl --target typescript --out generated/types

Capabilities

  • Parse and validate versioned models, projections, annotations, and workspace definitions.
  • Resolve exact versions and compatible version ranges.
  • Detect additive and breaking contract changes and affected projections.
  • Trace projection fields to canonical source fields.
  • Report structurally missing access and classification metadata.
  • Expand automatic database, request, reply, and event projections.
  • Author a model version as a delta against its prior version (evolves @ N { add/remove/rename/replace ... }) instead of repeating its complete field list, with tooling to convert either direction (modelable compact-version / expand-version) and to extract a repeated inline enum shape into a shared, versioned semantic enum (modelable extract-enum).
  • Generate JSON Schema, OpenAPI 3.1, Markdown, TypeScript, C#, Java, Python, Rust, Go, SQL DDL, dbt schema.yml, FHIR R4 profile, OpenMetadata JSON, and OpenLineage event, ODCS, Protobuf, Avro record, event-sink contract, and Scalable-oriented gRPC artifacts.
  • Provide diagnostics, completion, hover, navigation, references, rename, formatting, and other editor features through the language server.
  • Import or assist with models through optional LLM provider integrations.

The local compiler and language-server toolchain are the supported 1.0 stable surface. Apicurio JSON Schema artifact publish/pull and Marquez-compatible OpenLineage event sync are available for derived artifacts. Live catalog publishing, distributed synchronization, OpenLineage runtime event collection, and runtime materialization remain future candidates.

Browser playground

The static Modelable playground runs the compiler locally in the browser. It supports creating, importing, renaming, deleting, selecting, and editing multiple .mdl files, then validating or generating artifacts from the complete workspace.

The one local workspace is restored automatically from IndexedDB. Source text never leaves the page; compiler output is not persisted. If browser storage is unavailable, editing continues in memory with an explicit status. Invalid or incompatible stored data is left untouched until the user exports it or resets the workspace.

Beyond the editor, the playground provides:

  • Protocol v2 language services: 300 ms live diagnostics plus browser-native completion, hover, go-to-definition, references, and rename over the complete local workspace, usable from the last parseable semantic snapshot while current text contains a syntax error.
  • Domain and entity graph visualization with field lineage tracing, version compatibility views with downstream projection impacts, governance findings, and SVG/PNG diagram export.
  • Local AI assistance via WebLLM (or an optional local Ollama server) for entity generation and explanations, always behind validated previews and explicit user acceptance.
  • Offline operation through a service worker, accessibility enforcement, performance budgets, and automatic documentation retrieval (/docs-style questions routed to the bundled RAG index).

Diagnostics, completion results, hover content, and other derived state remain in-memory only and are never persisted.

1.0 stable surface

Modelable 1.0 stabilizes the local compiler and language-server toolchain.

In scope for 1.0:

  • .mdl language: syntax, types, projections, ownership, classification, and access metadata.
  • CLI: validate, compile, diff, generate, attach, spec, and the language server.
  • Generated artifacts: JSON Schema, TypeScript, C#, Java, Python, Rust, Go, SQL DDL, dbt schema.yml, Markdown, FHIR R4 profile, OpenMetadata JSON, OpenLineage event, ODCS, Protobuf, and Scalable-oriented gRPC formats.
  • Compatibility, lineage, and governance report output.
  • Apicurio JSON Schema registry artifact push/pull.
  • Marquez-compatible OpenLineage event sync via modelable sync --lineage.
  • VS Code extension shipped as a VSIX companion artifact with the 1.0 release.

Deferred from 1.0:

  • VS Code Marketplace distribution (post-1.0).
  • Live OpenMetadata catalog synchronization and runtime OpenLineage collection.
  • Remote tracked-spec polling and authenticated source access.
  • Runtime subscriptions, adapters, replay, and materialization.
  • Distributed registry synchronization beyond the current file-first model.

Development

cd cli
uv sync --extra dev --frozen
uv run pytest tests/ --tb=short
uv run modelable validate ../samples/mvp --strict

See CONTRIBUTING.md for the complete contributor workflow.

Documentation

Hosted: https://ktjn.github.io/modelable/

License

Licensed under the Apache License 2.0.

About

Compiler and language server for versioned, domain-owned data models

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Modelable

Modelable is a compiler and language server for versioned, domain-owned data models. Define canonical models and projections in .mdl files, then validate their compatibility, inspect field-level lineage, detect governance gaps, and generate artifacts for the systems that consume them.

Why Modelable?

Data contracts often become fragmented across application types, database schemas, API definitions, and catalog metadata. Modelable keeps the semantic contract in one versioned source and derives target-specific representations without losing ownership, classification, lineage, or compatibility context.

.mdl sources -> validate and resolve -> plan and govern -> generate artifacts

How it fits together

A canonical entity, its compiler-expanded db/request/reply/event projections, a hand-authored cross-domain projection, and the artifacts and (deferred) streaming path they can drive:

flowchart TB
subgraph CUSTOMER["Domain: customer (owner: customer-platform)"]
V1["entity Customer @1<br/>additive"] --> V2["entity Customer @2<br/>additive"]
end
subgraph AUTO["Auto projections — compiler-expanded from Customer @2"]
direction LR
DB["CustomerDb @2<br/>persistence contract"]
REQ["CustomerRequest @2<br/>write model"]
REP["CustomerReply @2<br/>read model"]
EVT["CustomerEvent @2<br/>created / updated / deleted"]
end
V2 --> DB
V2 --> REQ
V2 --> REP
V2 --> EVT
subgraph BILLING["Domain: billing (owner: billing-platform)"]
JOIN["projection BillingCustomer @1<br/>from customer.Customer @2 as c<br/>join orders.Order @3 as o"]
end
V2 -. "field-level lineage" .-> JOIN
subgraph PIPE["Compiler pipeline"]
direction LR
PARSE["Parse .mdl"] --> VALIDATE["Validate, resolve versions,<br/>check compatibility"] --> PLAN["Plan document (JSON)"]
end
DB --> PARSE
REQ --> PARSE
REP --> PARSE
EVT --> PARSE
JOIN --> PARSE
subgraph ARTIFACTS["Generated artifacts"]
direction LR
JSONSCHEMA["JSON Schema"]
TYPES["TypeScript, C#, Java,<br/>Python, Rust, Go"]
SQLDDL["SQL DDL,<br/>dbt schema.yml"]
PROTO["Protobuf / gRPC"]
GOV["OpenLineage, OpenMetadata,<br/>ODCS, FHIR R4"]
end
PLAN --> JSONSCHEMA
PLAN --> TYPES
PLAN --> SQLDDL
PLAN --> PROTO
PLAN --> GOV
subgraph FUTURE["Streaming runtime — Phase 5, deferred, not implemented"]
direction LR
ENVELOPE["Change event envelope"] --> SUBSCRIPTION["Subscription"] --> MATERIALIZED["Materialized replica<br/>Postgres / Kafka"]
end
EVT -.-> ENVELOPE
Loading

Everything above the "Streaming runtime" box is implemented by the local compiler today. subscription, adapter-driven materialization, and the runtime engine parse and validate but do not execute yet — see Architecture and system specification for the exact implemented/deferred boundary of every concept in the diagram.

Install

Modelable requires Python 3.14.

uv tool install modelable
modelable --version

For an isolated one-off command:

uvx modelable --help

Define a model

domain customer {
owner: "customer-platform"
entity Customer @ 1 (additive) {
@key customerId: uuid
@pii email?: string
displayName: string
}
}

Save the definition as customer.mdl, then validate and compile it:

modelable validate customer.mdl --strict
modelable compile customer.mdl --target json-schema --out generated/schema
modelable compile customer.mdl --target typescript --out generated/types

Capabilities

  • Parse and validate versioned models, projections, annotations, and workspace definitions.
  • Resolve exact versions and compatible version ranges.
  • Detect additive and breaking contract changes and affected projections.
  • Trace projection fields to canonical source fields.
  • Report structurally missing access and classification metadata.
  • Expand automatic database, request, reply, and event projections.
  • Author a model version as a delta against its prior version (evolves @ N { add/remove/rename/replace ... }) instead of repeating its complete field list, with tooling to convert either direction (modelable compact-version / expand-version) and to extract a repeated inline enum shape into a shared, versioned semantic enum (modelable extract-enum).
  • Generate JSON Schema, OpenAPI 3.1, Markdown, TypeScript, C#, Java, Python, Rust, Go, SQL DDL, dbt schema.yml, FHIR R4 profile, OpenMetadata JSON, and OpenLineage event, ODCS, Protobuf, Avro record, event-sink contract, and Scalable-oriented gRPC artifacts.
  • Provide diagnostics, completion, hover, navigation, references, rename, formatting, and other editor features through the language server.
  • Import or assist with models through optional LLM provider integrations.

The local compiler and language-server toolchain are the supported 1.0 stable surface. Apicurio JSON Schema artifact publish/pull and Marquez-compatible OpenLineage event sync are available for derived artifacts. Live catalog publishing, distributed synchronization, OpenLineage runtime event collection, and runtime materialization remain future candidates.

Browser playground

The static Modelable playground runs the compiler locally in the browser. It supports creating, importing, renaming, deleting, selecting, and editing multiple .mdl files, then validating or generating artifacts from the complete workspace.

The one local workspace is restored automatically from IndexedDB. Source text never leaves the page; compiler output is not persisted. If browser storage is unavailable, editing continues in memory with an explicit status. Invalid or incompatible stored data is left untouched until the user exports it or resets the workspace.

Beyond the editor, the playground provides:

  • Protocol v2 language services: 300 ms live diagnostics plus browser-native completion, hover, go-to-definition, references, and rename over the complete local workspace, usable from the last parseable semantic snapshot while current text contains a syntax error.
  • Domain and entity graph visualization with field lineage tracing, version compatibility views with downstream projection impacts, governance findings, and SVG/PNG diagram export.
  • Local AI assistance via WebLLM (or an optional local Ollama server) for entity generation and explanations, always behind validated previews and explicit user acceptance.
  • Offline operation through a service worker, accessibility enforcement, performance budgets, and automatic documentation retrieval (/docs-style questions routed to the bundled RAG index).

Diagnostics, completion results, hover content, and other derived state remain in-memory only and are never persisted.

1.0 stable surface

Modelable 1.0 stabilizes the local compiler and language-server toolchain.

In scope for 1.0:

  • .mdl language: syntax, types, projections, ownership, classification, and access metadata.
  • CLI: validate, compile, diff, generate, attach, spec, and the language server.
  • Generated artifacts: JSON Schema, TypeScript, C#, Java, Python, Rust, Go, SQL DDL, dbt schema.yml, Markdown, FHIR R4 profile, OpenMetadata JSON, OpenLineage event, ODCS, Protobuf, and Scalable-oriented gRPC formats.
  • Compatibility, lineage, and governance report output.
  • Apicurio JSON Schema registry artifact push/pull.
  • Marquez-compatible OpenLineage event sync via modelable sync --lineage.
  • VS Code extension shipped as a VSIX companion artifact with the 1.0 release.

Deferred from 1.0:

  • VS Code Marketplace distribution (post-1.0).
  • Live OpenMetadata catalog synchronization and runtime OpenLineage collection.
  • Remote tracked-spec polling and authenticated source access.
  • Runtime subscriptions, adapters, replay, and materialization.
  • Distributed registry synchronization beyond the current file-first model.

Development

cd cli
uv sync --extra dev --frozen
uv run pytest tests/ --tb=short
uv run modelable validate ../samples/mvp --strict

See CONTRIBUTING.md for the complete contributor workflow.

Documentation

Hosted: https://ktjn.github.io/modelable/

License

Licensed under the Apache License 2.0.

About

Compiler and language server for versioned, domain-owned data models

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Modelable

Modelable is a compiler and language server for versioned, domain-owned data models. Define canonical models and projections in .mdl files, then validate their compatibility, inspect field-level lineage, detect governance gaps, and generate artifacts for the systems that consume them.

Why Modelable?

Data contracts often become fragmented across application types, database schemas, API definitions, and catalog metadata. Modelable keeps the semantic contract in one versioned source and derives target-specific representations without losing ownership, classification, lineage, or compatibility context.

.mdl sources -> validate and resolve -> plan and govern -> generate artifacts

How it fits together

A canonical entity, its compiler-expanded db/request/reply/event projections, a hand-authored cross-domain projection, and the artifacts and (deferred) streaming path they can drive:

flowchart TB
subgraph CUSTOMER["Domain: customer (owner: customer-platform)"]
V1["entity Customer @1<br/>additive"] --> V2["entity Customer @2<br/>additive"]
end
subgraph AUTO["Auto projections — compiler-expanded from Customer @2"]
direction LR
DB["CustomerDb @2<br/>persistence contract"]
REQ["CustomerRequest @2<br/>write model"]
REP["CustomerReply @2<br/>read model"]
EVT["CustomerEvent @2<br/>created / updated / deleted"]
end
V2 --> DB
V2 --> REQ
V2 --> REP
V2 --> EVT
subgraph BILLING["Domain: billing (owner: billing-platform)"]
JOIN["projection BillingCustomer @1<br/>from customer.Customer @2 as c<br/>join orders.Order @3 as o"]
end
V2 -. "field-level lineage" .-> JOIN
subgraph PIPE["Compiler pipeline"]
direction LR
PARSE["Parse .mdl"] --> VALIDATE["Validate, resolve versions,<br/>check compatibility"] --> PLAN["Plan document (JSON)"]
end
DB --> PARSE
REQ --> PARSE
REP --> PARSE
EVT --> PARSE
JOIN --> PARSE
subgraph ARTIFACTS["Generated artifacts"]
direction LR
JSONSCHEMA["JSON Schema"]
TYPES["TypeScript, C#, Java,<br/>Python, Rust, Go"]
SQLDDL["SQL DDL,<br/>dbt schema.yml"]
PROTO["Protobuf / gRPC"]
GOV["OpenLineage, OpenMetadata,<br/>ODCS, FHIR R4"]
end
PLAN --> JSONSCHEMA
PLAN --> TYPES
PLAN --> SQLDDL
PLAN --> PROTO
PLAN --> GOV
subgraph FUTURE["Streaming runtime — Phase 5, deferred, not implemented"]
direction LR
ENVELOPE["Change event envelope"] --> SUBSCRIPTION["Subscription"] --> MATERIALIZED["Materialized replica<br/>Postgres / Kafka"]
end
EVT -.-> ENVELOPE
Loading

Everything above the "Streaming runtime" box is implemented by the local compiler today. subscription, adapter-driven materialization, and the runtime engine parse and validate but do not execute yet — see Architecture and system specification for the exact implemented/deferred boundary of every concept in the diagram.

Install

Modelable requires Python 3.14.

uv tool install modelable
modelable --version

For an isolated one-off command:

uvx modelable --help

Define a model

domain customer {
owner: "customer-platform"
entity Customer @ 1 (additive) {
@key customerId: uuid
@pii email?: string
displayName: string
}
}

Save the definition as customer.mdl, then validate and compile it:

modelable validate customer.mdl --strict
modelable compile customer.mdl --target json-schema --out generated/schema
modelable compile customer.mdl --target typescript --out generated/types

Capabilities

  • Parse and validate versioned models, projections, annotations, and workspace definitions.
  • Resolve exact versions and compatible version ranges.
  • Detect additive and breaking contract changes and affected projections.
  • Trace projection fields to canonical source fields.
  • Report structurally missing access and classification metadata.
  • Expand automatic database, request, reply, and event projections.
  • Author a model version as a delta against its prior version (evolves @ N { add/remove/rename/replace ... }) instead of repeating its complete field list, with tooling to convert either direction (modelable compact-version / expand-version) and to extract a repeated inline enum shape into a shared, versioned semantic enum (modelable extract-enum).
  • Generate JSON Schema, OpenAPI 3.1, Markdown, TypeScript, C#, Java, Python, Rust, Go, SQL DDL, dbt schema.yml, FHIR R4 profile, OpenMetadata JSON, and OpenLineage event, ODCS, Protobuf, Avro record, event-sink contract, and Scalable-oriented gRPC artifacts.
  • Provide diagnostics, completion, hover, navigation, references, rename, formatting, and other editor features through the language server.
  • Import or assist with models through optional LLM provider integrations.

The local compiler and language-server toolchain are the supported 1.0 stable surface. Apicurio JSON Schema artifact publish/pull and Marquez-compatible OpenLineage event sync are available for derived artifacts. Live catalog publishing, distributed synchronization, OpenLineage runtime event collection, and runtime materialization remain future candidates.

Browser playground

The static Modelable playground runs the compiler locally in the browser. It supports creating, importing, renaming, deleting, selecting, and editing multiple .mdl files, then validating or generating artifacts from the complete workspace.

The one local workspace is restored automatically from IndexedDB. Source text never leaves the page; compiler output is not persisted. If browser storage is unavailable, editing continues in memory with an explicit status. Invalid or incompatible stored data is left untouched until the user exports it or resets the workspace.

Beyond the editor, the playground provides:

  • Protocol v2 language services: 300 ms live diagnostics plus browser-native completion, hover, go-to-definition, references, and rename over the complete local workspace, usable from the last parseable semantic snapshot while current text contains a syntax error.
  • Domain and entity graph visualization with field lineage tracing, version compatibility views with downstream projection impacts, governance findings, and SVG/PNG diagram export.
  • Local AI assistance via WebLLM (or an optional local Ollama server) for entity generation and explanations, always behind validated previews and explicit user acceptance.
  • Offline operation through a service worker, accessibility enforcement, performance budgets, and automatic documentation retrieval (/docs-style questions routed to the bundled RAG index).

Diagnostics, completion results, hover content, and other derived state remain in-memory only and are never persisted.

1.0 stable surface

Modelable 1.0 stabilizes the local compiler and language-server toolchain.

In scope for 1.0:

  • .mdl language: syntax, types, projections, ownership, classification, and access metadata.
  • CLI: validate, compile, diff, generate, attach, spec, and the language server.
  • Generated artifacts: JSON Schema, TypeScript, C#, Java, Python, Rust, Go, SQL DDL, dbt schema.yml, Markdown, FHIR R4 profile, OpenMetadata JSON, OpenLineage event, ODCS, Protobuf, and Scalable-oriented gRPC formats.
  • Compatibility, lineage, and governance report output.
  • Apicurio JSON Schema registry artifact push/pull.
  • Marquez-compatible OpenLineage event sync via modelable sync --lineage.
  • VS Code extension shipped as a VSIX companion artifact with the 1.0 release.

Deferred from 1.0:

  • VS Code Marketplace distribution (post-1.0).
  • Live OpenMetadata catalog synchronization and runtime OpenLineage collection.
  • Remote tracked-spec polling and authenticated source access.
  • Runtime subscriptions, adapters, replay, and materialization.
  • Distributed registry synchronization beyond the current file-first model.

Development

cd cli
uv sync --extra dev --frozen
uv run pytest tests/ --tb=short
uv run modelable validate ../samples/mvp --strict

See CONTRIBUTING.md for the complete contributor workflow.

Documentation

Hosted: https://ktjn.github.io/modelable/

License

Licensed under the Apache License 2.0.

About

Compiler and language server for versioned, domain-owned data models

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages