One model.
Every diagram derived from it.
Kanoniq stores your architecture as a single canonical model — elements and relationships with stable identity. Views reference that model instead of copying it, so no diagram can quietly disagree with another.
model as code
platform storefront "Storefront" {
component checkout "Checkout"
: backend
component payments "Payments"
: backend {
derived httpApi payments-api
}
component orders "Orders"
: backend {
derived httpApi orders-api
}
checkout -> payments-api over http
payments -> orders-api over http
}
canonical model
derived views
.kq source into one canonical model, then
derives views from it. Solid outlines are authored. Dashed outlines are derived —
Kanoniq draws them, and they hold no data of their own.What Kanoniq does
-
One canonical model
Every element keeps a persistent identity. Rename it, move it, export it to another tool — the identity holds, and every view follows it.
-
Views you don't draw
Layered application views, data flows and entity diagrams are generated from the model. Hand-drawn views are still yours to make; they reference the same elements rather than copying them.
-
Plain files in git
Author visually or as code. The model is text you can branch, diff and review alongside the system it describes — it lives in your repo, not ours, parsed and rendered locally with nothing sent anywhere to draw a diagram.
Why it's opinionated
A modeling language with no opinions is a data format. Kanoniq takes positions.
An Ecosystem groups, it doesn't behave. A Domain Object and a Data Entity are different things, kept apart on purpose. A messaging exchange always has a Channel between two components — never optional, whether you draw it or Kanoniq derives it. Each of these is a decision, not a default: recorded and dated.
Rendering a diagram from a graph is not hard. Deciding which relationship becomes an ArchiMate assignment versus a realization, when two elements collapse into one view and when they don't — that takes judgment a generic diagramming tool doesn't have. Kanoniq's views are opinionated because getting ArchiMate right means committing to an interpretation, not because opinions are cheap to add.
Every rule in the metamodel is written down with why it exists, not just what it does. A tool trusted with how a company thinks about its own systems should be able to show its work — and expect its decisions to be argued with, not just adopted.
ecommerce.kq, lines 68–90 of 185
| 68 | /// Holds a basket for a signed-in shopper or an anonymous session, and |
| 69 | /// reprices it on every change. |
| 70 | component basket-service "Basket Service" : backend tech "Go" { |
| 71 | derived httpApi basket-api "Basket API" |
| 72 | } |
| 73 | |
| 74 | web-shop -> storefront-bff-api over http |
| 75 | mobile-shop -> storefront-bff-api over http |
| 76 | |
| 77 | storefront-bff -> catalogue-api over http |
| 78 | storefront-bff -> search-api over http |
| 79 | storefront-bff -> basket-api over http |
| 80 | storefront-bff -> order-api over http |
| 81 | |
| 82 | /// Pulls product data to rebuild the index. Not on the shopper's read path. |
| 83 | search-service -> catalogue-api over http |
| 84 | |
| 85 | web-shop realizes browse-catalogue |
| 86 | web-shop realizes manage-basket |
| 87 | mobile-shop realizes browse-catalogue |
| 88 | search-service realizes search-products |
| 89 | basket-service realizes manage-basket |
| 90 | catalogue-service realizes shop-merchandising |
- declaration
- derived
- relationship
- kind and transport
- name
Writing one yourself? The VS Code extension colors the file as you type.
Take the model out again
Export is one-way on purpose. Kanoniq holds the model; other tools receive a copy of it, and nothing writes back into it.
That constraint is what keeps the model canonical. A two-way sync means two things can both claim to be right, and reconciling them is a problem nobody solves well. Export instead produces a copy that is correct at the moment it is written, carries the identifiers it came from, and makes no claim to be the source.
-
ArchiMate specified, being built
Open Exchange Format — model namespace 3.0, validated against the 3.1 schema, which is the pairing Archi itself emits and accepts. Every element and relationship carries its Kanoniq identifier, so the model can still be matched back after a receiving tool has renumbered everything.
-
BPMN stage 2
Data flows in the notation process people already read, projected from the same elements rather than drawn a second time.
-
ERD stage 2
Entities projected from the canonical model and bound to the components that own them — physical-ish, not a database schema.
Where this is going
A model is a claim about a system. Today, checking it is manual.
Someone checks the model against the codebase, the infrastructure, the deployed reality — and updates one or the other. The last two stages close that loop: once deployed resources carry the identifiers the model already uses, drift becomes something Kanoniq reports on, rather than something you find out about during an incident. Discovery and drift only mean something once there is a canonical model to drift from — which is why that comes first.
-
Canonical model in progress
The metamodel, the model-as-code DSL, and models stored as plain files in git.
-
Projections
The layered application view generated from the model, then BPMN, ERD and IAM projections of those same elements.
-
Discovery
Bind the designed model to deployed infrastructure by tagging cloud resources with the identifiers the model already uses.
-
Drift
Report where the running system has diverged from the model, what a proposed change would touch, and how far the blast radius reaches.
Kanoniq is early. The metamodel, the DSL and the first views are still being specified.
This page is where the work lands — the specifications, the views, and the tool itself, as each one is finished.