From 1266d3765c77b22b6d2330546d26fece11540d71 Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Mon, 7 Sep 2026 18:10:45 +0200
Subject: [PATCH 01/21] update venv with local repo submodule
---
.gitmodules | 3 ++
.vscode/settings.json | 11 +++-
pyproject.toml | 4 +-
repo/hololinked | 1 +
uv.lock | 119 ++++++++++++++++++++++++++++++++++--------
5 files changed, 111 insertions(+), 27 deletions(-)
create mode 160000 repo/hololinked
diff --git a/.gitmodules b/.gitmodules
index c3ca054..2d3dc7c 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,6 @@
[submodule "deployment/helm/container-helm-chart"]
path = deployment/helm/container-helm-chart
url = https://gitlab.com/hololinked/kubernetes/helm-charts/container-helm-chart.git
+[submodule "hololinked"]
+ path = repo/hololinked
+ url = https://github.com/hololinked-dev/hololinked.git
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 43167ca..e91de5b 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -8,5 +8,12 @@
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"prettier.tabWidth": 2
- }
-}
\ No newline at end of file
+ },
+ "python.defaultInterpreterPath": "${workspaceFolder}/.venv/Scripts/python.exe",
+ "python.analysis.extraPaths": [
+ "repo/hololinked"
+ ],
+ "python.autoComplete.extraPaths": [
+ "repo/hololinked"
+ ]
+}
diff --git a/pyproject.toml b/pyproject.toml
index d2a0198..a3ae578 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -32,8 +32,8 @@ dev = [
"imageio",
]
repo = [
- "hololinked"
+ "hololinked[all]"
]
[tool.uv.sources]
-hololinked = { git = "https://github.com/hololinked-dev/hololinked.git", branch = "main" }
\ No newline at end of file
+hololinked = { path = "repo/hololinked", editable = true }
\ No newline at end of file
diff --git a/repo/hololinked b/repo/hololinked
new file mode 160000
index 0000000..9e85c37
--- /dev/null
+++ b/repo/hololinked
@@ -0,0 +1 @@
+Subproject commit 9e85c37d0886c956038c45f77afc00a0ff642865
diff --git a/uv.lock b/uv.lock
index 7d862e5..a8ff4bd 100644
--- a/uv.lock
+++ b/uv.lock
@@ -572,29 +572,114 @@ wheels = [
[[package]]
name = "hololinked"
-version = "0.3.11"
-source = { git = "https://github.com/hololinked-dev/hololinked.git?branch=main#7b8c98dea1bfe82eb6402e37aabd177863f22029" }
+version = "0.4.0"
+source = { editable = "repo/hololinked" }
dependencies = [
{ name = "aiomqtt" },
{ name = "argon2-cffi" },
{ name = "bcrypt" },
{ name = "cryptography" },
- { name = "fastjsonschema" },
{ name = "httpx" },
{ name = "ifaddr" },
- { name = "jsonschema" },
{ name = "msgspec" },
- { name = "psycopg2-binary" },
{ name = "pydantic" },
{ name = "pyjwt" },
+ { name = "sniffio" },
+ { name = "structlog" },
+ { name = "tornado" },
+]
+
+[package.optional-dependencies]
+all = [
+ { name = "fastjsonschema" },
+ { name = "jsonschema" },
+ { name = "psycopg2-binary" },
{ name = "pymongo" },
{ name = "pyzmq" },
{ name = "serpent" },
- { name = "sniffio" },
{ name = "sqlalchemy" },
- { name = "sqlalchemy-utils" },
- { name = "structlog" },
- { name = "tornado" },
+]
+
+[package.metadata]
+requires-dist = [
+ { name = "aiomqtt", specifier = ">=2.4.0" },
+ { name = "argon2-cffi", specifier = ">=23.1.0" },
+ { name = "bcrypt", specifier = "==4.3.0" },
+ { name = "cryptography", specifier = ">=46.0.5" },
+ { name = "fastjsonschema", marker = "extra == 'validators'", specifier = "==2.20.0" },
+ { name = "hololinked", extras = ["sqlalchemy"], marker = "extra == 'postgresql'" },
+ { name = "hololinked", extras = ["sqlalchemy", "postgresql", "mongo"], marker = "extra == 'storage'" },
+ { name = "hololinked", extras = ["zmq", "validators", "serializers", "storage"], marker = "extra == 'all'" },
+ { name = "httpx", specifier = ">=0.28.1,<29.0" },
+ { name = "ifaddr", specifier = ">=0.2.0,<0.3" },
+ { name = "jsonschema", marker = "extra == 'validators'", specifier = ">=4.22.0,<5.0" },
+ { name = "msgspec", specifier = ">=0.18.6" },
+ { name = "psycopg2-binary", marker = "extra == 'postgresql'", specifier = ">=2.9.11" },
+ { name = "pydantic", specifier = ">=2.8.0,<3.0.0" },
+ { name = "pyjwt", specifier = ">=2.11.0" },
+ { name = "pymongo", marker = "extra == 'mongo'", specifier = ">=4.15.2" },
+ { name = "pyzmq", marker = "extra == 'zmq'", specifier = ">=25.1.0,<26.2" },
+ { name = "serpent", marker = "extra == 'serializers'", specifier = ">=1.41,<2.0" },
+ { name = "sniffio", specifier = ">=1.3.1,<2.0" },
+ { name = "sqlalchemy", marker = "extra == 'sqlalchemy'", specifier = ">2.0.21" },
+ { name = "structlog", specifier = ">=25.5.0" },
+ { name = "tornado", specifier = ">=6.3.3" },
+]
+provides-extras = ["zmq", "validators", "serializers", "sqlalchemy", "postgresql", "mongo", "storage", "all"]
+
+[package.metadata.requires-dev]
+all = [
+ { name = "bandit", specifier = ">=1.9.1" },
+ { name = "faker", specifier = "==37.5.0" },
+ { name = "fastjsonschema", specifier = "==2.20.0" },
+ { name = "ipython", specifier = "==8.12.3" },
+ { name = "jsonschema", specifier = ">=4.22.0,<5.0" },
+ { name = "jupyter", specifier = ">=1.1.1" },
+ { name = "numpy", specifier = ">=2.0.0" },
+ { name = "pandas", specifier = "==2.2.3" },
+ { name = "pip", specifier = ">=25.2" },
+ { name = "pre-commit", specifier = ">=4.5.0" },
+ { name = "psycopg2-binary", specifier = ">=2.9.11" },
+ { name = "pymongo", specifier = ">=4.15.2" },
+ { name = "pytest", specifier = ">=8.0.0" },
+ { name = "pytest-asyncio", specifier = ">=1.3.0" },
+ { name = "pytest-cov", specifier = ">=4.0.0" },
+ { name = "pytest-order", specifier = ">=1.0.0" },
+ { name = "pyzmq", specifier = ">=25.1.0,<26.2" },
+ { name = "requests", specifier = "==2.32.3" },
+ { name = "ruff", specifier = ">=0.12.10" },
+ { name = "serpent", specifier = ">=1.41,<2.0" },
+ { name = "sqlalchemy", specifier = ">2.0.21" },
+ { name = "testcontainers", specifier = ">=4.14.1" },
+ { name = "ty", specifier = ">=0.0.24" },
+]
+dev = [
+ { name = "ipython", specifier = "==8.12.3" },
+ { name = "jupyter", specifier = ">=1.1.1" },
+ { name = "numpy", specifier = ">=2.0.0" },
+ { name = "pandas", specifier = "==2.2.3" },
+ { name = "pip", specifier = ">=25.2" },
+ { name = "pre-commit", specifier = ">=4.5.0" },
+ { name = "ruff", specifier = ">=0.12.10" },
+ { name = "ty", specifier = ">=0.0.24" },
+]
+scanning = [{ name = "bandit", specifier = ">=1.9.1" }]
+test = [
+ { name = "faker", specifier = "==37.5.0" },
+ { name = "fastjsonschema", specifier = "==2.20.0" },
+ { name = "jsonschema", specifier = ">=4.22.0,<5.0" },
+ { name = "numpy", specifier = ">=2.0.0" },
+ { name = "psycopg2-binary", specifier = ">=2.9.11" },
+ { name = "pymongo", specifier = ">=4.15.2" },
+ { name = "pytest", specifier = ">=8.0.0" },
+ { name = "pytest-asyncio", specifier = ">=1.3.0" },
+ { name = "pytest-cov", specifier = ">=4.0.0" },
+ { name = "pytest-order", specifier = ">=1.0.0" },
+ { name = "pyzmq", specifier = ">=25.1.0,<26.2" },
+ { name = "requests", specifier = "==2.32.3" },
+ { name = "serpent", specifier = ">=1.41,<2.0" },
+ { name = "sqlalchemy", specifier = ">2.0.21" },
+ { name = "testcontainers", specifier = ">=4.14.1" },
]
[[package]]
@@ -629,7 +714,7 @@ dev = [
{ name = "serpent" },
]
repo = [
- { name = "hololinked" },
+ { name = "hololinked", extra = ["all"] },
]
[package.metadata]
@@ -660,7 +745,7 @@ dev = [
{ name = "ruff", specifier = ">=0.12.10" },
{ name = "serpent", specifier = "==1.41" },
]
-repo = [{ name = "hololinked", git = "https://github.com/hololinked-dev/hololinked.git?branch=main" }]
+repo = [{ name = "hololinked", extras = ["all"], editable = "repo/hololinked" }]
[[package]]
name = "httpcore"
@@ -2161,18 +2246,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/1c/fc/9ba22f01b5cdacc8f5ed0d22304718d2c758fce3fd49a5372b886a86f37c/sqlalchemy-2.0.41-py3-none-any.whl", hash = "sha256:57df5dc6fdb5ed1a88a1ed2195fd31927e705cad62dedd86b46972752a80f576", size = 1911224 },
]
-[[package]]
-name = "sqlalchemy-utils"
-version = "0.41.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "sqlalchemy" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/a3/e0/6906a8a9b8e9deb82923e02e2c1f750c567d69a34f6e1fe566792494a682/SQLAlchemy-Utils-0.41.1.tar.gz", hash = "sha256:a2181bff01eeb84479e38571d2c0718eb52042f9afd8c194d0d02877e84b7d74", size = 136579 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/73/d8/3863fdfe6b27f6c0dffc650aaa2929f313b33aea615b102279fd46ab550b/SQLAlchemy_Utils-0.41.1-py3-none-any.whl", hash = "sha256:6c96b0768ea3f15c0dc56b363d386138c562752b84f647fb8d31a2223aaab801", size = 92612 },
-]
-
[[package]]
name = "stack-data"
version = "0.6.3"
From 6eabc750b949fc7712268ee203a3299cb5319493 Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Mon, 7 Sep 2026 18:20:36 +0200
Subject: [PATCH 02/21] update namespace round #1
---
docs/api-reference/eventloop/contexts.md | 3 ++
docs/api-reference/eventloop/eventloop.md | 36 +++++++++++++
.../eventloop/schedulers/async-scheduler.md | 8 +++
.../eventloop/schedulers/queued-scheduler.md | 9 ++++
.../eventloop/schedulers/scheduler.md | 17 ++++++
.../schedulers/threaded-scheduler.md | 8 +++
docs/api-reference/namespaces.md | 2 +-
.../protocols/zmq/brokers/async-zmq-client.md | 1 +
.../zmq}/brokers/async-zmq-server.md | 2 +-
.../zmq}/brokers/base-zmq.md | 10 ++--
.../zmq}/brokers/event-consumer.md | 6 +--
.../protocols/zmq/brokers/event-publisher.md | 1 +
.../brokers/message-mapped-zmq-client-pool.md | 2 +-
.../zmq}/brokers/sync-zmq-client.md | 2 +-
.../zmq/messaging-contract/event-message.md | 15 ++++++
.../zmq/messaging-contract/headers.md | 8 +++
.../messaging-contract/request-message.md | 2 +-
.../messaging-contract/response-message.md | 18 +++++++
.../rpc-server/brokers/async-zmq-client.md | 1 -
.../rpc-server/brokers/event-publisher.md | 1 -
.../rpc-server/messaging-contract/contexts.md | 3 --
.../messaging-contract/event-message.md | 10 ----
.../rpc-server/messaging-contract/headers.md | 8 ---
.../messaging-contract/response-message.md | 12 -----
docs/api-reference/rpc-server/rpc-server.md | 52 -------------------
.../rpc-server/schedulers/async-scheduler.md | 4 --
.../rpc-server/schedulers/queued-scheduler.md | 3 --
.../rpc-server/schedulers/scheduler.md | 2 -
.../schedulers/threaded-scheduler.md | 3 --
29 files changed, 137 insertions(+), 112 deletions(-)
create mode 100644 docs/api-reference/eventloop/contexts.md
create mode 100644 docs/api-reference/eventloop/eventloop.md
create mode 100644 docs/api-reference/eventloop/schedulers/async-scheduler.md
create mode 100644 docs/api-reference/eventloop/schedulers/queued-scheduler.md
create mode 100644 docs/api-reference/eventloop/schedulers/scheduler.md
create mode 100644 docs/api-reference/eventloop/schedulers/threaded-scheduler.md
create mode 100644 docs/api-reference/protocols/zmq/brokers/async-zmq-client.md
rename docs/api-reference/{rpc-server => protocols/zmq}/brokers/async-zmq-server.md (86%)
rename docs/api-reference/{rpc-server => protocols/zmq}/brokers/base-zmq.md (60%)
rename docs/api-reference/{rpc-server => protocols/zmq}/brokers/event-consumer.md (75%)
create mode 100644 docs/api-reference/protocols/zmq/brokers/event-publisher.md
rename docs/api-reference/{rpc-server => protocols/zmq}/brokers/message-mapped-zmq-client-pool.md (83%)
rename docs/api-reference/{rpc-server => protocols/zmq}/brokers/sync-zmq-client.md (76%)
create mode 100644 docs/api-reference/protocols/zmq/messaging-contract/event-message.md
create mode 100644 docs/api-reference/protocols/zmq/messaging-contract/headers.md
rename docs/api-reference/{rpc-server => protocols/zmq}/messaging-contract/request-message.md (84%)
create mode 100644 docs/api-reference/protocols/zmq/messaging-contract/response-message.md
delete mode 100644 docs/api-reference/rpc-server/brokers/async-zmq-client.md
delete mode 100644 docs/api-reference/rpc-server/brokers/event-publisher.md
delete mode 100644 docs/api-reference/rpc-server/messaging-contract/contexts.md
delete mode 100644 docs/api-reference/rpc-server/messaging-contract/event-message.md
delete mode 100644 docs/api-reference/rpc-server/messaging-contract/headers.md
delete mode 100644 docs/api-reference/rpc-server/messaging-contract/response-message.md
delete mode 100644 docs/api-reference/rpc-server/rpc-server.md
delete mode 100644 docs/api-reference/rpc-server/schedulers/async-scheduler.md
delete mode 100644 docs/api-reference/rpc-server/schedulers/queued-scheduler.md
delete mode 100644 docs/api-reference/rpc-server/schedulers/scheduler.md
delete mode 100644 docs/api-reference/rpc-server/schedulers/threaded-scheduler.md
diff --git a/docs/api-reference/eventloop/contexts.md b/docs/api-reference/eventloop/contexts.md
new file mode 100644
index 0000000..7cbaf7f
--- /dev/null
+++ b/docs/api-reference/eventloop/contexts.md
@@ -0,0 +1,3 @@
+::: hololinked.core.eventloop.operations.SchedulerExecutionContext
+
+::: hololinked.core.eventloop.operations.ThingExecutionContext
diff --git a/docs/api-reference/eventloop/eventloop.md b/docs/api-reference/eventloop/eventloop.md
new file mode 100644
index 0000000..142d6f8
--- /dev/null
+++ b/docs/api-reference/eventloop/eventloop.md
@@ -0,0 +1,36 @@
+
+
+::: hololinked.core.eventloop.eventloop.EventLoop
+ options:
+ members:
+ - __init__
+ - things
+ - per_job_scheduler_types
+ - per_thing_schedulers
+ - pending_operations
+ - add_thing
+ - add_things
+ - is_running
+ - submit
+ - execute
+ - execute_operation
+ - run
+ - run_things
+ - run_thing_instance
+ - tunnel_message_to_things
+ - run_coro_threadsafe
+ - add_stop_hook
+ - stop
+
+## Attributes
+
+### `logger`
+`structlog.stdlib.BoundLogger`
+`instance-attribute`, `read-only`
+logger instance, bound with `component="eventloop"` and the implementing class name.
+
+### `event_bus`
+`EventBus`
+`instance-attribute`, `read-only`
+publishes events of every served `Thing` to the subscribed protocol servers.
+Replaces the ZMQ `EventPublisher` that the RPC server used to own.
diff --git a/docs/api-reference/eventloop/schedulers/async-scheduler.md b/docs/api-reference/eventloop/schedulers/async-scheduler.md
new file mode 100644
index 0000000..a375ee1
--- /dev/null
+++ b/docs/api-reference/eventloop/schedulers/async-scheduler.md
@@ -0,0 +1,8 @@
+
+::: hololinked.core.eventloop.scheduler.AsyncScheduler
+ options:
+ members:
+ - __init__
+ - dispatch_job
+ - next_job
+ - has_job
diff --git a/docs/api-reference/eventloop/schedulers/queued-scheduler.md b/docs/api-reference/eventloop/schedulers/queued-scheduler.md
new file mode 100644
index 0000000..b3a06c0
--- /dev/null
+++ b/docs/api-reference/eventloop/schedulers/queued-scheduler.md
@@ -0,0 +1,9 @@
+
+::: hololinked.core.eventloop.scheduler.QueuedScheduler
+ options:
+ members:
+ - __init__
+ - dispatch_job
+ - next_job
+ - has_job
+ - cleanup
diff --git a/docs/api-reference/eventloop/schedulers/scheduler.md b/docs/api-reference/eventloop/schedulers/scheduler.md
new file mode 100644
index 0000000..b5be972
--- /dev/null
+++ b/docs/api-reference/eventloop/schedulers/scheduler.md
@@ -0,0 +1,17 @@
+
+::: hololinked.core.eventloop.scheduler.Scheduler
+ options:
+ members:
+ - __init__
+ - dispatch_job
+ - next_job
+ - has_job
+ - wait_for_job
+ - wait_for_operation
+ - wait_for_reply
+ - last_operation_request
+ - last_operation_reply
+ - reset_operation_request
+ - reset_operation_reply
+ - format_reply_tuple
+ - cleanup
diff --git a/docs/api-reference/eventloop/schedulers/threaded-scheduler.md b/docs/api-reference/eventloop/schedulers/threaded-scheduler.md
new file mode 100644
index 0000000..e239a7d
--- /dev/null
+++ b/docs/api-reference/eventloop/schedulers/threaded-scheduler.md
@@ -0,0 +1,8 @@
+
+::: hololinked.core.eventloop.scheduler.ThreadedScheduler
+ options:
+ members:
+ - __init__
+ - dispatch_job
+ - next_job
+ - has_job
diff --git a/docs/api-reference/namespaces.md b/docs/api-reference/namespaces.md
index 0bddf38..a121161 100644
--- a/docs/api-reference/namespaces.md
+++ b/docs/api-reference/namespaces.md
@@ -2,7 +2,7 @@
| Namespace | Description |
| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `hololinked.core` | Definition of [`Thing`](thing/index.md) class, [`Property`](property/index.md), [`Action`](action/index.md) and [`Event`](event/index.md) classes, [`StateMachine`](state-machine/state-machine.md), [`Logger`](thing/logger.md) & [`RPCServer`](rpc-server/rpc-server.md) |
+| `hololinked.core` | Definition of [`Thing`](thing/index.md) class, [`Property`](property/index.md), [`Action`](action/index.md) and [`Event`](event/index.md) classes, [`StateMachine`](state-machine/state-machine.md), [`Logger`](thing/logger.md) & [`EventLoop`](eventloop/eventloop.md) |
| `hololinked.serializers` | Serializers for different data formats (JSON, MessagePack, etc.) and [`Serializers`](serializers/index.md) singleton. |
| `hololinked.server` | Protocol specific server implementations |
| `hololinked.client` | [`ObjectProxy`](clients/object-proxy.md) and protocol specific client implementations, client abstractions and [`ClientFactory`](clients/base.md). |
diff --git a/docs/api-reference/protocols/zmq/brokers/async-zmq-client.md b/docs/api-reference/protocols/zmq/brokers/async-zmq-client.md
new file mode 100644
index 0000000..1623e75
--- /dev/null
+++ b/docs/api-reference/protocols/zmq/brokers/async-zmq-client.md
@@ -0,0 +1 @@
+::: hololinked.server.zmq.brokers.AsyncZMQClient
\ No newline at end of file
diff --git a/docs/api-reference/rpc-server/brokers/async-zmq-server.md b/docs/api-reference/protocols/zmq/brokers/async-zmq-server.md
similarity index 86%
rename from docs/api-reference/rpc-server/brokers/async-zmq-server.md
rename to docs/api-reference/protocols/zmq/brokers/async-zmq-server.md
index 06c5242..5477977 100644
--- a/docs/api-reference/rpc-server/brokers/async-zmq-server.md
+++ b/docs/api-reference/protocols/zmq/brokers/async-zmq-server.md
@@ -1,4 +1,4 @@
-::: hololinked.core.zmq.brokers.AsyncZMQServer
+::: hololinked.server.zmq.brokers.AsyncZMQServer
options:
members:
- __init__
diff --git a/docs/api-reference/rpc-server/brokers/base-zmq.md b/docs/api-reference/protocols/zmq/brokers/base-zmq.md
similarity index 60%
rename from docs/api-reference/rpc-server/brokers/base-zmq.md
rename to docs/api-reference/protocols/zmq/brokers/base-zmq.md
index 49f6a4a..62c896d 100644
--- a/docs/api-reference/rpc-server/brokers/base-zmq.md
+++ b/docs/api-reference/protocols/zmq/brokers/base-zmq.md
@@ -1,24 +1,24 @@
-::: hololinked.core.zmq.brokers.BaseZMQ
+::: hololinked.server.zmq.brokers.BaseZMQ
options:
show_root_heading: true
heading_level: 2
-::: hololinked.core.zmq.brokers.BaseAsyncZMQ
+::: hololinked.server.zmq.brokers.BaseAsyncZMQ
options:
show_root_heading: true
heading_level: 2
-::: hololinked.core.zmq.brokers.BaseSyncZMQ
+::: hololinked.server.zmq.brokers.BaseSyncZMQ
options:
show_root_heading: true
heading_level: 2
-::: hololinked.core.zmq.brokers.BaseZMQServer
+::: hololinked.server.zmq.brokers.BaseZMQServer
options:
show_root_heading: true
heading_level: 2
-::: hololinked.core.zmq.brokers.BaseZMQClient
+::: hololinked.server.zmq.brokers.BaseZMQClient
options:
show_root_heading: true
heading_level: 2
\ No newline at end of file
diff --git a/docs/api-reference/rpc-server/brokers/event-consumer.md b/docs/api-reference/protocols/zmq/brokers/event-consumer.md
similarity index 75%
rename from docs/api-reference/rpc-server/brokers/event-consumer.md
rename to docs/api-reference/protocols/zmq/brokers/event-consumer.md
index 958906d..ac433b1 100644
--- a/docs/api-reference/rpc-server/brokers/event-consumer.md
+++ b/docs/api-reference/protocols/zmq/brokers/event-consumer.md
@@ -1,4 +1,4 @@
-::: hololinked.core.zmq.brokers.BaseEventConsumer
+::: hololinked.server.zmq.brokers.BaseEventConsumer
options:
show_root_heading: true
heading_level: 2
@@ -8,7 +8,7 @@
- stop_polling
- interrupt_message
-::: hololinked.core.zmq.brokers.EventConsumer
+::: hololinked.server.zmq.brokers.EventConsumer
options:
show_root_heading: true
heading_level: 2
@@ -16,7 +16,7 @@
- receive
- interrupt
-::: hololinked.core.zmq.brokers.AsyncEventConsumer
+::: hololinked.server.zmq.brokers.AsyncEventConsumer
options:
show_root_heading: true
heading_level: 2
diff --git a/docs/api-reference/protocols/zmq/brokers/event-publisher.md b/docs/api-reference/protocols/zmq/brokers/event-publisher.md
new file mode 100644
index 0000000..9700311
--- /dev/null
+++ b/docs/api-reference/protocols/zmq/brokers/event-publisher.md
@@ -0,0 +1 @@
+::: hololinked.server.zmq.brokers.EventPublisher
\ No newline at end of file
diff --git a/docs/api-reference/rpc-server/brokers/message-mapped-zmq-client-pool.md b/docs/api-reference/protocols/zmq/brokers/message-mapped-zmq-client-pool.md
similarity index 83%
rename from docs/api-reference/rpc-server/brokers/message-mapped-zmq-client-pool.md
rename to docs/api-reference/protocols/zmq/brokers/message-mapped-zmq-client-pool.md
index a17d3ea..7dc80e4 100644
--- a/docs/api-reference/rpc-server/brokers/message-mapped-zmq-client-pool.md
+++ b/docs/api-reference/protocols/zmq/brokers/message-mapped-zmq-client-pool.md
@@ -1,4 +1,4 @@
-::: hololinked.core.zmq.brokers.MessageMappedZMQClientPool
+::: hololinked.server.zmq.brokers.MessageMappedZMQClientPool
options:
members:
- __init__
diff --git a/docs/api-reference/rpc-server/brokers/sync-zmq-client.md b/docs/api-reference/protocols/zmq/brokers/sync-zmq-client.md
similarity index 76%
rename from docs/api-reference/rpc-server/brokers/sync-zmq-client.md
rename to docs/api-reference/protocols/zmq/brokers/sync-zmq-client.md
index 754119c..89f2162 100644
--- a/docs/api-reference/rpc-server/brokers/sync-zmq-client.md
+++ b/docs/api-reference/protocols/zmq/brokers/sync-zmq-client.md
@@ -1,4 +1,4 @@
-::: hololinked.core.zmq.brokers.SyncZMQClient
+::: hololinked.server.zmq.brokers.SyncZMQClient
options:
members:
- __init__
diff --git a/docs/api-reference/protocols/zmq/messaging-contract/event-message.md b/docs/api-reference/protocols/zmq/messaging-contract/event-message.md
new file mode 100644
index 0000000..7346f24
--- /dev/null
+++ b/docs/api-reference/protocols/zmq/messaging-contract/event-message.md
@@ -0,0 +1,15 @@
+::: hololinked.server.zmq.message.EventMessage
+ options:
+ inherited_members: true
+ members:
+ - __init__
+ - header
+ - body
+ - event_id
+ - id
+ - type
+ - sender_id
+ - receiver_id
+ - byte_array
+ - craft_from_arguments
+ - parse_header
diff --git a/docs/api-reference/protocols/zmq/messaging-contract/headers.md b/docs/api-reference/protocols/zmq/messaging-contract/headers.md
new file mode 100644
index 0000000..a4ff014
--- /dev/null
+++ b/docs/api-reference/protocols/zmq/messaging-contract/headers.md
@@ -0,0 +1,8 @@
+# Headers
+
+::: hololinked.server.zmq.message.RequestHeader
+
+::: hololinked.server.zmq.message.ResponseHeader
+
+::: hololinked.server.zmq.message.EventHeader
+
diff --git a/docs/api-reference/rpc-server/messaging-contract/request-message.md b/docs/api-reference/protocols/zmq/messaging-contract/request-message.md
similarity index 84%
rename from docs/api-reference/rpc-server/messaging-contract/request-message.md
rename to docs/api-reference/protocols/zmq/messaging-contract/request-message.md
index 4f1a6f7..baef819 100644
--- a/docs/api-reference/rpc-server/messaging-contract/request-message.md
+++ b/docs/api-reference/protocols/zmq/messaging-contract/request-message.md
@@ -1,4 +1,4 @@
-::: hololinked.core.zmq.message.RequestMessage
+::: hololinked.server.zmq.message.RequestMessage
options:
members:
- __init__
diff --git a/docs/api-reference/protocols/zmq/messaging-contract/response-message.md b/docs/api-reference/protocols/zmq/messaging-contract/response-message.md
new file mode 100644
index 0000000..d1eb57c
--- /dev/null
+++ b/docs/api-reference/protocols/zmq/messaging-contract/response-message.md
@@ -0,0 +1,18 @@
+::: hololinked.server.zmq.message.ResponseMessage
+ options:
+ members:
+ - __init__
+ - header
+ - body
+ - payload
+ - preserialized_payload
+ - id
+ - type
+ - sender_id
+ - receiver_id
+ - byte_array
+ - craft_from_arguments
+ - craft_reply_from_request
+ - craft_with_message_type
+ - parse_header
+ - parse_body
diff --git a/docs/api-reference/rpc-server/brokers/async-zmq-client.md b/docs/api-reference/rpc-server/brokers/async-zmq-client.md
deleted file mode 100644
index 3e635e1..0000000
--- a/docs/api-reference/rpc-server/brokers/async-zmq-client.md
+++ /dev/null
@@ -1 +0,0 @@
-::: hololinked.core.zmq.brokers.AsyncZMQClient
\ No newline at end of file
diff --git a/docs/api-reference/rpc-server/brokers/event-publisher.md b/docs/api-reference/rpc-server/brokers/event-publisher.md
deleted file mode 100644
index 3ebf209..0000000
--- a/docs/api-reference/rpc-server/brokers/event-publisher.md
+++ /dev/null
@@ -1 +0,0 @@
-::: hololinked.core.zmq.brokers.EventPublisher
\ No newline at end of file
diff --git a/docs/api-reference/rpc-server/messaging-contract/contexts.md b/docs/api-reference/rpc-server/messaging-contract/contexts.md
deleted file mode 100644
index 53a8d56..0000000
--- a/docs/api-reference/rpc-server/messaging-contract/contexts.md
+++ /dev/null
@@ -1,3 +0,0 @@
-::: hololinked.core.zmq.message.ServerExecutionContext
-
-::: hololinked.core.zmq.message.ThingExecutionContext
\ No newline at end of file
diff --git a/docs/api-reference/rpc-server/messaging-contract/event-message.md b/docs/api-reference/rpc-server/messaging-contract/event-message.md
deleted file mode 100644
index 947190a..0000000
--- a/docs/api-reference/rpc-server/messaging-contract/event-message.md
+++ /dev/null
@@ -1,10 +0,0 @@
-::: hololinked.core.zmq.message.EventMessage
- options:
- members:
- - __init__
- - header
- - body
- - event_id
- - thing_id
- - byte_array
- - craft_from_arguments
\ No newline at end of file
diff --git a/docs/api-reference/rpc-server/messaging-contract/headers.md b/docs/api-reference/rpc-server/messaging-contract/headers.md
deleted file mode 100644
index 6d9da81..0000000
--- a/docs/api-reference/rpc-server/messaging-contract/headers.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# Headers
-
-::: hololinked.core.zmq.message.RequestHeader
-
-::: hololinked.core.zmq.message.ResponseHeader
-
-::: hololinked.core.zmq.message.EventHeader
-
diff --git a/docs/api-reference/rpc-server/messaging-contract/response-message.md b/docs/api-reference/rpc-server/messaging-contract/response-message.md
deleted file mode 100644
index 1e3031f..0000000
--- a/docs/api-reference/rpc-server/messaging-contract/response-message.md
+++ /dev/null
@@ -1,12 +0,0 @@
-::: hololinked.core.zmq.message.ResponseMessage
- options:
- members:
- - __init__
- - header
- - body
- - thing_id
- - byte_array
- - craft_from_arguments
- - craft_reply_from_request
- - parse_header
- - parse_body
\ No newline at end of file
diff --git a/docs/api-reference/rpc-server/rpc-server.md b/docs/api-reference/rpc-server/rpc-server.md
deleted file mode 100644
index 8ad8c5c..0000000
--- a/docs/api-reference/rpc-server/rpc-server.md
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-::: hololinked.core.zmq.rpc_server.RPCServer
- options:
- members:
- - __init__
- - run
- - stop
- - exit
- - get_thing_description
- - run_zmq_request_listener
- - recv_requests_and_dispatch_jobs
- - tunnel_message_to_things
- - run_things
- - run_thing_instance
- - execute_operation
-
-
-## Attributes
-
-### `id`
-`str`
-`instance-attribute`, `writable`
-ID of the RPC server, used to direct requests from client. Must be unique.
-For IPC & INPROC sockets, ID is used to create the socket as well. For TCP, it is used for
-message routing.
-
-### `things`
-`List[Thing]`
-`instance-attribute`, `read-only`
-`Thing` objects that will be served by this RPC server.
-
-### `logger`
-`logging.Logger`
-logger instance
-
-### `req_rep_server`
-`AsyncZMQServer`
-`instance-attribute`, `read-only`
-ZMQ server that handler request-reply pattern. Used for properties & actions.
-
-### `event_publisher`
-`EventPublisher`
-`instance-attribute`, `read-only`
-ZMQ servers that publishes events to clients in publish-subscribe pattern.
-
-### `schedulers`
-`tying.Dict[str, Scheduler]`
-`instance-attribute`
-A map of thing ID to a `Scheduler` object. For actions requiring special scheduling,
-additional schdulers with ID "(thing ID).(action name).(opertaion)" is created.
-
diff --git a/docs/api-reference/rpc-server/schedulers/async-scheduler.md b/docs/api-reference/rpc-server/schedulers/async-scheduler.md
deleted file mode 100644
index a6e6956..0000000
--- a/docs/api-reference/rpc-server/schedulers/async-scheduler.md
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-::: hololinked.core.zmq.rpc_server.AsyncScheduler
\ No newline at end of file
diff --git a/docs/api-reference/rpc-server/schedulers/queued-scheduler.md b/docs/api-reference/rpc-server/schedulers/queued-scheduler.md
deleted file mode 100644
index d8c1e03..0000000
--- a/docs/api-reference/rpc-server/schedulers/queued-scheduler.md
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-::: hololinked.core.zmq.rpc_server.QueuedScheduler
\ No newline at end of file
diff --git a/docs/api-reference/rpc-server/schedulers/scheduler.md b/docs/api-reference/rpc-server/schedulers/scheduler.md
deleted file mode 100644
index cf529be..0000000
--- a/docs/api-reference/rpc-server/schedulers/scheduler.md
+++ /dev/null
@@ -1,2 +0,0 @@
-
-::: hololinked.core.zmq.rpc_server.Scheduler
\ No newline at end of file
diff --git a/docs/api-reference/rpc-server/schedulers/threaded-scheduler.md b/docs/api-reference/rpc-server/schedulers/threaded-scheduler.md
deleted file mode 100644
index 4f6e473..0000000
--- a/docs/api-reference/rpc-server/schedulers/threaded-scheduler.md
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-::: hololinked.core.zmq.rpc_server.ThreadedScheduler
\ No newline at end of file
From 0137b00c141b94439871bc9dbfc1892eeac3eb8e Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Mon, 7 Sep 2026 19:29:21 +0200
Subject: [PATCH 03/21] update namespace #2
---
docs/api-reference/action/bases/index.md | 2 +-
docs/api-reference/clients/security/apikey.md | 4 +-
docs/api-reference/property/index.md | 2 +-
docs/api-reference/protocols/http/index.md | 16 +++++---
docs/api-reference/serializers/index.md | 39 +++++++++----------
docs/api-reference/td/bases/schema.md | 2 +-
.../interaction_affordance.md | 8 +++-
.../api-reference/thing/bases/event-source.md | 3 +-
8 files changed, 42 insertions(+), 34 deletions(-)
diff --git a/docs/api-reference/action/bases/index.md b/docs/api-reference/action/bases/index.md
index c3980b4..1b870ec 100644
--- a/docs/api-reference/action/bases/index.md
+++ b/docs/api-reference/action/bases/index.md
@@ -4,7 +4,7 @@
heading_level: 2
members:
- __init__
- - to_affordance
+ - to_metadata
::: hololinked.core.actions.BoundAction
diff --git a/docs/api-reference/clients/security/apikey.md b/docs/api-reference/clients/security/apikey.md
index fed13c9..57a8bda 100644
--- a/docs/api-reference/clients/security/apikey.md
+++ b/docs/api-reference/clients/security/apikey.md
@@ -3,6 +3,6 @@
::: hololinked.client.security.APIKeySecurity
options:
members:
- - __init__
- value
- - http_header_name
\ No newline at end of file
+ - http_header_name
+ - http_header
diff --git a/docs/api-reference/property/index.md b/docs/api-reference/property/index.md
index b53f0b8..ac6c57d 100644
--- a/docs/api-reference/property/index.md
+++ b/docs/api-reference/property/index.md
@@ -4,7 +4,7 @@
members:
- __init__
- comparator
- - to_affordance
+ - to_metadata
- push_change_event
- external_set
- validate_and_adapt
diff --git a/docs/api-reference/protocols/http/index.md b/docs/api-reference/protocols/http/index.md
index 73e3a58..576fff1 100644
--- a/docs/api-reference/protocols/http/index.md
+++ b/docs/api-reference/protocols/http/index.md
@@ -2,14 +2,20 @@
::: hololinked.server.http.HTTPServer
options:
+ inherited_members: true
members:
- __init__
- add_thing
- - listen
- - stop
- - async_stop
+ - add_things
- add_property
- add_action
- add_event
- - add_things
- - all_ok
\ No newline at end of file
+ - setup
+ - start
+ - run
+ - stop
+ - async_stop
+ - shutdown_tornado
+ - address
+ - port
+ - things
diff --git a/docs/api-reference/serializers/index.md b/docs/api-reference/serializers/index.md
index 8f7f144..bd364bc 100644
--- a/docs/api-reference/serializers/index.md
+++ b/docs/api-reference/serializers/index.md
@@ -1,28 +1,25 @@
-::: hololinked.Serializers
+::: hololinked.injection.Serializers
options:
members:
+ - default
+ - json
+ - msgpack
+ - pickle
+ - text
+ - default_content_type
+ - content_types
+ - allowed_content_types
- for_object
- register
- - register_content_type_for_object
- - register_content_type_for_object_by_name
- register_for_object
-
-## Attributes
-
-### `json`: `JSONSerializer`
-`class-attribute`, `writable`
-The default serializer for all properties, actions and events (`msgspec` based C++ implementation)
-
-### `pickle`: `PickleSerializer`
-`class-attribute`, `writable`
-pickle serializer, unsafe without encryption but useful for faster & flexible serialization of python specific types
-
-### `msgpack`: `MsgPackSerializer`
-`class-attribute`, `writable`
-MessagePack serializer, efficient binary format that is both fast & interoperable between languages but not human readable
-
-### `default`: `BaseSerializer`
-`class-attribute`, `writable`
-`JSONSerializer`, set it to use something else
\ No newline at end of file
+ - register_for_thing_instance
+ - register_for_object_per_thing_instance
+ - register_content_type_for_object
+ - register_content_type_for_thing_instance
+ - register_content_type_for_object_per_thing_instance
+ - get_content_type_for_object
+ - get_content_types
+ - get_allowed_content_types
+ - reset
\ No newline at end of file
diff --git a/docs/api-reference/td/bases/schema.md b/docs/api-reference/td/bases/schema.md
index 8b30037..466b07f 100644
--- a/docs/api-reference/td/bases/schema.md
+++ b/docs/api-reference/td/bases/schema.md
@@ -1,3 +1,3 @@
-::: hololinked.metadata.td.base.Schema
\ No newline at end of file
+::: hololinked.metadata.td.base.WoTSchema
\ No newline at end of file
diff --git a/docs/api-reference/td/interaction_affordance/interaction_affordance.md b/docs/api-reference/td/interaction_affordance/interaction_affordance.md
index 98f4064..63c47ef 100644
--- a/docs/api-reference/td/interaction_affordance/interaction_affordance.md
+++ b/docs/api-reference/td/interaction_affordance/interaction_affordance.md
@@ -2,18 +2,22 @@
::: hololinked.metadata.td.interaction_affordance.InteractionAffordance
options:
+ inherited_members: true
members:
- what
- name
- objekt
- owner
+ - owner_cls
- thing_cls
- thing_id
- - generate
- build
- - build_forms
+ - from_descriptor
+ - to_descriptor
+ - from_metadata
- from_TD
- retrieve_form
+ - pop_form
- register_descriptor
## TD Supported Fields
diff --git a/docs/api-reference/thing/bases/event-source.md b/docs/api-reference/thing/bases/event-source.md
index 5355c0c..ead791f 100644
--- a/docs/api-reference/thing/bases/event-source.md
+++ b/docs/api-reference/thing/bases/event-source.md
@@ -4,4 +4,5 @@
options:
members:
- create_events_registry
- - event_publisher
\ No newline at end of file
+ - events
+ - event_bus
\ No newline at end of file
From af59222e6015da7b5e5f213450df7438750f4537 Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Mon, 7 Sep 2026 19:39:25 +0200
Subject: [PATCH 04/21] round #3
---
docs/api-reference/namespaces.md | 6 ++++--
docs/api-reference/thing/index.md | 22 ++++++++++++++++++++++
docs/beginners-guide/articles/servers.md | 2 +-
main.py | 2 +-
4 files changed, 28 insertions(+), 4 deletions(-)
diff --git a/docs/api-reference/namespaces.md b/docs/api-reference/namespaces.md
index a121161..d3fb2bb 100644
--- a/docs/api-reference/namespaces.md
+++ b/docs/api-reference/namespaces.md
@@ -2,10 +2,12 @@
| Namespace | Description |
| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `hololinked.core` | Definition of [`Thing`](thing/index.md) class, [`Property`](property/index.md), [`Action`](action/index.md) and [`Event`](event/index.md) classes, [`StateMachine`](state-machine/state-machine.md), [`Logger`](thing/logger.md) & [`EventLoop`](eventloop/eventloop.md) |
+| `hololinked.core` | Definition of [`Thing`](thing/index.md) class, [`Property`](property/index.md), [`Action`](action/index.md) and [`Event`](events/index.md) classes, [`StateMachine`](state-machine/state-machine.md), [`Logger`](thing/logger.md) & the [`EventLoop`](eventloop/eventloop.md) that executes operations. |
| `hololinked.serializers` | Serializers for different data formats (JSON, MessagePack, etc.) and [`Serializers`](serializers/index.md) singleton. |
| `hololinked.server` | Protocol specific server implementations |
| `hololinked.client` | [`ObjectProxy`](clients/object-proxy.md) and protocol specific client implementations, client abstractions and [`ClientFactory`](clients/base.md). |
| `hololinked.param` | Copy of `param` library with implementation specific modifications. |
| `hololinked.storage` | Database clients for data persistence. |
-| `hololinked.metadata.td` | Thing Description/[ThingModel](td/tm.md) parsing and generation. |
+| `hololinked.metadata` | Device description languages a `Thing` can be described in. `hololinked.metadata.td` holds the W3C Web of Things Thing Description/[ThingModel](td/tm.md) parsing and generation. |
+| `hololinked.injection` | Dependency injection layer. Holds the lazy adapter registries — `Serializers`, `SchemaValidators`, `StorageBackends` and `MetadataFormats` — that resolve an implementation by name on first use. |
+| `hololinked.schema_validators` | Validators that check property, action and event payloads against a schema (JSON Schema, fastjsonschema, pydantic). |
diff --git a/docs/api-reference/thing/index.md b/docs/api-reference/thing/index.md
index 9cc9003..f6b5089 100644
--- a/docs/api-reference/thing/index.md
+++ b/docs/api-reference/thing/index.md
@@ -48,4 +48,26 @@ other `Thing`'s that are composed within this `Thing`.
`logging.Logger`
{{ thing_logger_doc() }}
+### `state_machine`
+`StateMachine | None`
+`class-attribute`, `writable`
+the `StateMachine`, `None` when the `Thing` has none. Accessed on an instance it returns a [`BoundFSM`](../state-machine/bound-fsm.md).
+
+### `state_change_event`
+`Event`
+`class-attribute`, `read-only`
+change event pushed whenever `state` changes. Generated automatically because `state` is an
+observable `Property`.
+
+### `event_bus`
+`EventBus`
+`instance-attribute`, `read-only`
+the bus this object's events are published through, owned by the
+[`EventLoop`](../eventloop/eventloop.md).
+
+### `thing_model`
+`ThingModel`
+`instance-attribute`, `read-only`
+the Thing Model of this object, equivalent to calling `get_thing_model()` with default arguments.
+
diff --git a/docs/beginners-guide/articles/servers.md b/docs/beginners-guide/articles/servers.md
index 71f669a..3e9b93b 100644
--- a/docs/beginners-guide/articles/servers.md
+++ b/docs/beginners-guide/articles/servers.md
@@ -57,7 +57,7 @@ The exposed properties, actions and events (events are discussed [below](#publis
--8<-- "docs/beginners-guide/code/thing_basic_example.py:146:155"
```
-See the [protocols](protocols/index.md) section for more options to serve the `Thing`.
+See the [protocols](protocols/general.md) section for more options to serve the `Thing`.
All requests to properties and actions are generally queued as the domain of operation under the hood is remote procedure calls (RPC) mediated completely by ZMQ. Therefore, only one request is executed at a time as it is assumed that the hardware normally responds to only one (physical-)operation at a time.
diff --git a/main.py b/main.py
index e631120..3368e81 100644
--- a/main.py
+++ b/main.py
@@ -12,7 +12,7 @@ def thing_id_docstring():
return hololinked.core.Thing.id.doc
@env.macro
- def sub_things_docstring(): # does not work, dont know why
+ def sub_things_docstring():
return inspect.getdoc(hololinked.core.thing.Thing.sub_things)
@env.macro
From 517f4bf821fd644591df249f3bedf3715da51277 Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Mon, 7 Sep 2026 19:46:56 +0200
Subject: [PATCH 05/21] eventloop API
---
docs/api-reference/eventloop/job.md | 14 +++++++
docs/api-reference/eventloop/operation.md | 16 ++++++++
docs/api-reference/eventloop/payloads.md | 25 +++++++++++
.../eventloop/pending-operations.md | 10 +++++
docs/api-reference/eventloop/pubsub.md | 41 +++++++++++++++++++
docs/api-reference/eventloop/reply.md | 18 ++++++++
6 files changed, 124 insertions(+)
create mode 100644 docs/api-reference/eventloop/job.md
create mode 100644 docs/api-reference/eventloop/operation.md
create mode 100644 docs/api-reference/eventloop/payloads.md
create mode 100644 docs/api-reference/eventloop/pending-operations.md
create mode 100644 docs/api-reference/eventloop/pubsub.md
create mode 100644 docs/api-reference/eventloop/reply.md
diff --git a/docs/api-reference/eventloop/job.md b/docs/api-reference/eventloop/job.md
new file mode 100644
index 0000000..784747b
--- /dev/null
+++ b/docs/api-reference/eventloop/job.md
@@ -0,0 +1,14 @@
+
+::: hololinked.core.eventloop.operations.Job
+ options:
+ members:
+ - __init__
+ - operation
+ - future
+ - started
+ - completed
+ - invokation_timeout_task
+ - execution_timeout_task
+ - answer
+ - answer_if_never_started
+ - answer_if_overdue
diff --git a/docs/api-reference/eventloop/operation.md b/docs/api-reference/eventloop/operation.md
new file mode 100644
index 0000000..fe44084
--- /dev/null
+++ b/docs/api-reference/eventloop/operation.md
@@ -0,0 +1,16 @@
+
+::: hololinked.core.eventloop.operations.Operation
+ options:
+ members:
+ - __init__
+ - thing_id
+ - objekt
+ - operation
+ - payload
+ - preserialized_payload
+ - scheduler_execution_context
+ - thing_execution_context
+ - sender_id
+ - id
+ - qualified_name
+ - create
diff --git a/docs/api-reference/eventloop/payloads.md b/docs/api-reference/eventloop/payloads.md
new file mode 100644
index 0000000..35d035e
--- /dev/null
+++ b/docs/api-reference/eventloop/payloads.md
@@ -0,0 +1,25 @@
+# Payloads
+
+The two containers an `Operation` and a `Reply` carry their data in.
+
+::: hololinked.core.eventloop.payloads.SerializableData
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - __init__
+ - value
+ - content_type
+ - serializer
+ - serialize
+ - deserialize
+ - require_serialized
+
+::: hololinked.core.eventloop.payloads.PreserializedData
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - __init__
+ - value
+ - content_type
diff --git a/docs/api-reference/eventloop/pending-operations.md b/docs/api-reference/eventloop/pending-operations.md
new file mode 100644
index 0000000..6fa0099
--- /dev/null
+++ b/docs/api-reference/eventloop/pending-operations.md
@@ -0,0 +1,10 @@
+
+::: hololinked.core.eventloop.operations.PendingOperations
+ options:
+ members:
+ - __init__
+ - maxsize
+ - futures
+ - add
+ - claim
+ - clear
diff --git a/docs/api-reference/eventloop/pubsub.md b/docs/api-reference/eventloop/pubsub.md
new file mode 100644
index 0000000..f7e0551
--- /dev/null
+++ b/docs/api-reference/eventloop/pubsub.md
@@ -0,0 +1,41 @@
+# Publish-Subscribe
+
+::: hololinked.core.eventloop.pubsub.EventBus
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - __init__
+ - register
+ - unregister
+ - subscribe
+ - unsubscribe
+ - publish
+ - event_for
+ - event_ids
+
+::: hololinked.core.eventloop.pubsub.EventSubscription
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - __init__
+ - event
+ - bus
+ - loop
+ - queue
+ - dropped
+ - unique_identifier
+ - receive
+ - encode
+ - event_callback_threadsafe
+ - unsubscribe
+
+::: hololinked.core.eventloop.pubsub.RegisteredEvent
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - descriptor
+ - owner
+ - unique_identifier
diff --git a/docs/api-reference/eventloop/reply.md b/docs/api-reference/eventloop/reply.md
new file mode 100644
index 0000000..cf5f09f
--- /dev/null
+++ b/docs/api-reference/eventloop/reply.md
@@ -0,0 +1,18 @@
+# Reply
+
+::: hololinked.core.eventloop.operations.Reply
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - __init__
+ - payload
+ - preserialized_payload
+ - kind
+ - is_error
+ - timed_out
+
+::: hololinked.core.eventloop.operations.ReplyKind
+ options:
+ show_root_heading: true
+ heading_level: 2
From 0f94410042e87954882387509cb572c53eafd9c6 Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Mon, 7 Sep 2026 19:53:10 +0200
Subject: [PATCH 06/21] dependenncy injection
---
docs/api-reference/injection/index.md | 36 +++++++++++++++++++
.../injection/metadata-formats.md | 9 +++++
.../injection/schema-validators.md | 14 ++++++++
.../injection/storage-backends.md | 22 ++++++++++++
4 files changed, 81 insertions(+)
create mode 100644 docs/api-reference/injection/index.md
create mode 100644 docs/api-reference/injection/metadata-formats.md
create mode 100644 docs/api-reference/injection/schema-validators.md
create mode 100644 docs/api-reference/injection/storage-backends.md
diff --git a/docs/api-reference/injection/index.md b/docs/api-reference/injection/index.md
new file mode 100644
index 0000000..855070b
--- /dev/null
+++ b/docs/api-reference/injection/index.md
@@ -0,0 +1,36 @@
+# Adapter Registries
+
+::: hololinked.injection
+ options:
+ members: []
+ show_root_heading: false
+
+Each registry below resolves an implementation **by name, on first use**.
+
+| Registry | Resolves | Adapters live in |
+| --- | --- | --- |
+| [`Serializers`](../serializers/index.md) | serializers | `hololinked.serializers` |
+| [`SchemaValidators`](schema-validators.md) | schema validators | `hololinked.schema_validators` |
+| [`StorageBackends`](storage-backends.md) | storage backends | `hololinked.storage` |
+| [`MetadataFormats`](metadata-formats.md) | device description languages | `hololinked.metadata` |
+
+The implementation is either already available in the package or can be supplied by the end user.
+All four classes above are singletons, so anything set on them applies process-wide.
+
+::: hololinked.injection.AdapterRegistry
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - adapter_kind
+ - package
+ - modules
+ - tables
+ - instantiate
+ - install
+ - forget_adapters
+
+::: hololinked.injection.Registry
+ options:
+ show_root_heading: true
+ heading_level: 2
diff --git a/docs/api-reference/injection/metadata-formats.md b/docs/api-reference/injection/metadata-formats.md
new file mode 100644
index 0000000..69a4f83
--- /dev/null
+++ b/docs/api-reference/injection/metadata-formats.md
@@ -0,0 +1,9 @@
+
+::: hololinked.injection.MetadataFormats
+ options:
+ members:
+ - wot
+ - modules
+ - get
+ - register
+ - reset
diff --git a/docs/api-reference/injection/schema-validators.md b/docs/api-reference/injection/schema-validators.md
new file mode 100644
index 0000000..54ffe69
--- /dev/null
+++ b/docs/api-reference/injection/schema-validators.md
@@ -0,0 +1,14 @@
+
+::: hololinked.injection.SchemaValidators
+ options:
+ members:
+ - json_schema
+ - pydantic
+ - modules
+ - predicates
+ - for_schema
+ - name_for_schema
+ - is_supported
+ - check_schema
+ - register
+ - reset
diff --git a/docs/api-reference/injection/storage-backends.md b/docs/api-reference/injection/storage-backends.md
new file mode 100644
index 0000000..8d63a3f
--- /dev/null
+++ b/docs/api-reference/injection/storage-backends.md
@@ -0,0 +1,22 @@
+# StorageBackends
+
+::: hololinked.injection.StorageBackends
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - sqlalchemy
+ - mongo
+ - json_file
+ - modules
+ - flags
+ - default_name
+ - for_thing
+ - name_for_thing
+ - register
+ - reset
+
+::: hololinked.injection.prepare_object_storage
+ options:
+ show_root_heading: true
+ heading_level: 2
From 190e8e7e6a61b0c5d18903e579617d5e9c02f397 Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Mon, 7 Sep 2026 20:08:11 +0200
Subject: [PATCH 07/21] interfaces
---
.../interfaces/configuration-repository.md | 15 ++++
docs/api-reference/interfaces/index.md | 18 +++++
docs/api-reference/interfaces/metadata.md | 72 +++++++++++++++++++
.../interfaces/schema-validator.md | 9 +++
docs/api-reference/interfaces/serializer.md | 10 +++
5 files changed, 124 insertions(+)
create mode 100644 docs/api-reference/interfaces/configuration-repository.md
create mode 100644 docs/api-reference/interfaces/index.md
create mode 100644 docs/api-reference/interfaces/metadata.md
create mode 100644 docs/api-reference/interfaces/schema-validator.md
create mode 100644 docs/api-reference/interfaces/serializer.md
diff --git a/docs/api-reference/interfaces/configuration-repository.md b/docs/api-reference/interfaces/configuration-repository.md
new file mode 100644
index 0000000..71cfb96
--- /dev/null
+++ b/docs/api-reference/interfaces/configuration-repository.md
@@ -0,0 +1,15 @@
+
+::: hololinked.core.interfaces.configuration.BaseConfigurationRepository
+ options:
+ members:
+ - __init__
+ - from_thing
+ - thing
+ - fetch_own_info
+ - get_property
+ - get_properties
+ - get_all_properties
+ - set_property
+ - set_properties
+ - create_missing_properties
+ - create_init_properties
diff --git a/docs/api-reference/interfaces/index.md b/docs/api-reference/interfaces/index.md
new file mode 100644
index 0000000..f3c7653
--- /dev/null
+++ b/docs/api-reference/interfaces/index.md
@@ -0,0 +1,18 @@
+# Interfaces
+
+::: hololinked.core.interfaces
+ options:
+ members: []
+ show_root_heading: false
+
+These are contracts each replaceable dependency has to satisfy. Subclass from here to implement one's
+own tech stack. If one needs a totally new feature, a base class needs to be defined in this namespace with business logic integrated into the repository, these need separate PRs and dont work out of the box.
+
+| Port | Registry | Adapters |
+| --- | --- | --- |
+| [`BaseSerializer`](serializer.md) | [`Serializers`](../serializers/index.md) | `hololinked.serializers` |
+| [`BaseSchemaValidator`](schema-validator.md) | [`SchemaValidators`](../injection/schema-validators.md) | `hololinked.schema_validators` |
+| [`BaseConfigurationRepository`](configuration-repository.md) | [`StorageBackends`](../injection/storage-backends.md) | `hololinked.storage` |
+| [`MetadataFormat`](metadata.md) | [`MetadataFormats`](../injection/metadata-formats.md) | `hololinked.metadata` |
+
+See [Hexagonal Architecture](../../design/hexagonal-architecture.md) for the reasoning behind the split.
diff --git a/docs/api-reference/interfaces/metadata.md b/docs/api-reference/interfaces/metadata.md
new file mode 100644
index 0000000..2e4b560
--- /dev/null
+++ b/docs/api-reference/interfaces/metadata.md
@@ -0,0 +1,72 @@
+# Metadata
+
+Metadata generators are device APIs or device description languages. One can either create a Thing
+in code and generate metadata (code-first), or create a Thing *from* a metadata (API-first). The interface
+required to do this is defined here.
+
+A specific metadata format is a bundle of five classes: one per core component - Property, Action, Event and a common base class for common metadata among them, and a class that puts them together.
+
+See code of `hololinked.core.metadata.td` for a reference implementation for the W3C Web of Things.
+
+::: hololinked.core.interfaces.metadata.MetadataFormat
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - thing
+ - property
+ - action
+ - event
+ - interaction
+
+::: hololinked.core.interfaces.metadata.Metadata
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - thing
+ - generate
+ - produce
+ - add_interactions
+ - skip_properties
+ - skip_actions
+ - skip_events
+ - skip_names
+ - ignore_errors
+ - json
+
+::: hololinked.core.interfaces.metadata.InteractionMetadata
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - what
+ - name
+ - objekt
+ - owner
+ - owner_cls
+ - thing_cls
+ - thing_id
+ - build
+ - build_non_compliant_metadata
+ - from_descriptor
+ - to_descriptor
+ - from_metadata
+ - override_defaults
+ - register_descriptor
+ - json
+
+::: hololinked.core.interfaces.metadata.PropertyMetadata
+ options:
+ show_root_heading: true
+ heading_level: 2
+
+::: hololinked.core.interfaces.metadata.ActionMetadata
+ options:
+ show_root_heading: true
+ heading_level: 2
+
+::: hololinked.core.interfaces.metadata.EventMetadata
+ options:
+ show_root_heading: true
+ heading_level: 2
diff --git a/docs/api-reference/interfaces/schema-validator.md b/docs/api-reference/interfaces/schema-validator.md
new file mode 100644
index 0000000..4687e74
--- /dev/null
+++ b/docs/api-reference/interfaces/schema-validator.md
@@ -0,0 +1,9 @@
+
+::: hololinked.core.interfaces.schema_validators.BaseSchemaValidator
+ options:
+ members:
+ - __init__
+ - schema
+ - json
+ - validate
+ - validate_method_call
diff --git a/docs/api-reference/interfaces/serializer.md b/docs/api-reference/interfaces/serializer.md
new file mode 100644
index 0000000..7040c25
--- /dev/null
+++ b/docs/api-reference/interfaces/serializer.md
@@ -0,0 +1,10 @@
+
+::: hololinked.core.interfaces.serializer.BaseSerializer
+ options:
+ members:
+ - __init__
+ - type
+ - content_type
+ - dumps
+ - loads
+ - convert_to_bytes
From 5fb1f4b3ecd65d0cec42a11c2665a6663c4680fe Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Mon, 7 Sep 2026 20:32:57 +0200
Subject: [PATCH 08/21] serializers
---
docs/api-reference/serializers/json.md | 26 +++++++++++++++++++++++
docs/api-reference/serializers/msgpack.md | 12 +++++++++++
docs/api-reference/serializers/pickle.md | 9 ++++++++
docs/api-reference/serializers/serpent.md | 9 ++++++++
docs/api-reference/serializers/text.md | 9 ++++++++
5 files changed, 65 insertions(+)
create mode 100644 docs/api-reference/serializers/json.md
create mode 100644 docs/api-reference/serializers/msgpack.md
create mode 100644 docs/api-reference/serializers/pickle.md
create mode 100644 docs/api-reference/serializers/serpent.md
create mode 100644 docs/api-reference/serializers/text.md
diff --git a/docs/api-reference/serializers/json.md b/docs/api-reference/serializers/json.md
new file mode 100644
index 0000000..5d1a69e
--- /dev/null
+++ b/docs/api-reference/serializers/json.md
@@ -0,0 +1,26 @@
+# JSON
+
+::: hololinked.serializers.json.JSONSerializer
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - __init__
+ - type
+ - content_type
+ - dumps
+ - loads
+ - default
+ - register_type_replacement
+
+::: hololinked.serializers.json.PythonBuiltinJSONSerializer
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - __init__
+ - type
+ - dumps
+ - loads
+ - dump
+ - load
diff --git a/docs/api-reference/serializers/msgpack.md b/docs/api-reference/serializers/msgpack.md
new file mode 100644
index 0000000..feb952d
--- /dev/null
+++ b/docs/api-reference/serializers/msgpack.md
@@ -0,0 +1,12 @@
+
+::: hololinked.serializers.msgpack.MsgpackSerializer
+ options:
+ members:
+ - __init__
+ - type
+ - content_type
+ - dumps
+ - loads
+ - default_encode
+ - ext_decode
+ - codes
diff --git a/docs/api-reference/serializers/pickle.md b/docs/api-reference/serializers/pickle.md
new file mode 100644
index 0000000..3a490c8
--- /dev/null
+++ b/docs/api-reference/serializers/pickle.md
@@ -0,0 +1,9 @@
+
+::: hololinked.serializers.pickle.PickleSerializer
+ options:
+ members:
+ - __init__
+ - type
+ - content_type
+ - dumps
+ - loads
diff --git a/docs/api-reference/serializers/serpent.md b/docs/api-reference/serializers/serpent.md
new file mode 100644
index 0000000..b467b6b
--- /dev/null
+++ b/docs/api-reference/serializers/serpent.md
@@ -0,0 +1,9 @@
+
+::: hololinked.serializers.serpent.SerpentSerializer
+ options:
+ members:
+ - __init__
+ - type
+ - dumps
+ - loads
+ - register_type_replacement
diff --git a/docs/api-reference/serializers/text.md b/docs/api-reference/serializers/text.md
new file mode 100644
index 0000000..ffd4aee
--- /dev/null
+++ b/docs/api-reference/serializers/text.md
@@ -0,0 +1,9 @@
+
+::: hololinked.serializers.text.TextSerializer
+ options:
+ members:
+ - __init__
+ - type
+ - content_type
+ - dumps
+ - loads
From 92ad97447d55b5519de4e2bc1082dd1601580088 Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Mon, 7 Sep 2026 21:04:32 +0200
Subject: [PATCH 09/21] update dockerfile
---
.dockerignore | 3 ++-
Dockerfile | 18 ++++++------------
2 files changed, 8 insertions(+), 13 deletions(-)
diff --git a/.dockerignore b/.dockerignore
index 9b85c8a..6f8747a 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -10,4 +10,5 @@
**/.DS_Store
**/logs
**/*.env
-**/hololinked
\ No newline at end of file
+# only a stray root-level checkout; the submodule at repo/hololinked must reach the build
+hololinked
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index cc843d0..b734dec 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM python:3.11-slim AS base
+FROM python:3.13-slim AS base
# workdir
WORKDIR /app
@@ -13,18 +13,12 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
RUN pip install uv==0.7.0
COPY .python-version pyproject.toml uv.lock /app/
+COPY repo/hololinked /app/repo/hololinked
+RUN uv venv
+RUN uv sync --no-install-project --no-default-groups --group repo
-# Create a virtual environment and sync dependencies
-RUN uv venv
-RUN uv sync --no-install-project --no-default-groups
-
-# Copy documentation source files
COPY . .
-# above resets the cache, always clone the latest version of the project
-RUN . .venv/bin/activate && git clone https://github.com/hololinked-dev/hololinked.git && \
- cd hololinked && pip install -e . && cd ..
-
# development image
FROM base AS dev
# ARG MKDOCS_DIRTY_RELOAD=false
@@ -34,9 +28,9 @@ CMD ["/bin/sh", "-c", ". .venv/bin/activate && mkdocs serve -a 0.0.0.0:8000"]
# production image
FROM base AS build
-RUN . .venv/bin/activate && mkdocs build
+RUN . .venv/bin/activate && mkdocs build
FROM nginx:alpine AS prod
COPY --from=build /app/site /usr/share/nginx/html
EXPOSE 80
-CMD ["nginx", "-g", "daemon off;"]
\ No newline at end of file
+CMD ["nginx", "-g", "daemon off;"]
From 1e9d34aca0dd30b27b1b350223d6d0dc81234cdd Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Mon, 7 Sep 2026 21:23:50 +0200
Subject: [PATCH 10/21] update mkdocs.yml
---
docs/api-reference/interfaces/metadata.md | 13 ++++-
mkdocs.yml | 68 +++++++++++++++--------
2 files changed, 58 insertions(+), 23 deletions(-)
diff --git a/docs/api-reference/interfaces/metadata.md b/docs/api-reference/interfaces/metadata.md
index 2e4b560..699b175 100644
--- a/docs/api-reference/interfaces/metadata.md
+++ b/docs/api-reference/interfaces/metadata.md
@@ -6,7 +6,18 @@ required to do this is defined here.
A specific metadata format is a bundle of five classes: one per core component - Property, Action, Event and a common base class for common metadata among them, and a class that puts them together.
-See code of `hololinked.core.metadata.td` for a reference implementation for the W3C Web of Things.
+The W3C Web of Things bundle in `hololinked.metadata.td` is the reference implementation, and maps
+onto the five slots as:
+
+| slot | W3C WoT class |
+| --- | --- |
+| `thing` | [`ThingModel`](../td/tm.md) |
+| `property` | [`PropertyAffordance`](../td/interaction_affordance/property_affordance.md) |
+| `action` | [`ActionAffordance`](../td/interaction_affordance/action_affordance.md) |
+| `event` | [`EventAffordance`](../td/interaction_affordance/event_affordance.md) |
+| `interaction` | [`InteractionAffordance`](../td/interaction_affordance/interaction_affordance.md) |
+
+Have a look at their code by using the links above.
::: hololinked.core.interfaces.metadata.MetadataFormat
options:
diff --git a/mkdocs.yml b/mkdocs.yml
index 4d65f0b..a18a9d8 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -55,27 +55,21 @@ nav:
- StateMachine:
- StateMachine: api-reference/state-machine/state-machine.md
- BoundFSM: api-reference/state-machine/bound-fsm.md
- - RPC Server:
- - RPCServer: api-reference/rpc-server/rpc-server.md
- - Messaging Contracts:
- - RequestMessage: api-reference/rpc-server/messaging-contract/request-message.md
- - ResponseMessage: api-reference/rpc-server/messaging-contract/response-message.md
- - EventMessage: api-reference/rpc-server/messaging-contract/event-message.md
- - Headers: api-reference/rpc-server/messaging-contract/headers.md
- - Contexts: api-reference/rpc-server/messaging-contract/contexts.md
- - Brokers:
- - BaseZMQ: api-reference/rpc-server/brokers/base-zmq.md
- - AsyncZMQServer: api-reference/rpc-server/brokers/async-zmq-server.md
- - SyncZMQClient: api-reference/rpc-server/brokers/sync-zmq-client.md
- - AsyncZMQClient: api-reference/rpc-server/brokers/async-zmq-client.md
- - MessageMappedClientPool: api-reference/rpc-server/brokers/message-mapped-zmq-client-pool.md
- - EventPublisher: api-reference/rpc-server/brokers/event-publisher.md
- - EventConsumer: api-reference/rpc-server/brokers/event-consumer.md
- # - Schedulers:
- # - Scheduler: api-reference/rpc-server/schedulers/scheduler.md
- # - QueuedScheduler: api-reference/rpc-server/schedulers/queued-scheduler.md
- # - ThreadedScheduler: api-reference/rpc-server/schedulers/threaded-scheduler.md
- # - AsyncScheduler: api-reference/rpc-server/schedulers/async-scheduler.md
+ - Event Loop:
+ - EventLoop: api-reference/eventloop/eventloop.md
+ - Operation Model:
+ - Operation: api-reference/eventloop/operation.md
+ - Job: api-reference/eventloop/job.md
+ - Reply: api-reference/eventloop/reply.md
+ - PendingOperations: api-reference/eventloop/pending-operations.md
+ - Payloads: api-reference/eventloop/payloads.md
+ - Publish-Subscribe: api-reference/eventloop/pubsub.md
+ - Execution Contexts: api-reference/eventloop/contexts.md
+ - Schedulers:
+ - Scheduler: api-reference/eventloop/schedulers/scheduler.md
+ - QueuedScheduler: api-reference/eventloop/schedulers/queued-scheduler.md
+ - ThreadedScheduler: api-reference/eventloop/schedulers/threaded-scheduler.md
+ - AsyncScheduler: api-reference/eventloop/schedulers/async-scheduler.md
- Clients:
- ClientFactory: api-reference/clients/base.md
- ObjectProxy: api-reference/clients/object-proxy.md
@@ -91,14 +85,44 @@ nav:
- OIDC Direct Access Grant: api-reference/clients/security/oidc.md
- Servers:
- HTTP: api-reference/protocols/http/index.md
- - ZMQ: api-reference/protocols/zmq/index.md
+ - ZMQ:
+ - ZMQServer: api-reference/protocols/zmq/index.md
+ - Messaging Contracts:
+ - RequestMessage: api-reference/protocols/zmq/messaging-contract/request-message.md
+ - ResponseMessage: api-reference/protocols/zmq/messaging-contract/response-message.md
+ - EventMessage: api-reference/protocols/zmq/messaging-contract/event-message.md
+ - Headers: api-reference/protocols/zmq/messaging-contract/headers.md
+ - Brokers:
+ - BaseZMQ: api-reference/protocols/zmq/brokers/base-zmq.md
+ - AsyncZMQServer: api-reference/protocols/zmq/brokers/async-zmq-server.md
+ - SyncZMQClient: api-reference/protocols/zmq/brokers/sync-zmq-client.md
+ - AsyncZMQClient: api-reference/protocols/zmq/brokers/async-zmq-client.md
+ - MessageMappedClientPool: api-reference/protocols/zmq/brokers/message-mapped-zmq-client-pool.md
+ - EventPublisher: api-reference/protocols/zmq/brokers/event-publisher.md
+ - EventConsumer: api-reference/protocols/zmq/brokers/event-consumer.md
- MQTT: api-reference/protocols/mqtt/index.md
- Security:
- Bcrypt: api-reference/protocols/security/bcrypt.md
- Argon2: api-reference/protocols/security/argon2.md
- Configuration: api-reference/global-config.md
+ - Interfaces:
+ - Ports: api-reference/interfaces/index.md
+ - BaseSerializer: api-reference/interfaces/serializer.md
+ - BaseSchemaValidator: api-reference/interfaces/schema-validator.md
+ - BaseConfigurationRepository: api-reference/interfaces/configuration-repository.md
+ - Metadata: api-reference/interfaces/metadata.md
+ - Dependency Injection:
+ - Adapter Registries: api-reference/injection/index.md
+ - SchemaValidators: api-reference/injection/schema-validators.md
+ - StorageBackends: api-reference/injection/storage-backends.md
+ - MetadataFormats: api-reference/injection/metadata-formats.md
- Serializers:
- Serializers: api-reference/serializers/index.md
+ - JSON: api-reference/serializers/json.md
+ - MessagePack: api-reference/serializers/msgpack.md
+ - Pickle: api-reference/serializers/pickle.md
+ - Serpent: api-reference/serializers/serpent.md
+ - Text: api-reference/serializers/text.md
# - Thing Descriptions:
# - Interaction Affordances:
# - InteractionAffordance: api-reference/td/interaction_affordance/interaction_affordance.md
From 042c4d31b4efbeaefa077251b4ed126a4c19fe0e Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Mon, 7 Sep 2026 21:39:48 +0200
Subject: [PATCH 11/21] schema validators
---
.../schema-validators/fast-json-schema.md | 28 +++++++++++++++++++
.../schema-validators/json-schema.md | 12 ++++++++
.../schema-validators/pydantic.md | 11 ++++++++
mkdocs.yml | 4 +++
4 files changed, 55 insertions(+)
create mode 100644 docs/api-reference/schema-validators/fast-json-schema.md
create mode 100644 docs/api-reference/schema-validators/json-schema.md
create mode 100644 docs/api-reference/schema-validators/pydantic.md
diff --git a/docs/api-reference/schema-validators/fast-json-schema.md b/docs/api-reference/schema-validators/fast-json-schema.md
new file mode 100644
index 0000000..2b945d4
--- /dev/null
+++ b/docs/api-reference/schema-validators/fast-json-schema.md
@@ -0,0 +1,28 @@
+# FastJSONSchemaValidator
+
+Unlike [`JSONSchemaValidator`](json-schema.md) and [`PydanticSchemaValidator`](pydantic.md), this one
+is **not** registered under a name in
+[`SchemaValidators`](../injection/schema-validators.md), as a default JSON schema validator is available. To use `FastJSONSchemaValidator`:
+
+```python
+from hololinked import SchemaValidators
+from hololinked.schema_validators import FastJSONSchemaValidator
+
+SchemaValidators.register(FastJSONSchemaValidator, "json_schema", predicate=lambda schema: isinstance(schema, dict))
+```
+
+It needs the `validators` extra dependencies (`pip install hololinked[validators]`).
+
+::: hololinked.schema_validators.fast_json_schema.FastJSONSchemaValidator
+ options:
+ show_root_heading: true
+ heading_level: 2
+ inherited_members: true
+ members:
+ - __init__
+ - schema
+ - json
+ - validator
+ - validate
+ - validate_method_call
+ - check_schema
diff --git a/docs/api-reference/schema-validators/json-schema.md b/docs/api-reference/schema-validators/json-schema.md
new file mode 100644
index 0000000..fe9a8b7
--- /dev/null
+++ b/docs/api-reference/schema-validators/json-schema.md
@@ -0,0 +1,12 @@
+
+::: hololinked.schema_validators.json_schema.JSONSchemaValidator
+ options:
+ inherited_members: true
+ members:
+ - __init__
+ - schema
+ - json
+ - validator
+ - validate
+ - validate_method_call
+ - check_schema
diff --git a/docs/api-reference/schema-validators/pydantic.md b/docs/api-reference/schema-validators/pydantic.md
new file mode 100644
index 0000000..1cd0f28
--- /dev/null
+++ b/docs/api-reference/schema-validators/pydantic.md
@@ -0,0 +1,11 @@
+
+::: hololinked.schema_validators.pydantic_model.PydanticSchemaValidator
+ options:
+ inherited_members: true
+ members:
+ - __init__
+ - schema
+ - json
+ - validator
+ - validate
+ - validate_method_call
diff --git a/mkdocs.yml b/mkdocs.yml
index a18a9d8..b1271e0 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -116,6 +116,10 @@ nav:
- SchemaValidators: api-reference/injection/schema-validators.md
- StorageBackends: api-reference/injection/storage-backends.md
- MetadataFormats: api-reference/injection/metadata-formats.md
+ - Schema Validators:
+ - JSONSchemaValidator: api-reference/schema-validators/json-schema.md
+ - FastJSONSchemaValidator: api-reference/schema-validators/fast-json-schema.md
+ - PydanticSchemaValidator: api-reference/schema-validators/pydantic.md
- Serializers:
- Serializers: api-reference/serializers/index.md
- JSON: api-reference/serializers/json.md
From 392774ab9948e0a18f0931fe64e36b9bf32908a1 Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Mon, 7 Sep 2026 22:03:07 +0200
Subject: [PATCH 12/21] update skaffold
---
docs/index.md | 14 +++++++++++---
skaffold.yaml | 4 ++--
2 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/docs/index.md b/docs/index.md
index 27d0cb4..7306f3d 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -11,7 +11,6 @@ As a novice, you have a requirement to control and capture data from your hardwa
If you are a web developer or an industry professional looking for a web standards compatible, interoperable (high-speed) IoT runtime, `hololinked` can be a decent choice. By conforming to [W3C Web of Things](https://www.w3.org/WoT/), one can expect a consistent API and flexible bidirectional message flow to interact with your devices, irrespective of the underlying protocol. Currently HTTP, MQTT & ZMQ are supported.
-This implementation is based on RPC, built ground-up in python keeping both the latest web technologies and python principles in mind.
+
---
## High Level Overview
@@ -89,6 +90,15 @@ Additionally, **state machines** can constrain property and action execution:
- _Oscilloscope_ - Cannot start a new measurement while one is ongoing
- _Camera_ - Cannot change exposure time while capturing video
+#### Benefits you get when you use hololinked:
+
+- technology independent and technology extensible architecture -> handles technology changes.
+- its not a solution that uses "different set of technologies to solve the same problem". It solves a problem irrespective of the underlying technologies. AI included. You chose the tech stack or extend it with your stack (PRs welcome for new tech adapters and new features).
+- simple to understand and simplifies contradicting viewpoints
+- scalable, performant, interoperable and can be used in different domains (IoT, microservices, networked control systems, web, RPCs etc.)
+- metadata rich - use AI agents, API tools, whatever.
+- security built in
+
---
!!! tip "Ready to get started?"
@@ -104,5 +114,3 @@ Additionally, **state machines** can constrain property and action execution:
- Every Friday 9-10AM CET/CEST, 4-5PM CET/CEST
Please email to info@hololinked.dev. You can also ask questions in the [discord group](https://discord.com/invite/kEz87zqQXh) (currently no participants).
-
-
diff --git a/skaffold.yaml b/skaffold.yaml
index dbf4a46..c026fc4 100644
--- a/skaffold.yaml
+++ b/skaffold.yaml
@@ -128,5 +128,5 @@ deploy:
image.ports.containerPort: 80
setValueTemplates:
image:
- repository: docker.io/vigneshvsv/hololinked_docs
- tag: prod
+ repository: "{{ .IMAGE_REPO_hololinked_docs }}"
+ tag: "{{ .IMAGE_TAG_hololinked_docs }}@{{ .IMAGE_DIGEST_hololinked_docs }}"
From 2fe52893dea21b336a3df56ad71a6eac46182d77 Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Fri, 11 Sep 2026 18:31:25 +0200
Subject: [PATCH 13/21] storage
---
docs/api-reference/storage/bases.md | 12 +++++++
docs/api-reference/storage/config.md | 43 ++++++++++++++++++++++++
docs/api-reference/storage/index.md | 14 ++++++++
docs/api-reference/storage/json-file.md | 18 ++++++++++
docs/api-reference/storage/models.md | 38 +++++++++++++++++++++
docs/api-reference/storage/mongodb.md | 24 +++++++++++++
docs/api-reference/storage/sqlalchemy.md | 43 ++++++++++++++++++++++++
docs/index.md | 2 +-
mkdocs.yml | 8 +++++
9 files changed, 201 insertions(+), 1 deletion(-)
create mode 100644 docs/api-reference/storage/bases.md
create mode 100644 docs/api-reference/storage/config.md
create mode 100644 docs/api-reference/storage/index.md
create mode 100644 docs/api-reference/storage/json-file.md
create mode 100644 docs/api-reference/storage/models.md
create mode 100644 docs/api-reference/storage/mongodb.md
create mode 100644 docs/api-reference/storage/sqlalchemy.md
diff --git a/docs/api-reference/storage/bases.md b/docs/api-reference/storage/bases.md
new file mode 100644
index 0000000..3ef047d
--- /dev/null
+++ b/docs/api-reference/storage/bases.md
@@ -0,0 +1,12 @@
+# BaseDB
+
+::: hololinked.storage.bases.BaseDB
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - __init__
+ - from_thing
+ - config
+ - load_conf
+ - in_batch_call_context
\ No newline at end of file
diff --git a/docs/api-reference/storage/config.md b/docs/api-reference/storage/config.md
new file mode 100644
index 0000000..86ecaa2
--- /dev/null
+++ b/docs/api-reference/storage/config.md
@@ -0,0 +1,43 @@
+# Storage configuration
+
+::: hololinked.storage.config.SQLDBConfig
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - provider
+ - host
+ - port
+ - database
+ - user
+ - password
+ - dialect
+ - uri
+ - URL
+
+::: hololinked.storage.config.SQLiteConfig
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - provider
+ - dialect
+ - file
+ - in_memory
+ - uri
+ - URL
+
+::: hololinked.storage.config.MongoDBConfig
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - provider
+ - host
+ - port
+ - database
+ - user
+ - password
+ - authSource
+ - uri
+ - URL
diff --git a/docs/api-reference/storage/index.md b/docs/api-reference/storage/index.md
new file mode 100644
index 0000000..ce399e6
--- /dev/null
+++ b/docs/api-reference/storage/index.md
@@ -0,0 +1,14 @@
+# Storage
+
+::: hololinked.storage
+ options:
+ show_root_heading: false
+ members: false
+
+A storage backend implements the [`BaseConfigurationRepository`](../interfaces/configuration-repository.md).
+
+| backend | registered name | `Thing` flag | extra | needs a server |
+| --- | --- | --- | --- | --- |
+| [`JSONFileStorage`](json-file.md) | `json_file` | `use_json_file` | — | no |
+| [`SQLAlchemyDB`](sqlalchemy.md) | `sqlalchemy` | `use_default_db` | `sqlalchemy`, `postgresql` | SQLite no, others yes |
+| [`MongoDB`](mongodb.md) | `mongo` | `use_mongo_db` | `mongo` | yes |
diff --git a/docs/api-reference/storage/json-file.md b/docs/api-reference/storage/json-file.md
new file mode 100644
index 0000000..c689265
--- /dev/null
+++ b/docs/api-reference/storage/json-file.md
@@ -0,0 +1,18 @@
+# JSONFileStorage
+
+::: hololinked.storage.JSONFileStorage
+ options:
+ show_root_heading: true
+ heading_level: 2
+ inherited_members: true
+ members:
+ - __init__
+ - from_thing
+ - thing
+ - filename
+ - get_property
+ - get_properties
+ - get_all_properties
+ - set_property
+ - set_properties
+ - create_missing_properties
\ No newline at end of file
diff --git a/docs/api-reference/storage/models.md b/docs/api-reference/storage/models.md
new file mode 100644
index 0000000..b9cda68
--- /dev/null
+++ b/docs/api-reference/storage/models.md
@@ -0,0 +1,38 @@
+# Storage models
+
+The SQLAlchemy table definitions used by [`SQLAlchemyDB`](sqlalchemy.md).
+
+::: hololinked.storage.models.SerializedProperty
+ options:
+ show_root_heading: true
+ heading_level: 2
+
+::: hololinked.storage.models.ThingInformation
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - id
+ - thing_id
+ - thing_class
+ - script
+ - init_kwargs
+ - server_id
+ - json
+
+::: hololinked.storage.models.DeserializedProperty
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - thing_id
+ - name
+ - value
+ - created_at
+ - updated_at
+
+
+::: hololinked.storage.models.ThingTableBase
+ options:
+ show_root_heading: true
+ heading_level: 2
\ No newline at end of file
diff --git a/docs/api-reference/storage/mongodb.md b/docs/api-reference/storage/mongodb.md
new file mode 100644
index 0000000..c275487
--- /dev/null
+++ b/docs/api-reference/storage/mongodb.md
@@ -0,0 +1,24 @@
+# MongoDB
+
+::: hololinked.storage.MongoDB
+ options:
+ show_root_heading: true
+ heading_level: 2
+ inherited_members: true
+ members:
+ - __init__
+ - from_thing
+ - thing
+ - config
+ - client
+ - db
+ - properties
+ - things
+ - fetch_own_info
+ - get_property
+ - get_properties
+ - get_all_properties
+ - set_property
+ - set_properties
+ - create_missing_properties
+ - in_batch_call_context
diff --git a/docs/api-reference/storage/sqlalchemy.md b/docs/api-reference/storage/sqlalchemy.md
new file mode 100644
index 0000000..48014f1
--- /dev/null
+++ b/docs/api-reference/storage/sqlalchemy.md
@@ -0,0 +1,43 @@
+# SQLAlchemyDB
+
+::: hololinked.storage.SQLAlchemyDB
+ options:
+ show_root_heading: true
+ heading_level: 2
+ inherited_members: true
+ members:
+ - __init__
+ - from_thing
+ - thing
+ - config
+ - engine
+ - sync_session
+ - fetch_own_info
+ - get_property
+ - get_properties
+ - get_all_properties
+ - set_property
+ - set_properties
+ - create_missing_properties
+ - create_init_properties
+ - in_batch_call_context
+
+## batch_db_commit
+
+::: hololinked.storage.sqlalchemydb.batch_db_commit
+ options:
+ show_root_heading: false
+ heading_level: 3
+ members:
+ - __init__
+
+## BaseSyncDB
+
+::: hololinked.storage.sqlalchemydb.BaseSyncDB
+ options:
+ show_root_heading: false
+ heading_level: 3
+ members:
+ - __init__
+ - engine
+ - sync_session
diff --git a/docs/index.md b/docs/index.md
index 7306f3d..30494b3 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -51,7 +51,7 @@ If you are a web developer or an industry professional looking for a web standar
-
+
---
diff --git a/mkdocs.yml b/mkdocs.yml
index b1271e0..d096a01 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -127,6 +127,14 @@ nav:
- Pickle: api-reference/serializers/pickle.md
- Serpent: api-reference/serializers/serpent.md
- Text: api-reference/serializers/text.md
+ - Storage:
+ - Storage Backends: api-reference/storage/index.md
+ - JSONFileStorage: api-reference/storage/json-file.md
+ - SQLAlchemyDB: api-reference/storage/sqlalchemy.md
+ - MongoDB: api-reference/storage/mongodb.md
+ - BaseDB: api-reference/storage/bases.md
+ - Configuration: api-reference/storage/config.md
+ - Models: api-reference/storage/models.md
# - Thing Descriptions:
# - Interaction Affordances:
# - InteractionAffordance: api-reference/td/interaction_affordance/interaction_affordance.md
From 6d907907292c7274d19b4930087e09feb8dbfde9 Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Sat, 12 Sep 2026 10:45:02 +0200
Subject: [PATCH 14/21] add servers
---
docs/api-reference/injection/index.md | 3 ++-
.../injection/protocol-servers.md | 16 +++++++++++
docs/api-reference/interfaces/index.md | 1 +
.../interfaces/protocol-server.md | 27 +++++++++++++++++++
docs/api-reference/server/index.md | 27 +++++++++++++++++++
mkdocs.yml | 3 +++
6 files changed, 76 insertions(+), 1 deletion(-)
create mode 100644 docs/api-reference/injection/protocol-servers.md
create mode 100644 docs/api-reference/interfaces/protocol-server.md
create mode 100644 docs/api-reference/server/index.md
diff --git a/docs/api-reference/injection/index.md b/docs/api-reference/injection/index.md
index 855070b..5eaaa51 100644
--- a/docs/api-reference/injection/index.md
+++ b/docs/api-reference/injection/index.md
@@ -13,9 +13,10 @@ Each registry below resolves an implementation **by name, on first use**.
| [`SchemaValidators`](schema-validators.md) | schema validators | `hololinked.schema_validators` |
| [`StorageBackends`](storage-backends.md) | storage backends | `hololinked.storage` |
| [`MetadataFormats`](metadata-formats.md) | device description languages | `hololinked.metadata` |
+| [`ProtocolServers`](protocol-servers.md) | protocol servers | `hololinked.server` |
The implementation is either already available in the package or can be supplied by the end user.
-All four classes above are singletons, so anything set on them applies process-wide.
+All classes above are singletons, so anything set on them applies process-wide.
::: hololinked.injection.AdapterRegistry
options:
diff --git a/docs/api-reference/injection/protocol-servers.md b/docs/api-reference/injection/protocol-servers.md
new file mode 100644
index 0000000..4ee0b13
--- /dev/null
+++ b/docs/api-reference/injection/protocol-servers.md
@@ -0,0 +1,16 @@
+# ProtocolServers
+
+::: hololinked.injection.ProtocolServers
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - http
+ - mqtt
+ - zmq
+ - modules
+ - protocols
+ - for_protocol
+ - register
+ - reset
+
diff --git a/docs/api-reference/interfaces/index.md b/docs/api-reference/interfaces/index.md
index f3c7653..1c138db 100644
--- a/docs/api-reference/interfaces/index.md
+++ b/docs/api-reference/interfaces/index.md
@@ -14,5 +14,6 @@ own tech stack. If one needs a totally new feature, a base class needs to be def
| [`BaseSchemaValidator`](schema-validator.md) | [`SchemaValidators`](../injection/schema-validators.md) | `hololinked.schema_validators` |
| [`BaseConfigurationRepository`](configuration-repository.md) | [`StorageBackends`](../injection/storage-backends.md) | `hololinked.storage` |
| [`MetadataFormat`](metadata.md) | [`MetadataFormats`](../injection/metadata-formats.md) | `hololinked.metadata` |
+| [`BaseProtocolServer`](protocol-server.md) | [`ProtocolServers`](../injection/protocol-servers.md) | `hololinked.server` |
See [Hexagonal Architecture](../../design/hexagonal-architecture.md) for the reasoning behind the split.
diff --git a/docs/api-reference/interfaces/protocol-server.md b/docs/api-reference/interfaces/protocol-server.md
new file mode 100644
index 0000000..ad06656
--- /dev/null
+++ b/docs/api-reference/interfaces/protocol-server.md
@@ -0,0 +1,27 @@
+# BaseProtocolServer
+
+::: hololinked.core.interfaces.protocol_server.BaseProtocolServer
+ options:
+ show_root_heading: true
+ heading_level: 2
+ inherited_members: true
+ members:
+ - __init__
+ - from_params
+ - id
+ - port
+ - logger
+ - config
+ - things
+ - add_thing
+ - add_things
+ - add_property
+ - add_action
+ - add_event
+ - setup
+ - start
+ - run
+ - stop
+ - welcome_lines
+
+The contract every protocol server must satisfy.
diff --git a/docs/api-reference/server/index.md b/docs/api-reference/server/index.md
new file mode 100644
index 0000000..2e1a301
--- /dev/null
+++ b/docs/api-reference/server/index.md
@@ -0,0 +1,27 @@
+# Server
+
+::: hololinked.server
+ options:
+ show_root_heading: false
+ members: false
+
+## Entry points
+
+`run()` and `stop()` knows no protocol in particular — they take already-constructed servers and
+drive their lifecycle. Use them when you build servers yourself; `Thing.run(access_points=...)` is
+the shorthand that calls `run()`.
+
+::: hololinked.server.run
+ options:
+ show_root_heading: true
+ heading_level: 3
+
+::: hololinked.server.stop
+ options:
+ show_root_heading: true
+ heading_level: 3
+
+::: hololinked.server.parse_params
+ options:
+ show_root_heading: true
+ heading_level: 3
diff --git a/mkdocs.yml b/mkdocs.yml
index d096a01..4838bc2 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -104,6 +104,7 @@ nav:
- Security:
- Bcrypt: api-reference/protocols/security/bcrypt.md
- Argon2: api-reference/protocols/security/argon2.md
+ - Server: api-reference/server/index.md
- Configuration: api-reference/global-config.md
- Interfaces:
- Ports: api-reference/interfaces/index.md
@@ -111,11 +112,13 @@ nav:
- BaseSchemaValidator: api-reference/interfaces/schema-validator.md
- BaseConfigurationRepository: api-reference/interfaces/configuration-repository.md
- Metadata: api-reference/interfaces/metadata.md
+ - BaseProtocolServer: api-reference/interfaces/protocol-server.md
- Dependency Injection:
- Adapter Registries: api-reference/injection/index.md
- SchemaValidators: api-reference/injection/schema-validators.md
- StorageBackends: api-reference/injection/storage-backends.md
- MetadataFormats: api-reference/injection/metadata-formats.md
+ - ProtocolServers: api-reference/injection/protocol-servers.md
- Schema Validators:
- JSONSchemaValidator: api-reference/schema-validators/json-schema.md
- FastJSONSchemaValidator: api-reference/schema-validators/fast-json-schema.md
From f2f23490edd2d14abc89ac490bebd23741ffa194 Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Sat, 12 Sep 2026 10:45:10 +0200
Subject: [PATCH 15/21] update main branch
---
repo/hololinked | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/repo/hololinked b/repo/hololinked
index 9e85c37..ef1c254 160000
--- a/repo/hololinked
+++ b/repo/hololinked
@@ -1 +1 @@
-Subproject commit 9e85c37d0886c956038c45f77afc00a0ff642865
+Subproject commit ef1c254594b47eab1f9dc5be5a26038d195cbcdd
From 733a913c0a845066b1f38f550fa0604bf9bef90e Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Sat, 12 Sep 2026 11:21:08 +0200
Subject: [PATCH 16/21] HTTP
---
docs/api-reference/protocols/http/config.md | 34 +++++++++++++
.../protocols/http/handlers/base.md | 21 ++++++++
.../protocols/http/handlers/event.md | 31 +++++++++++
.../protocols/http/handlers/index.md | 8 +++
.../protocols/http/handlers/probes.md | 42 +++++++++++++++
.../protocols/http/handlers/rpc.md | 51 +++++++++++++++++++
docs/api-reference/protocols/http/services.md | 20 ++++++++
mkdocs.yml | 11 +++-
8 files changed, 217 insertions(+), 1 deletion(-)
create mode 100644 docs/api-reference/protocols/http/config.md
create mode 100644 docs/api-reference/protocols/http/handlers/base.md
create mode 100644 docs/api-reference/protocols/http/handlers/event.md
create mode 100644 docs/api-reference/protocols/http/handlers/index.md
create mode 100644 docs/api-reference/protocols/http/handlers/probes.md
create mode 100644 docs/api-reference/protocols/http/handlers/rpc.md
create mode 100644 docs/api-reference/protocols/http/services.md
diff --git a/docs/api-reference/protocols/http/config.md b/docs/api-reference/protocols/http/config.md
new file mode 100644
index 0000000..89e64ef
--- /dev/null
+++ b/docs/api-reference/protocols/http/config.md
@@ -0,0 +1,34 @@
+# HTTP runtime configuration
+
+::: hololinked.server.http.config.RuntimeConfig
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - cors
+ - allowed_clients
+ - security_schemes
+ - server_id
+ - property_handler
+ - action_handler
+ - event_handler
+ - RW_multiple_properties_handler
+ - thing_description_handler
+ - liveness_probe_handler
+ - readiness_probe_handler
+ - stop_handler
+ - thing_description_service
+
+Pass these as a plain dictionary to the `config` argument of
+[`HTTPServer`](index.md) — not as a `RuntimeConfig` instance:
+
+```python
+HTTPServer(config=dict(cors=True, property_handler=MyPropertyHandler))
+```
+
+::: hololinked.server.http.config.HandlerMetadata
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - http_methods
diff --git a/docs/api-reference/protocols/http/handlers/base.md b/docs/api-reference/protocols/http/handlers/base.md
new file mode 100644
index 0000000..70bcbf9
--- /dev/null
+++ b/docs/api-reference/protocols/http/handlers/base.md
@@ -0,0 +1,21 @@
+# BaseHandler
+
+::: hololinked.server.http.handlers.BaseHandler
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - initialize
+ - has_access_control
+ - is_authenticated
+ - is_authorized
+ - is_method_allowed
+ - set_access_control_allow_headers
+ - set_custom_default_headers
+ - get_execution_parameters
+ - get_request_payload
+ - message_id
+ - get
+ - post
+ - put
+ - delete
\ No newline at end of file
diff --git a/docs/api-reference/protocols/http/handlers/event.md b/docs/api-reference/protocols/http/handlers/event.md
new file mode 100644
index 0000000..4521585
--- /dev/null
+++ b/docs/api-reference/protocols/http/handlers/event.md
@@ -0,0 +1,31 @@
+# EventHandler
+
+::: hololinked.server.http.handlers.EventHandler
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - initialize
+ - resource
+ - set_custom_default_headers
+ - get
+ - options
+ - handle_datastream
+
+## JPEGImageEventHandler
+
+::: hololinked.server.http.handlers.JPEGImageEventHandler
+ options:
+ show_root_heading: false
+ heading_level: 3
+ members:
+ - initialize
+
+## PNGImageEventHandler
+
+::: hololinked.server.http.handlers.PNGImageEventHandler
+ options:
+ show_root_heading: false
+ heading_level: 3
+ members:
+ - initialize
diff --git a/docs/api-reference/protocols/http/handlers/index.md b/docs/api-reference/protocols/http/handlers/index.md
new file mode 100644
index 0000000..b0348a7
--- /dev/null
+++ b/docs/api-reference/protocols/http/handlers/index.md
@@ -0,0 +1,8 @@
+# Request handlers
+
+Every HTTP route is served by a Tornado `RequestHandler` subclass.
+
+- [BaseHandler](base.md) — authentication and CORS are decided
+- [RPCHandler](rpc.md) — `PropertyHandler` / `ActionHandler` / `RWMultiplePropertiesHandler`
+- [EventHandler](event.md) — streams events
+- [Probes and control](probes.md) — `ThingDescriptionHandler`, `LivenessProbeHandler`, `ReadinessProbeHandler`, `StopHandler`
\ No newline at end of file
diff --git a/docs/api-reference/protocols/http/handlers/probes.md b/docs/api-reference/protocols/http/handlers/probes.md
new file mode 100644
index 0000000..19fc8e1
--- /dev/null
+++ b/docs/api-reference/protocols/http/handlers/probes.md
@@ -0,0 +1,42 @@
+# Probes and control
+
+Single-purpose handlers that do not carry an interaction.
+
+::: hololinked.server.http.handlers.ThingDescriptionHandler
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - initialize
+ - get
+
+Serves the Thing Description document, generated by `ThingDescriptionService`.
+
+::: hololinked.server.http.handlers.LivenessProbeHandler
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - initialize
+ - get
+
+::: hololinked.server.http.handlers.ReadinessProbeHandler
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - initialize
+ - get
+
+Liveness answers whether the server process is up; readiness answers whether it is ready to serve
+the `Thing`.
+
+::: hololinked.server.http.handlers.StopHandler
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - initialize
+ - post
+
+Shuts the server down over HTTP. `POST` only.
diff --git a/docs/api-reference/protocols/http/handlers/rpc.md b/docs/api-reference/protocols/http/handlers/rpc.md
new file mode 100644
index 0000000..831e572
--- /dev/null
+++ b/docs/api-reference/protocols/http/handlers/rpc.md
@@ -0,0 +1,51 @@
+# RPCHandler
+
+::: hololinked.server.http.handlers.RPCHandler
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - is_method_allowed
+ - options
+ - handle_through_thing
+ - write_reply
+ - handle_no_block_response
+
+## PropertyHandler
+
+::: hololinked.server.http.handlers.PropertyHandler
+ options:
+ show_root_heading: false
+ heading_level: 3
+ members:
+ - get
+ - post
+ - put
+ - delete
+
+
+## ActionHandler
+
+::: hololinked.server.http.handlers.ActionHandler
+ options:
+ show_root_heading: false
+ heading_level: 3
+ members:
+ - get
+ - post
+ - put
+ - delete
+
+
+## RWMultiplePropertiesHandler
+
+::: hololinked.server.http.handlers.RWMultiplePropertiesHandler
+ options:
+ show_root_heading: false
+ heading_level: 3
+ members:
+ - initialize
+ - get
+ - post
+ - put
+ - patch
\ No newline at end of file
diff --git a/docs/api-reference/protocols/http/services.md b/docs/api-reference/protocols/http/services.md
new file mode 100644
index 0000000..2efc69e
--- /dev/null
+++ b/docs/api-reference/protocols/http/services.md
@@ -0,0 +1,20 @@
+# ThingDescriptionService
+
+::: hololinked.server.http.services.ThingDescriptionService
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - __init__
+ - thing
+ - server
+ - config
+ - logger
+ - resource
+ - generate
+ - add_properties
+ - add_actions
+ - add_events
+ - add_top_level_forms
+ - add_security_definitions
+ - add_links
\ No newline at end of file
diff --git a/mkdocs.yml b/mkdocs.yml
index 4838bc2..ca5547b 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -84,7 +84,16 @@ nav:
- API Key: api-reference/clients/security/apikey.md
- OIDC Direct Access Grant: api-reference/clients/security/oidc.md
- Servers:
- - HTTP: api-reference/protocols/http/index.md
+ - HTTP:
+ - HTTPServer: api-reference/protocols/http/index.md
+ - Runtime Configuration: api-reference/protocols/http/config.md
+ - Thing Description Service: api-reference/protocols/http/services.md
+ - Request Handlers:
+ - Overview: api-reference/protocols/http/handlers/index.md
+ - BaseHandler: api-reference/protocols/http/handlers/base.md
+ - RPCHandler: api-reference/protocols/http/handlers/rpc.md
+ - EventHandler: api-reference/protocols/http/handlers/event.md
+ - Probes and Control: api-reference/protocols/http/handlers/probes.md
- ZMQ:
- ZMQServer: api-reference/protocols/zmq/index.md
- Messaging Contracts:
From 4b0638754736eca0e13a52c5e5a28bf93098bc65 Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Sat, 12 Sep 2026 11:37:10 +0200
Subject: [PATCH 17/21] MQTT
---
docs/api-reference/protocols/mqtt/config.md | 18 +++++++++++
docs/api-reference/protocols/mqtt/handlers.md | 31 +++++++++++++++++++
docs/api-reference/protocols/mqtt/index.md | 27 ++++++++++++++--
docs/api-reference/protocols/mqtt/services.md | 16 ++++++++++
mkdocs.yml | 6 +++-
5 files changed, 94 insertions(+), 4 deletions(-)
create mode 100644 docs/api-reference/protocols/mqtt/config.md
create mode 100644 docs/api-reference/protocols/mqtt/handlers.md
create mode 100644 docs/api-reference/protocols/mqtt/services.md
diff --git a/docs/api-reference/protocols/mqtt/config.md b/docs/api-reference/protocols/mqtt/config.md
new file mode 100644
index 0000000..795175f
--- /dev/null
+++ b/docs/api-reference/protocols/mqtt/config.md
@@ -0,0 +1,18 @@
+# MQTT runtime configuration
+
+::: hololinked.server.mqtt.config.RuntimeConfig
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - qos
+ - topic_publisher
+ - thing_description_publisher
+ - thing_description_service
+
+Pass these as a plain dictionary to the `config` argument of [`MQTTPublisher`](index.md), not as a
+`RuntimeConfig` instance:
+
+```python
+MQTTPublisher(config=dict(qos=2, topic_publisher=MyTopicPublisher))
+```
diff --git a/docs/api-reference/protocols/mqtt/handlers.md b/docs/api-reference/protocols/mqtt/handlers.md
new file mode 100644
index 0000000..e3c24bf
--- /dev/null
+++ b/docs/api-reference/protocols/mqtt/handlers.md
@@ -0,0 +1,31 @@
+# Topic publishers
+
+::: hololinked.server.mqtt.handlers.TopicPublisher
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - __init__
+ - client
+ - resource
+ - thing
+ - topic
+ - qos
+ - config
+ - logger
+ - publish
+ - stop
+
+::: hololinked.server.mqtt.handlers.ThingDescriptionPublisher
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - __init__
+ - client
+ - thing
+ - topic
+ - thing_description
+ - config
+ - logger
+ - publish
diff --git a/docs/api-reference/protocols/mqtt/index.md b/docs/api-reference/protocols/mqtt/index.md
index 9fde3a4..f03dd20 100644
--- a/docs/api-reference/protocols/mqtt/index.md
+++ b/docs/api-reference/protocols/mqtt/index.md
@@ -1,6 +1,27 @@
-
-
::: hololinked.server.mqtt.MQTTPublisher
options:
+ inherited_members: true
members:
- - __init__
\ No newline at end of file
+ - __init__
+ - from_params
+ - id
+ - hostname
+ - port
+ - username
+ - password
+ - ssl_context
+ - config
+ - logger
+ - things
+ - publishers
+ - add_thing
+ - add_things
+ - add_property
+ - add_action
+ - add_event
+ - setup
+ - start
+ - start_publishers
+ - run
+ - stop
+ - welcome_lines
\ No newline at end of file
diff --git a/docs/api-reference/protocols/mqtt/services.md b/docs/api-reference/protocols/mqtt/services.md
new file mode 100644
index 0000000..4a71b85
--- /dev/null
+++ b/docs/api-reference/protocols/mqtt/services.md
@@ -0,0 +1,16 @@
+# ThingDescriptionService
+
+::: hololinked.server.mqtt.services.ThingDescriptionService
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - __init__
+ - thing
+ - hostname
+ - port
+ - ssl
+ - logger
+ - generate
+ - add_properties
+ - add_events
\ No newline at end of file
diff --git a/mkdocs.yml b/mkdocs.yml
index ca5547b..b5d1539 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -109,7 +109,11 @@ nav:
- MessageMappedClientPool: api-reference/protocols/zmq/brokers/message-mapped-zmq-client-pool.md
- EventPublisher: api-reference/protocols/zmq/brokers/event-publisher.md
- EventConsumer: api-reference/protocols/zmq/brokers/event-consumer.md
- - MQTT: api-reference/protocols/mqtt/index.md
+ - MQTT:
+ - MQTTPublisher: api-reference/protocols/mqtt/index.md
+ - Runtime Configuration: api-reference/protocols/mqtt/config.md
+ - Topic Publishers: api-reference/protocols/mqtt/handlers.md
+ - Thing Description Service: api-reference/protocols/mqtt/services.md
- Security:
- Bcrypt: api-reference/protocols/security/bcrypt.md
- Argon2: api-reference/protocols/security/argon2.md
From 378c7c31ce542d4098b9311d91d6a3509d5a092f Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Sat, 3 Oct 2026 21:10:00 +0200
Subject: [PATCH 18/21] reintroduce deployment in pipeline
---
.github/workflows/ci.yaml | 14 +----
.gitmodules | 2 +-
deployment/{helm => }/container-helm-chart | 0
deployment/httproute-dev.yaml | 43 ++++++++++++++
httproute.yaml => deployment/httproute.yaml | 0
deployment/ingress-values.yaml | 19 -------
skaffold.yaml | 63 +--------------------
7 files changed, 49 insertions(+), 92 deletions(-)
rename deployment/{helm => }/container-helm-chart (100%)
create mode 100644 deployment/httproute-dev.yaml
rename httproute.yaml => deployment/httproute.yaml (100%)
delete mode 100644 deployment/ingress-values.yaml
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 49695d0..f039fbd 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -1,6 +1,8 @@
name: deploy-docs
on:
+ push:
+ branches: [main]
workflow_dispatch:
# repository_dispatch:
# types: [trigger-downstream]
@@ -25,8 +27,6 @@ jobs:
with:
submodules: recursive
- # Install the cosign tool
- # https://github.com/sigstore/cosign-installer
- name: Install cosign
uses: sigstore/cosign-installer@59acb6260d9c0ba8f4a2f9d9b48431a222b68e20 #v3.5.0
with:
@@ -39,14 +39,9 @@ jobs:
chmod +x skaffold
sudo mv skaffold /usr/local/bin/skaffold
- # Set up BuildKit Docker container builder to be able to build
- # multi-platform images and export cache
- # https://github.com/docker/setup-buildx-action
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0
- # Login against a Docker registry
- # https://github.com/docker/login-action
- name: Log into registry ${{ env.REGISTRY }}
uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0
with:
@@ -54,7 +49,6 @@ jobs:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- # Build & push with skaffold, and write the build outputs to a JSON file
- name: Build with Skaffold (push)
run: |
skaffold build \
@@ -63,7 +57,6 @@ jobs:
--file-output build.out.json \
-m ${{ env.MODULE }}
- # Cosign sign each built image by digest from the skaffold build output (keyless with OIDC)
- name: Cosign sign images
run: |
set -euo pipefail
@@ -73,7 +66,6 @@ jobs:
cosign sign --yes "$REF"
done
- # Provide your cluster config (example expects a base64-encoded kubeconfig secret)
- name: Configure kubeconfig
env:
KUBECONFIG_B64: ${{ secrets.KUBECONFIG_B64 }}
@@ -81,9 +73,9 @@ jobs:
mkdir -p ~/.kube
echo "${KUBECONFIG_B64}" | base64 -d > ~/.kube/config
- # Deploy using the exact images produced in the build job
- name: Deploy with Skaffold
run: |
skaffold deploy \
+ --default-repo=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} \
--build-artifacts build.out.json \
-m ${{ env.MODULE }}
diff --git a/.gitmodules b/.gitmodules
index 2d3dc7c..2fd7402 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,5 +1,5 @@
[submodule "deployment/helm/container-helm-chart"]
- path = deployment/helm/container-helm-chart
+ path = deployment/container-helm-chart
url = https://gitlab.com/hololinked/kubernetes/helm-charts/container-helm-chart.git
[submodule "hololinked"]
path = repo/hololinked
diff --git a/deployment/helm/container-helm-chart b/deployment/container-helm-chart
similarity index 100%
rename from deployment/helm/container-helm-chart
rename to deployment/container-helm-chart
diff --git a/deployment/httproute-dev.yaml b/deployment/httproute-dev.yaml
new file mode 100644
index 0000000..b34cf7b
--- /dev/null
+++ b/deployment/httproute-dev.yaml
@@ -0,0 +1,43 @@
+apiVersion: gateway.networking.k8s.io/v1
+kind: HTTPRoute
+metadata:
+ name: docs-dev
+ annotations:
+ external-dns.alpha.kubernetes.io/enabled: "true"
+ external-dns.alpha.kubernetes.io/ttl: "3600"
+spec:
+ parentRefs:
+ - name: gateway
+ namespace: development
+ sectionName: https-docs-dev-hololinked-net
+ hostnames:
+ - docs.dev.hololinked.net
+ rules:
+ - matches:
+ - path:
+ type: PathPrefix
+ value: /
+ backendRefs:
+ - name: dev-python-docs
+ port: 80
+---
+apiVersion: gateway.networking.k8s.io/v1
+kind: HTTPRoute
+metadata:
+ name: docs-dev-redirect
+ annotations:
+ external-dns.alpha.kubernetes.io/enabled: "true"
+ external-dns.alpha.kubernetes.io/ttl: "3600"
+spec:
+ parentRefs:
+ - name: gateway
+ namespace: development
+ sectionName: http-docs-dev-hololinked-net
+ hostnames:
+ - docs.dev.hololinked.net
+ rules:
+ - filters:
+ - type: RequestRedirect
+ requestRedirect:
+ scheme: https
+ statusCode: 301
diff --git a/httproute.yaml b/deployment/httproute.yaml
similarity index 100%
rename from httproute.yaml
rename to deployment/httproute.yaml
diff --git a/deployment/ingress-values.yaml b/deployment/ingress-values.yaml
deleted file mode 100644
index 378bb60..0000000
--- a/deployment/ingress-values.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
-annotations:
- cert-manager.io/cluster-issuer: letsencrypt-test
-
-tls:
- - hosts:
- - docs.dev.hololinked.net
- secretName: docs-staging-hololinked-net-tls
-
-rules:
-- host: docs.dev.hololinked.net
- http:
- paths:
- - path: /
- pathType: Prefix
- backend:
- service:
- name: dev-python-docs
- port:
- number: 80
\ No newline at end of file
diff --git a/skaffold.yaml b/skaffold.yaml
index c026fc4..86a9a75 100644
--- a/skaffold.yaml
+++ b/skaffold.yaml
@@ -28,7 +28,7 @@ deploy:
helm:
releases:
- name: dev-python-docs
- chartPath: deployment/helm/container-helm-chart
+ chartPath: deployment/container-helm-chart
namespace: development
createNamespace: true
setValues:
@@ -39,65 +39,6 @@ deploy:
repository: "{{ .IMAGE_REPO_hololinked_docs_dev }}"
tag: "{{ .IMAGE_TAG_hololinked_docs_dev }}@{{ .IMAGE_DIGEST_hololinked_docs_dev }}"
- - name: dev-python-docs-ingress
- chartPath: deployment/helm/ingress-helm-chart
- namespace: development
- createNamespace: true
- valuesFiles:
- - deployment/helm/ingress-helm-chart/values.yaml
- - deployment/ingress-values.yaml
- setValues:
- nameOverride: dev-python-docs-ingress
-
----
-# staging a production version of the Python docs
-apiVersion: skaffold/v4beta13
-kind: Config
-metadata:
- name: staging-docs
-build:
- artifacts:
- - image: hololinked_docs_staging
- context: .
- docker:
- dockerfile: Dockerfile
- target: prod
- tagPolicy:
- envTemplate:
- template: staging
- local:
- push: true
-deploy:
- helm:
- releases:
- - name: staging-python-docs
- chartPath: deployment/helm/container-helm-chart
- namespace: staging
- createNamespace: true
- setValues:
- nameOverride: staging-python-docs
- image.ports.containerPort: 80
- setValueTemplates:
- image:
- repository: "{{ .IMAGE_REPO_hololinked_docs_staging }}"
- tag: "{{ .IMAGE_TAG_hololinked_docs_staging }}@{{ .IMAGE_DIGEST_hololinked_docs_staging }}"
-
- - name: staging-python-docs-ingress
- chartPath: deployment/helm/ingress-helm-chart
- namespace: staging
- createNamespace: true
- valuesFiles:
- - deployment/helm/ingress-helm-chart/values.yaml
- - deployment/ingress-values.yaml
- setValues:
- nameOverride: staging-python-docs-ingress
- rules[0].host: docs.staging.hololinked.dev
- rules[0].http.paths[0].backend.service.name: staging-python-docs
- tls[0].hosts[0]: docs.staging.hololinked.dev
- tls[0].secretName: docs-staging-hololinked-dev-tls
- annotations:
- cert-manager\.io/cluster-issuer: letsencrypt-prod
-
---
# production version of the Python docs
apiVersion: skaffold/v4beta13
@@ -120,7 +61,7 @@ deploy:
helm:
releases:
- name: hololinked-python-docs
- chartPath: deployment/helm/container-helm-chart
+ chartPath: deployment/container-helm-chart
namespace: website
createNamespace: true
setValues:
From f2921063b6992f19db6a4744bf6b4d8125899722 Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Sat, 3 Oct 2026 21:18:56 +0200
Subject: [PATCH 19/21] update CI file
---
.github/workflows/ci.yaml | 87 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 85 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index f039fbd..4f69178 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -3,6 +3,7 @@ name: deploy-docs
on:
push:
branches: [main]
+ pull_request:
workflow_dispatch:
# repository_dispatch:
# types: [trigger-downstream]
@@ -14,7 +15,7 @@ env:
jobs:
build:
- name: build, sign & deploy
+ name: build & sign
runs-on: ubuntu-latest
permissions:
contents: read
@@ -28,6 +29,7 @@ jobs:
submodules: recursive
- name: Install cosign
+ if: github.event_name != 'pull_request'
uses: sigstore/cosign-installer@59acb6260d9c0ba8f4a2f9d9b48431a222b68e20 #v3.5.0
with:
cosign-release: "v2.2.4"
@@ -43,13 +45,25 @@ jobs:
uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0
- name: Log into registry ${{ env.REGISTRY }}
+ if: github.event_name != 'pull_request'
uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
+ # --push=false overrides local.push in skaffold.yaml, which would otherwise push anyway
+ # and overwrite the constant :prod tag with a pull request build.
+ - name: Build with Skaffold (validate only)
+ if: github.event_name == 'pull_request'
+ run: |
+ skaffold build \
+ --default-repo=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} \
+ --push=false \
+ -m ${{ env.MODULE }}
+
- name: Build with Skaffold (push)
+ if: github.event_name != 'pull_request'
run: |
skaffold build \
--default-repo=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} \
@@ -58,14 +72,48 @@ jobs:
-m ${{ env.MODULE }}
- name: Cosign sign images
+ if: github.event_name != 'pull_request'
run: |
set -euo pipefail
- # Extract full refs (they include @sha256:...); sign each
jq -r '.builds[].tag' build.out.json | while read -r REF; do
echo "Signing $REF"
cosign sign --yes "$REF"
done
+ - name: Upload build output
+ if: github.event_name != 'pull_request'
+ uses: actions/upload-artifact@v4
+ with:
+ name: build-out
+ path: build.out.json
+ retention-days: 1
+
+ deploy:
+ name: deploy
+ needs: build
+ if: github.event_name != 'pull_request'
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ with:
+ submodules: recursive
+
+ - name: Install Skaffold
+ run: |
+ set -euo pipefail
+ curl -L "https://storage.googleapis.com/skaffold/releases/v2.16.1/skaffold-linux-amd64" -o skaffold
+ chmod +x skaffold
+ sudo mv skaffold /usr/local/bin/skaffold
+
+ - name: Download build output
+ uses: actions/download-artifact@v4
+ with:
+ name: build-out
+
- name: Configure kubeconfig
env:
KUBECONFIG_B64: ${{ secrets.KUBECONFIG_B64 }}
@@ -79,3 +127,38 @@ jobs:
--default-repo=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} \
--build-artifacts build.out.json \
-m ${{ env.MODULE }}
+
+ httproute:
+ name: apply httproute
+ needs: deploy
+ if: github.event_name != 'pull_request'
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Configure kubeconfig
+ env:
+ KUBECONFIG_B64: ${{ secrets.KUBECONFIG_B64 }}
+ run: |
+ mkdir -p ~/.kube
+ echo "${KUBECONFIG_B64}" | base64 -d > ~/.kube/config
+
+ - name: Apply HTTPRoute
+ run: |
+ set -euo pipefail
+ kubectl apply --dry-run=server -f deployment/httproute.yaml -n website
+ kubectl apply -f deployment/httproute.yaml -n website
+
+ - name: Wait for route to be accepted
+ run: |
+ set -euo pipefail
+ for route in docs docs-redirect; do
+ for cond in Accepted ResolvedRefs; do
+ kubectl wait --timeout=60s -n website "httproute/$route" \
+ --for=jsonpath="{.status.parents[0].conditions[?(@.type==\"$cond\")].status}"=True
+ done
+ done
From a4b7aedbd47a4e711356837fa4fb54d90ce184c1 Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Sat, 3 Oct 2026 21:28:18 +0200
Subject: [PATCH 20/21] make container helm chart local
---
.gitmodules | 3 -
deployment/container-helm-chart | 1 -
deployment/container-helm-chart/.helmignore | 23 +++++
deployment/container-helm-chart/Chart.yaml | 6 ++
deployment/container-helm-chart/LICENSE | 21 +++++
deployment/container-helm-chart/README.md | 3 +
.../container-helm-chart/templates/NOTES.txt | 0
.../templates/_helpers.tpl | 51 +++++++++++
.../templates/deployment.yaml | 84 +++++++++++++++++++
.../container-helm-chart/templates/hpa.yaml | 32 +++++++
.../templates/service.yaml | 15 ++++
deployment/container-helm-chart/values.yaml | 63 ++++++++++++++
.../protocols/zmq/brokers/zmq-server-pool.md | 29 +++++++
docs/api-reference/protocols/zmq/config.md | 14 ++++
docs/api-reference/protocols/zmq/index.md | 35 +++++++-
docs/api-reference/protocols/zmq/services.md | 16 ++++
mkdocs.yml | 3 +
17 files changed, 392 insertions(+), 7 deletions(-)
delete mode 160000 deployment/container-helm-chart
create mode 100644 deployment/container-helm-chart/.helmignore
create mode 100644 deployment/container-helm-chart/Chart.yaml
create mode 100644 deployment/container-helm-chart/LICENSE
create mode 100644 deployment/container-helm-chart/README.md
create mode 100644 deployment/container-helm-chart/templates/NOTES.txt
create mode 100644 deployment/container-helm-chart/templates/_helpers.tpl
create mode 100644 deployment/container-helm-chart/templates/deployment.yaml
create mode 100644 deployment/container-helm-chart/templates/hpa.yaml
create mode 100644 deployment/container-helm-chart/templates/service.yaml
create mode 100644 deployment/container-helm-chart/values.yaml
create mode 100644 docs/api-reference/protocols/zmq/brokers/zmq-server-pool.md
create mode 100644 docs/api-reference/protocols/zmq/config.md
create mode 100644 docs/api-reference/protocols/zmq/services.md
diff --git a/.gitmodules b/.gitmodules
index 2fd7402..f9d0aba 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,6 +1,3 @@
-[submodule "deployment/helm/container-helm-chart"]
- path = deployment/container-helm-chart
- url = https://gitlab.com/hololinked/kubernetes/helm-charts/container-helm-chart.git
[submodule "hololinked"]
path = repo/hololinked
url = https://github.com/hololinked-dev/hololinked.git
diff --git a/deployment/container-helm-chart b/deployment/container-helm-chart
deleted file mode 160000
index 105c3fc..0000000
--- a/deployment/container-helm-chart
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 105c3fc6a3ed2ac9fde927d846841ecce92f1f6d
diff --git a/deployment/container-helm-chart/.helmignore b/deployment/container-helm-chart/.helmignore
new file mode 100644
index 0000000..0e8a0eb
--- /dev/null
+++ b/deployment/container-helm-chart/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/deployment/container-helm-chart/Chart.yaml b/deployment/container-helm-chart/Chart.yaml
new file mode 100644
index 0000000..e5134d1
--- /dev/null
+++ b/deployment/container-helm-chart/Chart.yaml
@@ -0,0 +1,6 @@
+apiVersion: v2
+name: apps
+description: A Helm chart for Kubernetes
+type: application
+version: 0.1.0
+appVersion: "0.1.0"
diff --git a/deployment/container-helm-chart/LICENSE b/deployment/container-helm-chart/LICENSE
new file mode 100644
index 0000000..10cf77a
--- /dev/null
+++ b/deployment/container-helm-chart/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 hololinked
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/deployment/container-helm-chart/README.md b/deployment/container-helm-chart/README.md
new file mode 100644
index 0000000..c4bd604
--- /dev/null
+++ b/deployment/container-helm-chart/README.md
@@ -0,0 +1,3 @@
+# Container Helm Chart
+
+Generic Container Helm Chart for hololinked TLD & associated projects.
\ No newline at end of file
diff --git a/deployment/container-helm-chart/templates/NOTES.txt b/deployment/container-helm-chart/templates/NOTES.txt
new file mode 100644
index 0000000..e69de29
diff --git a/deployment/container-helm-chart/templates/_helpers.tpl b/deployment/container-helm-chart/templates/_helpers.tpl
new file mode 100644
index 0000000..bd41ed9
--- /dev/null
+++ b/deployment/container-helm-chart/templates/_helpers.tpl
@@ -0,0 +1,51 @@
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "apps.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "apps.fullname" -}}
+{{- if .Values.fullnameOverride }}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- $name := default .Chart.Name .Values.nameOverride }}
+{{- if contains $name .Release.Name }}
+{{- .Release.Name | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "apps.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Common labels
+*/}}
+{{- define "apps.labels" -}}
+helm.sh/chart: {{ include "apps.chart" . }}
+{{ include "apps.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end }}
+
+{{/*
+Selector labels
+*/}}
+{{- define "apps.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "apps.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end }}
diff --git a/deployment/container-helm-chart/templates/deployment.yaml b/deployment/container-helm-chart/templates/deployment.yaml
new file mode 100644
index 0000000..6afc5aa
--- /dev/null
+++ b/deployment/container-helm-chart/templates/deployment.yaml
@@ -0,0 +1,84 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ include "apps.fullname" . }}
+ labels:
+ {{- include "apps.labels" . | nindent 4 }}
+spec:
+ {{- if not .Values.autoscaling.enabled }}
+ replicas: {{ .Values.replicaCount }}
+ {{- end }}
+ selector:
+ matchLabels:
+ {{- include "apps.selectorLabels" . | nindent 6 }}
+ template:
+ metadata:
+ {{- with .Values.podAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ labels:
+ {{- include "apps.labels" . | nindent 8 }}
+ {{- with .Values.podLabels }}
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ spec:
+ {{- with .Values.imagePullSecrets }}
+ imagePullSecrets:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ {{- with .Values.podSecurityContext }}
+ securityContext:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ containers:
+ - name: {{ .Chart.Name }}
+ {{- with .Values.securityContext }}
+ securityContext:
+ {{- toYaml . | nindent 12 }}
+ {{- end }}
+ image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+ imagePullPolicy: {{ .Values.image.pullPolicy }}
+ ports:
+ - name: http
+ containerPort: {{ .Values.image.ports.containerPort }}
+ protocol: TCP
+ {{- if .Values.env }}
+ env:
+ {{- range .Values.env }}
+ - name: {{ .name }}
+ value: {{ .value | quote }}
+ {{- end }}
+ {{- end }}
+ {{- with .Values.livenessProbe }}
+ livenessProbe:
+ {{- toYaml . | nindent 12 }}
+ {{- end }}
+ {{- with .Values.readinessProbe }}
+ readinessProbe:
+ {{- toYaml . | nindent 12 }}
+ {{- end }}
+ {{- with .Values.resources }}
+ resources:
+ {{- toYaml . | nindent 12 }}
+ {{- end }}
+ {{- with .Values.volumeMounts }}
+ volumeMounts:
+ {{- toYaml . | nindent 12 }}
+ {{- end }}
+ {{- with .Values.volumes }}
+ volumes:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ {{- with .Values.nodeSelector }}
+ nodeSelector:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ {{- with .Values.affinity }}
+ affinity:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ {{- with .Values.tolerations }}
+ tolerations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
diff --git a/deployment/container-helm-chart/templates/hpa.yaml b/deployment/container-helm-chart/templates/hpa.yaml
new file mode 100644
index 0000000..200294b
--- /dev/null
+++ b/deployment/container-helm-chart/templates/hpa.yaml
@@ -0,0 +1,32 @@
+{{- if .Values.autoscaling.enabled }}
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+ name: {{ include "apps.fullname" . }}
+ labels:
+ {{- include "apps.labels" . | nindent 4 }}
+spec:
+ scaleTargetRef:
+ apiVersion: apps/v1
+ kind: Deployment
+ name: {{ include "apps.fullname" . }}
+ minReplicas: {{ .Values.autoscaling.minReplicas }}
+ maxReplicas: {{ .Values.autoscaling.maxReplicas }}
+ metrics:
+ {{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
+ - type: Resource
+ resource:
+ name: cpu
+ target:
+ type: Utilization
+ averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
+ {{- end }}
+ {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
+ - type: Resource
+ resource:
+ name: memory
+ target:
+ type: Utilization
+ averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
+ {{- end }}
+{{- end }}
diff --git a/deployment/container-helm-chart/templates/service.yaml b/deployment/container-helm-chart/templates/service.yaml
new file mode 100644
index 0000000..91c6c39
--- /dev/null
+++ b/deployment/container-helm-chart/templates/service.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ include "apps.fullname" . }}
+ labels:
+ {{- include "apps.labels" . | nindent 4 }}
+spec:
+ type: {{ .Values.service.type }}
+ ports:
+ - port: {{ .Values.service.port }}
+ targetPort: http
+ protocol: TCP
+ name: http
+ selector:
+ {{- include "apps.selectorLabels" . | nindent 4 }}
diff --git a/deployment/container-helm-chart/values.yaml b/deployment/container-helm-chart/values.yaml
new file mode 100644
index 0000000..9e86660
--- /dev/null
+++ b/deployment/container-helm-chart/values.yaml
@@ -0,0 +1,63 @@
+replicaCount: 1
+
+image:
+ repository: nginx
+ pullPolicy: Always
+ tag: ""
+ ports:
+ containerPort: 80
+
+nameOverride: ""
+fullnameOverride: ""
+
+podAnnotations: {}
+podLabels: {}
+podSecurityContext: {}
+
+securityContext: {}
+ # capabilities:
+ # drop:
+ # - ALL
+ # readOnlyRootFilesystem: true
+ # runAsNonRoot: true
+ # runAsUser: 1000
+
+service:
+ type: ClusterIP
+ port: 80
+
+resources: {}
+ # limits:
+ # cpu: 100m
+ # memory: 128Mi
+ # requests:
+ # cpu: 100m
+ # memory: 128Mi
+
+# livenessProbe:
+# httpGet:
+# path: /
+# port: http
+# readinessProbe:
+# httpGet:
+# path: /
+# port: http
+
+# This section is for setting up autoscaling more information can be found here: https://kubernetes.io/docs/concepts/workloads/autoscaling/
+autoscaling:
+ enabled: false
+ minReplicas: 1
+ maxReplicas: 100
+ targetCPUUtilizationPercentage: 80
+ # targetMemoryUtilizationPercentage: 80
+
+volumes: []
+volumeMounts: []
+
+nodeSelector: {}
+
+tolerations: []
+
+affinity: {}
+
+env: {}
diff --git a/docs/api-reference/protocols/zmq/brokers/zmq-server-pool.md b/docs/api-reference/protocols/zmq/brokers/zmq-server-pool.md
new file mode 100644
index 0000000..ed0a597
--- /dev/null
+++ b/docs/api-reference/protocols/zmq/brokers/zmq-server-pool.md
@@ -0,0 +1,29 @@
+# ZMQServerPool
+
+::: hololinked.server.zmq.brokers.ZMQServerPool
+ options:
+ show_root_heading: true
+ heading_level: 2
+ inherited_members: true
+ members:
+ - __init__
+ - id
+ - context
+ - poller
+ - pool
+ - logger
+ - create_socket
+ - register_server
+ - deregister_server
+ - poll_timeout
+ - poll
+ - async_recv_request
+ - async_recv_requests
+ - async_send_response
+ - stop_polling
+ - exit
+ - handshake
+ - handle_invalid_message
+ - handle_timeout
+ - handle_error_message
+ - handled_default_message_types
diff --git a/docs/api-reference/protocols/zmq/config.md b/docs/api-reference/protocols/zmq/config.md
new file mode 100644
index 0000000..b7d60b8
--- /dev/null
+++ b/docs/api-reference/protocols/zmq/config.md
@@ -0,0 +1,14 @@
+# ZMQ runtime configuration
+
+::: hololinked.server.zmq.config.RuntimeConfig
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - thing_description_service
+
+Pass as a plain dictionary to the `config` argument of [`ZMQServer`](index.md):
+
+```python
+ZMQServer(config=dict(thing_description_service=MyService))
+```
\ No newline at end of file
diff --git a/docs/api-reference/protocols/zmq/index.md b/docs/api-reference/protocols/zmq/index.md
index 9831a90..0754573 100644
--- a/docs/api-reference/protocols/zmq/index.md
+++ b/docs/api-reference/protocols/zmq/index.md
@@ -1,8 +1,37 @@
-
-
::: hololinked.server.zmq.ZMQServer
options:
+ inherited_members: true
members:
- __init__
+ - from_params
+ - id
+ - config
+ - context
+ - logger
+ - things
+ - add_thing
+ - add_things
+ - add_property
+ - add_action
+ - add_event
+ - inproc_server
+ - ipc_server
+ - tcp_server
+ - transport_servers
+ - inproc_event_publisher
+ - ipc_event_publisher
+ - tcp_event_publisher
+ - event_publishers
+ - setup
+ - start
+ - run
+ - polling
+ - recv_requests
+ - process_request
+ - stop_polling
+ - get_thing_description
- stop
- - exit
\ No newline at end of file
+ - exit
+ - welcome_lines
+
+Requires the `zmq` extra. Note the pin: `pyzmq<26.2`, which is what keeps IPC working on Windows.
\ No newline at end of file
diff --git a/docs/api-reference/protocols/zmq/services.md b/docs/api-reference/protocols/zmq/services.md
new file mode 100644
index 0000000..4c4428a
--- /dev/null
+++ b/docs/api-reference/protocols/zmq/services.md
@@ -0,0 +1,16 @@
+# ThingDescriptionService
+
+::: hololinked.server.zmq.services.ThingDescriptionService
+ options:
+ show_root_heading: true
+ heading_level: 2
+ members:
+ - __init__
+ - server
+ - logger
+ - generate
+ - socket_addresses_for
+ - content_type_for
+ - add_properties
+ - add_actions
+ - add_events
diff --git a/mkdocs.yml b/mkdocs.yml
index b5d1539..ee1cf57 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -96,6 +96,8 @@ nav:
- Probes and Control: api-reference/protocols/http/handlers/probes.md
- ZMQ:
- ZMQServer: api-reference/protocols/zmq/index.md
+ - Runtime Configuration: api-reference/protocols/zmq/config.md
+ - Thing Description Service: api-reference/protocols/zmq/services.md
- Messaging Contracts:
- RequestMessage: api-reference/protocols/zmq/messaging-contract/request-message.md
- ResponseMessage: api-reference/protocols/zmq/messaging-contract/response-message.md
@@ -109,6 +111,7 @@ nav:
- MessageMappedClientPool: api-reference/protocols/zmq/brokers/message-mapped-zmq-client-pool.md
- EventPublisher: api-reference/protocols/zmq/brokers/event-publisher.md
- EventConsumer: api-reference/protocols/zmq/brokers/event-consumer.md
+ - ZMQServerPool: api-reference/protocols/zmq/brokers/zmq-server-pool.md
- MQTT:
- MQTTPublisher: api-reference/protocols/mqtt/index.md
- Runtime Configuration: api-reference/protocols/mqtt/config.md
From 717e753358a49c3776025f3a72df26544ea3a7e4 Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Sat, 3 Oct 2026 21:37:03 +0200
Subject: [PATCH 21/21] clone submodule fix
---
.github/workflows/ci.yaml | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 4f69178..b06d5b5 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -26,7 +26,10 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4
with:
- submodules: recursive
+ submodules: false
+
+ - name: Check out the repo submodule
+ run: git submodule update --init --depth 1 repo/hololinked
- name: Install cosign
if: github.event_name != 'pull_request'
@@ -100,7 +103,7 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4
with:
- submodules: recursive
+ submodules: false
- name: Install Skaffold
run: |