diff --git a/Cargo.lock b/Cargo.lock
index e6b4419591ec9b40f5cf6af30ab9617c912ad383..61fd581a803ad968ffac6c85ae31cb716a70d7a4 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -388,7 +388,7 @@ dependencies = [
 
 [[package]]
 name = "bevy_cosmic_edit"
-version = "0.10.0"
+version = "0.10.1"
 dependencies = [
  "arboard",
  "bevy",
diff --git a/Cargo.toml b/Cargo.toml
index a670eb40661a93ee05c5c4cdb549d28f4293d404..f9e4a83654cd2f70b2a6c255fec292c644c4e6ab 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "bevy_cosmic_edit"
-version = "0.10.0"
+version = "0.10.1"
 edition = "2021"
 license = "MIT OR Apache-2.0"
 description = "Bevy cosmic-text multiline text input"
diff --git a/examples/font_per_widget.rs b/examples/font_per_widget.rs
index 50d0843d14160b3d9d57981b18dd49eec0439a10..c3580c5c697ce56032909789a7118166dd29de6c 100644
--- a/examples/font_per_widget.rs
+++ b/examples/font_per_widget.rs
@@ -249,12 +249,13 @@ fn setup(
 
     let mut attrs_2 = cosmic_text::Attrs::new();
     attrs_2 = attrs_2.family(cosmic_text::Family::Name("Times New Roman"));
+    attrs_2.color_opt = Some(cosmic_text::Color::rgb(0x94, 0x00, 0xD3));
 
     let cosmic_edit_2 = CosmicEditUiBundle {
         cosmic_attrs: CosmicAttrs(AttrsOwned::new(attrs_2)),
         cosmic_metrics: CosmicMetrics {
-            font_size: 14.,
-            line_height: 18.,
+            font_size: 28.,
+            line_height: 36.,
             scale_factor: primary_window.scale_factor() as f32,
         },
         text_position: CosmicTextPosition::Center,
diff --git a/src/lib.rs b/src/lib.rs
index 9f09020f745a850aa8d7849c2bea3b6814fcb61f..3a0452095c960793c03aaadc803a9bf8da0e2b71 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -389,6 +389,8 @@ impl Plugin for CosmicEditPlugin {
                         .before(cosmic_edit_set_redraw)
                         .before(on_scale_factor_change),
                     cosmic_edit_redraw_buffer.before(on_scale_factor_change),
+                    blink_cursor,
+                    hide_inactive_cursor,
                 ),
             )
             .init_resource::<ActiveEditor>()
@@ -1177,6 +1179,61 @@ fn cosmic_edit_redraw_buffer_ui(
     }
 }
 
+fn blink_cursor(
+    mut visible: Local<bool>,
+    mut timer: Local<Option<Timer>>,
+    time: Res<Time>,
+    active_editor: ResMut<ActiveEditor>,
+    mut cosmic_editor_q: Query<(&mut CosmicEditor, &BackgroundColor), Without<ReadOnly>>,
+) {
+    if let Some(e) = active_editor.entity {
+        if let Ok((mut editor, bg_color)) = cosmic_editor_q.get_mut(e) {
+            let timer =
+                timer.get_or_insert_with(|| Timer::from_seconds(0.53, TimerMode::Repeating));
+
+            timer.tick(time.delta());
+            if !timer.just_finished() && !active_editor.is_changed() {
+                return;
+            }
+            *visible = !*visible;
+
+            // always start cursor visible on focus
+            if active_editor.is_changed() {
+                *visible = true;
+                timer.set_elapsed(Duration::from_secs(0));
+            }
+
+            let mut cursor = editor.0.cursor();
+            let new_color = if *visible {
+                None
+            } else {
+                Some(bevy_color_to_cosmic(bg_color.0))
+            };
+            cursor.color = new_color;
+            editor.0.set_cursor(cursor);
+            editor.0.buffer_mut().set_redraw(true);
+        }
+    }
+}
+
+fn hide_inactive_cursor(
+    mut cosmic_editor_q: Query<(Entity, &mut CosmicEditor, &BackgroundColor)>,
+    active_editor: Res<ActiveEditor>,
+) {
+    if !active_editor.is_changed() || active_editor.entity.is_none() {
+        return;
+    }
+
+    for (e, mut editor, bg_color) in &mut cosmic_editor_q.iter_mut() {
+        if e != active_editor.entity.unwrap() {
+            let mut cursor = editor.0.cursor();
+            cursor.color = Some(bevy_color_to_cosmic(bg_color.0));
+            editor.0.set_cursor(cursor);
+            editor.0.buffer_mut().set_redraw(true);
+        }
+    }
+}
+
 fn cosmic_edit_redraw_buffer(
     windows: Query<&Window, With<PrimaryWindow>>,
     mut images: ResMut<Assets<Image>>,