Bioimage analysis,
a bit more fun.
Arkitekt is a real-time middleman between you and your tools. It turns scattered scripts and messy multi-folder data sinkholes into a single, analysis tracking datahub that orchestrates your workflows and lets you share your data with your team securely.
You bring your apps and robots, Arkitekt ties them together.
Watch how a request flows through the platform.
Arkitekt is a reactive platform for live, stateful workflows. It is not a replacement for the tools we admire.
We love and use Dask heavily. It is brilliant at scaling array, dataframe & task-graph compute across a cluster.
Arkitekt is not a pure parallelization library.
We are a concurrency platform: long-lived, stateful actor apps that broker data and compute. They are not ephemeral task graphs you submit and forget.
How we run DaskWe love Nextflow: for running stateless batch pipelines on a cluster.
Arkitekt is not just a stateless executor.
Smart microscopy is rarely stateless. A model is loaded once and results steer the next acquisition. Our apps stay alive and keep their state across a live feedback loop.
Arkitekt vs NextflowWe love ROS. It rules at real-time robotic control and swarm orchestration
Arkitekt does not orchestrate robotic swarms.
That layer is out of scope. But the moment your robot exposes a high-level action, wrap it as an Arkitekt app and we become your friend.
Wrap it as an appRegister idiomatic Python code
Every action is just a function, sync or async. Use standard python calls like task.progress() to report how far along you are, and yield results as they are produced.
@app.action
async def process(stack: Image, task: Task) -> Image:
"""Segment every plane and stream the masks."""
for i, plane in enumerate(stack):
await task.aprogress(i * 10)
yield segment(plane)Observability baked in
Declare any @app.state class and any agent can read it (but only you mutate it). Every change is published to the platform automatically. Dashboards and other apps watch your that change. Did we say we keep track of it for replay and provenance too? We do.
@app.state
class RobotState:
pose: str = "idle"
picks: int = 0
@app.action
def pick(robot: RobotState) -> int:
robot.picks += 1 # published automatically (in the background and thread safe)
return robot.picksWant to see Arkitekt in action?
Look at these examples. Maybe they can illustrate things better than words.
Audited by default.
Every action, input and output is recorded at task assignment. You get a complete, queryable provenance trail of who ran what, on which data, and when.
Orchestrate across machines, survive the crash
Declare what you need from other apps with @app.declare and write the orchestration as plain Python in an @app.workflow. If the machine running it dies, the workflow is resumed: calls that already finished are replayed from the journal instead of running again (the robot does not move twice), and a call still in flight is picked up where it is.
@app.declare(app="fairino")
class Arm(Protocol):
plate: Plate # published @app.state
def pick(self, slot: str) -> None: ...
def place(self, slot: str) -> None: ...
@app.workflow
def image_plate(arm: Arm, scope: Scope, seg: Segmentor,
task: Task) -> int:
arm.pick("hotel/3")
arm.place("stage")
total = 0
# raise if someone swapped the plate while we were down
with task.guard(arm.plate, "barcode"):
for well in ["A1", "A2"]:
image = scope.acquire(well)
total += task.retry(seg.count_cells, image,
if_started=True)
arm.place("hotel/3")
return totalEVERY CALL JOURNALED UNDER A STABLE KEY
Dashboards, declared in JSX.
Compose a panel from the component catalogand wire it straight to your app: bind props to a dependency's state with $state, and call its actions with @. jsx(...) parses it into a component tree.
<Page>
<Label text="Camera" />
<Text value="$state.camera.connected" />
<Button title="Snap"
onClick="@camera.snap(exposure_ms=10)" />
</Page>@camera.snap → 0 frames captured
Powered by the Arkitekt core
A handful of focused services do the heavy lifting. Call them from any language through the client SDKs.
Apps expose Actions; agents run them and Rekuest assigns the work across the network.
Stores & serves n-dimensional images, ROIs and rich metadata.
Links samples, experiments and results into one graph.
Discovers, deploys & manages Apps across the platform.
Build Apps & call Actions from any language.
We dont vibe code here, but we use AI sometimes.
Arkitekt is older than AI and the core of the platform has been painstakingly engineered without any ML magic. Look at our code, talk to us humans, there is no hype here.
Get started with Arkitekt
Install the platform, walk through the tutorial, and connect your first tool.
Start the tutorial