flux-doctrine/awesome-fbp

📚 A community knowledge base for awesome flow-based programming (FBP) resources. Contributions most welcome!

40

20 commits

updated Feb 10, 2026

See the code

See what people are saying

README

Awesome Flow-Based Programming (FBP)

This is a community knowledge base for flow-based programming (FBP).

The flow-based programming paradigm


[Reading] | [Showcase] | [Reference] | [Community] | [Credits]

Reading

Encyclopedias

Flow-based programming on Wikipedia, Grokipedia, WikiWikiWeb, Python Wiki, and Tcl Wiki.

Articles

Showcase

ProjectSummaryAuthorLanguageLicenseUpdatedLinks
Apache NiFiMature ETL workflow system based on FBP.@apacheJavaApache2026:octocat: 🏠
Async-FlowAsync FBP core abstractions for Tokio.@artobRustUnlicense2026:octocat: 📦 📖 🏠
CppFBPClassical FBP implementation for C++.@jpaulmC, C++Artistic2021:octocat:
CsharpFBPClassical FBP implementation for C#.@jpaulmC#Artistic2021:octocat:
FlowexFBP/ROP framework based on GenStage.@antonmiElixirApache2021:octocat: 📦 📖
Flows.rsReusable FBP building blocks for Tokio.@artobRustUnlicense2026:octocat: 📦 📖 🏠
GoFBPClassical FBP implementation for Go.@jpaulmGoUnknown2022:octocat:
JavaFBPClassical FBP implementation for Java.@jpaulmJavaLGPL2022:octocat:
JSFBPClassical FBP implementation for JavaScript.@jpaulmJavaScriptMIT2021:octocat:
Node-REDPopular low-code IDE for event-driven apps.@knollearyJavaScriptApache2026:octocat: 🏠
NoFloPopular FBP-inspired runtime for Node.js.@bergieJavaScriptMIT2024:octocat: 🏠
ProtoflowThread-based FBP using Protocol Buffers.@artobRustUnlicense2025:octocat: 📦 📖
RAMEN 🍜Lightweight actor-based message exchange library for embedded C++.@ZubaxC++MIT2025:octocat:
SciPipeMature scientific workflow library for Go.@samuellGoMIT2024:octocat: 🏠

Reference

Concepts

This is a cross-reference for the widely varying nomenclature used in various FBP implementations. "Classical FBP" here means @jpaulm's nomenclature as found in his pioneering book and his open-source implementations (e.g., GoFBP, JavaFBP) that seeded the field.

Classical FBPFlux TheoryApache NiFiNoFloNode-REDRAMEN
NetworkSystemFlowGraphFlowNetwork
Subnet 1SubsystemProcess GroupSubgraphSubflow-
Component 2BlockProcessorComponentNodeActor
Process 3ProcessProcessorProcessNodeActor
Connection 4ConnectionConnectionConnectionWireTopic
PortPortRelationshipPortPortEvent/Behavior
Information Packet (IP)MessageFlow FileIPMessageMessage
Initial Information Packet (IIP)Property-IIPConfig Node-
SchedulerSchedulerFlow ControllerRuntimeRuntime-

Languages

A growing number of programming languages implement concurrency primitives suitable for building flow-based systems. Here follows a comparison of several widely-used languages:

Parallelism describes whether the runtime can execute multiple processes simultaneously on separate CPU cores. Erlang, Dart, Go, and Ruby all achieve true multi-core parallelism. Clojure's core.async.flow runs each process on a JVM thread (from configurable thread pools), also achieving multi-core parallelism. Python's asyncio multiplexes coroutines on a single thread, so it's concurrent but not parallel without reaching for multiprocessing.

Scheduling matters because it determines whether a long-running computation can starve other processes. Erlang is the gold standard here with reduction-counting preemption that guarantees fairness even for CPU-bound work. Go adopted signal-based preemption in 1.14 to prevent tight loops from hogging a core. Dart and Python are cooperative--a compute-bound isolate or coroutine must explicitly yield. Clojure and Ruby delegate to the OS/JVM thread scheduler.

Isolation has direct implications for data safety in FBP networks. Erlang and Dart processes have fully separate heaps and can only communicate by copying messages. Go and Python have shared memory, requiring discipline to avoid races. Clojure takes a middle path by encouraging immutable shared data. Ruby's ractors restrict sharing to frozen/shareable objects.

Backpressure determines whether a fast producer can overwhelm a slow consumer. Clojure's and Go's channels and Python's asyncio queues support bounded buffers that block senders when full--a natural fit for FBP. Erlang, Dart, and Ruby all have unbounded mailboxes/ports, meaning backpressure must be implemented at the application level.

Supervision captures how errors in one process are detected and handled by the network. Erlang's OTP supervisor trees are the most mature model. Clojure's core.async.flow centralizes errors onto a dedicated :error-chan. The others offer varying levels of support through error listeners, panic recovery, or exception propagation from tasks.

Community

Here follows a small sample of the fine folks developing FBP frameworks and/or producing useful content about this approach to programming:

@antonmi, @apiri, @artob, @bergie, @exceptionfactory, @goodlux, @jm9e, @joewitt, @jpaulm, @knolleary, @markap14, @mcgilman, @pavel-kirienko, @ryrobes, @samuell, @statusfailed, @trustmaster, @tyoung3

👉 Join the FBP Slack! (Historically, there was also an active Flow Based Programming Google group but these days it's unmaintained and has been overrun by spam. Still, lots of useful information in the archives over there.)

Credits

Kudos to @samuell for putting together the first Awesome FBP list over at samuell/awesome-fbp.


Share on X Share on Reddit Share on Hacker News Share on Facebook Share on LinkedIn

Footnotes

  1. Subnets were also known as "composite components" in classical FBP. ↩

  2. Components were described as "black boxes" in classical FBP. ↩

  3. Processes were interchangeably called "threads" in classical FBP. ↩

  4. Connections were also known as "bounded buffers" in classical FBP. ↩

awesome
dataflow
dataflow-programming
fbp
flow-based
flow-based-programming

flux-doctrine/awesome-fbp

📚 A community knowledge base for awesome flow-based programming (FBP) resources. Contributions most welcome!

40

20 commits

updated Feb 10, 2026

See the code

See what people are saying

README

Awesome Flow-Based Programming (FBP)

This is a community knowledge base for flow-based programming (FBP).

The flow-based programming paradigm


[Reading] | [Showcase] | [Reference] | [Community] | [Credits]

Reading

Encyclopedias

Flow-based programming on Wikipedia, Grokipedia, WikiWikiWeb, Python Wiki, and Tcl Wiki.

Articles

Showcase

ProjectSummaryAuthorLanguageLicenseUpdatedLinks
Apache NiFiMature ETL workflow system based on FBP.@apacheJavaApache2026:octocat: 🏠
Async-FlowAsync FBP core abstractions for Tokio.@artobRustUnlicense2026:octocat: 📦 📖 🏠
CppFBPClassical FBP implementation for C++.@jpaulmC, C++Artistic2021:octocat:
CsharpFBPClassical FBP implementation for C#.@jpaulmC#Artistic2021:octocat:
FlowexFBP/ROP framework based on GenStage.@antonmiElixirApache2021:octocat: 📦 📖
Flows.rsReusable FBP building blocks for Tokio.@artobRustUnlicense2026:octocat: 📦 📖 🏠
GoFBPClassical FBP implementation for Go.@jpaulmGoUnknown2022:octocat:
JavaFBPClassical FBP implementation for Java.@jpaulmJavaLGPL2022:octocat:
JSFBPClassical FBP implementation for JavaScript.@jpaulmJavaScriptMIT2021:octocat:
Node-REDPopular low-code IDE for event-driven apps.@knollearyJavaScriptApache2026:octocat: 🏠
NoFloPopular FBP-inspired runtime for Node.js.@bergieJavaScriptMIT2024:octocat: 🏠
ProtoflowThread-based FBP using Protocol Buffers.@artobRustUnlicense2025:octocat: 📦 📖
RAMEN 🍜Lightweight actor-based message exchange library for embedded C++.@ZubaxC++MIT2025:octocat:
SciPipeMature scientific workflow library for Go.@samuellGoMIT2024:octocat: 🏠

Reference

Concepts

This is a cross-reference for the widely varying nomenclature used in various FBP implementations. "Classical FBP" here means @jpaulm's nomenclature as found in his pioneering book and his open-source implementations (e.g., GoFBP, JavaFBP) that seeded the field.

Classical FBPFlux TheoryApache NiFiNoFloNode-REDRAMEN
NetworkSystemFlowGraphFlowNetwork
Subnet 1SubsystemProcess GroupSubgraphSubflow-
Component 2BlockProcessorComponentNodeActor
Process 3ProcessProcessorProcessNodeActor
Connection 4ConnectionConnectionConnectionWireTopic
PortPortRelationshipPortPortEvent/Behavior
Information Packet (IP)MessageFlow FileIPMessageMessage
Initial Information Packet (IIP)Property-IIPConfig Node-
SchedulerSchedulerFlow ControllerRuntimeRuntime-

Languages

A growing number of programming languages implement concurrency primitives suitable for building flow-based systems. Here follows a comparison of several widely-used languages:

Parallelism describes whether the runtime can execute multiple processes simultaneously on separate CPU cores. Erlang, Dart, Go, and Ruby all achieve true multi-core parallelism. Clojure's core.async.flow runs each process on a JVM thread (from configurable thread pools), also achieving multi-core parallelism. Python's asyncio multiplexes coroutines on a single thread, so it's concurrent but not parallel without reaching for multiprocessing.

Scheduling matters because it determines whether a long-running computation can starve other processes. Erlang is the gold standard here with reduction-counting preemption that guarantees fairness even for CPU-bound work. Go adopted signal-based preemption in 1.14 to prevent tight loops from hogging a core. Dart and Python are cooperative--a compute-bound isolate or coroutine must explicitly yield. Clojure and Ruby delegate to the OS/JVM thread scheduler.

Isolation has direct implications for data safety in FBP networks. Erlang and Dart processes have fully separate heaps and can only communicate by copying messages. Go and Python have shared memory, requiring discipline to avoid races. Clojure takes a middle path by encouraging immutable shared data. Ruby's ractors restrict sharing to frozen/shareable objects.

Backpressure determines whether a fast producer can overwhelm a slow consumer. Clojure's and Go's channels and Python's asyncio queues support bounded buffers that block senders when full--a natural fit for FBP. Erlang, Dart, and Ruby all have unbounded mailboxes/ports, meaning backpressure must be implemented at the application level.

Supervision captures how errors in one process are detected and handled by the network. Erlang's OTP supervisor trees are the most mature model. Clojure's core.async.flow centralizes errors onto a dedicated :error-chan. The others offer varying levels of support through error listeners, panic recovery, or exception propagation from tasks.

Community

Here follows a small sample of the fine folks developing FBP frameworks and/or producing useful content about this approach to programming:

@antonmi, @apiri, @artob, @bergie, @exceptionfactory, @goodlux, @jm9e, @joewitt, @jpaulm, @knolleary, @markap14, @mcgilman, @pavel-kirienko, @ryrobes, @samuell, @statusfailed, @trustmaster, @tyoung3

👉 Join the FBP Slack! (Historically, there was also an active Flow Based Programming Google group but these days it's unmaintained and has been overrun by spam. Still, lots of useful information in the archives over there.)

Credits

Kudos to @samuell for putting together the first Awesome FBP list over at samuell/awesome-fbp.


Share on X Share on Reddit Share on Hacker News Share on Facebook Share on LinkedIn

Footnotes

  1. Subnets were also known as "composite components" in classical FBP. ↩

  2. Components were described as "black boxes" in classical FBP. ↩

  3. Processes were interchangeably called "threads" in classical FBP. ↩

  4. Connections were also known as "bounded buffers" in classical FBP. ↩

awesome
dataflow
dataflow-programming
fbp
flow-based
flow-based-programming

Significant stargazers

David Lakin

65 followers · starred Jul 2026

Sarv

535 followers · starred Jul 2026