HOW IT WORKS

Three components. One causal record.

podblocks splits cleanly into a control plane that orchestrates, workers that execute, and a UI that watches. The control plane never runs your code. Workers connect outbound only. Every boundary speaks one format, the Poset Interchange Format.

ARCHITECTURE

Orchestrate, execute, watch.

React UI

Canvas, block editor, causal overlay. Talks to the control plane over WebSocket and REST.

Control plane (Go)

A single static binary. Stores definitions, schedules runs, persists posets, evaluates triggers. Never executes your code.

Worker (Python)

Connects outbound over one WebSocket, runs blocks and CrewAI crews, captures causality with PyRapide, streams events back.

CONCEPTS

Pods, blocks, runs.

A pod is the unit of work: a DAG of typed blocks, defined in a git-friendly pod.yaml and compiled on the worker into a CrewAI Flow. Pods run to completion (triggered) or stay resident and react continuously. Project groups contain projects; projects contain pods; pods may embed sub-pods, each with its own poset.

pod.yaml
schema_version: "2.0"
pod:
  name: "Research Pod"
  slug: research-pod
  mode: triggered
nodes:
  - id: load_listings
    type: sql
    source: blocks/load_listings.sql
  - id: analyst_crew
    type: crew
    config:
      agents: [researcher, reporter]
      process: sequential
edges:
  - {from: load_listings, to: analyst_crew}
constraints:
  - id: no_tool_errors
    type: never
    pattern: 'match("agent.tool.error")'
    policy: route
    route_to: publish_failure

THE RUN LIFECYCLE

From dispatch to a persisted poset.

  1. 01

    Dispatch

    The control plane resolves secrets, seals the pod bundle, and dispatches it to an eligible worker over one WebSocket.

  2. 02

    Compile

    The worker compiles the pod to a CrewAI Flow: root nodes start, downstream nodes listen, conditional edges become routers.

  3. 03

    Stream

    Incremental PIF event windows stream back every 500ms, so the UI lights up the graph live.

  4. 04

    Persist

    On completion the full poset persists; the run view serves causal queries over it.

Want the deep version?

Causality is the part worth understanding. It is what the rest is built on.

How causality works