Skip to main content

konstruktor

Create and manage Arkitekt deployments — the konstruktor CLI in a wheel, and a Python interface to it.

pip install konstruktor

The wheel carries the CLI itself, so that is the whole install: konstruktor is on your PATH (and python -m konstruktor runs it), and the Python interface below always drives the generator it was released with. Docker has to be running.

Everything that decides what a deployment looks like lives in the CLI. This package runs it, reads back what it wrote, and hands you the result as a dokker deployment to look into.

A deployment from Python

from konstruktor import testing_hub

with testing_hub(services=["rekuest", "mikro"], mandate_keys=2) as hub:
    hub.up()                        # written, then started
    hub.wait_ready()                # until everything a client opens answers

    hub.fakts_url                   # http://localhost:<port> — where an app is pointed
    hub.mandate_key("my-app")      # what the app trades for a client, with no browser
    hub.services["mikro"].url       # http://localhost:<port>/mikro
# gone: containers, data and folder

A hub is a self-contained hub: the services you name, and a coordination server of their own, behind one gateway on one port (konstruktor hub create --server local). Nobody has to accept it and nothing leaves the machine.

Entering the block does nothing. The block says what happens, and leaving it undoes exactly that:

made by on leaving the block
a hub for a test testing_hub(...) destroyed, with its data and its folder
a hub you keep local_hub("./hub", ...) stopped; its folder and data stay
a hub that exists Hub.load("./hub") left as it is

A hub can also be made from images instead of names. Each image is asked which service it is, so a client library only has to know the image that hosts it:

testing_hub(service_images=["jhnnsrs/mikro:7"])

Rekuest then runs only if one of the images is Rekuest's.

Looking into it

Inside the block the hub answers for its services:

hub.ps()                                        # its containers, and whether they run
hub.logs("mikro", tail=50).stdout
hub.exec("mikro", "python manage.py check")     # in the running container
hub.run("mikro", "python manage.py shell -c ...")  # in a container of its own
hub.restart("mikro")                            # and wait until it is healthy again
hub.check_health()                              # every service, on its own health address
hub.job("mikro", "plan")                        # a job the image declares

with hub.create_watcher("mikro") as logs:       # what a service writes while you act
    ...
logs.collected_logs

Starting, stopping and removing (up, stop, down, pull, destroy) are the konstruktor commands of the same name, on the whole hub: which containers a hub runs, and from which builds, is the generator's to say, so up(services=[...]) is refused. Everything else above is dokker's, on the compose project in the hub's folder. Each has an a-prefixed async twin (await hub.aup(), async with hub:).

These run on a loop the block owns, so they need the block. Outside of a with — in a fixture, a notebook — hub.enter() and hub.exit() are the two halves of it. How to get in (fakts_url, mandate_key, services, ...) is read from the hub's folder and works anywhere.

Developing a service against a hub

from konstruktor import local_hub

with local_hub("./hub", services=["mikro"], mounts={"mikro": "~/Code/mikro-server"}, debug=["mikro"]) as hub:
    hub.up()
    hub.wait_ready()
    input("running — enter to stop")

The tree is mounted over the image's own code and the server reloads when a file in it changes. The folder is written the first time and used as it is from then on.

Connecting an app

Connecting an app to it takes the address and a mandate key:

from arkitekt import App, connect

app = App("my-app", "0.1.0", services=[...])
with connect(app, url=hub.fakts_url, mandate_key=hub.mandate_key("my-app")) as runtime:
    ...

or, for an app in another process, hub.env("my-app") — FAKTS_URL and FAKTS_MANDATE_KEY. An app in a container on the hub's own docker network points at http://gateway instead: the hub can be logged into at any address it answers on.

One mandate key serves one app. The coordination server pins a token to the first app that logs in with it, so mandate_keys= is how many apps can connect, and hub.mandate_key(name) hands each name its own.

To run a particular build of a service rather than the one a new hub gets, pin it by its name in the stack: testing_hub(..., images={"rekuest": "jhnnsrs/rekuest:1.2.3"}).

With pytest

Installing the package registers a pytest plugin:

import pytest


@pytest.fixture(scope="session")
def hub(konstruktor_hub):
    return konstruktor_hub(services=["rekuest", "mikro"], mandate_keys=2)


@pytest.mark.konstruktor
def test_my_app(hub):
    ...
  • konstruktor_hub is a session-scoped factory taking what testing_hub takes. The hub it returns is entered, started and answering, so a test can ask it anything above. Every hub it makes is destroyed — containers, volumes and folder — when the session ends.
  • Tests marked konstruktor are skipped where Docker is not running.
  • A failed test gets the hub's container logs attached to its report.
  • Hubs live in a registry of their own, so they never show up beside your real ones.
  • A session that is killed leaves containers behind; the next test hub made on the machine removes them.

Which build of a service a run tests against is usually the job's to say, not the suite's. Set KONSTRUKTOR_IMAGES where the suite runs and every hub created there uses those images, for the services it has:

KONSTRUKTOR_IMAGES=rekuest=jhnnsrs/rekuest:1.2.3,mikro=jhnnsrs/mikro:6.1.0 pytest -m konstruktor
option
--konstruktor-keep leave the hubs running after the session, and print where they are
--konstruktor-timeout seconds a hub gets to answer after it is started (600)
--konstruktor-bin the executable to use, instead of $KONSTRUKTOR_BIN or the one in the wheel

From a source checkout

cargo build -p konstruktor-cli
KONSTRUKTOR_BIN=$PWD/target/debug/konstruktor PYTHONPATH=$PWD/python python -m pytest python/tests

Metadata

Release files for konstruktor 0.28.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for konstruktor 0.28.1
File
konstruktor-0.28.1-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
konstruktor-0.28.1-py3-none-musllinux_1_2_x86_64.whl Python 3 none Linux musl 1.2+ x86-64 Details
konstruktor-0.28.1-py3-none-manylinux_2_28_x86_64.whl Python 3 none Linux glibc 2.28+ x86-64 Details
konstruktor-0.28.1-py3-none-manylinux_2_28_aarch64.whl Python 3 none Linux glibc 2.28+ ARM64 Details
konstruktor-0.28.1-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details
konstruktor-0.28.1-py3-none-macosx_10_12_x86_64.whl Python 3 none macOS 10.12+ x86-64 Details

Total release size: 33.4 MB

Release files / konstruktor-0.28.1-py3-none-win_amd64.whl

Download URL konstruktor-0.28.1-py3-none-win_amd64.whl
Size 5.8 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
3c08d4ab2d0868bae6d90bb142f8c0c47cd58ae87ae0872ba0384598ef2d0d79
BLAKE2b-256 checksum
How to use checksums
c847ff0d1234ce183367cf3db5e10bb23127fd2fa5816e493f1a7d89e83de8f5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

Release files / konstruktor-0.28.1-py3-none-musllinux_1_2_x86_64.whl

Download URL konstruktor-0.28.1-py3-none-musllinux_1_2_x86_64.whl
Size 5.8 MB
Tags Linux musl 1.2+ x86-64 Python 3
SHA-256 checksum
How to use checksums
7eaddd4a917e33458f2a43e713347d6b961cebc8295fe1bcbb708b21f46eb57b
BLAKE2b-256 checksum
How to use checksums
0d3ca379bd74e4113311f9c673d7a3188de75db1287574b9148ac90c0f284f5d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

Release files / konstruktor-0.28.1-py3-none-manylinux_2_28_x86_64.whl

Download URL konstruktor-0.28.1-py3-none-manylinux_2_28_x86_64.whl
Size 5.7 MB
Tags Linux glibc 2.28+ x86-64 Python 3
SHA-256 checksum
How to use checksums
147c57d2903f54ac4badc8fcf9092bf546d181631d0140163a287554723a3991
BLAKE2b-256 checksum
How to use checksums
0162d4058eb563c8c8fe9a006866030d457a0a7b32e3b49ab3b04fdab72c9f79
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

Release files / konstruktor-0.28.1-py3-none-manylinux_2_28_aarch64.whl

Download URL konstruktor-0.28.1-py3-none-manylinux_2_28_aarch64.whl
Size 5.3 MB
Tags Linux glibc 2.28+ ARM64 Python 3
SHA-256 checksum
How to use checksums
d7da86c9c35b29452e423220ec4ca1c3a87a57b0f4f9441d3bbb202256e44887
BLAKE2b-256 checksum
How to use checksums
337760049a783757b58d4c38313a78942419f264c1e9a9a87d07e093e9db2c22
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

Release files / konstruktor-0.28.1-py3-none-macosx_11_0_arm64.whl

Download URL konstruktor-0.28.1-py3-none-macosx_11_0_arm64.whl
Size 5.3 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
f2cc63e5bce77d3c8f2ff39b3a6b161b6f09b3736417aab41959cff4d1e4e37b
BLAKE2b-256 checksum
How to use checksums
899fe924629a25ee2e82e92215fdd08a84af0a3633f309537ff4d7a5561b962b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

Release files / konstruktor-0.28.1-py3-none-macosx_10_12_x86_64.whl

Download URL konstruktor-0.28.1-py3-none-macosx_10_12_x86_64.whl
Size 5.5 MB
Tags Python 3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
1a10a8b6f1acb45cde36651a613c7a9d422161f51465943d4c0ccdbf5c9b8dc5
BLAKE2b-256 checksum
How to use checksums
f5a8411dd7854dc36843ec5912d30daa5e3c4175cfe682d8b9bc0426a7274bd1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

Security for konstruktor 0.28.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 6 files in this release have been uploaded with provenance metadata.

Select from 6 files

Attestation for konstruktor-0.28.1-py3-none-win_amd64.whl

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page