diff --git a/examples/login.rs b/examples/login.rs
index 51594b698fa3bec376b61324a331762fa9a36274..8942c5176a73155da2c4e7f6a0e2c093a3d3c93c 100644
--- a/examples/login.rs
+++ b/examples/login.rs
@@ -67,7 +67,7 @@ fn setup(mut commands: Commands, window: Query<&Window, With<PrimaryWindow>>) {
                     Attrs::new().color(bevy_color_to_cosmic(Color::rgb_u8(128, 128, 128))),
                 )),
             })
-            .insert(PasswordInput);
+            .insert(PasswordInput('\u{1F92B}'));
         });
 }
 
@@ -104,10 +104,18 @@ fn print_changed_input(mut evr_type: EventReader<CosmicTextChanged>) {
 }
 
 fn main() {
+    let font_bytes: &[u8] = include_bytes!("../assets/fonts/VictorMono-Regular.ttf");
+    let font_config = CosmicFontConfig {
+        fonts_dir_path: None,
+        font_bytes: Some(vec![font_bytes]),
+        load_system_fonts: true,
+    };
+
     App::new()
         .add_plugins(DefaultPlugins)
         .add_plugins(CosmicEditPlugin {
             change_cursor: CursorConfig::Default,
+            font_config,
             ..default()
         })
         .add_systems(Startup, setup)
diff --git a/src/lib.rs b/src/lib.rs
index 51a430d9ddcd104e24aa3ee10d3787356ea8a765..0fdbb84aca597e394cf8255675296d57ca996c8f 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -205,7 +205,13 @@ pub struct PlaceholderText(pub CosmicText);
 pub struct PlaceholderAttrs(pub AttrsOwned);
 
 #[derive(Component)]
-pub struct PasswordInput;
+pub struct PasswordInput(pub char);
+
+impl Default for PasswordInput {
+    fn default() -> Self {
+        PasswordInput("•".chars().next().unwrap())
+    }
+}
 
 impl Default for PlaceholderAttrs {
     fn default() -> Self {
diff --git a/src/render.rs b/src/render.rs
index 1a8deca75329eb156423fb81d81964dad12845b2..5451d97b3393436bb5b5d65b14f997c4ca838d77 100644
--- a/src/render.rs
+++ b/src/render.rs
@@ -11,8 +11,9 @@ use image::{imageops::FilterType, GenericImageView};
 
 use crate::{
     get_text_size, get_x_offset_center, get_y_offset_center, CosmicAttrs, CosmicBackground,
-    CosmicCanvas, CosmicEditor, CosmicFontSystem, CosmicMetrics, CosmicMode, CosmicTextPosition,
-    FillColor, Focus, PasswordInput, Placeholder, ReadOnly, XOffset, DEFAULT_SCALE_PLACEHOLDER,
+    CosmicCanvas, CosmicEditor, CosmicFontSystem, CosmicMetrics, CosmicMode, CosmicText,
+    CosmicTextPosition, FillColor, Focus, PasswordInput, Placeholder, ReadOnly, XOffset,
+    DEFAULT_SCALE_PLACEHOLDER,
 };
 
 #[derive(Resource)]
@@ -73,12 +74,14 @@ pub(crate) fn cosmic_edit_redraw_buffer(
         let current_text = cosmic_editor.get_text();
 
         // intercept text for password inputs
-        if password_opt.is_some() && !current_text.is_empty() {
-            cosmic_editor.set_text(
-                crate::CosmicText::OneStyle("•".repeat(current_text.len())),
-                attrs.0.clone(),
-                &mut font_system.0,
-            );
+        if let Some(password) = password_opt {
+            if !current_text.is_empty() {
+                cosmic_editor.set_text(
+                    CosmicText::OneStyle(format!("{}", password.0).repeat(current_text.len())),
+                    attrs.0.clone(),
+                    &mut font_system.0,
+                );
+            }
         }
 
         // Check for placeholder, replace editor if found and buffer is empty