Value Chains¶
Two value chains structure the dsviper ecosystem. Toolchain turns a data model into runnable code; Runtime runs your typed Python application backed by versioned, persistent storage. Each chain composes from independent components — you can engage at any link without adopting the rest.
The toolchain (code-generation side)¶
dsm → kibo → kibo-template-viper
Goal. Turn a data-model description into typed code that runs.
dsm — the modeling language. Standalone. Defines types, structures, attachments, function pools. No dependency on kibo, no dependency on viper. You can use dsm for spec-only purposes — sharing a typed data contract between teams — without ever generating code from it.
kibo — the code generator. Reads a dsm model plus a template, emits code. Kibo itself is template-agnostic: the target language and runtime are determined by the template you give it.
kibo-template-viper — a kibo template pack that targets the viper runtime (Python via dsviper, or C++ Viper directly). Choose this template when your generated code needs to run inside a viper-based application. Other kibo templates can target other runtimes — kibo is not viper-specific.
dsviper-tools also belongs to the toolchain side: CLI utilities
(dsm_util) and GUI editors (cdbe.py, dbe.py) that operate on dsm models
and dsviper databases throughout the development lifecycle. A QML variant
(dsviper-tools-qml) provides Qt Quick versions of the same database
browsers.
The runtime (execution side)¶
dsviper → dsviper-components → reference applications
Goal. Run a typed Python application with versioned, persistent data.
dsviper — the Python runtime. Strong-typed Python API over the Viper C++
engine. The foundation: type system, value system, commit DAG, database tier.
Distributed exclusively on PyPI (pip install dsviper) — not bundled in the
DevKit ZIP.
dsviper-components — reusable building blocks built on top of dsviper.
Consumed by applications. Comes in two parallel tracks: dsviper-components
(Qt Widgets) and dsviper-components-qml (Qt Quick / QML). Most of the
runtime stack mirrors this split.
Reference applications. Several applications exist as canonical “putting it all together” exemplars — they exercise the whole ecosystem end-to-end (DSM modeling, Kibo code generation, the viper template, dsviper-components, the dsviper runtime). They are not products in their own right:
ge-py— Graph Editor, PySide6 desktop app.ge-qml— three QML desktop apps (dbe,cdbe,graph_editor).dsviper-blender— Blender 4.x add-on bundling the dsviper runtime from PyPI.web-cdbe— Flask web application demonstrating a Commit Database Editor (HTML5, no JavaScript).
About Viper itself — the C++ engine behind dsviper — see naming. Viper is not currently distributed standalone.
Where the chains meet¶
The two chains converge at the artifact: the toolchain produces a typed Python package (and optionally a database schema); the runtime consumes it.
A typical project flow:
Author a
model.dsmdescribing your data model.Run
kibowithkibo-template-viperto emit a typed Python package.Build an application that imports that package and uses dsviper at runtime.
Throughout, use
dsviper-tools(cdbe,dbe,dsm_util) to inspect, validate, and manage databases.
For the visual 3-step pipeline framing (Describe → Generate → Use), see pipeline.
Dependency rules¶
The arrows go one way. A change at a lower level can ripple up; a change at a higher level cannot ripple down. Documentation, code, and tests for each component must respect the same direction.
Component |
Depends on |
Must not assume |
|---|---|---|
dsm |
— |
kibo, viper, dsviper |
kibo |
dsm |
viper, dsviper |
kibo-template-viper |
kibo, viper / dsviper |
applications |
dsviper-tools (Widgets and QML) |
dsm, dsviper |
applications |
dsviper |
Viper (C++ engine) |
applications, components |
dsviper-components (Widgets and QML) |
dsviper |
applications |
reference applications |
dsviper, dsviper-components |
— |
This table is the contract per-component documentation must respect: a dsm
page may not assume kibo is in the picture; a kibo page may assume dsm but
not viper; and so on.
When you only need part of the chain¶
You do not have to adopt the whole stack. Common partial uses:
Just a data-model spec. Share
.dsmfiles between teams as a typed contract. No kibo, no viper involved.Generated code for a non-viper runtime. Use
kibowith a different template; viper and dsviper are out of the picture.Versioned data without code generation. Use
dsviper’s dynamic API directly, loading dsm definitions at runtime — no static package needed.Inspect a database.
dsviper-tools(cdbe,dbe,dsm_util) work standalone against any compatible database, regardless of whether you authored its schema in dsm yourself.