diff --git a/apidoc/Bonsai_Reactive_Append.md b/apidoc/Bonsai_Reactive_Append.md
new file mode 100644
index 00000000..5f0f403a
--- /dev/null
+++ b/apidoc/Bonsai_Reactive_Append.md
@@ -0,0 +1,5 @@
+---
+uid: Bonsai.Reactive.Append
+---
+
+[!include[Append](../articles/reactive-append.md)]
\ No newline at end of file
diff --git a/apidoc/Bonsai_Reactive_AsyncSubject.md b/apidoc/Bonsai_Reactive_AsyncSubject.md
index e02404e7..b618fcfa 100644
--- a/apidoc/Bonsai_Reactive_AsyncSubject.md
+++ b/apidoc/Bonsai_Reactive_AsyncSubject.md
@@ -2,4 +2,14 @@
uid: Bonsai.Reactive.AsyncSubject
---
-[!include[AsyncSubject](~/articles/subject-async.md)]
\ No newline at end of file
+[!include[AsyncSubject](~/articles/subject-async.md)]
+
+### Example
+
+Use `AsyncSubject` to broadcast the last value to any subscriber.
+
+:::workflow
+
+:::
+
+[!include[SubjectAlternatives](../articles/reactive-subjectalternatives.md)]
\ No newline at end of file
diff --git a/apidoc/Bonsai_Reactive_AsyncSubject_1.md b/apidoc/Bonsai_Reactive_AsyncSubject_1.md
index 7dad1a91..939e7704 100644
--- a/apidoc/Bonsai_Reactive_AsyncSubject_1.md
+++ b/apidoc/Bonsai_Reactive_AsyncSubject_1.md
@@ -2,4 +2,14 @@
uid: Bonsai.Reactive.AsyncSubject`1
---
-[!include[AsyncSubject](~/articles/subject-async.md)]
\ No newline at end of file
+[!include[AsyncSubject](~/articles/subject-async.md)]
+
+### Example
+
+Use `AsyncSubject` to broadcast the last value to any subscriber.
+
+:::workflow
+
+:::
+
+[!include[SubjectAlternatives](../articles/reactive-subjectalternatives.md)]
\ No newline at end of file
diff --git a/apidoc/Bonsai_Reactive_BehaviorSubject.md b/apidoc/Bonsai_Reactive_BehaviorSubject.md
index 2fd9b88e..1bf80b7b 100644
--- a/apidoc/Bonsai_Reactive_BehaviorSubject.md
+++ b/apidoc/Bonsai_Reactive_BehaviorSubject.md
@@ -2,4 +2,14 @@
uid: Bonsai.Reactive.BehaviorSubject
---
-[!include[BehaviorSubject](~/articles/subject-behavior.md)]
\ No newline at end of file
+[!include[BehaviorSubject](~/articles/subject-behavior.md)]
+
+### Example
+
+Use `BehaviorSubject` to broadcast the latest value to any subscriber.
+
+:::workflow
+
+:::
+
+[!include[SubjectAlternatives](../articles/reactive-subjectalternatives.md)]
\ No newline at end of file
diff --git a/apidoc/Bonsai_Reactive_BehaviorSubject_1.md b/apidoc/Bonsai_Reactive_BehaviorSubject_1.md
index 14890ff4..0b955f0b 100644
--- a/apidoc/Bonsai_Reactive_BehaviorSubject_1.md
+++ b/apidoc/Bonsai_Reactive_BehaviorSubject_1.md
@@ -2,4 +2,14 @@
uid: Bonsai.Reactive.BehaviorSubject`1
---
-[!include[BehaviorSubject](~/articles/subject-behavior.md)]
\ No newline at end of file
+[!include[BehaviorSubject](~/articles/subject-behavior.md)]
+
+### Example
+
+Use `BehaviorSubject` to broadcast the latest value to any subscriber.
+
+:::workflow
+
+:::
+
+[!include[SubjectAlternatives](../articles/reactive-subjectalternatives.md)]
\ No newline at end of file
diff --git a/apidoc/Bonsai_Reactive_CombineTimestamp.md b/apidoc/Bonsai_Reactive_CombineTimestamp.md
deleted file mode 100644
index 1231dee6..00000000
--- a/apidoc/Bonsai_Reactive_CombineTimestamp.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-uid: Bonsai.Reactive.CombineTimestamp
----
-
-[!include[CombineTimestamp](~/articles/reactive-combinetimestamp.md)]
\ No newline at end of file
diff --git a/apidoc/Bonsai_Reactive_CreateTimestamped.md b/apidoc/Bonsai_Reactive_CreateTimestamped.md
new file mode 100644
index 00000000..da371d9e
--- /dev/null
+++ b/apidoc/Bonsai_Reactive_CreateTimestamped.md
@@ -0,0 +1,5 @@
+---
+uid: Bonsai.Reactive.CreateTimestamped
+---
+
+[!include[CreateTimestamped](~/articles/reactive-createtimestamped.md)]
\ No newline at end of file
diff --git a/apidoc/Bonsai_Reactive_Prepend.md b/apidoc/Bonsai_Reactive_Prepend.md
new file mode 100644
index 00000000..b608249c
--- /dev/null
+++ b/apidoc/Bonsai_Reactive_Prepend.md
@@ -0,0 +1,5 @@
+---
+uid: Bonsai.Reactive.Prepend
+---
+
+[!include[Prepend](../articles/reactive-prepend.md)]
\ No newline at end of file
diff --git a/apidoc/Bonsai_Reactive_PublishSubject.md b/apidoc/Bonsai_Reactive_PublishSubject.md
index fa239258..0c8f971c 100644
--- a/apidoc/Bonsai_Reactive_PublishSubject.md
+++ b/apidoc/Bonsai_Reactive_PublishSubject.md
@@ -2,4 +2,14 @@
uid: Bonsai.Reactive.PublishSubject
---
-[!include[PublishSubject](~/articles/subject-publish.md)]
\ No newline at end of file
+[!include[PublishSubject](~/articles/subject-publish.md)]
+
+### Example
+
+Use `PublishSubject` to broadcast values to any subscriber.
+
+:::workflow
+
+:::
+
+[!include[SubjectAlternatives](../articles/reactive-subjectalternatives.md)]
\ No newline at end of file
diff --git a/apidoc/Bonsai_Reactive_PublishSubject_1.md b/apidoc/Bonsai_Reactive_PublishSubject_1.md
index aa4e57a8..8964443a 100644
--- a/apidoc/Bonsai_Reactive_PublishSubject_1.md
+++ b/apidoc/Bonsai_Reactive_PublishSubject_1.md
@@ -2,4 +2,14 @@
uid: Bonsai.Reactive.PublishSubject`1
---
-[!include[PublishSubject](~/articles/subject-publish.md)]
\ No newline at end of file
+[!include[PublishSubject](~/articles/subject-publish.md)]
+
+### Example
+
+Use `PublishSubject` to broadcast values to any subscriber.
+
+:::workflow
+
+:::
+
+[!include[SubjectAlternatives](../articles/reactive-subjectalternatives.md)]
\ No newline at end of file
diff --git a/apidoc/Bonsai_Reactive_ReplaySubject.md b/apidoc/Bonsai_Reactive_ReplaySubject.md
index 88fa1deb..ea36e0cf 100644
--- a/apidoc/Bonsai_Reactive_ReplaySubject.md
+++ b/apidoc/Bonsai_Reactive_ReplaySubject.md
@@ -2,4 +2,14 @@
uid: Bonsai.Reactive.ReplaySubject
---
-[!include[ReplaySubject](~/articles/subject-replay.md)]
\ No newline at end of file
+[!include[ReplaySubject](~/articles/subject-replay.md)]
+
+### Example
+
+Use `ReplaySubject` to broadcast all past and future values to any subscriber.
+
+:::workflow
+
+:::
+
+[!include[SubjectAlternatives](../articles/reactive-subjectalternatives.md)]
\ No newline at end of file
diff --git a/apidoc/Bonsai_Reactive_ReplaySubject_1.md b/apidoc/Bonsai_Reactive_ReplaySubject_1.md
index cae459b3..26f4cea0 100644
--- a/apidoc/Bonsai_Reactive_ReplaySubject_1.md
+++ b/apidoc/Bonsai_Reactive_ReplaySubject_1.md
@@ -2,4 +2,14 @@
uid: Bonsai.Reactive.ReplaySubject`1
---
-[!include[ReplaySubject](~/articles/subject-replay.md)]
\ No newline at end of file
+[!include[ReplaySubject](~/articles/subject-replay.md)]
+
+### Example
+
+Use `ReplaySubject` to broadcast all past and future values to any subscriber.
+
+:::workflow
+
+:::
+
+[!include[SubjectAlternatives](../articles/reactive-subjectalternatives.md)]
\ No newline at end of file
diff --git a/apidoc/Bonsai_Reactive_ResourceSubject.md b/apidoc/Bonsai_Reactive_ResourceSubject.md
index 07d8f60a..4193efeb 100644
--- a/apidoc/Bonsai_Reactive_ResourceSubject.md
+++ b/apidoc/Bonsai_Reactive_ResourceSubject.md
@@ -2,4 +2,8 @@
uid: Bonsai.Reactive.ResourceSubject
---
-[!include[ResourceSubject](~/articles/subject-resource.md)]
\ No newline at end of file
+[!include[ResourceSubject](~/articles/subject-resource.md)]
+
+### Alternative
+
+`ResourceSubject` is primarily used in niche applications involving device objects. For more typical scenarios, use [`AsyncSubject`](xref:Bonsai.Reactive.AsyncSubject) instead to broadcast the last value to subscribers.
\ No newline at end of file
diff --git a/apidoc/Bonsai_Reactive_ResourceSubject_1.md b/apidoc/Bonsai_Reactive_ResourceSubject_1.md
index 831eec4e..52dc500f 100644
--- a/apidoc/Bonsai_Reactive_ResourceSubject_1.md
+++ b/apidoc/Bonsai_Reactive_ResourceSubject_1.md
@@ -2,4 +2,8 @@
uid: Bonsai.Reactive.ResourceSubject`1
---
-[!include[ResourceSubject](~/articles/subject-resource.md)]
\ No newline at end of file
+[!include[ResourceSubject](~/articles/subject-resource.md)]
+
+### Alternative
+
+`ResourceSubject` is primarily used in niche applications involving device objects. For more typical scenarios, use [`AsyncSubject`](xref:Bonsai.Reactive.AsyncSubject) instead to broadcast the last value to subscribers.
\ No newline at end of file
diff --git a/articles/reactive-accumulate.md b/articles/reactive-accumulate.md
index 5044e3ab..32bca30d 100644
--- a/articles/reactive-accumulate.md
+++ b/articles/reactive-accumulate.md
@@ -6,3 +6,15 @@ title: Accumulate

The `Accumulate` operator returns the current value of the cumulative sum each time the source sequence emits a notification. The result sequence terminates successfully when the source sequence terminates successfully.
+
+### Example
+
+Use `Accumulate` to continuously update a value by adding up the changes over time.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`Sum`](xref:Bonsai.Reactive.Sum) instead to yield a single accumulated value at the end of a sequence.
\ No newline at end of file
diff --git a/articles/reactive-amb.md b/articles/reactive-amb.md
index 3508e5dc..5baedae0 100644
--- a/articles/reactive-amb.md
+++ b/articles/reactive-amb.md
@@ -6,3 +6,15 @@ title: Amb

The `Amb` operator sets up a winner-take-all race condition between all source sequences. The first sequence to emit a notification will gain full control of the output, and all the other sequences will have their subscriptions immediatelly cancelled. `Amb` is most commonly used to ensure only one of many outcomes being evaluated in parallel is propagated.
+
+### Example
+
+Use `Amb` to propagate the first observable sequence that emits notifications.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`Switch`](xref:Bonsai.Reactive.Switch) instead to propagate the latest observable sequence that emits notifications from a sequence of observable sequences.
\ No newline at end of file
diff --git a/articles/reactive-append.md b/articles/reactive-append.md
new file mode 100644
index 00000000..4830f791
--- /dev/null
+++ b/articles/reactive-append.md
@@ -0,0 +1,16 @@
+---
+uid: reactive-append
+title: Append
+---
+
+### Example
+
+Use `Append` to add an element to the end of a sequence.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`Prepend`](xref:Bonsai.Reactive.Prepend) instead to add an element to the beginning of a sequence.
\ No newline at end of file
diff --git a/articles/reactive-average.md b/articles/reactive-average.md
index 50b0c7b1..76471d17 100644
--- a/articles/reactive-average.md
+++ b/articles/reactive-average.md
@@ -6,3 +6,25 @@ title: Average

The `Average` operator collects all the values from the source sequence and emits a single floating-point number representing their arithmetic mean. The single result value is emitted only when the source sequence terminates successfully.
+
+### Examples
+
+Use `Average` to report the mean value at the end of the sequence.
+
+:::workflow
+
+:::
+
+#### Signal Smoothing
+
+Use `Average` to smooth a noisy signal by grouping elements with [`WindowCount`](xref:Bonsai.Reactive.WindowCount), then applying `Average` inside a [`SelectMany`](xref:Bonsai.Reactive.SelectMany).
+
+:::workflow
+
+:::
+
+> [!NOTE]
+> This operation is equivalent to [downsampling](https://en.wikipedia.org/wiki/Downsampling_(signal_processing)) and reduces the number of elements in the sequence. To implement a [moving average](https://en.wikipedia.org/wiki/Moving_average) that preserves the number of elements, you can adjust the `Skip` property in [`WindowCount`](xref:Bonsai.Reactive.WindowCount) to create sliding windows.
+
+> [!NOTE]
+> This example requires the `Bonsai.Design.Visualizers` package to be installed.
\ No newline at end of file
diff --git a/articles/reactive-buffercount.md b/articles/reactive-buffercount.md
index 3fe7e272..04430821 100644
--- a/articles/reactive-buffercount.md
+++ b/articles/reactive-buffercount.md
@@ -8,3 +8,17 @@ title: Buffer
`BufferCount` groups the notifications of the source sequence into chunks containing the number of elements specified in the property. The overlap between the elements in each chunk can be controlled using the property.
If no skip value is provided, the chunks will be strictly non-overlapping, with a new chunk beginning when the previous chunk ends. If the skip value is less than the specified number of elements, chunks will be overlapping, with a new buffer created every `Skip` notifications. Finally, if the skip value is greater than the specified number of elements, there will be a gap between each chunk where elements from the source sequence will be dropped.
+
+### Example
+
+Use `BufferCount` to group elements into zero or more buffers based on element count.
+
+:::workflow
+
+:::
+
+### Alternatives
+
+Use [`BufferTime`](xref:Bonsai.Reactive.BufferTime) instead to group elements into zero or more buffers based on timing information.
+
+Use [`WindowCount`](xref:Bonsai.Reactive.WindowCount) instead to create new observable sequences based on element count.
\ No newline at end of file
diff --git a/articles/reactive-buffertime.md b/articles/reactive-buffertime.md
index 20ae4af0..c4077540 100644
--- a/articles/reactive-buffertime.md
+++ b/articles/reactive-buffertime.md
@@ -8,3 +8,17 @@ title: BufferTime
The `BufferTime` operator groups the notifications of the source sequence into chunks, where each chunk contains the elements emitted during the specified . The overlap between the elements in each chunk can be controlled using the property.
If no `TimeShift` is provided, the chunks will be strictly non-overlapping, with a new chunk beginning when the previous chunk ends. If `TimeShift` is smaller than `TimeSpan`, chunks will be overlapping, with a new buffer created every `TimeShift` interval. Finally, if `TimeShift` is larger than `TimeSpan`, there will be a time gap between each chunk where elements from the source sequence may be dropped.
+
+### Example
+
+Use `BufferTime` to group elements into zero or more buffers based on timing information.
+
+:::workflow
+
+:::
+
+### Alternatives
+
+Use [`BufferCount`](xref:Bonsai.Reactive.BufferCount) instead to group elements into zero or more buffers based on element count.
+
+Use [`WindowTime`](xref:Bonsai.Reactive.WindowTime) instead to create new observable sequences based on timing information.
\ No newline at end of file
diff --git a/articles/reactive-buffertrigger.md b/articles/reactive-buffertrigger.md
index 819ae144..dfdcb26d 100644
--- a/articles/reactive-buffertrigger.md
+++ b/articles/reactive-buffertrigger.md
@@ -10,3 +10,15 @@ title: BufferTrigger
If neither buffer count nor buffer time span are specified, chunks will be strictly non-overlapping, with the previous chunk being closed when a new chunk is created. In this case, and only this case, the first chunk is also created immediately at the start of the sequence.
If the `Count` property or the `TimeSpan` property is specified, then a new chunk is created when the second sequence emits a notification, and it is automatically closed after either the specified number of elements is collected or the specified time span elapses. If a new chunk is created before the previous chunk is closed, then chunks will overlap, and any elements emitted during this period will be included in both buffers. If at any moment there is no open buffer, elements emitted from the source sequence will be dropped.
+
+### Example
+
+Use `BufferTrigger` to group elements into zero or more buffers based on notifications from a second sequence.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`WindowTrigger`](xref:Bonsai.Reactive.WindowTrigger) instead to group elements into zero or more observable sequences based on notifications from a second sequence.
\ No newline at end of file
diff --git a/articles/reactive-catch.md b/articles/reactive-catch.md
index 09d86ea0..63f19a44 100644
--- a/articles/reactive-catch.md
+++ b/articles/reactive-catch.md
@@ -7,4 +7,18 @@ title: Catch
The `Catch` operator allows you to handle error notifications from a sequence by combining the output of multiple fallback sequences of the same type into a single sequence. `Catch` subscribes to the next sequence when the previous sequence produces an error, and emits all the values from that sequence until successful termination. If that sequence also terminates exceptionally, `Catch` then subscribes to the next sequence, and so forth. Each sequence is guaranteed to only start after the previous one terminates.
-The resulting sequence will terminate successfully when any of the source sequences has terminated successfully, or exceptionally when all sequences have terminated with an error.
\ No newline at end of file
+The resulting sequence will terminate successfully when any of the source sequences has terminated successfully, or exceptionally when all sequences have terminated with an error.
+
+### Example
+
+Use `Catch` to continue an observable sequence that terminated with an exception with the next observable sequence.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`Retry`](xref:Bonsai.Reactive.Retry) instead to repeat subscription to the observable sequence if it terminates with an exception.
+
+Use [`OnErrorResumeNext`](xref:Bonsai.Reactive.OnErrorResumeNext) instead to avoid raising an exception when all sequences have terminated with an error.
\ No newline at end of file
diff --git a/articles/reactive-combinelatest.md b/articles/reactive-combinelatest.md
index 7f1ebbbb..8a927f2c 100644
--- a/articles/reactive-combinelatest.md
+++ b/articles/reactive-combinelatest.md
@@ -7,13 +7,38 @@ title: CombineLatest
`CombineLatest` combines the values from each sequence which are closest in time. Whenever any of the source sequences emits a value (as long as all source sequences have emitted at least one value), `CombineLatest` takes the most recently emitted values from all other sequences and creates the combined result. `CombineLatest` will continue to emit values as long as at least one source sequence remains active (i.e. without terminating).
-`CombineLatest` can be useful to temporally correlate separate sources (e.g. frames from different cameras, or the closest frame to a key press). It can also be useful when combining a sequence containing a single reference value with a possibly infinite sequence of values to be associated with the reference (e.g. subtracting a background from every frame).
+### Examples
+
+Use `CombineLatest` to combine multiple sources in time.
+
+:::workflow
+
+:::
> [!Warning]
-> Because `CombineLatest` emits a combined value whenever *any* of the source sequences emits a new value, the number of values emitted by `CombineLatest` is approximately the sum of the number of values in each sequence. If you need to discard redundant values you can filter the output, e.g. using [`Sample`](xref:Bonsai.Reactive.Sample) to use one of the source sequences as a master driver.
+> As `CombineLatest` emits a combined value whenever *any* of the source sequences emits a new value, the number of values emitted by `CombineLatest` is approximately the sum of the number of values in each sequence. If you want to use only one of the source sequences as a master driver and discard redundant values, consider using [`Sample`](xref:Bonsai.Reactive.Sample).
+
+:::workflow
+
+:::
+
+#### Video Synchronization
+
+Use `CombineLatest` to combine multiple sources (e.g. frames from different cameras).
+
+:::workflow
+
+:::
+
+> [!NOTE]
+> This example requires the `Bonsai.Dsp`, `Bonsai.Vision` and `Bonsai.Vision.Design` packages to be installed.
+
+### Alternative
+
+Use [`WithLatestFrom`](xref:Bonsai.Reactive.WithLatestFrom) if you only need to combine two sources and want to discard redundant values.
### Higher-order operator
`CombineLatest` also works as a higher-order operator, so it can take as input a sequence of observable sequences. In this case, it will subscribe to each of the source sequences and start collecting all the latest values from each sequence. As soon as the outer sequence terminates, it will start reactively combining the latest values whenever any sequence changes, just as in the case of using `CombineLatest` with a fixed number of inputs.
-
+
\ No newline at end of file
diff --git a/articles/reactive-combinetimestamp.md b/articles/reactive-combinetimestamp.md
deleted file mode 100644
index 4ef8defc..00000000
--- a/articles/reactive-combinetimestamp.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-uid: reactive-combinetimestamp
-title: CombineTimestamp
----
-
-
-
-`CombineTimestamp` is used primarily to create a sequence of values for downstream operators, when timestamps have been extracted from other sources.
-
-Alternatively, `CombineTimestamp` can be used to preserve the value of a timestamp during post-processing operations. In this case, even though the timestamped value may be transformed multiple times, we can keep the original acquisition timestamp in a branch and use the operator followed by `CombineTimestamp` to carry the timestamp value forward.
-
-:::workflow
-
-:::
diff --git a/articles/reactive-concat.md b/articles/reactive-concat.md
index 59fcb485..4ccc7333 100644
--- a/articles/reactive-concat.md
+++ b/articles/reactive-concat.md
@@ -9,6 +9,31 @@ The `Concat` operator allows you to combine the output of multiple sequences of
The resulting sequence will terminate successfully when the last source sequence has terminated successfully, or exceptionally as soon as any sequence produces an error.
+### Examples
+
+Use `Concat` to sequentially combine the outputs of multiple sequences.
+
+:::workflow
+
+:::
+
+#### Stimulus Composition
+
+Use `Concat` to create a stimulus sequence by combining multiple preloaded or defined sequences.
+
+:::workflow
+
+:::
+
+> [!NOTE]
+> This example requires the `Bonsai.Vision` and `Bonsai.Vision.Design` packages to be installed. Load separate images into each [`LoadImage`](xref:Bonsai.Vision.LoadImage) operator.
+
+### Alternative
+
+Use [`Merge`](xref:Bonsai.Reactive.Merge) instead if you want to combine sequences in parallel online.
+
+Use [`OnErrorResumeNext`](xref:Bonsai.Reactive.OnErrorResumeNext) instead to concatenate multiple observable sequences, even if one or more terminate with an error.
+
### Higher-order operator
`Concat` also works as a higher-order operator, so it can take as input a sequence of observable sequences. In this case, it will subscribe to the first source sequence and start passing along all emitted values. As soon as that sequence terminates, it will subscribe to the next received sequence, either immediately if it arrived before termination of the first sequence, or as soon as a new observable sequence is emitted.
diff --git a/articles/reactive-condition.md b/articles/reactive-condition.md
index 381b4ec6..14f4d501 100644
--- a/articles/reactive-condition.md
+++ b/articles/reactive-condition.md
@@ -7,8 +7,16 @@ title: Condition
The nested workflow specifying the condition must return a sequence of type . This nested sequence may be synchronous or asynchronous with respect to notifications from the source sequence. After each element is emitted by the source sequence, the latest value from the nested sequence is checked. If the value is `true` then the element will be accepted and emitted by the result sequence. Otherwise, the element will be dropped.
-As an example of asynchronous condition evaluation, it is possible to build a simple manual toggle by using a connected directly to the output of the nested workflow:
+### Example
+
+Use `Condition` to filter elements of an observable sequence according to the nested workflow.
:::workflow
-
+
:::
+
+As an example of asynchronous condition evaluation, it is possible to build a simple manual toggle by using a connected directly to the output of the nested workflow:
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-count.md b/articles/reactive-count.md
index ca81dfdf..73ad9a0b 100644
--- a/articles/reactive-count.md
+++ b/articles/reactive-count.md
@@ -5,4 +5,16 @@ title: Count

-The `Count` operator collects all the values from the source sequence and emits a single value representing the total number of items. The single result value is emitted only when the source sequence terminates successfully.
\ No newline at end of file
+The `Count` operator collects all the values from the source sequence and emits a single value representing the total number of items. The single result value is emitted only when the source sequence terminates successfully.
+
+### Example
+
+Use `Count` to report the total count of elements at the end of a sequence.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`ElementIndex`](xref:Bonsai.Reactive.ElementIndex) instead to continuously track the number of elements in the sequence.
\ No newline at end of file
diff --git a/articles/reactive-createobservable.md b/articles/reactive-createobservable.md
index 9b6093e7..aab2b081 100644
--- a/articles/reactive-createobservable.md
+++ b/articles/reactive-createobservable.md
@@ -11,3 +11,15 @@ For each notification in the source sequence, `CreateObservable` constructs a ne
> You can manipulate and schedule each of the emitted observable sequences downstream using higher-order operators such as [`Merge`](xref:Bonsai.Reactive.Merge), [`Concat`](xref:Bonsai.Reactive.Concat) or [`Switch`](xref:Bonsai.Reactive.Switch).
The input to the nested workflow represents the element passed as an argument to the asynchronous operation. If the input is itself an observable sequence, the [WorkflowInput](xref:Bonsai.Expressions.WorkflowInputBuilder) node will subscribe to all the values in the sequence when the asynchronous operation is finally launched. Otherwise, the input will emit a single value containing the stored argument value.
+
+### Example
+
+Use `CreateObservable` to create higher-order observable sequences.
+
+:::workflow
+
+:::
+
+### Alternatives
+
+Use [`SelectMany`](xref:Bonsai.Reactive.SelectMany) instead to create higher-order observable sequences and merge them into a single sequence.
\ No newline at end of file
diff --git a/articles/reactive-createtimestamped.md b/articles/reactive-createtimestamped.md
new file mode 100644
index 00000000..e53eadc1
--- /dev/null
+++ b/articles/reactive-createtimestamped.md
@@ -0,0 +1,16 @@
+---
+uid: reactive-createtimestamped
+title: CreateTimestamped
+---
+
+
+
+`CreateTimestamped` is used primarily to create a sequence of values for downstream operators, when timestamps have been extracted from other sources. Alternatively, `CreateTimestamped` can be used to preserve the value of a timestamp during post-processing operations.
+
+### Example
+
+Use `CreateTimestamped` to carry forward and preserve a timestamp value during post-processing.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-delay.md b/articles/reactive-delay.md
index 8c681afe..76c9895a 100644
--- a/articles/reactive-delay.md
+++ b/articles/reactive-delay.md
@@ -8,3 +8,15 @@ title: Delay
The `Delay` operator modifies the source sequence by pausing for the specified duration before emitting each of the notifications in the original sequence. This has the effect of delaying the timing of the entire sequence of notifications by that specified time interval.
`Delay` is useful to model delayed responses to events in a control task, but also to access past data from a continuous stream in the future. In other words, if the stream timing is delayed, then any downstream observers grabbing data in the present moment will be receiving notifications from the past. For example, if you are recording data aligned on a temporal trigger detected in real-time, you can record data before the trigger simply by triggering the delayed sequence.
+
+### Example
+
+Use `Delay` to delay emission of elements from an observable sequence.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`DelaySubscription`](xref:Bonsai.Reactive.DelaySubscription) to delay initialization of an observable sequence.
diff --git a/articles/reactive-delaysubscription.md b/articles/reactive-delaysubscription.md
index c96c2a23..ac0502a5 100644
--- a/articles/reactive-delaysubscription.md
+++ b/articles/reactive-delaysubscription.md
@@ -8,3 +8,15 @@ title: DelaySubscription
The `DelaySubscription` operator modifies the source sequence by pausing for the specified duration before subscribing to the original sequence. This has the effect of delaying the start of the sequence by the specified time interval.
`DelaySubscription` can be used to control the timing of initialization. Note that if a source is [*hot*](xref:observables#temperature), delaying the start of the sequence will not preserve past data, since unlike [`Delay`](xref:Bonsai.Reactive.Delay) the `DelaySubscription` operator does not store or have access to any historical data.
+
+### Example
+
+Use `DelaySubscription` to delay initialization of an observable sequence.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`Delay`](xref:Bonsai.Reactive.Delay) to access past data from [*hot*](xref:observables#temperature) sequences or delay notifications of an observable sequence.
\ No newline at end of file
diff --git a/articles/reactive-dematerialize.md b/articles/reactive-dematerialize.md
index 0fcb073c..6a69a716 100644
--- a/articles/reactive-dematerialize.md
+++ b/articles/reactive-dematerialize.md
@@ -6,3 +6,11 @@ title: Dematerialize

`Dematerialize` is the complement of . `Dematerialize` reconstructs the implicit notifications of an observable sequence from a sequence of explicit notifications. This can be useful if you have materialized a sequence for debugging or logging purposes but still need to retain the original sequence.
+
+### Example
+
+Use `Dematerialize` to convert explicit notifications back to implicit notifications.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-distinct.md b/articles/reactive-distinct.md
index 0b43b77a..b57c3006 100644
--- a/articles/reactive-distinct.md
+++ b/articles/reactive-distinct.md
@@ -6,3 +6,15 @@ title: Distinct

The `Distinct` operator ensures that only unique elements are included in the result sequence. Uniqueness is specified by the default for the type of the elements in the source sequence. If multiple non-unique elements are present in the source sequence, only the first element will be included in the result sequence.
+
+### Example
+
+Use `Distinct` to extract unique elements from a sequence.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`DistinctUntilChanged`](xref:Bonsai.Reactive.DistinctUntilChanged) to extract elements that are distinct from the previous element.
\ No newline at end of file
diff --git a/articles/reactive-distinctby.md b/articles/reactive-distinctby.md
index c3f837e0..23c603bb 100644
--- a/articles/reactive-distinctby.md
+++ b/articles/reactive-distinctby.md
@@ -6,3 +6,11 @@ title: DistinctBy

The `DistinctBy` operator ensures that only unique elements are included in the result sequence. The property specifies the member, or set of members, to use to test the uniqueness of each element in the source sequence. The default for the type of the selected key is used to check whether each key is unique. If multiple non-unique keys are present in the source sequence, only the first element emitted with a given key will be included in the result sequence.
+
+### Example
+
+Use `DistinctBy` to return distinct elements as determined by the specified key.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-distinctuntilchanged.md b/articles/reactive-distinctuntilchanged.md
index 3c290eda..326afb29 100644
--- a/articles/reactive-distinctuntilchanged.md
+++ b/articles/reactive-distinctuntilchanged.md
@@ -8,3 +8,22 @@ title: DistinctUntilChanged
The `DistinctUntilChanged` operator removes all contiguous elements in the sequence that are equal. Equality is determined by the default for the type of the elements in the source sequence.
In other words, after each element is emitted by the result sequence, subsequent elements will be dropped until the value changes.
+
+### Example
+
+Use `DistinctUntilChanged` to filter out elements which are identical to the previous one.
+
+:::workflow
+
+:::
+
+#### Signal State Transitions
+
+Use `DistinctUntilChanged` to signal changes in [state](../tutorials/state-machines.md), such as when an object enters or leaves a region of interest.
+
+:::workflow
+
+:::
+
+> [!NOTE]
+> This example requires the `Bonsai.WindowsInput` package to be installed.
\ No newline at end of file
diff --git a/articles/reactive-distinctuntilchangedby.md b/articles/reactive-distinctuntilchangedby.md
index ba2ed691..7b357de5 100644
--- a/articles/reactive-distinctuntilchangedby.md
+++ b/articles/reactive-distinctuntilchangedby.md
@@ -8,3 +8,11 @@ title: DistinctUntilChangedBy
The `DistinctUntilChangedBy` operator removes all contiguous elements in the sequence with equal keys. The property specifies the member, or set of members, used to test whether elements in the source sequence are equal. Equality is determined by the default for the type of the selected key.
In other words, after each element is emitted by the result sequence, subsequent elements will be dropped until the value of the key changes.
+
+### Example
+
+Use `DistinctUntilChangedBy` to return non-contiguous distinct elements as determined by the specified key.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-elementindex.md b/articles/reactive-elementindex.md
index 829f2aa1..34422baf 100644
--- a/articles/reactive-elementindex.md
+++ b/articles/reactive-elementindex.md
@@ -6,3 +6,11 @@ title: ElementIndex

`ElementIndex` can be used to incrementally keep a tally of the number of elements in a sequence. It is also often used as the first step in custom index-dependent computations.
+
+### Example
+
+Use `ElementIndex` to incorporate a tally of the number of elements.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-first.md b/articles/reactive-first.md
index 0f0cfd50..086e4d03 100644
--- a/articles/reactive-first.md
+++ b/articles/reactive-first.md
@@ -10,7 +10,21 @@ If the sequence has no elements, `First` will terminate with an error.
> [!Tip]
> If you are interested in finding the first element that meets some criteria, consider using the [`Condition`](xref:Bonsai.Reactive.Condition) operator before `First`.
+### Example
+
+Use `First` to retrieve the first element of a sequence.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`Take`](xref:Bonsai.Reactive.Take) to retrieve one or more elements from the start of the sequence.
+
> [!Warning]
> There are subtle but important differences between using the `First` operator and [`Take(1)`](xref:Bonsai.Reactive.Take):
-> - When the source sequence has no elements, `Take(1)` will complete successfully, while `First` will throw an error.
-> - When the source sequence emits the first element, `Take(1)` will immediately cancel the subscription to the source sequence before emitting the notification. `First`, on the other hand, will emit the notification and only afterwards cancel the subscription to the source sequence.
+> - When the source sequence has no elements, [`Take(1)`](xref:Bonsai.Reactive.Take) will complete successfully, while `First` will throw an error.
+> - When the source sequence emits the first element, [`Take(1)`](xref:Bonsai.Reactive.Take) will immediately cancel the subscription to the source sequence before emitting the notification. `First`, on the other hand, will emit the notification and only afterwards cancel the subscription to the source sequence.
+
+Use [`FirstOrDefault`](xref:Bonsai.Reactive.FirstOrDefault) to retrieve the first element or return a default element if the sequence is empty.
\ No newline at end of file
diff --git a/articles/reactive-firstordefault.md b/articles/reactive-firstordefault.md
index a835902f..bc57bfb1 100644
--- a/articles/reactive-firstordefault.md
+++ b/articles/reactive-firstordefault.md
@@ -5,12 +5,24 @@ title: FirstOrDefault

-If the sequence has no elements, `FirstOrDefault` will emit a default value before terminating successfully.
+If the sequence has no elements, `FirstOrDefault` will emit a [default](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/default-values) value before terminating successfully.
> [!Tip]
> If you are interested in finding the first element that meets some criteria, consider using the [`Condition`](xref:Bonsai.Reactive.Condition) operator before `FirstOrDefault`.
+### Example
+
+Use `FirstOrDefault` to retrieve the first element of a sequence or a default value if the sequence is empty.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`Take`](xref:Bonsai.Reactive.Take) to retrieve one or more elements from the start of the sequence.
+
> [!Warning]
> There are subtle but important differences between using the `FirstOrDefault` operator and [`Take(1)`](xref:Bonsai.Reactive.Take):
> - When the source sequence has no elements, `Take(1)` will complete successfully with no emitted values, while `FirstOrDefault` will emit a default value before terminating successfully.
-> - When the source sequence emits the first element, `Take(1)` will immediately cancel the subscription to the source sequence before emitting the notification. `FirstOrDefault`, on the other hand, will emit the notification and only afterwards cancel the subscription to the source sequence.
+> - When the source sequence emits the first element, `Take(1)` will immediately cancel the subscription to the source sequence before emitting the notification. `FirstOrDefault`, on the other hand, will emit the notification and only afterwards cancel the subscription to the source sequence.
\ No newline at end of file
diff --git a/articles/reactive-gate.md b/articles/reactive-gate.md
index 78a43c92..9273588a 100644
--- a/articles/reactive-gate.md
+++ b/articles/reactive-gate.md
@@ -13,3 +13,17 @@ If a maximum due time is specified, no elements from the source sequence arrivin
> [!Warning]
> If the second sequence emits notifications before the gate is closed, the gate will remain open. If there is a maximum specified due time, the timer will be reset upon arrival of the new notification. Even if there are multiple opening notifications, only a single element can make it through the gate.
+
+### Example
+
+Use `Gate` to allow a single element from the source sequence to pass through each time a second sequence sends a trigger.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`GateInterval`](xref:Bonsai.Reactive.GateInterval) to gate elements based on time.
+
+Use [`WindowTrigger`](xref:Bonsai.Reactive.WindowTrigger) or [`BufferTrigger`](xref:Bonsai.Reactive.BufferTrigger) to allow more than one element to pass through.
\ No newline at end of file
diff --git a/articles/reactive-gateinterval.md b/articles/reactive-gateinterval.md
index bfc34dcd..8f0278ad 100644
--- a/articles/reactive-gateinterval.md
+++ b/articles/reactive-gateinterval.md
@@ -8,3 +8,19 @@ title: GateInterval
The gate starts in the open state, and a single element is allowed to pass through from the source sequence. After this first element is emitted, the gate closes and all subsequent elements are dropped from the result sequence. The gate reopens when the specified elapses.
It is possible to specify how long the gate stays open by using the property. If no value is specified, the gate stays open indefinitely until an element arrives. If a maximum due time is specified, then no elements from the source sequence arriving after the due time elapses will be allowed through until the gate reopens.
+
+### Example
+
+Use `GateInterval` to extract the first element from a source sequence that is emitted within the time interval.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`SampleInterval`](xref:Bonsai.Reactive.SampleInterval) to extract the latest element from a source sequence that is emitted within the time interval.
+
+Use [`Slice`](xref:Bonsai.Reactive.Slice) to extract elements based on element count instead of time.
+
+Use [`Gate`](xref:Bonsai.Reactive.Gate) to gate elements based on the notifications from another sequence.
\ No newline at end of file
diff --git a/articles/reactive-groupby.md b/articles/reactive-groupby.md
index 2111764e..5c7e65e3 100644
--- a/articles/reactive-groupby.md
+++ b/articles/reactive-groupby.md
@@ -12,3 +12,11 @@ The `GroupBy` operator can be used to separate, or demultiplex, the elements fro
> You can manipulate and schedule each of the group sequences downstream using other higher-order operators such as [`Merge`](xref:Bonsai.Reactive.Merge), [`Concat`](xref:Bonsai.Reactive.Concat) or [`Switch`](xref:Bonsai.Reactive.Switch).
The members used to generate the elements in each group sequence can be optionally specified using the property. If no element selector is specified, the original values from the source sequence will be used.
+
+### Example
+
+Use `GroupBy` to separate out elements from a multiplexed sequence.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-ignoreelements.md b/articles/reactive-ignoreelements.md
index cba6811b..f7a9d087 100644
--- a/articles/reactive-ignoreelements.md
+++ b/articles/reactive-ignoreelements.md
@@ -7,3 +7,11 @@ title: IgnoreElements
> [!Tip]
> This operator can sometimes be useful when only the type of the sequence is important, and not its elements. The compiler will still check the correct type of the sequence even if no elements are emitted.
+
+### Examples
+
+Use `IgnoreElements` to ignore all elements, leaving only termination messages.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-isempty.md b/articles/reactive-isempty.md
index 2714930d..7335b4ea 100644
--- a/articles/reactive-isempty.md
+++ b/articles/reactive-isempty.md
@@ -6,3 +6,11 @@ title: IsEmpty

If the source sequence completes before returning any elements, the `IsEmpty` operator will emit a single value `true` before terminating successfully. If the source sequence emits any element, `IsEmpty` will immediately emit a single value `false`, terminate successfully, and cancel the subscription to the source sequence.
+
+### Example
+
+Use `IsEmpty` to check if a sequence is empty.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-last.md b/articles/reactive-last.md
index 933bf6bc..4a9f1ad8 100644
--- a/articles/reactive-last.md
+++ b/articles/reactive-last.md
@@ -5,4 +5,21 @@ title: Last

-If the sequence has no elements, `Last` will terminate with an error. This is a subtle but important difference between the `Last` operator and [`TakeLast(1)`](xref:Bonsai.Reactive.TakeLast), which will complete successfully when the source sequence has no elements.
+If the sequence has no elements, `Last` will terminate with an error.
+
+### Example
+
+Use `Last` to retrieve the last element of a sequence.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`TakeLast`](xref:Bonsai.Reactive.TakeLast) to retrieve one or more elements from the end of the sequence.
+
+> [!Warning]
+> There is a subtle but important difference between the `Last` operator and [`TakeLast(1)`](xref:Bonsai.Reactive.TakeLast). [`TakeLast(1)`](xref:Bonsai.Reactive.TakeLast) will complete successfully when the source sequence has no elements.
+
+Use [`LastOrDefault`](xref:Bonsai.Reactive.LastOrDefault) to retrieve the last element or return a default element if the sequence is empty.
\ No newline at end of file
diff --git a/articles/reactive-lastordefault.md b/articles/reactive-lastordefault.md
index edbd5f27..63135fd9 100644
--- a/articles/reactive-lastordefault.md
+++ b/articles/reactive-lastordefault.md
@@ -5,7 +5,21 @@ title: LastOrDefault

-If the sequence has no elements, `LastOrDefault` will emit a default value before terminating successfully. This is a subtle but important difference between the `LastOrDefault` operator and [`TakeLast(1)`](xref:Bonsai.Reactive.TakeLast), which will also complete successfully when the source sequence is empty, but will not emit any values.
+If the sequence has no elements, `LastOrDefault` will emit a [default](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/default-values) value before terminating successfully.
> [!Tip]
> `LastOrDefault` is one of the simplest and most efficient ways of capturing the end of an observable sequence explicitly as a notification in the workflow. You can use it to react to the termination of a sequence regardless of whether that sequence produces values.
+
+### Example
+
+Use `LastOrDefault` to retrieve the last element of a sequence or a default value if the sequence is empty.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`TakeLast`](xref:Bonsai.Reactive.TakeLast) to retrieve one or more elements from the end of the sequence.
+
+This is a subtle but important difference between the `LastOrDefault` operator and [`TakeLast(1)`](xref:Bonsai.Reactive.TakeLast), which will also complete successfully when the source sequence is empty, but will not emit any values.
\ No newline at end of file
diff --git a/articles/reactive-materialize.md b/articles/reactive-materialize.md
index afa77f94..d7fe26b9 100644
--- a/articles/reactive-materialize.md
+++ b/articles/reactive-materialize.md
@@ -8,3 +8,11 @@ title: Materialize
`Materialize` surfaces all notifications in the source sequence as explicit values, including termination messages ( and ). Converting termination messages into explicit notifications can be useful to reveal the entire behavior of a sequence for debugging or logging purposes.
The application of `Materialize` can be reversed by applying to the result sequence.
+
+### Example
+
+Use `Materialize` to surface implicit notifications as explicit notifications.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-max.md b/articles/reactive-max.md
index 550b777d..8c357ced 100644
--- a/articles/reactive-max.md
+++ b/articles/reactive-max.md
@@ -6,3 +6,11 @@ title: Max

The `Max` operator collects all the values from the source sequence and emits a single value representing the largest of all values. The single result value is emitted only when the source sequence terminates successfully.
+
+### Example
+
+Use `Max` to report the maximum value at the end of the sequence.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-maxby.md b/articles/reactive-maxby.md
index c4dad67d..c2080f8a 100644
--- a/articles/reactive-maxby.md
+++ b/articles/reactive-maxby.md
@@ -6,3 +6,11 @@ title: MaxBy

The `MaxBy` operator collects all the specified keys from values in the source sequence and emits a single value representing the value with the largest key. The single result value is emitted only when the source sequence terminates successfully.
+
+### Example
+
+Use `MaxBy` to return the list of values with the largest key.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-merge.md b/articles/reactive-merge.md
index cf1a719d..1475bb46 100644
--- a/articles/reactive-merge.md
+++ b/articles/reactive-merge.md
@@ -9,10 +9,35 @@ The `Merge` operator allows you to combine the output of multiple sequences of t
The resulting sequence will terminate successfully only when all source sequences have terminated successfully, or exceptionally as soon as any sequence produces an error.
+### Example
+
+Use `Merge` to combine the output of two or more sequences together into a single sequence.
+
+:::workflow
+
+:::
+
+#### Input Aggregation
+
+Use `Merge` to combine responses generated from processing different inputs (e.g. button presses).
+
+:::workflow
+
+:::
+
+> [!NOTE]
+> This example requires the `Bonsai.Windows.Input` package to be installed.
+
+### Alternative
+
+Use [`Zip`](xref:Bonsai.Reactive.Zip), [`WithLatestFrom`](xref:Bonsai.Reactive.WithLatestFrom) or [`CombineLatest`](xref:Bonsai.Reactive.CombineLatest) if you want to combine sequences but keep the output separate.
+
+Use [`Concat`](xref:Bonsai.Reactive.Concat) if you want to combine sequences sequentially.
+
### Higher-order operator
`Merge` also works as a higher-order operator, so it can take as input a sequence of observable sequences. In this case, it will subscribe to all source sequences as soon as they are emitted by the outer sequence, and emit all elements from each sequence downstream.

-The higher-order variant is useful to combine notifications from multiple event sources running in parallel, for example when waiting for the first event from multiple input conditionals, or when logging data from multiple sources to the same file.
+The higher-order variant is useful to combine notifications from multiple event sources running in parallel, for example when waiting for the first event from multiple input conditionals, or when logging data from multiple sources to the same file.
\ No newline at end of file
diff --git a/articles/reactive-min.md b/articles/reactive-min.md
index 9a52c5c7..a41fdd56 100644
--- a/articles/reactive-min.md
+++ b/articles/reactive-min.md
@@ -6,3 +6,11 @@ title: Min

The `Min` operator collects all the values from the source sequence and emits a single value representing the smallest of all values. The single result value is emitted only when the source sequence terminates successfully.
+
+### Example
+
+Use `Min` to report the minimum value at the end of the sequence.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-minby.md b/articles/reactive-minby.md
index e40781f2..4730a364 100644
--- a/articles/reactive-minby.md
+++ b/articles/reactive-minby.md
@@ -6,3 +6,11 @@ title: MinBy

The `MinBy` operator collects all the specified keys from values in the source sequence and emits a single value representing the value with the smallest key. The single result value is emitted only when the source sequence terminates successfully.
+
+### Example
+
+Use `MinBy` to return the list of values with the smallest key.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-onerrorresumenext.md b/articles/reactive-onerrorresumenext.md
index 1c2297f9..775a3258 100644
--- a/articles/reactive-onerrorresumenext.md
+++ b/articles/reactive-onerrorresumenext.md
@@ -8,3 +8,17 @@ title: OnErrorResumeNext
The `OnErrorResumeNext` operator allows you to combine the output of multiple sequences of the same type into a single sequence. `OnErrorResumeNext` subscribes to each sequence in turn, emits all the values from that sequence until termination, and then subscribes to the next sequence, even if the previous sequence has terminated with an error. Each sequence is guaranteed to only start after the previous one terminates.
The resulting sequence will always terminate successfully when the last source sequence has terminated.
+
+### Example
+
+Use `OnErrorResumeNext` to concatenate multiple observable sequences, even if one or more terminate with an error.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`Concat`](xref:Bonsai.Reactive.Concat) instead to concatenate multiple observable sequences that terminate successfully.
+
+Use [`Catch`](xref:Bonsai.Reactive.Catch) instead to raise an exception if all sequences terminated with an error.
\ No newline at end of file
diff --git a/articles/reactive-orderby.md b/articles/reactive-orderby.md
index 93cb189c..559691d0 100644
--- a/articles/reactive-orderby.md
+++ b/articles/reactive-orderby.md
@@ -8,3 +8,11 @@ title: OrderBy
The `OrderBy` operator requires the elements in the source sequence to be collections implementing the interface. For each collection emitted by the source sequence, the result sequence will emit an ordered collection where elements are sorted in ascending order of the keys specified in the property.
[!include[LazyOrdering](~/articles/reactive-lazyordering.md)]
+
+### Example
+
+Use `OrderBy` to sort elements in ascending order according to the specified key.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-orderbydescending.md b/articles/reactive-orderbydescending.md
index 705c075d..c99b8ee7 100644
--- a/articles/reactive-orderbydescending.md
+++ b/articles/reactive-orderbydescending.md
@@ -8,3 +8,11 @@ title: OrderByDescending
The `OrderByDescending` operator requires the elements in the source sequence to be collections implementing the interface. For each collection emitted by the source sequence, the result sequence will emit an ordered collection where elements are sorted in descending order of the keys specified in the property.
[!include[LazyOrdering](~/articles/reactive-lazyordering.md)]
+
+### Example
+
+Use `OrderByDescending` to sort elements in descending order according to the specified key.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-prepend.md b/articles/reactive-prepend.md
new file mode 100644
index 00000000..7a0479e8
--- /dev/null
+++ b/articles/reactive-prepend.md
@@ -0,0 +1,16 @@
+---
+uid: reactive-prepend
+title: Prepend
+---
+
+### Example
+
+Use `Prepend` to add an element to the beginning of a sequence.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`Append`](xref:Bonsai.Reactive.Append) instead to add an element to the end of a sequence.
\ No newline at end of file
diff --git a/articles/reactive-range.md b/articles/reactive-range.md
index 4ad7f834..8c66dab2 100644
--- a/articles/reactive-range.md
+++ b/articles/reactive-range.md
@@ -6,3 +6,11 @@ title: Range

The entire sequence of numbers in the range is emitted immediately upon subscription. If another sequence is provided as an input to `Range`, the entire sequence of numbers will be emitted once for each notification in the source sequence.
+
+### Examples
+
+Use `Range` to generate a range of numbers.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-repeat.md b/articles/reactive-repeat.md
index aa36f1fa..c13c233f 100644
--- a/articles/reactive-repeat.md
+++ b/articles/reactive-repeat.md
@@ -10,3 +10,15 @@ title: Repeat
If any of the subscriptions terminates exceptionally, the result sequence will also terminate exceptionally, and no further resubscriptions will be made.
[!include[Resubscription](~/articles/reactive-resubscription.md)]
+
+### Example
+
+Use `Repeat` to repeat an observable sequence indefinitely.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`RepeatCount`](xref:Bonsai.Reactive.RepeatCount) to repeat an observable sequence a specified number of times.
\ No newline at end of file
diff --git a/articles/reactive-repeatcount.md b/articles/reactive-repeatcount.md
index ff70cf52..16e0b921 100644
--- a/articles/reactive-repeatcount.md
+++ b/articles/reactive-repeatcount.md
@@ -10,3 +10,15 @@ title: RepeatCount
After the source sequence completes successfully the specified number of times, the result sequence will also terminate successfully. If any of the subscriptions terminates exceptionally, the result sequence will also terminate exceptionally, and no further resubscriptions will be made.
[!include[Resubscription](~/articles/reactive-resubscription.md)]
+
+### Example
+
+Use `RepeatCount` to repeat an observable sequence a specified number of times.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`Repeat`](xref:Bonsai.Reactive.Repeat) to repeat an observable sequence indefinitely.
\ No newline at end of file
diff --git a/articles/reactive-retry.md b/articles/reactive-retry.md
index f49ee23d..6e8b049d 100644
--- a/articles/reactive-retry.md
+++ b/articles/reactive-retry.md
@@ -10,3 +10,15 @@ title: Retry
If any of the subscriptions completes successfully, the result sequence will also complete, and no further resubscriptions will be made.
[!include[Resubscription](~/articles/reactive-resubscription.md)]
+
+### Example
+
+Use `Retry` to repeat subscription to an observable sequence if it terminates with an exception.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`RetryCount`](xref:Bonsai.Reactive.RetryCount) to repeat subscription to an observable sequence a specified number of times.
\ No newline at end of file
diff --git a/articles/reactive-retrycount.md b/articles/reactive-retrycount.md
index 6e70c9af..76885b2f 100644
--- a/articles/reactive-retrycount.md
+++ b/articles/reactive-retrycount.md
@@ -10,3 +10,15 @@ title: RetryCount
After the source sequence terminates exceptionally the specified maximum number of times, the result sequence will also terminate exceptionally. If any of the subscriptions completes successfully, the result sequence will also complete, and no further resubscriptions will be made.
[!include[Resubscription](~/articles/reactive-resubscription.md)]
+
+### Example
+
+Use `RetryCount` to repeat subscription to an observable sequence a specified number of times.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`Retry`](xref:Bonsai.Reactive.RetryCount) instead to repeat subscription to an observable sequence until it terminates successfully, without limit on retries.
\ No newline at end of file
diff --git a/articles/reactive-sample.md b/articles/reactive-sample.md
index 0a7f00e3..9687a758 100644
--- a/articles/reactive-sample.md
+++ b/articles/reactive-sample.md
@@ -9,3 +9,17 @@ title: Sample
> [!Note]
> If the sampler sequence completes successfully, the termination event will be used to sample the latest element from the source sequence, if it exists.
+
+### Example
+
+Use `Sample` to extract elements from a source sequence based on triggers from another sequence.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`SampleInterval`](xref:Bonsai.Reactive.SampleInterval) to extract elements based on time.
+
+Use [`Zip`](xref:Bonsai.Reactive.Zip) to extract elements from a source sequence where all elements are available up front.
\ No newline at end of file
diff --git a/articles/reactive-sampleinterval.md b/articles/reactive-sampleinterval.md
index 72e3aec6..2d9ef417 100644
--- a/articles/reactive-sampleinterval.md
+++ b/articles/reactive-sampleinterval.md
@@ -6,3 +6,19 @@ title: SampleInterval

If multiple elements are received during each sampling period, `SampleInterval` will emit only the latest value. However, elements are never repeated: if no new elements are received between two sampling events, no notification will be emitted when the sampling period elapses.
+
+### Example
+
+Use `SampleInterval` to extract the latest element from a source sequence that is emitted within within the time interval.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`GateInterval`](xref:Bonsai.Reactive.GateInterval) to extract the first element from a source sequence that is emitted within the time interval.
+
+Use [`Slice`](xref:Bonsai.Reactive.Slice) to extract elements based on element count instead of time.
+
+Use [`Sample`](xref:Bonsai.Reactive.Sample) to extract elements based on notifications from another sequence.
\ No newline at end of file
diff --git a/articles/reactive-scan.md b/articles/reactive-scan.md
index c2ea2456..23460d74 100644
--- a/articles/reactive-scan.md
+++ b/articles/reactive-scan.md
@@ -11,3 +11,15 @@ When a new element is received from the source sequence, it is paired with the c
> [!Warning]
> The nested sequence may be synchronous or asynchronous with respect to notifications from the source sequence. However, it is strongly recommended that computation of the accumulation function is performed synchronously to ensure a correspondence between the notifications received from the source sequence and the cumulative values emitted by the result sequence.
+
+### Example
+
+Use `Scan` to define an accumulation function using the encapsulated workflow.
+
+:::workflow
+
+:::
+
+### Alternatives
+
+Use [`Accumulate`](xref:Bonsai.Reactive.Accumulate) instead to yield a linear accumulation of values.
\ No newline at end of file
diff --git a/articles/reactive-selectmany.md b/articles/reactive-selectmany.md
index 59a2fab8..c4cba43e 100644
--- a/articles/reactive-selectmany.md
+++ b/articles/reactive-selectmany.md
@@ -11,3 +11,15 @@ The input to the nested workflow represents the element passed as an argument to
> [!Tip]
> `SelectMany` is one of the most versatile reactive operators and can be used as a primitive building block on which to build a large number of more complex reactive operators, including reactive state machines. See the [State Machines tutorial](xref:state-machines-tutorial) for examples.
+
+### Example
+
+Use `SelectMany` to create higher-order observable sequences and merge them into a single sequence.
+
+:::workflow
+
+:::
+
+### Alternatives
+
+Use [`CreateObservable`](xref:Bonsai.Reactive.CreateObservable) instead to create separate higher-order observable sequences.
\ No newline at end of file
diff --git a/articles/reactive-sequenceequal.md b/articles/reactive-sequenceequal.md
index 6105fe6d..61a04ea7 100644
--- a/articles/reactive-sequenceequal.md
+++ b/articles/reactive-sequenceequal.md
@@ -6,3 +6,11 @@ title: SequenceEqual

`SequenceEqual` will return `false` as soon as one of the sequences emits an element with a different value or in a different order from the other sequences, or if one of the sequences terminates early. If all notifications are equal, `SequenceEqual` will return `true` when all sequences terminate successfully.
+
+### Example
+
+Use `SequenceEqual` to determine if two sequences are equal.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-sink.md b/articles/reactive-sink.md
index 5520c58d..8065e0d1 100644
--- a/articles/reactive-sink.md
+++ b/articles/reactive-sink.md
@@ -12,3 +12,11 @@ The `Sink` operator uses the nested workflow to specify a reactive operation ove
> [!Warning]
> If the source sequence terminates, the subscription to the nested sequence will be cancelled. If the reactive operation needs to be fully asynchronous and decoupled from the main sequence, consider using @subjects to process items in a separate branch of the workflow.
+
+### Example
+
+Use `Sink` to add side effects specified by the encapsulated workflow.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-skip.md b/articles/reactive-skip.md
index 77071fdc..d864250d 100644
--- a/articles/reactive-skip.md
+++ b/articles/reactive-skip.md
@@ -5,6 +5,27 @@ title: Skip

-The `Skip` operator modifies the source sequence to remove the specified number of elements from the start of the sequence. After the maximum number of elements is received, `Skip` will then emit the remaining elements in the sequence. `Skip` can be used to ignore unstable values from the start of a dynamic time series, e.g. to remove the auto-exposure adaptation start of a camera capture sequence.
+The `Skip` operator modifies the source sequence to remove the specified number of elements from the start of the sequence. After the maximum number of elements is received, `Skip` will then emit the remaining elements in the sequence. If the source sequence terminates before the specified number of elements is received, `Skip` will terminate without emitting any values.
-If the source sequence terminates before the specified number of elements is received, `Skip` will terminate without emitting any values.
+### Examples
+
+Use `Skip` to remove the specified number of elements from the start of the sequence.
+
+:::workflow
+
+:::
+
+#### Discard Startup Elements
+
+Use `Skip` to ignore frames from the start of a camera capture sequence (e.g. unstable frames due to auto-exposure adaptation).
+
+:::workflow
+
+:::
+
+> [!NOTE]
+> This example requires the `Bonsai.Vision` and `Bonsai.Vision.Design` packages to be installed.
+
+### Alternative
+
+Use [`Slice`](xref:Bonsai.Reactive.Slice) to ignore n-th elements from a sequence.
\ No newline at end of file
diff --git a/articles/reactive-skiplast.md b/articles/reactive-skiplast.md
index 862bb586..0a8a3320 100644
--- a/articles/reactive-skiplast.md
+++ b/articles/reactive-skiplast.md
@@ -9,3 +9,15 @@ The `SkipLast` operator modifies the source sequence to remove the specified num
> [!Tip]
> `SkipLast` can often be used when you need to impose a delay in the source sequence using number of elements, rather than a time interval.
+
+### Example
+
+Use `SkipLast` to remove the specified number of elements from the end of the sequence.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`Delay`](xref:Bonsai.Reactive.Delay) to impose a delay in the source sequence using a time interval.
\ No newline at end of file
diff --git a/articles/reactive-skipuntil.md b/articles/reactive-skipuntil.md
index 49f204b5..f4eca3f1 100644
--- a/articles/reactive-skipuntil.md
+++ b/articles/reactive-skipuntil.md
@@ -5,9 +5,35 @@ title: SkipUntil

-`SkipUntil` modifies the source sequence so that all elements are ignored until the second sequence produces a notification. At that time, `SkipUntil` will start emitting all remaining elements from the source sequence. `SkipUntil` is often used to create a dynamic start condition for an infinite sequence, e.g. start grabbing frames from a video camera when a key is pressed.
+`SkipUntil` modifies the source sequence so that all elements are ignored until the second sequence produces a notification. At that time, `SkipUntil` will start emitting all remaining elements from the source sequence. `SkipUntil` is often used to create a dynamic start condition for an infinite sequence.
If the source sequence terminates before the second sequence produces a value, `SkipUntil` will terminate without emitting any elements.
+### Examples
+
+Use `SkipUntil` to skip elements from an active sequence.
+
+:::workflow
+
+:::
+
+#### Start Video Recording
+
+Use `SkipUntil` to start video recording when a trigger is sent (e.g. key press).
+
+:::workflow
+
+:::
+
+> [!NOTE]
+> This example requires the `Bonsai.Vision`, `Bonsai.Vision.Design`, and `Bonsai.Windows.Input` packages to be installed.
+
+> [!NOTE]
+> Use [`TakeUntil`](xref:Bonsai.Reactive.TakeUntil) to control the termination of video recording.
+
+### Alternative
+
+Use [`SubscribeWhen`](xref:Bonsai.Reactive.SubscribeWhen) to control the start of subscription.
+
> [!Warning]
-> [`SubscribeWhen`](xref:Bonsai.Reactive.SubscribeWhen) is a similar operator which is often used to control the start of a sequence. Although often both `SubscribeWhen` and `SkipUntil` result in a similar sequence, `SkipUntil` will always immediately subscribe to the source sequence. This means that any initialization side-effects will be evaluated immediately. For *hot* sequences (e.g. camera) this might be advantageous, since any initialization costs are paid upfront, and new values are immediately ready to be consumed after the trigger. However, for *cold* sequences (e.g. video) this might lead to loss of data from the start of the sequence. For more about the difference between *hot* and *cold* sequences, see the section on [temperature](xref:observables#temperature).
+> Although `SubscribeWhen` and `SkipUntil` often produce a similar sequence, `SkipUntil` always subscribes to the source sequence immediately. This means that any initialization side-effects will be evaluated immediately. For *hot* sequences (e.g. camera) this might be advantageous, since any initialization costs are paid upfront, and new values are immediately ready to be consumed after the trigger. However, for *cold* sequences (e.g. video or a timer) this might lead to loss of data from the start of the sequence. For more about the difference between *hot* and *cold* sequences, see the section on [temperature](xref:observables#temperature).
\ No newline at end of file
diff --git a/articles/reactive-skipwhile.md b/articles/reactive-skipwhile.md
index 55c2bb27..90a1ce50 100644
--- a/articles/reactive-skipwhile.md
+++ b/articles/reactive-skipwhile.md
@@ -10,3 +10,17 @@ The nested workflow specifying the condition must return a sequence of type [!Warning]
> If the index of elements in the source sequence becomes greater than or equal to , then `Slice` will terminate successfully and cancel the subscription to the source sequence.
+
+### Examples
+
+Use `Slice` to extract n-th elements from a sequence.
+
+:::workflow
+
+:::
+
+#### Deinterleave Video Frames
+
+Use `Slice` to separate elements from an interleaved sequence (e.g. frames from a fiber photometry camera).
+
+:::workflow
+
+:::
+
+> [!NOTE]
+> This example requires the `Bonsai.Vision` and `Bonsai.Vision.Design` packages to be installed.
+
+### Alternative
+
+Use [`GateInterval`](xref:Bonsai.Reactive.GateInterval) to extract elements based on time.
\ No newline at end of file
diff --git a/articles/reactive-subjectalternatives.md b/articles/reactive-subjectalternatives.md
new file mode 100644
index 00000000..f1cbf8b7
--- /dev/null
+++ b/articles/reactive-subjectalternatives.md
@@ -0,0 +1,3 @@
+### Alternative
+
+Consider using a different [subject type](./subjects.md#subject-types) depending on the values you need for each subscriber.
\ No newline at end of file
diff --git a/articles/reactive-subscribewhen.md b/articles/reactive-subscribewhen.md
index f3ea8592..faa80177 100644
--- a/articles/reactive-subscribewhen.md
+++ b/articles/reactive-subscribewhen.md
@@ -8,3 +8,18 @@ title: SubscribeWhen
The `SubscribeWhen` operator modifies the source sequence by waiting for the first value emitted by the second sequence before subscribing to the first sequence. This has the effect of delaying the start of the sequence until the second sequence emits a value.
`SubscribeWhen` can be used to control the timing of initialization. Note that if a source is [*hot*](xref:observables#temperature), delaying the start of the sequence will not preserve past data.
+
+### Example
+
+Use `SubscribeWhen` to start subscription to a sequence.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`SkipUntil`](xref:Bonsai.Reactive.SkipUntil) to skip elements from an active subscription.
+
+> [!Warning]
+> Although `SubscribeWhen` and `SkipUntil` often produce a similar sequence, `SubscribeWhen` only subscribes to the source sequence when triggered. This means that any initialization side-effects will be delayed. For *hot* sequences (e.g. camera) this might be disadvantageous as initialization costs are paid upon subscription, and new values after the trigger are not immediately available. However, for *cold* sequences (e.g. video or a timer) this might be beneficial, as all data from the start of the sequence will be available. For more about the difference between *hot* and *cold* sequences, see the section on [temperature](xref:observables#temperature).
\ No newline at end of file
diff --git a/articles/reactive-sum.md b/articles/reactive-sum.md
index 92a163a6..91d8175b 100644
--- a/articles/reactive-sum.md
+++ b/articles/reactive-sum.md
@@ -6,3 +6,15 @@ title: Sum

The `Sum` operator collects all the numbers from the source sequence and emits a single value representing the sum of all numbers. The single result value is emitted only when the source sequence terminates successfully.
+
+### Example
+
+Use `Sum` to report the total value at the end of a sequence.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`Accumulate`](xref:Bonsai.Reactive.Accumulate) instead to continuously track the value in the sequence.
\ No newline at end of file
diff --git a/articles/reactive-switch.md b/articles/reactive-switch.md
index 258caa54..eace0da5 100644
--- a/articles/reactive-switch.md
+++ b/articles/reactive-switch.md
@@ -10,3 +10,15 @@ title: Switch
The resulting sequence will terminate successfully when the outer sequence has terminated successfully, and the currently active sequence (if any) also terminates successfully. It will terminate exceptionally if any of the sequences produces an error.
`Switch` is useful to model interruptible states, for example when transitioning between different modes of a state-machine, or switching between different video channels on demand.
+
+### Example
+
+Use `Switch` to switch to the latest observable sequence that emits notifications.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`Amb`](xref:Bonsai.Reactive.Amb) instead to propagate the first observable sequence that emits notifications.
\ No newline at end of file
diff --git a/articles/reactive-take.md b/articles/reactive-take.md
index e0993ec4..7b5884b3 100644
--- a/articles/reactive-take.md
+++ b/articles/reactive-take.md
@@ -8,3 +8,21 @@ title: Take
The `Take` operator modifies the source sequence to emit only the specified maximum number of values from the start of the sequence. If the maximum number of values is reached, `Take` will terminate immediately and ignore the remainder of the sequence. `Take` is commonly used to convert an infinite sequence into a finite sequence, for example to take the first key press out of an infinite sequence of keyboard key presses.
`Take` only specifies a maximum upper bound on the number of elements. If the source sequence terminates before that maximum number of values is reached, the behavior of the sequence will not be modified.
+
+### Example
+
+Use `Take` to retrieve one or more elements from the start of a sequence.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`First`](xref:Bonsai.Reactive.First) to retrieve the first element from the start of a sequence.
+
+> [!Warning]
+> There are subtle but important differences between using the `Take(1)` and [`First`](xref:Bonsai.Reactive.First) operator:
+> - When the source sequence has no elements, `Take(1)` will complete successfully, while [`First`](xref:Bonsai.Reactive.First) will throw an error.
+> - When the source sequence emits the first element, `Take(1)` will immediately cancel the subscription to the source sequence before emitting the notification. [`First`](xref:Bonsai.Reactive.First), on the other hand, will emit the notification and only afterwards cancel the subscription to the source sequence.
+
diff --git a/articles/reactive-takelast.md b/articles/reactive-takelast.md
index cd4ead30..25b11f17 100644
--- a/articles/reactive-takelast.md
+++ b/articles/reactive-takelast.md
@@ -8,3 +8,18 @@ title: TakeLast
The `TakeLast` operator modifies the source sequence to emit only a specified maximum number of values from the end of the sequence. Since `TakeLast` does not know which elements are the last before the original sequence terminates, it will not emit any value until the completion event is emitted, but will instead keep in memory the specified number of "latest" values. At the time when the source sequence terminates, `TakeLast` will immediately emit all buffered values up to the specified maximum number of elements and then terminate.
Because of this buffering behavior, `TakeLast` will always modify the behavior of the original sequence, regardless of how many values it contains.
+
+### Example
+
+Use `TakeLast` to retrieve one or more elements from the end of a sequence.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`Last`](xref:Bonsai.Reactive.Last) to retrieve the last element from the end of the sequence.
+
+> [!Warning]
+> There is a subtle but important difference between the `TakeLast(1)` and [`Last`](xref:Bonsai.Reactive.Last) operator. `TakeLast(1)` will complete successfully when the source sequence has no elements but [`Last`](xref:Bonsai.Reactive.Last) will terminate with an error.
\ No newline at end of file
diff --git a/articles/reactive-takeuntil.md b/articles/reactive-takeuntil.md
index da36d58b..ba0ce90a 100644
--- a/articles/reactive-takeuntil.md
+++ b/articles/reactive-takeuntil.md
@@ -5,6 +5,28 @@ title: TakeUntil

-`TakeUntil` modifies the source sequence so that values are emitted only until the second sequence produces a value. At that time, `TakeUntil` will terminate immediately and ignore the remainder of the sequence. `TakeUntil` is often used to create a dynamic stop condition for an infinite sequence, e.g. grab frames from a video camera until a key is pressed.
+`TakeUntil` modifies the source sequence so that values are emitted only until the second sequence produces a value. At that time, `TakeUntil` will terminate immediately and ignore the remainder of the sequence. TakeUntil is often used to create a dynamic stop condition for an infinite sequence.
If the source sequence terminates before the second sequence produces a value, `TakeUntil` will also terminate and cancel the subscription to the second sequence.
+
+### Examples
+
+Use `TakeUntil` to stop taking elements from an active sequence.
+
+:::workflow
+
+:::
+
+#### Stop Video Recording
+
+Use `TakeUntil` to stop video recording when a trigger is sent (e.g. key press).
+
+:::workflow
+
+:::
+
+> [!NOTE]
+> This example requires the `Bonsai.Vision`, `Bonsai.Vision.Design`, and `Bonsai.Windows.Input` packages to be installed.
+
+> [!NOTE]
+> Use [`SkipUntil`](xref:Bonsai.Reactive.SkipUntil) to control the start of video recording.
\ No newline at end of file
diff --git a/articles/reactive-takewhile.md b/articles/reactive-takewhile.md
index 3e23a9d7..b187b35a 100644
--- a/articles/reactive-takewhile.md
+++ b/articles/reactive-takewhile.md
@@ -8,3 +8,17 @@ title: TakeWhile
The nested workflow specifying the condition must return a sequence of type . This nested sequence may be synchronous or asynchronous with respect to notifications from the source sequence.
After each element is emitted by the source sequence, the latest value from the nested sequence is checked. While the value is `true`, `TakeWhile` will continue to emit all elements from the source sequence. When the value changes to `false`, `TakeWhile` will terminate successfully.
+
+### Example
+
+Use `TakeWhile` to return elements in an observable sequence as long as the condition specified in the encapsulated workflow is true.
+
+:::workflow
+
+:::
+
+### Alternatives
+
+Use [`TakeUntil`](xref:Bonsai.Reactive.TakeUntil) instead to return elements only after a second sequence emits a notification.
+
+Use [`Condition`](xref:Bonsai.Reactive.Condition) instead to filter elements based on the encapsulated workflow.
\ No newline at end of file
diff --git a/articles/reactive-thenby.md b/articles/reactive-thenby.md
index 35fd6457..444040d2 100644
--- a/articles/reactive-thenby.md
+++ b/articles/reactive-thenby.md
@@ -8,3 +8,11 @@ title: ThenBy
`ThenBy` operates on sequences returned by any of the , , , or operators. For each ordered collection emitted by the source sequence, the result sequence will emit a new ordered collection where elements in the collection are subsequently sorted in ascending order of the keys specified in the property.
[!include[LazyOrdering](~/articles/reactive-lazyordering.md)]
+
+### Example
+
+Use `ThenBy` to perform a ascending sort on ordered collections according to the specified key.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-thenbydescending.md b/articles/reactive-thenbydescending.md
index 7d7a5f0d..657625e7 100644
--- a/articles/reactive-thenbydescending.md
+++ b/articles/reactive-thenbydescending.md
@@ -8,3 +8,11 @@ title: ThenByDescending
`ThenByDescending` operates on sequences returned by any of the , , , or operators. For each ordered collection emitted by the source sequence, the result sequence will emit a new ordered collection where elements in the collection are subsequently sorted in descending order of the keys specified in the property.
[!include[LazyOrdering](~/articles/reactive-lazyordering.md)]
+
+### Example
+
+Use `ThenByDescending` to perform a descending sort on ordered collections according to the specified key.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-throttle.md b/articles/reactive-throttle.md
index b35dfd9c..2c8d2010 100644
--- a/articles/reactive-throttle.md
+++ b/articles/reactive-throttle.md
@@ -9,3 +9,14 @@ The `Throttle` operator provides a mechanism to control backpressure in reactive
> [!Warning]
> Any elements emitted by `Throttle` will necessarily be delayed by , since the only way to test that an element is followed by a period of silence is to wait out the period.
+
+### Example
+
+Use `Throttle` to emit only elements that are followed by a silent period.
+
+:::workflow
+
+:::
+
+> [!NOTE]
+> This example requires the `Bonsai.WindowsInput` package to be installed.
\ No newline at end of file
diff --git a/articles/reactive-timeinterval.md b/articles/reactive-timeinterval.md
index b5392cf4..89722782 100644
--- a/articles/reactive-timeinterval.md
+++ b/articles/reactive-timeinterval.md
@@ -6,3 +6,22 @@ title: TimeInterval

For each element in the source sequence, `TimeInterval` measures the time elapsed between the arrival of that element and the previous element. Time zero is the start of the sequence (i.e. the moment of subscription).
+
+### Example
+
+Use `TimeInterval` to measure the time elapsed between consecutive elements.
+
+:::workflow
+
+:::
+
+#### Measure Camera Frame Rate
+
+Use `TimeInterval` to calculate the rate of camera frame acquisition.
+
+:::workflow
+
+:::
+
+> [!NOTE]
+> This example requires the `Bonsai.Vision` package to be installed.
\ No newline at end of file
diff --git a/articles/reactive-timeout.md b/articles/reactive-timeout.md
index 7be47b4a..40431533 100644
--- a/articles/reactive-timeout.md
+++ b/articles/reactive-timeout.md
@@ -6,3 +6,11 @@ title: Timeout

Time zero is the start of the sequence (i.e. the moment of subscription). If a new notification arrives before a timeout is reached, the clock is reset.
+
+### Example
+
+Use `Timeout` to raise an error if the next element is not received within the specified timeout duration.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-timer.md b/articles/reactive-timer.md
index b7ded5bc..bbad83b5 100644
--- a/articles/reactive-timer.md
+++ b/articles/reactive-timer.md
@@ -9,3 +9,11 @@ title: Timer
> [!Warning]
> The value of the and properties cannot be modified after the observable sequence has initialized. If dynamic configuration is necessary, make sure that all properties are immediately configured using property mapping operators.
+
+### Example
+
+Use `Timer` to generate periodic elements.
+
+:::workflow
+
+:::
diff --git a/articles/reactive-timestamp.md b/articles/reactive-timestamp.md
index e808b016..cd92bcf1 100644
--- a/articles/reactive-timestamp.md
+++ b/articles/reactive-timestamp.md
@@ -8,7 +8,26 @@ title: Timestamp
Timestamps are specified relative to Coordinated Universal Time (UTC) using values, and are recorded as soon as element notifications are received from the source sequence.
> [!Warning]
-> By default, timestamps are logged using the highest-resolution performance counter available in the system. The clock is synchronized with system time for events ocurring within the same process, including across different threads. However, timestamps are not guaranteed to be synchronized across different processes.
+> By default, timestamps are logged using the highest-resolution performance counter available in the system. The clock is synchronized with system time for events occurring within the same process, including across different threads. However, timestamps are not guaranteed to be synchronized across different processes.
> [!Caution]
> Time recorded using the `Timestamp` operator does not take into account any hardware or communication latency associated with data acquisition processes. If your application requires high-precision timing of data acquisition events, consider logging any available hardware timestamps included in the data, if available.
+
+### Example
+
+Use `Timestamp` to timestamp elements that are produced by the source sequence.
+
+:::workflow
+
+:::
+
+#### Record Data Timestamps
+
+Use `Timestamp` in conjunction with [`CsvWriter`](xref:Bonsai.IO.CsvWriter) to record timestamps for various data streams such as camera frames, sensor readings or key presses.
+
+:::workflow
+
+:::
+
+> [!NOTE]
+> This example requires the `Bonsai.System` and `Bonsai.Vision` packages to be installed.
\ No newline at end of file
diff --git a/articles/reactive-toarray.md b/articles/reactive-toarray.md
index 20f738fb..735b5072 100644
--- a/articles/reactive-toarray.md
+++ b/articles/reactive-toarray.md
@@ -5,6 +5,32 @@ title: ToArray

-`ToArray` emits a single array of the same type as the type of the elements in the source sequence. The array is emitted when the source sequence completes successfully.
+`ToArray` emits a single [array](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/arrays) of the same type as the type of the elements in the source sequence. The array is emitted when the source sequence completes successfully.
[!include[ToCollection](~/articles/reactive-tocollection.md)]
+
+### Examples
+
+Use `ToArray` to create an array with every element in the sequence.
+
+:::workflow
+
+:::
+
+> [!NOTE]
+> This example requires the `Bonsai.Design.Visualizers` package to be installed.
+
+#### Collect Input Data
+
+Use `ToArray` to collect a sequence of individual elements produced by file reading operators such as [`CsvReader`](xref:Bonsai.IO.CsvReader).
+
+:::workflow
+
+:::
+
+> [!NOTE]
+> This example requires the `Bonsai.IO` package to be installed.
+
+### Alternative
+
+Use [`ToList`](xref:Bonsai.Reactive.ToList) if you need to manipulate elements in the collection.
\ No newline at end of file
diff --git a/articles/reactive-todictionary.md b/articles/reactive-todictionary.md
index b722c811..f6435129 100644
--- a/articles/reactive-todictionary.md
+++ b/articles/reactive-todictionary.md
@@ -5,9 +5,21 @@ title: ToDictionary

-`ToDictionary` collects all the values from the source sequence and creates a dictionary mapping keys to elements using the specified and properties. The dictionary is emitted when the source sequence completes successfully, and will have key and element types matching the selected members.
+`ToDictionary` collects all the values from the source sequence and creates a [dictionary](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/collections) mapping keys to elements using the specified and properties. The dictionary is emitted when the source sequence completes successfully, and will have key and element types matching the selected members.
> [!Warning]
> If the source sequence emits a value with a duplicate key, an error will be raised and the sequence will terminate exceptionally.
[!include[ToCollection](~/articles/reactive-tocollection.md)]
+
+### Example
+
+Use `ToDictionary` to create a dictionary from an observable sequence according to the specified key and element selector.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`ToLookup`](xref:Bonsai.Reactive.ToLookup) if you need to group multiple elements under the same key.
\ No newline at end of file
diff --git a/articles/reactive-tolist.md b/articles/reactive-tolist.md
index 6998333d..e60c1466 100644
--- a/articles/reactive-tolist.md
+++ b/articles/reactive-tolist.md
@@ -5,6 +5,18 @@ title: ToList

-`ToList` emits a single list of the same type as the type of the elements in the source sequence. The list is emitted when the source sequence completes successfully.
+`ToList` emits a single [list](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/collections) of the same type as the type of the elements in the source sequence. The list is emitted when the source sequence completes successfully.
[!include[ToCollection](~/articles/reactive-tocollection.md)]
+
+### Example
+
+Use `ToList` to create a list with every element in the sequence.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`ToArray`](xref:Bonsai.Reactive.ToArray) if you do not need to manipulate elements in the collection.
\ No newline at end of file
diff --git a/articles/reactive-tolookup.md b/articles/reactive-tolookup.md
index f471b61e..d062d7b0 100644
--- a/articles/reactive-tolookup.md
+++ b/articles/reactive-tolookup.md
@@ -5,9 +5,21 @@ title: ToLookup

-`ToLookup` collects all the values from the source sequence and creates a mapping from keys to a set of elements using the specified and properties. The lookup is emitted when the source sequence completes successfully, and will have key and element types matching the selected members.
+`ToLookup` collects all the values from the source sequence and creates a mapping from keys to a set of elements using the specified and properties. The [lookup](https://learn.microsoft.com/en-us/dotnet/api/system.linq.lookup-2?view=net-8.0) is emitted when the source sequence completes successfully, and will have key and element types matching the selected members.
> [!Note]
> A lookup allows multiple values to be grouped under the same key.
[!include[ToCollection](~/articles/reactive-tocollection.md)]
+
+### Example
+
+Use `ToLookup` to create a lookup from an observable sequence according to the specified key and element selector.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`ToDictionary`](xref:Bonsai.Reactive.ToDictionary) to link single elements to keys.
\ No newline at end of file
diff --git a/articles/reactive-visualizer.md b/articles/reactive-visualizer.md
index e3cb551e..adee3cbc 100644
--- a/articles/reactive-visualizer.md
+++ b/articles/reactive-visualizer.md
@@ -9,3 +9,11 @@ The `Visualizer` operator is a [Sink](xref:Bonsai.Reactive.Sink) which uses the
> [!Note]
> All notifications emitted by the inner [`WorkflowOutput`](xref:Bonsai.Expressions.WorkflowOutputBuilder) node are ignored. However, the type visualizer assigned to the nested workflow output will be considered as the default visualizer of the outer node.
+
+### Example
+
+Use `Visualizer` to use the encapsulated workflow as a visualizer.
+
+:::workflow
+
+:::
\ No newline at end of file
diff --git a/articles/reactive-window.md b/articles/reactive-window.md
index 0805c900..7cc2b047 100644
--- a/articles/reactive-window.md
+++ b/articles/reactive-window.md
@@ -11,3 +11,15 @@ If a new window is created before the previous window is closed, then window wil
> [!Note]
> You can manipulate and schedule each of the windows downstream using other higher-order operators such as [`Merge`](xref:Bonsai.Reactive.Merge), [`Concat`](xref:Bonsai.Reactive.Concat) or [`Switch`](xref:Bonsai.Reactive.Switch).
+
+### Example
+
+Use `Window` to group elements into zero or more observable sequences based on notifications from a second sequence as well as the encapsulated workflow.
+
+:::workflow
+
+:::
+
+### Alternative
+
+Use [`WindowTrigger`](xref:Bonsai.Reactive.WindowTrigger) instead to group elements into zero or more observable sequences based solely on notifications from a second sequence.
\ No newline at end of file
diff --git a/articles/reactive-windowcount.md b/articles/reactive-windowcount.md
index 6234164a..f58c4771 100644
--- a/articles/reactive-windowcount.md
+++ b/articles/reactive-windowcount.md
@@ -11,3 +11,17 @@ If no skip value is provided, the windows will be strictly non-overlapping, with
> [!Note]
> You can manipulate and schedule each of the windows downstream using other higher-order operators such as [`Merge`](xref:Bonsai.Reactive.Merge), [`Concat`](xref:Bonsai.Reactive.Concat) or [`Switch`](xref:Bonsai.Reactive.Switch).
+
+### Example
+
+Use `WindowCount` to group elements into zero or more observable sequences based on element count.
+
+:::workflow
+
+:::
+
+### Alternatives
+
+Use [`WindowTime`](xref:Bonsai.Reactive.WindowTime) instead to create new observable sequences based on timing information.
+
+Use [`BufferCount`](xref:Bonsai.Reactive.BufferCount) instead to group elements into zero or more buffers based on element count.
\ No newline at end of file
diff --git a/articles/reactive-windowtime.md b/articles/reactive-windowtime.md
index 46348861..151e7ed8 100644
--- a/articles/reactive-windowtime.md
+++ b/articles/reactive-windowtime.md
@@ -11,3 +11,17 @@ If no `TimeShift` is provided, the windows will be strictly non-overlapping, wit
> [!Note]
> You can manipulate and schedule each of the windows downstream using other higher-order operators such as [`Merge`](xref:Bonsai.Reactive.Merge), [`Concat`](xref:Bonsai.Reactive.Concat) or [`Switch`](xref:Bonsai.Reactive.Switch).
+
+### Example
+
+Use `WindowTime` to group elements into zero or more observable sequences based on timing information.
+
+:::workflow
+
+:::
+
+### Alternatives
+
+Use [`WindowCount`](xref:Bonsai.Reactive.WindowCount) instead to create new observable sequences based on element count.
+
+Use [`BufferTime`](xref:Bonsai.Reactive.BufferTime) instead to group elements into zero or more buffers based on timing information.
\ No newline at end of file
diff --git a/articles/reactive-windowtrigger.md b/articles/reactive-windowtrigger.md
index f408a374..0e23e0b2 100644
--- a/articles/reactive-windowtrigger.md
+++ b/articles/reactive-windowtrigger.md
@@ -13,3 +13,17 @@ If the `Count` property or the `TimeSpan` property is specified, then a new wind
> [!Note]
> You can manipulate and schedule each of the windows downstream using other higher-order operators such as [**Merge**](xref:Bonsai.Reactive.Merge), [**Concat**](xref:Bonsai.Reactive.Concat) or [**Switch**](xref:Bonsai.Reactive.Switch).
+
+### Example
+
+Use `WindowTrigger` to group elements into zero or more observable sequences based on notifications from a second sequence.
+
+:::workflow
+
+:::
+
+### Alternatives
+
+Use [`BufferTrigger`](xref:Bonsai.Reactive.BufferTrigger) instead to group elements into zero or more buffers based on notifications from a second sequence.
+
+Use [`Window`](xref:Bonsai.Reactive.Window) instead if you want to specify a dynamic close condition.
\ No newline at end of file
diff --git a/articles/reactive-withlatestfrom.md b/articles/reactive-withlatestfrom.md
index e7c7701b..9f949a7e 100644
--- a/articles/reactive-withlatestfrom.md
+++ b/articles/reactive-withlatestfrom.md
@@ -5,4 +5,41 @@ title: WithLatestFrom

-The behavior of `WithLatestFrom` is very similar to [`CombineLatest`](xref:Bonsai.Reactive.CombineLatest), but while `CombineLatest` emits a combined value whenever any of the source sequences emits a value, `WithLatestFrom` only emits the combination when the first sequence emits a value (as long as the second sequence has emitted at least one value).
+The behavior of `WithLatestFrom` is very similar to [`CombineLatest`](xref:Bonsai.Reactive.CombineLatest), but while `CombineLatest` emits a combined value whenever any of the source sequences emits a value, `WithLatestFrom` only emits the combination when the first sequence emits a value (as long as the second sequence has emitted at least one value).
+
+### Examples
+
+Use `WithLatestFrom` to combine two sources in time.
+
+:::workflow
+
+:::
+
+#### Video Synchronization
+
+Use [`WithLatestFrom`](xref:Bonsai.Reactive.WithLatestFrom) to combine two sources (e.g. frames from different cameras, or the closest frame to a key press).
+
+:::workflow
+
+:::
+
+> [!NOTE]
+> This example requires the `Bonsai.Vision` and `Bonsai.Vision.Design` packages to be installed.
+
+#### Background Subtraction
+
+Use [`WithLatestFrom`](xref:Bonsai.Reactive.WithLatestFrom) to combine a source with a reference value for post-processing (e.g. background subtraction).
+
+:::workflow
+
+:::
+
+> [!NOTE]
+> This example requires the `Bonsai.Vision` and `Bonsai.Vision.Design` packages to be installed.
+
+### Alternative
+
+Use [`CombineLatest`](xref:Bonsai.Reactive.CombineLatest) to combine sequences if:
+- You have more than two sources
+- Need a [higher-order](../articles/higher-order.md) operator
+- Need to keep all the values from all the sources
\ No newline at end of file
diff --git a/articles/reactive-zip.md b/articles/reactive-zip.md
index 0bd6b722..40a07125 100644
--- a/articles/reactive-zip.md
+++ b/articles/reactive-zip.md
@@ -7,15 +7,55 @@ title: Zip
`Zip` combines the items from each sequence in strict sequential order. It will combine the first item emitted by sequence #1 with the first item emitted by sequence #2; then the second item emitted by sequence #1 with the second item emitted by sequence #2, and so forth, regardless of the timing of arrival of the values. It will only emit as many values as the number of values in the shortest sequence.
-`Zip` can be useful to combine separate processing branches from a single source into a composite result, or when pairing events which are logically related even though they might arrive far apart in time, e.g. request/response pairs from a server, or pairing camera frames with frame trigger event onsets.
-
> [!Warning]
> `Zip` will continuously store unpaired values from all source sequences, with no limit to the buffer size. This means that if one source sequence produces a much larger number of values than the other sequences, memory usage will continue to grow unbounded. In general, `Zip` should be used only when there is a known fixed relationship between number of elements in each of the source sequences.
+### Examples
+
+Use `Zip` to combine the output of two or more sequences together in strict sequential order.
+
+:::workflow
+
+:::
+
+#### Combine Processing Results
+
+Use `Zip` to combine separate processing branches from a single source into a composite result.
+
+:::workflow
+
+:::
+
+#### Combine Related Events
+
+Use `Zip` to pair events which are logically related even though they might arrive far apart in time (e.g. request/response pairs from a server, or pairing camera frames with frame trigger event onsets).
+
+:::workflow
+
+:::
+
+> [!NOTE]
+> This example requires the `Bonsai.Arduino`, `Bonsai.Vision` and `Bonsai.Vision.Design` packages to be installed.
+
+#### Sample Preloaded Sequences
+
+Use `Zip` to "sample" from a source sequence where all elements are available up front, using a time- or event-based trigger sequence.
+
+:::workflow
+
+:::
+
+> [!Warning]
+> This approach is best suited for text- or numeric-based sequences as `Zip` will buffer all available elements with no limit to buffer size.
+
+### Alternative
+
+Use [`WithLatestFrom`](xref:Bonsai.Reactive.WithLatestFrom) or [`CombineLatest`](xref:Bonsai.Reactive.CombineLatest) to combine sequences when their relationship is not well defined.
+
### Higher-order operator
`Zip` also works as a higher-order operator, so it can take as input a sequence of observable sequences. In this case, it will subscribe to each of the source sequences and start collecting all emitted values from each sequence. As soon as the outer sequence terminates, it will start reactively combining values in sequential order, just as in the case of using `Zip` with a fixed number of inputs.

-The higher-order variant can be useful occasionally, for example when combining frames from an unknown number of videos in a folder, but should be used with care and awareness that reactive pairing only starts after the outer sequence terminates, which means its use should be avoided with infinite sequences.
+The higher-order variant can be useful occasionally, for example when combining frames from an unknown number of videos in a folder, but should be used with care and awareness that reactive pairing only starts after the outer sequence terminates, which means its use should be avoided with infinite sequences.
\ No newline at end of file
diff --git a/images/reactive-combinetimestamp.svg b/images/reactive-createtimestamped.svg
similarity index 89%
rename from images/reactive-combinetimestamp.svg
rename to images/reactive-createtimestamped.svg
index a2b4f9f4..ec9afc06 100644
--- a/images/reactive-combinetimestamp.svg
+++ b/images/reactive-createtimestamped.svg
@@ -1,5 +1,5 @@
-
+