diff --git a/.gitignore b/.gitignore
index 99d1388..076443d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,3 +10,4 @@ Cargo.lock
 **/*.rs.bk
 
 /*.gif
+/savegame.json
diff --git a/game/src/scenes/ingame_scene/mod.rs b/game/src/scenes/ingame_scene/mod.rs
index 7762dc1..8577c83 100644
--- a/game/src/scenes/ingame_scene/mod.rs
+++ b/game/src/scenes/ingame_scene/mod.rs
@@ -133,6 +133,7 @@ impl Action<Scenes, ScreenError, GameContext> for InGameScreen {
         // Render the HUD
         self.render_screen_space(&mut renderer, &context.config);
 
+
         // Check if the player won
         let cur_level = self.levels.get(context.current_level).unwrap();
         if self.player.position.x > cur_level.zones.win.x {
diff --git a/game/src/scenes/next_level_screen.rs b/game/src/scenes/next_level_screen.rs
index 5714600..b677855 100644
--- a/game/src/scenes/next_level_screen.rs
+++ b/game/src/scenes/next_level_screen.rs
@@ -1,6 +1,6 @@
 use std::ops::{Div, Sub};
 
-use chrono::{DateTime, Utc};
+use chrono::{DateTime, Duration, Utc};
 use dirty_fsm::{Action, ActionFlag};
 use discord_sdk::activity::{ActivityBuilder, Assets};
 use pkg_version::pkg_version_major;
@@ -24,6 +24,9 @@ use tracing::{debug, error, info, trace};
 #[derive(Debug)]
 pub struct NextLevelScreen {
     is_next_pressed: bool,
+    screen_load_time: DateTime<Utc>,
+    attempt_time: String,
+    best_time: String,
 }
 
 impl NextLevelScreen {
@@ -31,6 +34,9 @@ impl NextLevelScreen {
     pub fn new() -> Self {
         Self {
             is_next_pressed: false,
+            screen_load_time: Utc::now(),
+            attempt_time: String::new(),
+            best_time: String::new(),
         }
     }
 }
@@ -43,6 +49,7 @@ impl Action<Scenes, ScreenError, GameContext> for NextLevelScreen {
 
     fn on_first_run(&mut self, context: &GameContext) -> Result<(), ScreenError> {
         debug!("Running NextLevelScreen for the first time");
+        self.screen_load_time = Utc::now();
 
         if let Err(e) = context.discord_rpc_send.send(Some(
             ActivityBuilder::default().details("accepting fate").assets(
@@ -63,6 +70,22 @@ impl Action<Scenes, ScreenError, GameContext> for NextLevelScreen {
         trace!("execute() called on NextLevelScreen");
         self.render_screen_space(&mut context.renderer.borrow_mut(), &context.config);
 
+        let attempt_elapsed = self.screen_load_time - context.level_start_time;
+        self.attempt_time = format!(
+            "{:02}:{:02}",
+            attempt_elapsed.num_minutes(),
+            attempt_elapsed.num_seconds() % 60
+        );
+        let best_time = context
+            .player_progress
+            .get_level_best_time(context.current_level)
+            .unwrap_or(attempt_elapsed);
+        self.best_time = format!(
+            "{:02}:{:02}",
+            best_time.num_minutes(),
+            best_time.num_seconds() % 60
+        );
+
         if self.is_next_pressed {
             Ok(ActionFlag::SwitchState(Scenes::InGameScene))
         } else {
@@ -114,7 +137,14 @@ impl ScreenSpaceRender for NextLevelScreen {
         //Time
         raylib.draw_rgb_split_text(
             Vector2::new(80.0, screen_size.y / 2.0 - 40.0),
-            "YOUR TIME: ",
+            &format!("YOUR TIME: {}", self.attempt_time),
+            20,
+            false,
+            Color::WHITE,
+        );
+        raylib.draw_rgb_split_text(
+            Vector2::new(80.0, screen_size.y / 2.0 - 20.0),
+            &format!("BEST TIME: {}", self.best_time),
             20,
             false,
             Color::WHITE,