This is an automated email from the ASF dual-hosted git repository.

piotr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iggy.git


The following commit(s) were added to refs/heads/master by this push:
     new 239a11e7 feat(bench): introduce benchmark deep linking and 'Recent' 
tab (#1773)
239a11e7 is described below

commit 239a11e7804040f3e704d5488e977dc7913b78b5
Author: Hubert Gruszecki <[email protected]>
AuthorDate: Mon May 26 15:00:13 2025 +0200

    feat(bench): introduce benchmark deep linking and 'Recent' tab (#1773)
    
    This commit introduces Yew routing to enable sharing links
    directly to specific benchmarks. By appending a benchmark's UUID to the URL 
(e.g., /benchmark/:uuid),
    users can navigate directly to its detailed view.
    This enhances collaboration and accessibility by allowing for easy sharing 
and direct access.
    
    Key changes for deep linking:
    - Implemented route handling for `/benchmark/:uuid`.
    - Refined application state management in `AppContent.rs` to
      correctly initialize hardware, git reference, and benchmark
      contexts when a UUID is present in the URL.
    - Addressed potential race conditions and URL flickering
      during deep link loading by introducing a pending selection
      mechanism. This ensures that the target benchmark is
      selected only after its associated data (hardware, gitref,
      and benchmark list) is fully loaded and contexts are
      aligned.
    
    Additionally, this commit enhances the "Recent" tab in the sidebar:
    - The "Recent" tab now fetches and displays a significantly
      larger number of benchmarks (currently up to 10,000)
      instead of a fixed small limit. This provides a more
      comprehensive overview of recent benchmark activities.
    - The underlying API call in `fetch_recent_benchmarks` was
      adjusted to accept this larger limit.
---
 Cargo.lock                                         |   7 +-
 DEPENDENCIES.md                                    |   4 +-
 core/bench/dashboard/README.md                     |  13 -
 core/bench/dashboard/frontend/Cargo.toml           |   5 +-
 core/bench/dashboard/frontend/assets/style.css     | 662 +++++++++++++++++++--
 core/bench/dashboard/frontend/src/api/mod.rs       |  61 +-
 .../frontend/src/components/app_content.rs         | 430 +++++++------
 .../frontend/src/components/chart/single_chart.rs  |  12 +
 .../frontend/src/components/layout/main_content.rs |  80 ++-
 .../frontend/src/components/layout/sidebar.rs      | 174 +++---
 .../bench/dashboard/frontend/src/components/mod.rs |   1 +
 .../components/selectors/benchmark_search_box.rs   |  44 ++
 .../src/components/selectors/benchmark_selector.rs |  31 +-
 .../src/components/selectors/hardware_selector.rs  |  54 +-
 .../frontend/src/components/selectors/mod.rs       |   2 +
 .../selectors/recent_benchmarks_selector.rs        | 265 +++++++++
 .../src/components/selectors/view_mode_selector.rs |  71 ++-
 core/bench/dashboard/frontend/src/main.rs          |   2 +-
 core/bench/dashboard/frontend/src/router.rs        |   4 +-
 .../dashboard/frontend/src/state/benchmark.rs      | 295 ++++-----
 core/bench/dashboard/frontend/src/state/ui.rs      |   6 +-
 core/bench/dashboard/server/Cargo.toml             |   2 +-
 core/bench/dashboard/server/src/cache/query.rs     |  40 +-
 core/bench/dashboard/server/src/handlers.rs        |  29 +-
 core/bench/dashboard/server/src/main.rs            |   1 +
 core/bench/dashboard/shared/src/subtext.rs         |   9 +
 core/bench/report/src/types/benchmark_kind.rs      |   2 +-
 27 files changed, 1758 insertions(+), 548 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index 96dee5e0..6df9d5a5 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -863,16 +863,17 @@ dependencies = [
 
 [[package]]
 name = "bench-dashboard-frontend"
-version = "0.1.0"
+version = "0.4.1"
 dependencies = [
  "bench-dashboard-shared",
  "bench-report",
  "charming",
+ "chrono",
  "getrandom 0.3.3",
  "gloo 0.11.0",
  "js-sys",
+ "serde_json",
  "thiserror 2.0.12",
- "urlencoding",
  "uuid",
  "wasm-bindgen",
  "web-sys",
@@ -883,7 +884,7 @@ dependencies = [
 
 [[package]]
 name = "bench-dashboard-server"
-version = "0.1.0"
+version = "0.4.0"
 dependencies = [
  "actix-cors",
  "actix-files",
diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md
index 2903cdb9..1bb3a6a9 100644
--- a/DEPENDENCIES.md
+++ b/DEPENDENCIES.md
@@ -64,8 +64,8 @@ base64: 0.21.7, "Apache-2.0 OR MIT",
 base64: 0.22.1, "Apache-2.0 OR MIT",
 bcrypt: 0.17.0, "MIT",
 bench: 0.2.4, "Apache-2.0",
-bench-dashboard-frontend: 0.1.0, "Apache-2.0",
-bench-dashboard-server: 0.1.0, "Apache-2.0",
+bench-dashboard-frontend: 0.4.1, "Apache-2.0",
+bench-dashboard-server: 0.4.0, "Apache-2.0",
 bench-dashboard-shared: 0.1.0, "Apache-2.0",
 bench-report: 0.2.2, "Apache-2.0",
 bench-runner: 0.1.0, "Apache-2.0",
diff --git a/core/bench/dashboard/README.md b/core/bench/dashboard/README.md
index 3e996682..be857d00 100644
--- a/core/bench/dashboard/README.md
+++ b/core/bench/dashboard/README.md
@@ -32,10 +32,6 @@ The project is organized as a Rust workspace with four main 
components:
   - Configurable through command-line arguments
   - Built-in security features
 
-- `runner/`: Benchmark runner
-  - Runs local benchmarks and collects results
-  - Organizes benchmark results in a structured format
-
 - `shared/`: Common code between components
   - Type definitions
   - Serialization logic
@@ -117,15 +113,6 @@ All endpoints return JSON responses (except artifacts 
which returns a ZIP file)
 - 404: Resource not found
 - 500: Server error
 
-### Runner
-
-Allows to run and collect performance results for multiple gitrefs back:
-
-```bash
-cargo run --bin bench-runner -- --directory ~/rust/iggy --count 10 --gitref 
master --skip-master-check
-out --output-dir performance_results
-```
-
 ## Prerequisites
 
 - Rust toolchain (latest stable)
diff --git a/core/bench/dashboard/frontend/Cargo.toml 
b/core/bench/dashboard/frontend/Cargo.toml
index bb7a14e1..ff299474 100644
--- a/core/bench/dashboard/frontend/Cargo.toml
+++ b/core/bench/dashboard/frontend/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 name = "bench-dashboard-frontend"
 license = "Apache-2.0"
-version = "0.1.0"
+version = "0.4.1"
 edition = "2024"
 
 [package.metadata.cargo-machete]
@@ -11,11 +11,12 @@ ignored = ["getrandom"]
 bench-dashboard-shared = { workspace = true }
 bench-report = { workspace = true }
 charming = { workspace = true, features = ["wasm"] }
+chrono = { workspace = true }
 getrandom = { version = "0.3", features = ["wasm_js"] }
 gloo = "0.11"
 js-sys = "0.3"
+serde_json = { workspace = true }
 thiserror = { workspace = true }
-urlencoding = "2.1.3"
 uuid = { workspace = true, features = ["js"] }
 wasm-bindgen = "0.2"
 web-sys = { version = "0.3", features = [
diff --git a/core/bench/dashboard/frontend/assets/style.css 
b/core/bench/dashboard/frontend/assets/style.css
index 2c914b86..9899bc5b 100644
--- a/core/bench/dashboard/frontend/assets/style.css
+++ b/core/bench/dashboard/frontend/assets/style.css
@@ -26,7 +26,7 @@
     --color-border: #dddddd;
     --color-sidebar: #f5f5f5;
     --color-hover: #f5f5f5;
-    --color-active: #f5f5f5;
+    --color-active: #e0e0e0;
     --color-shadow: rgba(0, 0, 0, 0.1);
     --color-shadow-light: rgba(0, 0, 0, 0.05);
     --color-shadow-medium: rgba(0, 0, 0, 0.15);
@@ -72,11 +72,16 @@
     --transition-speed-slow: 0.3s;
 }
 
-body {
+html, body {
     margin: 0;
     padding: 0;
+    height: 100vh;
+    max-height: 100vh;
+    overflow: hidden;
+}
+
+body {
     font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 
Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
-    min-height: 100vh;
     display: flex;
     flex-direction: column;
 }
@@ -84,7 +89,9 @@ body {
 #app {
     display: flex;
     flex-direction: column;
-    min-height: 100vh;
+    height: 100vh;
+    max-height: 100vh;
+    overflow: hidden;
 }
 
 .app-container {
@@ -97,6 +104,9 @@ body {
     flex: 1;
     display: flex;
     min-height: 0;
+    max-height: 100vh; /* Constrain container to viewport height */
+    overflow: hidden; /* Prevent scrolling at container level */
+    background-color: var(--color-sidebar);
 }
 
 .sidebar {
@@ -104,10 +114,46 @@ body {
     min-width: unset;
     max-width: unset;
     background-color: var(--color-sidebar);
-    padding: var(--spacing-xl);
     border-right: 1px solid var(--color-border);
-    overflow-y: auto;
+    overflow: hidden; /* Prevent scrolling on sidebar itself */
     box-sizing: border-box;
+    height: 100%; /* Ensure sidebar takes full height */
+    max-height: 100vh; /* Constrain to viewport height */
+    display: flex;
+    flex-direction: column;
+}
+
+.sidebar-fixed-header {
+    padding: var(--spacing-xl) var(--spacing-xl) var(--spacing-md) 
var(--spacing-xl);
+    flex-shrink: 0; /* Prevent the header from shrinking */
+    position: sticky; /* Make it sticky */
+    top: 0; /* Stick to the top */
+    background-color: var(--color-sidebar); /* Background to prevent 
show-through */
+    z-index: 20; /* Ensure it's above scrollable content */
+}
+
+.sidebar-scrollable-content {
+    flex-grow: 1;
+    overflow-y: auto; /* Enable scrolling for the content area */
+    padding: 0 var(--spacing-md) var(--spacing-xl) var(--spacing-md); /* 
Balanced left and right padding */
+    scrollbar-width: thin; /* For Firefox */
+    display: flex;
+    flex-direction: column;
+    align-items: stretch; /* Center children horizontally */
+}
+
+/* Style the scrollbar for webkit browsers */
+.sidebar-scrollable-content::-webkit-scrollbar {
+    width: 8px;
+}
+
+.sidebar-scrollable-content::-webkit-scrollbar-track {
+    background: var(--color-sidebar);
+}
+
+.sidebar-scrollable-content::-webkit-scrollbar-thumb {
+    background-color: var(--color-border);
+    border-radius: 4px;
 }
 
 .content {
@@ -150,6 +196,24 @@ body {
     line-height: 1.4;
 }
 
+.chart-title-identifier {
+    font-size: var(--font-size-md, 0.75rem);
+    color: var(--color-text-muted);
+    font-style: italic;
+    font-weight: 500;
+    margin-top: var(--spacing-sm);
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    max-width: 100%;
+    padding: 0 var(--spacing-sm);
+    box-sizing: border-box;
+}
+
+body.dark .chart-title-identifier {
+    color: var(--color-dark-text-secondary);
+}
+
 .single-view,
 .trend-view {
     flex: 1;
@@ -178,6 +242,11 @@ h3 {
     color: var(--color-text);
 }
 
+/* Consistent heading spacing for Benchmarks section */
+.benchmarks-heading {
+    margin-bottom: 0 !important;
+}
+
 /* --- Unified Select Styles Start --- */
 
 /* Define a general select style */
@@ -251,6 +320,8 @@ body.dark select option {
 .gitref-select,
 .hardware-select {
     margin-bottom: var(--spacing-xl);
+    margin-left: 0;
+    margin-right: 0;
 }
 
 .logo {
@@ -608,14 +679,17 @@ body.dark select option {
 }
 
 .hardware-select,
+.gitref-select,
 .benchmark-select {
     margin: var(--spacing-md) 0;
     width: 100%;
+    padding: 0 var(--spacing-xs) 0 0;
 }
 
 .hardware-select h3,
 .benchmark-select h3 {
     margin-bottom: var(--spacing-sm);
+    padding-left: var(--spacing-sm);
     color: var(--color-text);
 }
 
@@ -788,7 +862,11 @@ body.dark .footer .gitref {
 }
 
 .sidebar-tabs {
+    display: flex;
+    flex-direction: column;
+    flex: 1;
     margin-bottom: var(--spacing-xl);
+    margin-top: 0;
 }
 
 .tab-list {
@@ -797,6 +875,8 @@ body.dark .footer .gitref {
     margin-bottom: var(--spacing-md);
     border-bottom: 1px solid var(--color-border);
     padding-bottom: var(--spacing-xs);
+    padding-left: var(--spacing-sm); /* Added to align with fixed header 
content */
+    padding-right: var(--spacing-sm); /* Added for symmetry */
 }
 
 .tab-button {
@@ -837,6 +917,7 @@ body.dark .footer .gitref {
 
 .tab-content {
     display: none;
+    padding: 0 var(--spacing-sm) 0 var(--spacing-sm);
 }
 
 .tab-content.active {
@@ -865,7 +946,10 @@ body.dark .footer .gitref {
 .benchmark-grid {
     display: flex;
     gap: var(--spacing-sm);
-    margin-top: var(--spacing-md);
+    margin: var(--spacing-md) auto 0;
+    width: 100%;
+    padding: 0;
+    box-sizing: border-box;
 }
 
 .benchmark-option {
@@ -906,6 +990,7 @@ body.dark .footer .gitref {
 .benchmark-option.active {
     background-color: var(--color-active);
     border-color: var(--color-text);
+    border-left: 4px solid var(--color-text);
 }
 
 .benchmark-option-icon {
@@ -931,26 +1016,94 @@ body.dark .footer .gitref {
 
 .dark .benchmark-option.active {
     background-color: var(--color-dark-active);
-    border-color: var(--color-dark-text);
+    color: var(--color-dark-text);
+    border-left: 4px solid var(--color-dark-text);
+}
+
+.benchmark-list-container {
+    display: flex;
+    flex-direction: column;
+    width: 100%; /* Take full width of parent */
+    max-width: calc(100% - var(--spacing-md) * 2); /* Match search box width */
+    box-sizing: border-box;
+}
+
+/* Specific fix for the gap in Recent view, applied to benchmark-list-wrapper 
*/
+.close-gap {
+    margin-top: -10px;
+}
+
+/* Search container and input styling */
+.search-container {
+    width: 100%;
+    max-width: calc(100% - var(--spacing-md) * 2); /* Match parent container 
width */
+    margin-top: var(--spacing-sm);
+    box-sizing: border-box;
+    padding: 0; /* Remove any padding */
+}
+
+.benchmark-search-input {
+    width: 100%;
+    padding: var(--spacing-sm) var(--spacing-md);
+    border: 1px solid var(--color-border);
+    border-radius: var(--border-radius);
+    font-size: var(--font-size-sm);
+    box-sizing: border-box;
+    background-color: var(--color-background);
+    color: var(--color-text);
+}
+
+.benchmark-search-input:focus {
+    outline: none;
+    border-color: var(--color-active);
+    box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
+}
+
+/* Dark mode styles for search */
+body.dark .benchmark-search-input {
+    background-color: var(--color-dark-input);
+    border-color: var(--color-dark-border);
+    color: var(--color-dark-text);
+}
+
+body.dark .benchmark-search-input:focus {
+    border-color: var(--color-dark-active);
+    box-shadow: 0 0 0 2px rgba(var(--color-dark-active-rgb), 0.4);
+}
+
+.benchmark-list-wrapper {
+    display: flex;
+    flex-direction: column;
+    padding: 0; /* No padding at all */
+    margin: 0; /* No margin */
 }
 
 .benchmark-list {
     margin-top: var(--spacing-md);
-    border: 1px solid var(--color-border);
+    border: none; /* Removed border */
     border-radius: var(--border-radius);
-    max-height: 200px;
-    overflow-y: auto;
+    background-color: var(--color-sidebar);
+    overflow-y: visible;
+    max-height: none;
+    padding-left: 0; /* Ensure no left padding */
 }
 
 .benchmark-list-item {
-    padding: var(--spacing-sm) var(--spacing-md);
+    padding: var(--spacing-xs) var(--spacing-xs) var(--spacing-xs) 
var(--spacing-lg); /* Add left padding for dot */
     cursor: pointer;
     transition: all var(--transition-speed);
-    border-bottom: 1px solid var(--color-border);
-    font-size: var(--font-size-sm);
+    border-bottom: none; /* Removed border */
+    background-color: var(--color-sidebar);
+    font-size: var(--font-size-xs);
     display: flex;
     align-items: center;
-    gap: var(--spacing-sm);
+    gap: var(--spacing-xs);
+    position: relative; /* Create positioning context for dot */
+}
+
+.benchmark-list-item-content {
+    flex: 1;
+    line-height: 1.1;
 }
 
 .benchmark-list-item:last-child {
@@ -964,20 +1117,24 @@ body.dark .footer .gitref {
 .benchmark-list-item.active {
     background-color: var(--color-active);
     font-weight: 500;
+    border-left: 4px solid var(--color-text);
+    padding-left: calc(var(--spacing-lg) - 4px);
 }
 
-.benchmark-list-item-dot {
-    width: 8px;
-    height: 8px;
-    border-radius: 50%;
-    background-color: var(--color-text-secondary);
-    opacity: 0;
-    transition: all var(--transition-speed);
+.benchmark-list-item-dot,
+span.benchmark-list-item-dot {
+    display: none !important;
+    opacity: 0 !important;
+    width: 0 !important;
+    height: 0 !important;
 }
 
-.benchmark-list-item.active .benchmark-list-item-dot {
-    opacity: 1;
-    background-color: var(--color-text);
+.benchmark-list-item.active .benchmark-list-item-dot,
+.benchmark-list-item .benchmark-list-item-dot {
+    display: none !important; /* Hide dots in all contexts */
+    opacity: 0 !important;
+    width: 0 !important;
+    height: 0 !important;
 }
 
 /* Dark mode styles */
@@ -996,32 +1153,32 @@ body.dark .footer .gitref {
 
 .dark .benchmark-list-item.active {
     background-color: var(--color-dark-active);
+    border-left: 4px solid var(--color-dark-text);
+    padding-left: calc(var(--spacing-lg) - 4px);
 }
 
 .dark .benchmark-list-item-dot {
-    background-color: var(--color-dark-text-secondary);
+    display: none !important; /* Hide dots in dark mode */
+    opacity: 0 !important;
+    width: 0 !important;
+    height: 0 !important;
 }
 
 .dark .benchmark-list-item.active .benchmark-list-item-dot {
-    background-color: var(--color-dark-text);
+    display: none !important; /* Hide dots in dark mode active state */
+    opacity: 0 !important;
+    width: 0 !important;
+    height: 0 !important;
 }
 
 /* Scrollbar styles */
-.benchmark-list::-webkit-scrollbar {
-    width: 8px;
-}
 
-.benchmark-list::-webkit-scrollbar-track {
-    background: transparent;
+.dark .sidebar-scrollable-content::-webkit-scrollbar-thumb {
+    background-color: var(--color-dark-border);
 }
 
-.benchmark-list::-webkit-scrollbar-thumb {
-    background-color: var(--color-border);
-    border-radius: 4px;
-}
-
-.dark .benchmark-list::-webkit-scrollbar-thumb {
-    background-color: var(--color-dark-border);
+.dark .sidebar-scrollable-content::-webkit-scrollbar-track {
+    background-color: var(--color-dark-sidebar);
 }
 
 .measurement-buttons {
@@ -1047,7 +1204,7 @@ body.dark .footer .gitref {
 }
 
 .measurement-button:last-child {
-    min-width: 95px;  /* Make Throughput button slightly wider */
+    min-width: 95px;
 }
 
 .measurement-button:hover {
@@ -1138,7 +1295,430 @@ body.dark .footer .gitref {
     transform: rotate(45deg) !important;
 }
 
-/* Position containers */
 .info-container {
     position: relative;
 }
+
+.recent-benchmarks-container {
+    padding: var(--spacing-xl);
+    overflow-y: visible;
+    flex: 1;
+}
+
+.recent-benchmarks-container h1 {
+    margin-top: 0;
+    margin-bottom: var(--spacing-xl);
+    font-size: var(--font-size-lg);
+    color: var(--color-text);
+    text-align: center;
+}
+
+.benchmark-cards-grid {
+    display: grid;
+    grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
+    gap: var(--spacing-xl);
+    margin-bottom: var(--spacing-xl);
+}
+
+.benchmark-card {
+    background-color: var(--color-background);
+    border: 1px solid var(--color-border);
+    border-radius: var(--border-radius);
+    padding: var(--spacing-lg);
+    box-shadow: 0 2px 4px var(--color-shadow-light);
+    transition: box-shadow var(--transition-speed), transform 
var(--transition-speed);
+}
+
+.benchmark-card:hover {
+    box-shadow: 0 4px 8px var(--color-shadow-medium);
+    transform: translateY(-2px);
+}
+
+.card-header {
+    margin-bottom: var(--spacing-md);
+    border-bottom: 1px solid var(--color-border);
+    padding-bottom: var(--spacing-md);
+}
+
+.benchmark-name {
+    margin-top: 0;
+    margin-bottom: var(--spacing-xs);
+    font-size: var(--font-size-md);
+    color: var(--color-text);
+}
+
+.benchmark-time {
+    display: block;
+    font-size: var(--font-size-xs);
+    color: var(--color-text-secondary);
+    margin-bottom: var(--spacing-sm);
+}
+
+.benchmark-metadata {
+    margin-bottom: var(--spacing-lg);
+}
+
+.metadata-item {
+    margin-bottom: var(--spacing-sm);
+    display: flex;
+    flex-direction: column;
+}
+
+.metadata-label {
+    font-size: var(--font-size-xs);
+    color: var(--color-text-secondary);
+    margin-bottom: 2px;
+}
+
+.metadata-value {
+    font-size: var(--font-size-sm);
+    color: var(--color-text);
+    font-weight: 500;
+}
+
+.view-details-button {
+    width: 100%;
+    padding: var(--spacing-sm) var(--spacing-md);
+    background-color: var(--color-sidebar);
+    border: 1px solid var(--color-border);
+    border-radius: var(--border-radius);
+    cursor: pointer;
+    font-size: var(--font-size-sm);
+    transition: background-color var(--transition-speed);
+}
+
+.view-details-button:hover {
+background-color: var(--color-hover);
+}
+
+.loading-indicator, .benchmark-list-loading, .benchmark-list-error, 
.benchmark-list-empty {
+display: flex;
+flex-direction: column;
+align-items: center;
+justify-content: center;
+padding: var(--spacing-xxl);
+text-align: center;
+background-color: var(--color-sidebar);
+flex: 1;
+}
+
+.error-message button {
+margin-top: var(--spacing-md);
+padding: var(--spacing-sm) var(--spacing-lg);
+background-color: var(--color-sidebar);
+border: 1px solid var(--color-border);
+border-radius: var(--border-radius);
+cursor: pointer;
+    border: 1px solid var(--color-border);
+    border-radius: var(--border-radius);
+    cursor: pointer;
+}
+
+/* Enhanced Recent Benchmarks in Sidebar Styles */
+.recent-benchmark-item {
+    margin-bottom: var(--spacing-sm);
+    transition: all var(--transition-speed);
+    position: relative;
+    overflow: hidden;
+    border-left: 3px solid transparent;
+}
+
+.recent-benchmark-item:hover {
+    transform: translateX(2px);
+}
+
+.recent-benchmark-item.active {
+    border-left-color: var(--color-primary);
+    background-color: var(--color-active);
+}
+
+.benchmark-list-item-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    width: 100%;
+    margin-bottom: var(--spacing-xs);
+}
+
+.benchmark-list-item-title {
+    display: flex;
+    align-items: center;
+    font-weight: 600;
+    color: var(--color-text);
+    margin-right: var(--spacing-md);
+}
+
+.benchmark-list-item-time {
+    font-size: var(--font-size-xs);
+    color: var(--color-text-secondary);
+    white-space: nowrap;
+}
+
+.benchmark-list-item-dot {
+    display: inline-block;
+    width: 8px;
+    height: 8px;
+    border-radius: 50%;
+    margin-right: var(--spacing-xs);
+    background-color: var(--color-primary);
+}
+
+/* Different colors for different benchmark kinds */
+.benchmark-list-item-dot.pinned-producer {
+    background-color: #4CAF50;
+}
+
+.benchmark-list-item-dot.pinned-consumer {
+    background-color: #2196F3;
+}
+
+.benchmark-list-item-dot.balanced-producer {
+    background-color: #FF9800;
+}
+
+.benchmark-list-item-dot.balanced-consumer-group {
+    background-color: #E91E63;
+}
+
+.benchmark-list-item-dot.end-to-end-producing-consumer {
+    background-color: #9C27B0;
+}
+
+.benchmark-list-item-details {
+    padding-left: var(--spacing-xs);
+    border-left: 1px solid var(--color-border);
+    margin-left: 3px;
+}
+
+.benchmark-list-item-subtitle {
+    font-size: var(--font-size-xs);
+    margin-bottom: 2px;
+    color: var(--color-text-secondary);
+    display: inline-block;
+    margin-right: var(--spacing-md);
+}
+
+.benchmark-list-item-label {
+    font-weight: 600;
+    color: var(--color-text);
+    margin-right: var(--spacing-xs);
+}
+
+.benchmark-list-item-metrics {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    gap: 8px;
+    margin-top: 2px;
+}
+
+.metrics-group {
+    display: flex;
+    align-items: center;
+    gap: 2px;
+    flex-shrink: 0;
+}
+
+.benchmark-list-item-metric {
+    font-size: calc(var(--font-size-xs) - 1px);
+    padding: 2px 4px;
+    background-color: var(--color-hover);
+    display: inline-block;
+    border-radius: var(--border-radius);
+    color: var(--color-text);
+}
+
+.benchmark-list-item-metric.latency {
+    background-color: rgba(33, 150, 243, 0.1);
+    color: var(--color-text);
+}
+
+.benchmark-list-item-metric.throughput {
+    background-color: rgba(76, 175, 80, 0.1);
+    color: var(--color-text);
+}
+
+.benchmark-list-item-metric.message-throughput {
+    background-color: rgba(255, 152, 0, 0.1);
+    color: var(--color-text);
+}
+
+/* Dark mode styles for benchmark metrics */
+body.dark .benchmark-list-item-metric.latency {
+    background-color: rgba(33, 150, 243, 0.2);
+    color: var(--color-dark-text);
+}
+
+body.dark .benchmark-list-item-metric.throughput {
+    background-color: rgba(76, 175, 80, 0.2);
+    color: var(--color-dark-text);
+}
+
+body.dark .benchmark-list-item-metric.message-throughput {
+    background-color: rgba(255, 152, 0, 0.2);
+    color: var(--color-dark-text);
+}
+
+.benchmark-list-item-remark {
+    font-size: var(--font-size-xs);
+    margin-top: 2px;
+    font-style: italic;
+    line-height: 1.2;
+    color: var(--color-text-muted);
+    border-top: 1px dotted var(--color-border);
+    padding-top: 2px;
+}
+
+.inline-remark {
+    border-top: none;
+    padding-top: 0;
+    margin-top: 0;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    max-width: 150px;
+    flex-shrink: 1;
+    margin-left: auto;
+}
+
+/* Dark theme adjustments for recent benchmarks */
+.dark .recent-benchmark-item.active {
+    border-left-color: var(--color-primary);
+    background-color: var(--color-dark-active);
+}
+
+.dark .benchmark-list-item-title {
+    color: var(--color-dark-text);
+}
+
+.dark .benchmark-list-item-time,
+.dark .benchmark-list-item-subtitle {
+    color: var(--color-dark-text-secondary);
+}
+
+.dark .benchmark-list-item-label {
+    color: var(--color-dark-text);
+}
+
+.dark .benchmark-list-item-details {
+    border-left-color: var(--color-dark-border);
+}
+
+.dark .benchmark-list-item-metric {
+    background-color: var(--color-dark-hover);
+    color: var(--color-dark-text);
+}
+
+.dark .benchmark-list-item-remark {
+    color: var(--color-dark-text-secondary);
+    border-top-color: var(--color-dark-border);
+}
+
+.loading-message {
+    color: var(--color-text);
+    text-align: center;
+    padding: var(--spacing-lg);
+}
+
+.dark .loading-message {
+    color: var(--color-dark-text);
+}
+
+.no-search-results {
+    color: var(--color-text);
+    text-align: center;
+    padding: var(--spacing-lg);
+}
+
+.dark .no-search-results {
+    color: var(--color-dark-text);
+}
+
+/* Dark Theme Adjustments for the card view */
+.dark .benchmark-card {
+    background-color: var(--color-dark-sidebar);
+    border-color: var(--color-dark-border);
+    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
+}
+
+.dark .benchmark-card:hover {
+    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
+}
+
+.dark .card-header {
+    border-color: var(--color-dark-border);
+}
+
+.dark .benchmark-name {
+    color: var(--color-dark-text);
+}
+
+.dark .benchmark-time {
+    color: var(--color-dark-text-secondary);
+}
+
+.dark .metadata-label {
+    color: var(--color-dark-text-secondary);
+}
+
+.dark .metadata-value {
+    color: var(--color-dark-text);
+}
+
+.dark .view-details-button {
+    background-color: var(--color-dark-sidebar);
+    border-color: var(--color-dark-border);
+    color: var(--color-dark-text);
+}
+
+.dark .view-details-button:hover {
+    background-color: var(--color-dark-hover);
+}
+
+.dark .error-message button {
+    background-color: var(--color-dark-sidebar);
+    border-color: var(--color-dark-border);
+    color: var(--color-dark-text);
+}
+
+.dark .sidebar {
+    background-color: var(--color-dark-sidebar);
+    border-right-color: var(--color-dark-border);
+}
+
+.dark .sidebar-fixed-header {
+    background-color: var(--color-dark-sidebar);
+}
+
+.dark .sidebar-scrollable-content::-webkit-scrollbar-track {
+    background: var(--color-dark-sidebar);
+}
+
+.dark .sidebar-scrollable-content::-webkit-scrollbar-thumb {
+    background-color: var(--color-dark-border);
+}
+
+.benchmark-list-item-id-version-line {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    width: 100%;
+    margin-bottom: var(--spacing-xs);
+}
+
+.benchmark-list-item-id-version-line > .benchmark-list-item-subtitle {
+    margin-right: 0;
+    margin-bottom: 0;
+}
+
+.benchmark-list-item-id-version-line > .benchmark-version-subtitle {
+    padding-right: var(--spacing-sm);
+}
+
+.benchmark-list-item-subtitle {
+    font-size: var(--font-size-xs);
+    margin-bottom: 2px;
+    color: var(--color-text-secondary);
+    display: inline-block;
+    margin-right: var(--spacing-md);
+}
diff --git a/core/bench/dashboard/frontend/src/api/mod.rs 
b/core/bench/dashboard/frontend/src/api/mod.rs
index d669878c..6eab8de6 100644
--- a/core/bench/dashboard/frontend/src/api/mod.rs
+++ b/core/bench/dashboard/frontend/src/api/mod.rs
@@ -126,6 +126,42 @@ pub async fn fetch_benchmarks_for_hardware_and_gitref(
         .map_err(|e| IggyBenchDashboardError::Parse(e.to_string()))
 }
 
+pub async fn fetch_benchmark_by_uuid(uuid: &str) -> 
Result<BenchmarkReportLight> {
+    check_server_health().await?;
+
+    log!(format!("Fetching benchmark for UUID: {}", uuid));
+    let base_url = get_api_base_url();
+    let url = format!("{}/api/benchmark/light/{}", base_url, uuid);
+    let response = Request::get(&url).send().await.map_err(|e| {
+        log!(format!("Network error fetching benchmark: {}", e));
+        IggyBenchDashboardError::Network(e.to_string())
+    })?;
+
+    if response.status() != 200 {
+        return Err(IggyBenchDashboardError::Server(format!(
+            "Failed to fetch benchmark: {}",
+            response.status()
+        )));
+    }
+
+    let text = response.text().await.map_err(|e| {
+        log!(format!("Error getting response text: {}", e));
+        IggyBenchDashboardError::Parse(e.to_string())
+    })?;
+
+    if text.is_empty() {
+        log!("Got empty response body despite 200 status code");
+        return Err(IggyBenchDashboardError::Parse(
+            "Empty response body".to_string(),
+        ));
+    }
+
+    serde_json::from_str::<BenchmarkReportLight>(&text).map_err(|e| {
+        log!(format!("JSON parse error: {}", e));
+        IggyBenchDashboardError::Parse(e.to_string())
+    })
+}
+
 pub async fn fetch_benchmark_report_full(uuid: &Uuid) -> 
Result<BenchmarkReport> {
     check_server_health().await?;
 
@@ -179,10 +215,8 @@ pub async fn fetch_benchmark_trend(
 }
 
 pub fn download_test_artifacts(uuid: &Uuid) {
-    // Create the download URL
     let url = format!("{}/api/artifacts/{}", get_api_base_url(), uuid);
 
-    // Use browser's native download functionality
     if let Some(window) = window() {
         let _ = window
             .location()
@@ -190,3 +224,26 @@ pub fn download_test_artifacts(uuid: &Uuid) {
             .map_err(|_| log!("Failed to initiate download"));
     }
 }
+
+pub async fn fetch_recent_benchmarks(limit: Option<u32>) -> 
Result<Vec<BenchmarkReportLight>> {
+    check_server_health().await?;
+
+    let limit_param = limit.unwrap_or(20);
+    let url = format!("{}/api/recent/{}", get_api_base_url(), limit_param);
+
+    let resp = Request::get(&url)
+        .send()
+        .await
+        .map_err(|e| IggyBenchDashboardError::Network(e.to_string()))?;
+
+    if !resp.ok() {
+        return Err(IggyBenchDashboardError::Server(format!(
+            "Failed to fetch recent benchmarks: {}",
+            resp.status()
+        )));
+    }
+
+    resp.json()
+        .await
+        .map_err(|e| IggyBenchDashboardError::Parse(e.to_string()))
+}
diff --git a/core/bench/dashboard/frontend/src/components/app_content.rs 
b/core/bench/dashboard/frontend/src/components/app_content.rs
index 8e9f9fab..ff45896e 100644
--- a/core/bench/dashboard/frontend/src/components/app_content.rs
+++ b/core/bench/dashboard/frontend/src/components/app_content.rs
@@ -18,115 +18,168 @@
 use crate::{
     api,
     components::layout::{main_content::MainContent, sidebar::Sidebar},
+    router::AppRoute,
     state::{
         benchmark::{BenchmarkAction, BenchmarkContext, use_benchmark},
         gitref::{GitrefAction, GitrefContext, use_gitref},
         hardware::{HardwareAction, HardwareContext, use_hardware},
-        ui::{UiAction, use_ui},
+        ui::use_ui,
     },
 };
+use bench_report::hardware::BenchmarkHardware;
 use gloo::console::log;
-use urlencoding::decode;
 use yew::prelude::*;
-use yew_router::hooks::use_location;
+use yew_router::hooks::use_route;
+use yew_router::prelude::use_navigator;
 
 // Props definitions
 #[derive(Properties, PartialEq)]
 pub struct AppContentProps {}
 
-// Hardware initialization hook
 #[hook]
-fn use_init_hardware(hardware_ctx: HardwareContext) {
+fn use_init_hardware(
+    hardware_ctx: HardwareContext,
+    route: Option<AppRoute>,
+    is_loading_from_url: bool,
+) {
     use gloo::console::log;
 
-    use_effect_with((), move |_| {
-        let dispatch = hardware_ctx.dispatch.clone();
-        let already_selected = hardware_ctx.state.selected_hardware.clone();
-        yew::platform::spawn_local(async move {
-            match api::fetch_hardware_configurations().await {
-                Ok(mut hw_list) => {
-                    if !hw_list.is_empty() {
-                        hw_list.sort_by(|a, b| 
a.identifier.cmp(&b.identifier));
-                        
dispatch.emit(HardwareAction::SetHardwareList(hw_list.clone()));
+    use_effect_with(
+        (route, is_loading_from_url),
+        move |(route, is_loading_from_url)| {
+            let dispatch = hardware_ctx.dispatch.clone();
+            let already_selected = 
hardware_ctx.state.selected_hardware.clone();
+            let current_route = route.clone();
+            let loading_from_url = *is_loading_from_url;
 
-                        if already_selected.is_none() {
-                            if let Some(first_hw) = hw_list.first() {
-                                
dispatch.emit(HardwareAction::SelectHardware(Some(
-                                    first_hw.identifier.clone().unwrap(),
-                                )));
+            yew::platform::spawn_local(async move {
+                match api::fetch_hardware_configurations().await {
+                    Ok(mut hw_list) => {
+                        if !hw_list.is_empty() {
+                            hw_list.sort_by(|a, b| 
a.identifier.cmp(&b.identifier));
+                            
dispatch.emit(HardwareAction::SetHardwareList(hw_list.clone()));
+
+                            if already_selected.is_none() && !loading_from_url 
{
+                                if let Some(AppRoute::Benchmark { .. }) = 
current_route {
+                                    // Do nothing, app_content will handle 
selection for this route
+                                } else if let Some(preferred) =
+                                    preferred_hardware_identifier(&hw_list)
+                                {
+                                    
dispatch.emit(HardwareAction::SelectHardware(Some(preferred)));
+                                } else {
+                                    log!("No preferred hardware found");
+                                }
                             }
                         }
                     }
+                    Err(e) => log!(format!("Error fetching hardware: {}", e)),
                 }
-                Err(e) => log!(format!("Error fetching hardware: {}", e)),
-            }
-        });
-        || ()
-    });
+            });
+            || ()
+        },
+    );
+}
+
+fn preferred_hardware_identifier(hw_list: &[BenchmarkHardware]) -> 
Option<String> {
+    hw_list
+        .iter()
+        .filter_map(|hw| {
+            hw.identifier
+                .clone()
+                .filter(|identifier| identifier == "spetz-amd-rkyv")
+        })
+        .next()
 }
-// Gitref loading hook
+
 #[hook]
 fn use_load_gitrefs(
     gitref_ctx: GitrefContext,
-    benchmark_ctx: BenchmarkContext,
     hardware: Option<String>,
+    route: Option<AppRoute>,
+    is_loading_from_url: bool,
 ) {
     use gloo::console::log;
 
-    use_effect_with(hardware.clone(), move |hardware| {
-        let gitref_ctx = gitref_ctx.clone();
-        let benchmark_ctx = benchmark_ctx.clone();
-        let hardware = hardware.clone();
+    use_effect_with(
+        (hardware.clone(), route.clone(), is_loading_from_url),
+        move |(hardware_dep, route_dep, is_loading_dep)| {
+            let gitref_ctx_effect = gitref_ctx.clone();
+            let hardware_val = hardware_dep.clone();
+            let current_route_val = route_dep.clone();
+            let loading_from_url_val = *is_loading_dep;
 
-        if let Some(hardware) = hardware {
-            yew::platform::spawn_local(async move {
-                match api::fetch_gitrefs_for_hardware(&hardware).await {
-                    Ok(vers) => {
-                        gitref_ctx
-                            .dispatch
-                            .emit(GitrefAction::SetGitrefs(vers.clone()));
-                        if !vers.is_empty() {
-                            let current_selected = 
gitref_ctx.state.selected_gitref.clone();
+            if let Some(hw) = hardware_val {
+                yew::platform::spawn_local(async move {
+                    match api::fetch_gitrefs_for_hardware(&hw).await {
+                        Ok(vers) => {
+                            gitref_ctx_effect
+                                .dispatch
+                                .emit(GitrefAction::SetGitrefs(vers.clone()));
+                            if !vers.is_empty() {
+                                let current_selected_gitref_val =
+                                    
gitref_ctx_effect.state.selected_gitref.clone();
 
-                            let final_gitref = match current_selected {
-                                Some(ref existing) if vers.contains(existing) 
=> existing.clone(),
-                                _ => {
-                                    log!("Using first available version for 
new hardware");
-                                    vers[0].clone()
-                                }
-                            };
+                                log!(format!(
+                                    "use_load_gitrefs: Pre-auto-selection 
check. loading_from_url: {}, current_route: {:?}, has_versions: {}, 
current_selected_gitref: {:?}",
+                                    loading_from_url_val,
+                                    current_route_val,
+                                    !vers.is_empty(),
+                                    current_selected_gitref_val
+                                ));
 
-                            if Some(final_gitref.clone()) != 
gitref_ctx.state.selected_gitref {
-                                gitref_ctx
-                                    .dispatch
-                                    .emit(GitrefAction::SetSelectedGitref(Some(
-                                        final_gitref.clone(),
-                                    )));
-                            }
+                                if !loading_from_url_val {
+                                    if let Some(AppRoute::Benchmark { .. }) = 
current_route_val {
+                                        log!(
+                                            "use_load_gitrefs: On Benchmark 
route, skipping auto gitref selection."
+                                        );
+                                    } else {
+                                        log!(
+                                            "use_load_gitrefs: Not on 
Benchmark route, proceeding with auto gitref selection logic."
+                                        );
+                                        let final_gitref = match 
current_selected_gitref_val {
+                                            Some(ref existing) if 
vers.contains(existing) => {
+                                                log!(format!(
+                                                    "use_load_gitrefs: 
Retaining existing gitref: {}",
+                                                    existing
+                                                ));
+                                                existing.clone()
+                                            }
+                                            _ => {
+                                                log!(format!(
+                                                    "use_load_gitrefs: 
Selecting first available gitref: {}",
+                                                    vers[0]
+                                                ));
+                                                vers[0].clone()
+                                            }
+                                        };
 
-                            match 
api::fetch_benchmarks_for_hardware_and_gitref(
-                                &hardware,
-                                &final_gitref,
-                            )
-                            .await
-                            {
-                                Ok(benchmarks) => {
-                                    benchmark_ctx.dispatch.emit(
-                                        
BenchmarkAction::SetBenchmarksForGitref(
-                                            benchmarks, hardware,
-                                        ),
-                                    );
+                                        if Some(final_gitref.clone())
+                                            != 
gitref_ctx_effect.state.selected_gitref
+                                        {
+                                            log!(format!(
+                                                "use_load_gitrefs: Dispatching 
SetSelectedGitref with: {}",
+                                                final_gitref
+                                            ));
+                                            gitref_ctx_effect.dispatch.emit(
+                                                
GitrefAction::SetSelectedGitref(Some(final_gitref)),
+                                            );
+                                        } else {
+                                            log!(format!(
+                                                "use_load_gitrefs: Gitref {} 
already selected or matches current state.",
+                                                final_gitref
+                                            ));
+                                        }
+                                    }
                                 }
-                                Err(e) => log!(format!("Error fetching 
benchmarks: {}", e)),
                             }
                         }
+                        Err(e) => log!(format!("Error fetching gitrefs: {}", 
e)),
                     }
-                    Err(e) => log!(format!("Error fetching git refs: {}", e)),
-                }
-            });
-        }
-        || ()
-    });
+                });
+            }
+            || ()
+        },
+    );
 }
 
 #[hook]
@@ -135,26 +188,47 @@ fn use_load_benchmarks(
     hardware: Option<String>,
     gitref: Option<String>,
 ) {
+    use gloo::console::log;
     use_effect_with(
         (hardware.clone(), gitref.clone()),
-        move |(hardware, gitref)| {
-            let benchmark_ctx = benchmark_ctx.clone();
-            let hardware = hardware.clone();
-            let gitref = gitref.clone();
-
-            if let (Some(hardware), Some(gitref)) = (hardware, gitref) {
+        move |(hardware_dep, gitref_dep)| {
+            let benchmark_ctx_effect = benchmark_ctx.clone();
+            if let (Some(hw), Some(gr)) = (hardware_dep.clone(), 
gitref_dep.clone()) {
+                log!(format!(
+                    "use_load_benchmarks: Triggered with HW: {:?}, GitRef: 
{:?}",
+                    hw, gr
+                ));
+                let hw_clone = hw.clone(); // Clone for async move
+                let gr_clone = gr.clone(); // Clone for async move
                 yew::platform::spawn_local(async move {
-                    match 
api::fetch_benchmarks_for_hardware_and_gitref(&hardware, &gitref).await {
+                    match 
api::fetch_benchmarks_for_hardware_and_gitref(&hw_clone, &gr_clone).await
+                    {
                         Ok(benchmarks) => {
-                            benchmark_ctx
-                                .dispatch
-                                .emit(BenchmarkAction::SetBenchmarksForGitref(
-                                    benchmarks, hardware,
-                                ));
+                            log!(format!(
+                                "use_load_benchmarks: Fetched {} benchmarks 
for {} & {}",
+                                benchmarks.len(),
+                                hw_clone,
+                                gr_clone
+                            ));
+                            benchmark_ctx_effect.dispatch.emit(
+                                BenchmarkAction::SetBenchmarksForGitref(
+                                    benchmarks, hw_clone, gr_clone,
+                                ),
+                            );
                         }
-                        Err(e) => log!(format!("Error fetching benchmarks: 
{}", e)),
+                        Err(e) => log!(format!(
+                            "use_load_benchmarks: Error fetching benchmarks: 
{}",
+                            e
+                        )),
                     }
                 });
+            } else {
+                log!(format!(
+                    "use_load_benchmarks: Not fetching. HW: {:?}, GitRef: 
{:?}",
+                    hardware_dep, gitref_dep
+                ));
+                // Do nothing if hardware or gitref is None, allowing state to 
persist
+                // until both are available. This avoids clearing entries 
transiently.
             }
             || ()
         },
@@ -163,83 +237,101 @@ fn use_load_benchmarks(
 
 #[function_component(AppContent)]
 pub fn app_content() -> Html {
-    let hardware_ctx = use_hardware();
-    let gitref_ctx = use_gitref();
-    let benchmark_ctx = use_benchmark();
     let ui_state = use_ui();
-    let theme_ctx = use_context::<(bool, Callback<()>)>().expect("Theme 
context not found");
-    let is_dark = theme_ctx.0;
-    let theme_toggle = theme_ctx.1;
-    let location = use_location().expect("Should have <BrowserRouter> in the 
tree");
+    let benchmark_ctx = use_benchmark();
+    let gitref_ctx = use_gitref();
+    let hardware_ctx = use_hardware();
+    let route = use_route::<AppRoute>();
+    let navigator = use_navigator();
+
+    // Get theme context from the provider
+    let (is_dark, theme_toggle) =
+        use_context::<(bool, Callback<()>)>().expect("Theme context not 
found");
 
-    use_init_hardware(hardware_ctx.clone());
+    let is_loading_from_url = use_state(|| false);
+
+    use_init_hardware(hardware_ctx.clone(), route.clone(), 
*is_loading_from_url);
 
     {
-        let hardware_ctx = hardware_ctx.clone();
-        let gitref_ctx = gitref_ctx.clone();
-        let benchmark_ctx = benchmark_ctx.clone();
-        let ui_state = ui_state.clone();
-        let query_str = location.query_str().to_string();
+        let route_clone = route.clone();
+        let hardware_ctx_cloned = hardware_ctx.clone();
+        let gitref_ctx_cloned = gitref_ctx.clone();
+        let benchmark_ctx_cloned = benchmark_ctx.clone();
+        let is_loading_from_url_handle = is_loading_from_url.clone();
 
-        use_effect_with((), move |_| {
-            let search = query_str.clone();
-            let (hw_opt, gitref_opt, meas_opt, pid_opt) = 
parse_query_params_from_str(&search);
-            if hw_opt.is_none() && gitref_opt.is_none() && meas_opt.is_none() 
&& pid_opt.is_none() {
-                log!("No query params, selecting first available");
-            } else {
-                if let Some(hw) = hw_opt {
-                    log!("Selected hardware: {}", &hw);
-                    let already = 
hardware_ctx.state.selected_hardware.as_ref();
-                    if already != Some(&hw) {
-                        hardware_ctx
-                            .dispatch
-                            .emit(HardwareAction::SelectHardware(Some(hw)));
-                    }
-                }
+        use_effect_with(route_clone, move |current_route| {
+            if let Some(AppRoute::Benchmark { uuid }) = current_route {
+                let uuid_val = uuid.clone();
+                log!(format!(
+                    "AppContent: Processing benchmark UUID from URL: {}",
+                    uuid_val
+                ));
+                is_loading_from_url_handle.set(true);
 
-                if let Some(gr) = gitref_opt {
-                    log!("Selected gitref: {}", &gr);
-                    let already = &gitref_ctx.state.selected_gitref;
-                    if already.as_ref() != Some(&gr) {
-                        gitref_ctx
-                            .dispatch
-                            .emit(GitrefAction::SetSelectedGitref(Some(gr)));
-                    }
-                }
+                let hardware_ctx_effect = hardware_ctx_cloned.clone();
+                let gitref_ctx_effect = gitref_ctx_cloned.clone();
+                let benchmark_ctx_effect = benchmark_ctx_cloned.clone();
+                let is_loading_setter_effect = 
is_loading_from_url_handle.clone();
 
-                if let Some(meas_str) = meas_opt {
-                    log!("Selected measurement: {}", &meas_str);
-                    if let Ok(meas) = meas_str.parse() {
-                        if meas != ui_state.selected_measurement {
-                            
ui_state.dispatch(UiAction::SetMeasurementType(meas));
-                        }
-                    }
-                }
+                yew::platform::spawn_local(async move {
+                    match api::fetch_benchmark_by_uuid(&uuid_val).await {
+                        Ok(target_bm_light) => {
+                            log!(format!(
+                                "AppContent: URL Benchmark Details Fetched: 
UUID={}, Hardware={:?}, GitRef={:?}",
+                                uuid_val,
+                                target_bm_light.hardware.identifier,
+                                target_bm_light.params.gitref
+                            ));
+
+                            if 
hardware_ctx_effect.state.selected_hardware.as_ref()
+                                != target_bm_light.hardware.identifier.as_ref()
+                            {
+                                hardware_ctx_effect
+                                    .dispatch
+                                    .emit(HardwareAction::SelectHardware(
+                                        
target_bm_light.hardware.identifier.clone(),
+                                    ));
+                            }
+
+                            if gitref_ctx_effect.state.selected_gitref.as_ref()
+                                != target_bm_light.params.gitref.as_ref()
+                            {
+                                gitref_ctx_effect
+                                    .dispatch
+                                    .emit(GitrefAction::SetSelectedGitref(
+                                        target_bm_light.params.gitref.clone(),
+                                    ));
+                            }
+
+                            benchmark_ctx_effect
+                                .dispatch
+                                
.emit(BenchmarkAction::SelectBenchmark(Box::new(Some(
+                                    target_bm_light,
+                                ))));
 
-                if let Some(pid) = pid_opt {
-                    log!("Selected params identifier: {}", &pid);
-                    let already_same_pid = benchmark_ctx
-                        .state
-                        .selected_benchmark
-                        .as_ref()
-                        .map(|b| b.params.params_identifier == pid)
-                        .unwrap_or(false);
-                    if !already_same_pid {
-                        benchmark_ctx
-                            .dispatch
-                            
.emit(BenchmarkAction::SelectBenchmarkByParamsIdentifier(pid));
+                            is_loading_setter_effect.set(false);
+                        }
+                        Err(e) => {
+                            log!(format!(
+                                "AppContent: Error fetching benchmark {} for 
URL init: {}",
+                                uuid_val, e
+                            ));
+                            is_loading_setter_effect.set(false);
+                        }
                     }
-                }
+                });
+            } else if *is_loading_from_url_handle {
+                is_loading_from_url_handle.set(false);
             }
-
             || ()
         });
     }
 
     use_load_gitrefs(
         gitref_ctx.clone(),
-        benchmark_ctx.clone(),
         hardware_ctx.state.selected_hardware.clone(),
+        route.clone(),
+        *is_loading_from_url,
     );
 
     use_load_benchmarks(
@@ -252,8 +344,22 @@ pub fn app_content() -> Html {
         <div class="container">
             <Sidebar
                 on_gitref_select={Callback::from(move |gitref: String| {
+                    // When gitref is selected, we might also want to navigate 
to Home with new query params
+                    // For now, let existing logic handle it. If issues 
persist, revisit.
                     
gitref_ctx.dispatch.emit(GitrefAction::SetSelectedGitref(Some(gitref)));
                 })}
+                on_hardware_select={Callback::from(move |hw: String| {
+                    let navigator_clone = navigator.clone();
+                    
hardware_ctx.dispatch.emit(HardwareAction::SelectHardware(Some(hw.clone())));
+                    // Navigate to Home to reset the route context from a 
specific benchmark URL
+                    // This allows use_load_gitrefs to correctly auto-select a 
gitref
+                    if let Some(nav) = navigator_clone {
+                        log!(format!("Navigating to Home due to manual 
hardware selection: {}", hw));
+                        nav.push(&AppRoute::Home);
+                    } else {
+                        log!("Navigator not available for hardware selection 
navigation");
+                    }
+                })}
             />
             <MainContent
                 
selected_gitref={gitref_ctx.state.selected_gitref.clone().unwrap_or_default()}
@@ -266,37 +372,3 @@ pub fn app_content() -> Html {
         </div>
     }
 }
-
-fn parse_query_params_from_str(
-    search: &str,
-) -> (
-    Option<String>, // hardware
-    Option<String>, // gitref
-    Option<String>, // measurement
-    Option<String>, // params_identifier
-) {
-    let search = search.trim_start_matches('?');
-    let mut hardware = None;
-    let mut gitref = None;
-    let mut measurement = None;
-    let mut params_identifier = None;
-
-    for pair in search.split('&') {
-        let mut parts = pair.split('=');
-        if let Some(key) = parts.next() {
-            if let Some(value) = parts.next() {
-                let decoded = decode(value).unwrap_or_else(|_| 
value.into()).into_owned();
-
-                match key {
-                    "hardware" => hardware = Some(decoded),
-                    "gitref" => gitref = Some(decoded),
-                    "measurement" => measurement = Some(decoded),
-                    "params_identifier" => params_identifier = Some(decoded),
-                    _ => {}
-                }
-            }
-        }
-    }
-
-    (hardware, gitref, measurement, params_identifier)
-}
diff --git a/core/bench/dashboard/frontend/src/components/chart/single_chart.rs 
b/core/bench/dashboard/frontend/src/components/chart/single_chart.rs
index 9ec8729b..51cc00e4 100644
--- a/core/bench/dashboard/frontend/src/components/chart/single_chart.rs
+++ b/core/bench/dashboard/frontend/src/components/chart/single_chart.rs
@@ -22,6 +22,7 @@ use bench_report::report::BenchmarkReport;
 use charming::theme::Theme;
 use charming::{Echarts, WasmRenderer};
 use gloo::console::log;
+use gloo::history::{BrowserHistory, History};
 use uuid::Uuid;
 use yew::platform::spawn_local;
 use yew::prelude::*;
@@ -53,6 +54,17 @@ pub fn single_chart(props: &SingleChartProps) -> Html {
             let benchmark_uuid = *benchmark_uuid;
             is_loading.set(true);
 
+            let current_location = web_sys::window()
+                .and_then(|w| w.location().pathname().ok())
+                .unwrap_or_default();
+
+            let expected_path = format!("/benchmarks/{}", benchmark_uuid);
+
+            if current_location != expected_path {
+                let history = BrowserHistory::new();
+                history.push(expected_path);
+            }
+
             spawn_local(async move {
                 match fetch_benchmark_report_full(&benchmark_uuid).await {
                     Ok(data) => {
diff --git 
a/core/bench/dashboard/frontend/src/components/layout/main_content.rs 
b/core/bench/dashboard/frontend/src/components/layout/main_content.rs
index 99ddc642..56f53324 100644
--- a/core/bench/dashboard/frontend/src/components/layout/main_content.rs
+++ b/core/bench/dashboard/frontend/src/components/layout/main_content.rs
@@ -16,7 +16,6 @@
 // under the License.
 
 use crate::components::chart::single_chart::SingleChart;
-use crate::components::chart::trend_chart::TrendChart;
 use crate::components::layout::topbar::TopBar;
 use crate::state::benchmark::use_benchmark;
 use crate::state::ui::{ViewMode, use_ui};
@@ -36,50 +35,47 @@ pub fn main_content(props: &MainContentProps) -> Html {
     let ui = use_ui();
     let selected_measurement = ui.selected_measurement.clone();
 
+    let is_recent_view = matches!(props.view_mode, ViewMode::RecentBenchmarks);
+
     let content = if let Some(selected_benchmark) = 
&benchmark_ctx.state.selected_benchmark {
-        match props.view_mode {
-            ViewMode::SingleGitref => {
-                html! {
-                    <div class="content-wrapper">
-                            <div class="chart-title">
-                            <div class="chart-title-primary">
-                                { 
selected_benchmark.title(&selected_measurement.to_string()) }
-                            </div>
-                            <div class="chart-title-sub">
-                                { selected_benchmark.subtext() }
-                            </div>
-                        </div>
-                        <div class="single-view">
-                            <SingleChart
-                                benchmark_uuid={selected_benchmark.uuid}
-                                measurement_type={selected_measurement.clone()}
-                                is_dark={props.is_dark}
-                            />
-                        </div>
+        html! {
+            <div class="content-wrapper">
+                <div class="chart-title">
+                    <div class="chart-title-primary">
+                        { 
selected_benchmark.title(&selected_measurement.to_string()) }
                     </div>
-                }
-            }
-            ViewMode::GitrefTrend => {
-                html! {
-                    <div class="content-wrapper">
-                        <div class="chart-title">
-                            <div class="chart-title-primary">
-                                { 
selected_benchmark.title(&selected_measurement.to_string()) }
-                            </div>
-                            <div class="chart-title-sub">
-                                { selected_benchmark.format_params() }
-                            </div>
-                        </div>
-                        <div class="trend-view">
-                            <TrendChart
-                                
params_identifier={selected_benchmark.params.params_identifier.clone()}
-                                measurement_type={selected_measurement.clone()}
-                                is_dark={props.is_dark}
-                            />
-                        </div>
+                    <div class="chart-title-sub">
+                        { selected_benchmark.subtext() }
+                    </div>
+                    <div class="chart-title-identifier">
+                        { selected_benchmark.identifier_with_cpu_and_version() 
}
+                    </div>
+                </div>
+                <div class="single-view">
+                    <SingleChart
+                        benchmark_uuid={selected_benchmark.uuid}
+                        measurement_type={selected_measurement.clone()}
+                        is_dark={props.is_dark}
+                    />
+                </div>
+            </div>
+        }
+    } else if is_recent_view {
+        html! {
+            <div class="content-wrapper">
+                <div class="empty-state">
+                    <div class="empty-state-content">
+                        <svg xmlns="http://www.w3.org/2000/svg"; width="48" 
height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" 
stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
+                            <path d="M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 
2h12a2 2 0 0 0 2-2V9z"/>
+                            <polyline points="13 2 13 9 20 9"/>
+                            <line x1="16" y1="13" x2="8" y2="13"/>
+                            <line x1="16" y1="17" x2="8" y2="17"/>
+                        </svg>
+                        <h2>{"Select a recent benchmark"}</h2>
+                        <p>{"Choose a benchmark from the sidebar to display 
performance data."}</p>
                     </div>
-                }
-            }
+                </div>
+            </div>
         }
     } else {
         html! {
diff --git a/core/bench/dashboard/frontend/src/components/layout/sidebar.rs 
b/core/bench/dashboard/frontend/src/components/layout/sidebar.rs
index 947e8dfa..ce1fc00d 100644
--- a/core/bench/dashboard/frontend/src/components/layout/sidebar.rs
+++ b/core/bench/dashboard/frontend/src/components/layout/sidebar.rs
@@ -16,9 +16,11 @@
 // under the License.
 
 use super::logo::Logo;
+use crate::components::selectors::benchmark_search_box::BenchmarkSearchBox;
 use crate::components::selectors::benchmark_selector::BenchmarkSelector;
 use crate::components::selectors::gitref_selector::GitrefSelector;
 use crate::components::selectors::hardware_selector::HardwareSelector;
+use 
crate::components::selectors::recent_benchmarks_selector::RecentBenchmarksSelector;
 use crate::components::selectors::view_mode_selector::ViewModeSelector;
 use crate::state::benchmark::{BenchmarkAction, use_benchmark};
 use crate::state::gitref::use_gitref;
@@ -36,6 +38,7 @@ pub enum BenchmarkTab {
 #[derive(Properties, PartialEq)]
 pub struct SidebarProps {
     pub on_gitref_select: Callback<String>,
+    pub on_hardware_select: Callback<String>,
 }
 
 #[function_component(Sidebar)]
@@ -43,8 +46,12 @@ pub fn sidebar(props: &SidebarProps) -> Html {
     let gitref_ctx = use_gitref();
     let ui_state = use_ui();
     let benchmark_ctx = use_benchmark();
+    let search_query = use_state(String::new);
+
     let is_trend_view = matches!(ui_state.view_mode, ViewMode::GitrefTrend);
 
+    let is_recent_view = matches!(ui_state.view_mode, 
ViewMode::RecentBenchmarks);
+
     let active_tab = match benchmark_ctx.state.selected_kind {
         BenchmarkKind::PinnedProducer
         | BenchmarkKind::PinnedConsumer
@@ -129,83 +136,100 @@ pub fn sidebar(props: &SidebarProps) -> Html {
 
     html! {
         <div class="sidebar">
-            <Logo />
-            <HardwareSelector />
-            <ViewModeSelector />
-
-            if !is_trend_view {
-                <GitrefSelector
-                    gitrefs={gitref_ctx.state.gitrefs.clone()}
-                    
selected_gitref={gitref_ctx.state.selected_gitref.clone().unwrap_or_default()}
-                    on_gitref_select={props.on_gitref_select.clone()}
-                />
-            }
-
-            <h3>{"Benchmarks"}</h3>
-            <div class="sidebar-tabs">
-                <div class="tab-list">
-                    <button
-                        class={classes!(
-                            "tab-button",
-                            (active_tab == 
BenchmarkTab::Pinned).then_some("active"),
-                            (!has_pinned_benchmarks).then_some("inactive")
-                        )}
-                        disabled={!has_pinned_benchmarks}
-                        onclick={
-                            let on_tab_click = on_tab_click.clone();
-                            Callback::from(move |_| 
on_tab_click.emit(BenchmarkTab::Pinned))
-                        }
-                    >
-                        { "Pinned (" }{pinned_benchmark_count}{")" }
-                    </button>
-                    <button
-                        class={classes!(
-                            "tab-button",
-                            (active_tab == 
BenchmarkTab::Balanced).then_some("active"),
-                            (!has_balanced_benchmarks).then_some("inactive")
-                        )}
-                        disabled={!has_balanced_benchmarks}
-                        onclick={
-                            let on_tab_click = on_tab_click.clone();
-                            Callback::from(move |_| 
on_tab_click.emit(BenchmarkTab::Balanced))
-                        }
-                    >
-                        { "Balanced (" }{balanced_benchmark_count}{")" }
-                    </button>
-                    <button
-                        class={classes!(
-                            "tab-button",
-                            (active_tab == 
BenchmarkTab::EndToEnd).then_some("active"),
-                            (!has_end_to_end_benchmarks).then_some("inactive")
-                        )}
-                        disabled={!has_end_to_end_benchmarks}
-                        onclick={
-                            let on_tab_click = on_tab_click.clone();
-                            Callback::from(move |_| 
on_tab_click.emit(BenchmarkTab::EndToEnd))
-                        }
-                    >
-                        { "End to End (" }{end_to_end_benchmark_count}{")" }
-                    </button>
-                </div>
+            <div class="sidebar-fixed-header">
+                <Logo />
+                <ViewModeSelector />
+
+                if !is_recent_view {
+                    <HardwareSelector
+                        on_hardware_select={props.on_hardware_select.clone()}
+                    />
+                }
+
+                if !is_trend_view && !is_recent_view {
+                    <GitrefSelector
+                        gitrefs={gitref_ctx.state.gitrefs.clone()}
+                        
selected_gitref={gitref_ctx.state.selected_gitref.clone().unwrap_or_default()}
+                        on_gitref_select={props.on_gitref_select.clone()}
+                    />
+                }
+
+                <h3 class="benchmarks-heading">{"Benchmarks"}</h3>
+                if is_recent_view {
+                    <BenchmarkSearchBox search_query={search_query.clone()} />
+                }
+            </div>
 
-                <div class={classes!(
-                    "tab-content",
-                    (active_tab == BenchmarkTab::Pinned).then_some("active")
-                )}>
-                    <BenchmarkSelector 
kind={get_default_kind_for_tab(&BenchmarkTab::Pinned)} />
-                </div>
-                <div class={classes!(
-                    "tab-content",
-                    (active_tab == BenchmarkTab::Balanced).then_some("active")
-                )}>
-                    <BenchmarkSelector 
kind={get_default_kind_for_tab(&BenchmarkTab::Balanced)} />
-                </div>
-                <div class={classes!(
-                    "tab-content",
-                    (active_tab == BenchmarkTab::EndToEnd).then_some("active")
-                )}>
-                    <BenchmarkSelector 
kind={get_default_kind_for_tab(&BenchmarkTab::EndToEnd)} />
+            <div class="sidebar-scrollable-content">
+                if is_recent_view {
+                    <RecentBenchmarksSelector limit={10000} 
search_query={(*search_query).clone()} />
+                } else {
+                    <div class="sidebar-tabs">
+                    <div class="tab-list">
+                        <button
+                            class={classes!(
+                                "tab-button",
+                                (active_tab == 
BenchmarkTab::Pinned).then_some("active"),
+                                (!has_pinned_benchmarks).then_some("inactive")
+                            )}
+                            disabled={!has_pinned_benchmarks}
+                            onclick={
+                                let on_tab_click = on_tab_click.clone();
+                                Callback::from(move |_| 
on_tab_click.emit(BenchmarkTab::Pinned))
+                            }
+                        >
+                            { "Pinned (" }{pinned_benchmark_count}{")" }
+                        </button>
+                        <button
+                            class={classes!(
+                                "tab-button",
+                                (active_tab == 
BenchmarkTab::Balanced).then_some("active"),
+                                
(!has_balanced_benchmarks).then_some("inactive")
+                            )}
+                            disabled={!has_balanced_benchmarks}
+                            onclick={
+                                let on_tab_click = on_tab_click.clone();
+                                Callback::from(move |_| 
on_tab_click.emit(BenchmarkTab::Balanced))
+                            }
+                        >
+                            { "Balanced (" }{balanced_benchmark_count}{")" }
+                        </button>
+                        <button
+                            class={classes!(
+                                "tab-button",
+                                (active_tab == 
BenchmarkTab::EndToEnd).then_some("active"),
+                                
(!has_end_to_end_benchmarks).then_some("inactive")
+                            )}
+                            disabled={!has_end_to_end_benchmarks}
+                            onclick={
+                                let on_tab_click = on_tab_click.clone();
+                                Callback::from(move |_| 
on_tab_click.emit(BenchmarkTab::EndToEnd))
+                            }
+                        >
+                            { "End to End (" }{end_to_end_benchmark_count}{")" 
}
+                        </button>
+                    </div>
+
+                    <div class={classes!(
+                        "tab-content",
+                        (active_tab == 
BenchmarkTab::Pinned).then_some("active")
+                    )}>
+                        <BenchmarkSelector 
kind={get_default_kind_for_tab(&BenchmarkTab::Pinned)} />
+                    </div>
+                    <div class={classes!(
+                        "tab-content",
+                        (active_tab == 
BenchmarkTab::Balanced).then_some("active")
+                    )}>
+                        <BenchmarkSelector 
kind={get_default_kind_for_tab(&BenchmarkTab::Balanced)} />
+                    </div>
+                    <div class={classes!(
+                        "tab-content",
+                        (active_tab == 
BenchmarkTab::EndToEnd).then_some("active")
+                    )}>
+                        <BenchmarkSelector 
kind={get_default_kind_for_tab(&BenchmarkTab::EndToEnd)} />
+                    </div>
                 </div>
+            }
             </div>
         </div>
     }
diff --git a/core/bench/dashboard/frontend/src/components/mod.rs 
b/core/bench/dashboard/frontend/src/components/mod.rs
index 3a60114c..d923c72b 100644
--- a/core/bench/dashboard/frontend/src/components/mod.rs
+++ b/core/bench/dashboard/frontend/src/components/mod.rs
@@ -17,6 +17,7 @@
 
 pub mod app_content;
 pub mod chart;
+// pub mod common; // Removed unused module
 pub mod footer;
 pub mod layout;
 pub mod selectors;
diff --git 
a/core/bench/dashboard/frontend/src/components/selectors/benchmark_search_box.rs
 
b/core/bench/dashboard/frontend/src/components/selectors/benchmark_search_box.rs
new file mode 100644
index 00000000..4ff1566f
--- /dev/null
+++ 
b/core/bench/dashboard/frontend/src/components/selectors/benchmark_search_box.rs
@@ -0,0 +1,44 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+use yew::prelude::*;
+
+#[derive(Properties, PartialEq, Clone)]
+pub struct BenchmarkSearchBoxProps {
+    pub search_query: UseStateHandle<String>,
+}
+
+#[function_component(BenchmarkSearchBox)]
+pub fn benchmark_search_box(props: &BenchmarkSearchBoxProps) -> Html {
+    let search_query_handle = props.search_query.clone();
+    let on_search_input = Callback::from(move |e: InputEvent| {
+        let input: web_sys::HtmlInputElement = e.target_unchecked_into();
+        search_query_handle.set(input.value());
+    });
+
+    html! {
+        <div class="search-container">
+            <input
+                type="search"
+                class="benchmark-search-input"
+                placeholder="Search benchmarks..."
+                value={(*props.search_query).clone()}
+                oninput={on_search_input}
+            />
+        </div>
+    }
+}
diff --git 
a/core/bench/dashboard/frontend/src/components/selectors/benchmark_selector.rs 
b/core/bench/dashboard/frontend/src/components/selectors/benchmark_selector.rs
index 23554803..d93daedf 100644
--- 
a/core/bench/dashboard/frontend/src/components/selectors/benchmark_selector.rs
+++ 
b/core/bench/dashboard/frontend/src/components/selectors/benchmark_selector.rs
@@ -125,6 +125,7 @@ pub fn benchmark_selector(props: &BenchmarkSelectorProps) 
-> Html {
                             on_benchmark_select.emit(pretty_name.clone());
                         })
                     };
+                    let pretty_name = 
pretty_name.split("(").next().unwrap().to_string();
 
                     html! {
                         <div
@@ -134,8 +135,34 @@ pub fn benchmark_selector(props: &BenchmarkSelectorProps) 
-> Html {
                             )}
                             onclick={on_click}
                         >
-                            <span class="benchmark-list-item-dot" />
-                            {pretty_name}
+                            <div class="benchmark-list-item-content">
+                                <div class="benchmark-list-item-title">
+                                    <span class="benchmark-list-item-dot" />
+                                    {pretty_name}
+                                </div>
+
+                                <div class="benchmark-list-item-details">
+                                    {if let Some(remark) = 
benchmark.params.remark.as_deref() {
+                                        if !remark.is_empty() {
+                                            let truncated_remark = if 
remark.len() > 30 {
+                                                format!("{}..", &remark[0..28])
+                                            } else {
+                                                remark.to_string()
+                                            };
+                                            html! {
+                                                <div 
class="benchmark-list-item-subtitle">
+                                                    <span 
class="benchmark-list-item-label">{"Remark:"}</span>
+                                                    
<span>{truncated_remark}</span>
+                                                </div>
+                                            }
+                                        } else {
+                                            html! {}
+                                        }
+                                    } else {
+                                        html! {}
+                                    }}
+                                </div>
+                            </div>
                         </div>
                     }
                 }).collect::<Html>()}
diff --git 
a/core/bench/dashboard/frontend/src/components/selectors/hardware_selector.rs 
b/core/bench/dashboard/frontend/src/components/selectors/hardware_selector.rs
index 633beab0..fc2a9eb4 100644
--- 
a/core/bench/dashboard/frontend/src/components/selectors/hardware_selector.rs
+++ 
b/core/bench/dashboard/frontend/src/components/selectors/hardware_selector.rs
@@ -15,41 +15,47 @@
 // specific language governing permissions and limitations
 // under the License.
 
-use crate::state::hardware::{HardwareAction, use_hardware};
-use web_sys::HtmlSelectElement;
+use crate::state::hardware::use_hardware;
+use gloo::console::log;
 use yew::prelude::*;
 
 #[derive(Properties, PartialEq)]
-pub struct HardwareSelectorProps {}
+pub struct HardwareSelectorProps {
+    pub on_hardware_select: Callback<String>,
+}
 
 #[function_component(HardwareSelector)]
-pub fn hardware_selector(_props: &HardwareSelectorProps) -> Html {
+pub fn hardware_selector(props: &HardwareSelectorProps) -> Html {
     let hardware_ctx = use_hardware();
 
-    let onchange = {
-        let dispatch = hardware_ctx.dispatch.clone();
-        Callback::from(move |e: Event| {
-            if let Some(target) = e.target_dyn_into::<HtmlSelectElement>() {
-                
dispatch.emit(HardwareAction::SelectHardware(target.value().parse().ok()));
-            }
-        })
-    };
+    let on_hardware_change = 
create_on_hardware_change_callback(props.on_hardware_select.clone());
 
     html! {
-        <div class="hardware-select">
+        <div class="hardware-selector">
             <h3>{"Hardware"}</h3>
-            <select onchange={onchange}>
-                {hardware_ctx.state.hardware_list.iter().map(|hardware| {
-                    html! {
-                        <option
-                            
value={hardware.identifier.clone().unwrap_or_else(|| "Unknown".to_string())}
-                            selected={hardware_ctx.state.selected_hardware == 
Some(hardware.identifier.clone().unwrap_or_else(|| "Unknown".to_string()))}
-                        >
-                            {format!("{} @ {}", 
hardware.identifier.clone().unwrap_or_else(|| "Unknown".to_string()), 
&hardware.cpu_name)}
-                        </option>
-                    }
-                }).collect::<Html>()}
+            <select
+                onchange={on_hardware_change.clone()}
+            >
+                { for hardware_ctx.state.hardware_list.iter().map(|hardware| 
html! {
+                    <option
+                        value={hardware.identifier.clone().unwrap_or_else(|| 
"Unknown".to_string())}
+                        selected={hardware_ctx.state.selected_hardware == 
Some(hardware.identifier.clone().unwrap_or_else(|| "Unknown".to_string()))}
+                    >
+                        {format!("{} @ {}", 
hardware.identifier.clone().unwrap_or_else(|| "Unknown".to_string()), 
&hardware.cpu_name)}
+                    </option>
+                }) }
             </select>
         </div>
     }
 }
+
+fn create_on_hardware_change_callback(on_hardware_select: Callback<String>) -> 
Callback<Event> {
+    Callback::from(move |e: Event| {
+        let target = e.target_dyn_into::<web_sys::HtmlSelectElement>();
+        if let Some(select) = target {
+            let value = select.value();
+            log!(format!("Hardware selected via dropdown: {}", value));
+            on_hardware_select.emit(value);
+        }
+    })
+}
diff --git a/core/bench/dashboard/frontend/src/components/selectors/mod.rs 
b/core/bench/dashboard/frontend/src/components/selectors/mod.rs
index ece00649..04fc93b6 100644
--- a/core/bench/dashboard/frontend/src/components/selectors/mod.rs
+++ b/core/bench/dashboard/frontend/src/components/selectors/mod.rs
@@ -16,8 +16,10 @@
 // under the License.
 
 pub mod benchmark_kind_selector;
+pub mod benchmark_search_box;
 pub mod benchmark_selector;
 pub mod gitref_selector;
 pub mod hardware_selector;
 pub mod measurement_type_selector;
+pub mod recent_benchmarks_selector;
 pub mod view_mode_selector;
diff --git 
a/core/bench/dashboard/frontend/src/components/selectors/recent_benchmarks_selector.rs
 
b/core/bench/dashboard/frontend/src/components/selectors/recent_benchmarks_selector.rs
new file mode 100644
index 00000000..3af8d8b6
--- /dev/null
+++ 
b/core/bench/dashboard/frontend/src/components/selectors/recent_benchmarks_selector.rs
@@ -0,0 +1,265 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+use crate::{
+    api,
+    state::benchmark::{BenchmarkAction, use_benchmark},
+};
+use bench_dashboard_shared::BenchmarkReportLight;
+use chrono::{DateTime, Utc};
+use gloo::console::log;
+use yew::prelude::*;
+use yew_hooks::use_async;
+
+/// Format a timestamp string as a human-readable relative time (e.g., "2 
hours ago")
+fn format_relative_time(timestamp_str: &str) -> String {
+    if let Ok(timestamp) = DateTime::parse_from_rfc3339(timestamp_str) {
+        let now = Utc::now();
+        let duration = 
now.signed_duration_since(timestamp.with_timezone(&Utc));
+
+        if duration.num_seconds() < 60 {
+            format!("{} seconds ago", duration.num_seconds())
+        } else if duration.num_minutes() < 60 {
+            format!("{} minutes ago", duration.num_minutes())
+        } else if duration.num_hours() < 24 {
+            format!("{} hours ago", duration.num_hours())
+        } else if duration.num_days() < 30 {
+            format!("{} days ago", duration.num_days())
+        } else {
+            timestamp.format("%Y-%m-%d").to_string()
+        }
+    } else {
+        "Unknown time".to_string()
+    }
+}
+
+#[derive(Properties, PartialEq)]
+pub struct RecentBenchmarksSelectorProps {
+    pub limit: u32,
+    pub search_query: String,
+}
+
+#[function_component(RecentBenchmarksSelector)]
+pub fn recent_benchmarks_selector(props: &RecentBenchmarksSelectorProps) -> 
Html {
+    let benchmark_ctx = use_benchmark();
+
+    let recent_benchmarks = use_state(Vec::<BenchmarkReportLight>::new);
+
+    let fetch_benchmarks = {
+        let recent_benchmarks = recent_benchmarks.clone();
+        let limit = props.limit;
+
+        use_async(async move {
+            match api::fetch_recent_benchmarks(Some(limit)).await {
+                Ok(mut data) => {
+                    data.sort_by(|a, b| {
+                        let parse_a = 
DateTime::parse_from_rfc3339(&a.timestamp);
+                        let parse_b = 
DateTime::parse_from_rfc3339(&b.timestamp);
+                        match (parse_a, parse_b) {
+                            (Ok(time_a), Ok(time_b)) => time_b.cmp(&time_a),
+                            _ => std::cmp::Ordering::Equal,
+                        }
+                    });
+                    recent_benchmarks.set(data.clone());
+                    Ok(data)
+                }
+                Err(e) => {
+                    log!(format!("Error fetching recent benchmarks: {}", e));
+                    Err(e)
+                }
+            }
+        })
+    };
+
+    {
+        let fetch_benchmarks_effect = fetch_benchmarks.clone();
+        use_effect_with((), move |_| {
+            fetch_benchmarks_effect.run();
+            || ()
+        });
+    }
+
+    let on_benchmark_select = {
+        let benchmark_ctx = benchmark_ctx.clone();
+        Callback::from(move |benchmark: BenchmarkReportLight| {
+            benchmark_ctx
+                .dispatch
+                
.emit(BenchmarkAction::SelectBenchmark(Box::new(Some(benchmark))));
+        })
+    };
+
+    let filtered_benchmarks = (*recent_benchmarks)
+        .iter()
+        .filter(|benchmark| {
+            if props.search_query.is_empty() {
+                return true;
+            }
+
+            let query = props.search_query.to_lowercase();
+
+            if benchmark
+                .params
+                .benchmark_kind
+                .to_string()
+                .to_lowercase()
+                .contains(&query)
+            {
+                return true;
+            }
+
+            if let Some(identifier) = &benchmark.hardware.identifier {
+                if identifier.to_lowercase().contains(&query) {
+                    return true;
+                }
+            }
+
+            if let Some(gitref) = &benchmark.params.gitref {
+                if gitref.to_lowercase().contains(&query) {
+                    return true;
+                }
+            }
+
+            if let Some(remark) = &benchmark.params.remark {
+                if remark.to_lowercase().contains(&query) {
+                    return true;
+                }
+            }
+
+            if benchmark.timestamp.to_lowercase().contains(&query) {
+                return true;
+            }
+
+            false
+        })
+        .cloned()
+        .collect::<Vec<BenchmarkReportLight>>();
+
+    html! {
+        <div class="sidebar-tabs">
+            <div class="benchmark-list-container close-gap">
+                <div class="benchmark-list-wrapper">
+                if fetch_benchmarks.loading {
+                    <p class="loading-message">{"Loading recent 
benchmarks..."}</p>
+                } else if filtered_benchmarks.is_empty() {
+                    <div class="no-search-results">
+                        <p>{format!("No benchmarks found matching \"{}\"", 
props.search_query)}</p>
+                    </div>
+                } else {
+                    <ul class="benchmark-list">
+                        {filtered_benchmarks.into_iter().map(|benchmark| {
+                            let on_select = {
+                                let on_benchmark_select = 
on_benchmark_select.clone();
+                                let benchmark_clone = benchmark.clone();
+                                Callback::from(move |_| {
+                                    
on_benchmark_select.emit(benchmark_clone.clone());
+                                })
+                            };
+                            let timestamp_display = 
format_relative_time(&benchmark.timestamp);
+
+                            let is_selected = 
benchmark_ctx.state.selected_benchmark.as_ref()
+                                .map(|selected| selected.uuid == 
benchmark.uuid)
+                                .unwrap_or(false);
+
+                            html! {
+                                <li class={classes!("benchmark-list-item", 
"recent-benchmark-item", is_selected.then_some("active"))} onclick={on_select}>
+                                    <div class="benchmark-list-item-content">
+                                        <div 
class="benchmark-list-item-header">
+                                            <div 
class="benchmark-list-item-title">
+                                                <span 
class={classes!("benchmark-list-item-dot", 
benchmark.params.benchmark_kind.to_string().to_lowercase().replace(" ", 
"-"))}></span>
+                                                
{benchmark.params.benchmark_kind.to_string()}
+                                            </div>
+                                            <div 
class="benchmark-list-item-time">{timestamp_display}</div>
+                                        </div>
+
+                                        <div 
class="benchmark-list-item-details">
+                                            <div 
class="benchmark-list-item-id-version-line">
+                                                <div 
class="benchmark-list-item-subtitle">
+                                                    <span 
class="benchmark-list-item-label">{"Identifier:"}</span>
+                                                    
<span>{benchmark.hardware.identifier.as_deref().unwrap_or("Unknown")}</span>
+                                                </div>
+                                                <div 
class="benchmark-list-item-subtitle benchmark-version-subtitle">
+                                                    <span 
class="benchmark-list-item-label">{"Version:"}</span>
+                                                    
<span>{benchmark.params.gitref.as_deref().unwrap_or("Unknown")}</span>
+                                                </div>
+                                            </div>
+
+                                            <div 
class="benchmark-list-item-metrics">
+                                                <div class="metrics-group">
+                                                    {if let Some(metrics) = 
benchmark.group_metrics.first() {
+                                                        html! {
+                                                            <>
+                                                                <div 
class="benchmark-list-item-metric latency">
+                                                                    <span 
class="benchmark-list-item-label">{"P99:"}</span>
+                                                                    
<span>{format!("{:.2} ms", metrics.summary.average_p99_latency_ms)}</span>
+                                                                </div>
+                                                                <div 
class="benchmark-list-item-metric throughput">
+                                                                    
<span>{format!("{:.2} MB/s", 
metrics.summary.total_throughput_megabytes_per_second)}</span>
+                                                                </div>
+                                                                <div 
class="benchmark-list-item-metric message-throughput">
+                                                                    
<span>{format!("{} msg/s", metrics.summary.total_throughput_messages_per_second 
as u32)}</span>
+                                                                </div>
+                                                            </>
+                                                        }
+                                                    } else {
+                                                        html! {
+                                                            <>
+                                                                <div 
class="benchmark-list-item-metric latency">
+                                                                    <span 
class="benchmark-list-item-label">{"P99:"}</span>
+                                                                    
<span>{"N/A"}</span>
+                                                                </div>
+                                                                <div 
class="benchmark-list-item-metric throughput">
+                                                                    
<span>{"N/A"}</span>
+                                                                </div>
+                                                                <div 
class="benchmark-list-item-metric message-throughput">
+                                                                    
<span>{"N/A"}</span>
+                                                                </div>
+                                                            </>
+                                                        }
+                                                    }}
+                                                </div>
+
+                                                {if let Some(remark) = 
benchmark.params.remark.as_deref() {
+                                                    if !remark.is_empty() {
+                                                        let truncated_remark = 
if remark.len() > 30 {
+                                                            format!("{}..", 
&remark[0..28])
+                                                        } else {
+                                                            remark.to_string()
+                                                        };
+                                                        html! {
+                                                            <div 
class="benchmark-list-item-remark inline-remark">
+                                                                
{truncated_remark}
+                                                            </div>
+                                                        }
+                                                    } else {
+                                                        html! {}
+                                                    }
+                                                } else {
+                                                    html! {}
+                                                }}
+                                            </div>
+                                        </div>
+                                    </div>
+                                </li>
+                            }
+                        }).collect::<Html>()}
+                    </ul>
+                }
+                </div>
+            </div>
+        </div>
+    }
+}
diff --git 
a/core/bench/dashboard/frontend/src/components/selectors/view_mode_selector.rs 
b/core/bench/dashboard/frontend/src/components/selectors/view_mode_selector.rs
index 9652595a..e0514bde 100644
--- 
a/core/bench/dashboard/frontend/src/components/selectors/view_mode_selector.rs
+++ 
b/core/bench/dashboard/frontend/src/components/selectors/view_mode_selector.rs
@@ -15,22 +15,62 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use crate::state::benchmark::{BenchmarkAction, use_benchmark};
 use crate::state::ui::{UiAction, ViewMode, use_ui};
 use yew::prelude::*;
 
 #[function_component(ViewModeSelector)]
 pub fn view_mode_toggle() -> Html {
     let ui_state = use_ui();
-    let is_trend_view = matches!(ui_state.view_mode, ViewMode::GitrefTrend);
+    let benchmark_ctx = use_benchmark();
+    let current_mode = &ui_state.view_mode;
 
-    let onclick = {
+    let single_onclick: Callback<MouseEvent> =
+        {
+            let ui_state = ui_state.clone();
+            let benchmark_ctx = benchmark_ctx.clone();
+            Callback::from(move |_| {
+                if let Some(selected_benchmark) = 
&benchmark_ctx.state.selected_benchmark {
+                    let kind = selected_benchmark.params.benchmark_kind;
+
+                    
ui_state.dispatch(UiAction::SetViewMode(ViewMode::SingleGitref));
+
+                    if benchmark_ctx.state.selected_kind != kind {
+                        benchmark_ctx
+                            .dispatch
+                            .emit(BenchmarkAction::SelectBenchmarkKind(kind));
+                        gloo::console::log!(format!(
+                            "Selected benchmark kind {:?} when switching to 
Single view",
+                            kind
+                        ));
+                    }
+
+                    let params_identifier = 
selected_benchmark.params.params_identifier.clone();
+                    benchmark_ctx.dispatch.emit(
+                        
BenchmarkAction::SelectBenchmarkByParamsIdentifier(params_identifier),
+                    );
+                    gloo::console::log!(format!(
+                        "Maintaining selection of benchmark with 
params_identifier: {}",
+                        selected_benchmark.params.params_identifier
+                    ));
+                } else {
+                    
ui_state.dispatch(UiAction::SetViewMode(ViewMode::SingleGitref));
+                }
+            })
+        };
+
+    // TODO(hubcio): Trend is not used anywhere yet, because we don't have a 
regression ongoing.
+    // let trend_onclick = {
+    //     let ui_state = ui_state.clone();
+    //     Callback::from(move |_| {
+    //         ui_state.dispatch(UiAction::SetViewMode(ViewMode::GitrefTrend));
+    //     })
+    // };
+
+    let recent_onclick = {
         let ui_state = ui_state.clone();
         Callback::from(move |_| {
-            ui_state.dispatch(UiAction::SetViewMode(if is_trend_view {
-                ViewMode::SingleGitref
-            } else {
-                ViewMode::GitrefTrend
-            }));
+            
ui_state.dispatch(UiAction::SetViewMode(ViewMode::RecentBenchmarks));
         })
     };
 
@@ -39,16 +79,23 @@ pub fn view_mode_toggle() -> Html {
             <h3>{"View Mode"}</h3>
             <div class="segmented-control">
                 <button
-                    class={if !is_trend_view { "segment active" } else { 
"segment" }}
-                    onclick={onclick.clone()}
+                    class={if matches!(current_mode, ViewMode::SingleGitref) { 
"segment active" } else { "segment" }}
+                    onclick={single_onclick}
                 >
                     {"Single"}
                 </button>
+                // TODO(hubcio): Trend is not used anywhere yet, because we 
don't have a regression ongoing.
+                // <button
+                //     class={if matches!(current_mode, ViewMode::GitrefTrend) 
{ "segment active" } else { "segment" }}
+                //     onclick={trend_onclick}
+                // >
+                //     {"Trend"}
+                // </button>
                 <button
-                    class={if is_trend_view { "segment active" } else { 
"segment" }}
-                    {onclick}
+                    class={if matches!(current_mode, 
ViewMode::RecentBenchmarks) { "segment active" } else { "segment" }}
+                    onclick={recent_onclick}
                 >
-                    {"Trend"}
+                    {"Recent"}
                 </button>
             </div>
         </div>
diff --git a/core/bench/dashboard/frontend/src/main.rs 
b/core/bench/dashboard/frontend/src/main.rs
index 49368f92..d8808fba 100644
--- a/core/bench/dashboard/frontend/src/main.rs
+++ b/core/bench/dashboard/frontend/src/main.rs
@@ -43,7 +43,7 @@ pub fn app() -> Html {
 
 fn switch(routes: AppRoute) -> Html {
     match routes {
-        AppRoute::Single | AppRoute::Home => html! {
+        AppRoute::Benchmark { .. } | AppRoute::Home => html! {
             <ThemeProvider>
                 <UiProvider>
                     <div class="app-container">
diff --git a/core/bench/dashboard/frontend/src/router.rs 
b/core/bench/dashboard/frontend/src/router.rs
index 8651beb1..37344424 100644
--- a/core/bench/dashboard/frontend/src/router.rs
+++ b/core/bench/dashboard/frontend/src/router.rs
@@ -21,8 +21,8 @@ use yew_router::prelude::*;
 pub enum AppRoute {
     #[at("/")]
     Home,
-    #[at("/single")]
-    Single,
+    #[at("/benchmarks/:uuid")]
+    Benchmark { uuid: String },
     #[not_found]
     #[at("/404")]
     NotFound,
diff --git a/core/bench/dashboard/frontend/src/state/benchmark.rs 
b/core/bench/dashboard/frontend/src/state/benchmark.rs
index 3a4fb13b..5c7c0f15 100644
--- a/core/bench/dashboard/frontend/src/state/benchmark.rs
+++ b/core/bench/dashboard/frontend/src/state/benchmark.rs
@@ -35,6 +35,8 @@ pub struct BenchmarkState {
     pub selected_kind: BenchmarkKind,
     /// Current hardware configuration identifier
     pub current_hardware: Option<String>,
+    /// Current gitref for the loaded entries
+    pub current_gitref: Option<String>,
 }
 
 /// Helper struct to compare benchmark parameters
@@ -48,20 +50,6 @@ struct BenchmarkParams<'a> {
 }
 
 impl BenchmarkState {
-    /// Finds a benchmark that matches the parameters of the given benchmark
-    pub fn find_matching_benchmark(
-        &self,
-        benchmark: &BenchmarkReportLight,
-    ) -> Option<BenchmarkReportLight> {
-        let params = self.extract_benchmark_params(benchmark);
-        self.entries.values().find_map(|benchmarks| {
-            benchmarks
-                .iter()
-                .find(|b| self.params_match(b, &params))
-                .cloned()
-        })
-    }
-
     /// Extract benchmark parameters for comparison
     fn extract_benchmark_params<'a>(
         &self,
@@ -85,110 +73,21 @@ impl BenchmarkState {
             && benchmark.params.remark == *params.remark
     }
 
-    /// Creates a new BenchmarkState with the given entries and tries to find 
a matching benchmark
-    fn create_with_entries(
-        entries: BTreeMap<BenchmarkKind, Vec<BenchmarkReportLight>>,
-        current_state: &BenchmarkState,
-        hardware: String,
-    ) -> BenchmarkState {
-        let (selected_kind, selected_benchmark) =
-            Self::determine_selection(&entries, current_state);
-
-        Self::log_selection_result(&selected_kind, &selected_benchmark);
-
-        BenchmarkState {
-            entries,
-            selected_benchmark,
-            selected_kind,
-            current_hardware: Some(hardware),
-        }
-    }
-
-    /// Determine the selected benchmark and kind based on current state and 
entries
-    fn determine_selection(
-        entries: &BTreeMap<BenchmarkKind, Vec<BenchmarkReportLight>>,
-        current_state: &BenchmarkState,
-    ) -> (BenchmarkKind, Option<BenchmarkReportLight>) {
-        let mut selected_kind = current_state.selected_kind;
-
-        if let Some(current) = &current_state.selected_benchmark {
-            Self::find_selection_with_current(entries, current, &mut 
selected_kind)
-        } else {
-            Self::find_selection_without_current(entries, &mut selected_kind)
-        }
-    }
-
-    /// Find selection when there is a current benchmark
-    fn find_selection_with_current(
-        entries: &BTreeMap<BenchmarkKind, Vec<BenchmarkReportLight>>,
-        current: &BenchmarkReportLight,
-        selected_kind: &mut BenchmarkKind,
-    ) -> (BenchmarkKind, Option<BenchmarkReportLight>) {
-        let temp_state = BenchmarkState {
-            entries: entries.clone(),
-            selected_benchmark: None,
-            selected_kind: *selected_kind,
-            current_hardware: None,
-        };
-
-        if let Some(matched) = temp_state.find_matching_benchmark(current) {
-            log!("Found exact matching benchmark");
-            *selected_kind = matched.params.benchmark_kind;
-            (*selected_kind, Some(matched))
-        } else {
-            Self::fallback_selection(entries, selected_kind)
-        }
-    }
-
-    /// Find selection when there is no current benchmark
-    fn find_selection_without_current(
-        entries: &BTreeMap<BenchmarkKind, Vec<BenchmarkReportLight>>,
-        selected_kind: &mut BenchmarkKind,
-    ) -> (BenchmarkKind, Option<BenchmarkReportLight>) {
-        let selected_benchmark = entries
-            .get(selected_kind)
-            .and_then(|benchmarks| benchmarks.first().cloned())
-            .or_else(|| {
-                entries
-                    .values()
-                    .next()
-                    .and_then(|benchmarks| benchmarks.first().cloned())
-            });
-
-        if let Some(benchmark) = &selected_benchmark {
-            *selected_kind = benchmark.params.benchmark_kind;
-        }
-
-        (*selected_kind, selected_benchmark)
-    }
-
-    /// Fallback selection when no exact match is found
-    fn fallback_selection(
-        entries: &BTreeMap<BenchmarkKind, Vec<BenchmarkReportLight>>,
-        selected_kind: &mut BenchmarkKind,
-    ) -> (BenchmarkKind, Option<BenchmarkReportLight>) {
-        log!("No exact match found, trying to find benchmark in current kind");
-        if let Some(benchmarks) = entries.get(selected_kind) {
-            (*selected_kind, benchmarks.first().cloned())
-        } else if let Some((&first_kind, benchmarks)) = entries.iter().next() {
-            *selected_kind = first_kind;
-            (first_kind, benchmarks.first().cloned())
-        } else {
-            (*selected_kind, None)
-        }
-    }
-
     /// Log the result of benchmark selection
     fn log_selection_result(
         selected_kind: &BenchmarkKind,
         selected_benchmark: &Option<BenchmarkReportLight>,
     ) {
         match selected_benchmark {
-            Some(benchmark) => log!(format!(
-                "Selected benchmark: kind={:?}, params={:?}",
-                selected_kind, benchmark.params
+            Some(bm) => log!(format!(
+                "Selected benchmark: kind={}, params={:?}",
+                format!("{:?}", selected_kind), // Explicitly format kind
+                bm.params
+            )),
+            None => log!(format!(
+                "No benchmark selected, kind is {}",
+                format!("{:?}", selected_kind)
             )),
-            None => log!("No benchmark selected"),
         }
     }
 }
@@ -202,8 +101,8 @@ impl Reducible for BenchmarkState {
                 self.handle_benchmark_selection(*benchmark)
             }
             BenchmarkAction::SelectBenchmarkKind(kind) => 
self.handle_kind_selection(kind),
-            BenchmarkAction::SetBenchmarksForGitref(benchmarks, hardware) => {
-                self.handle_gitref_benchmarks(benchmarks, hardware)
+            BenchmarkAction::SetBenchmarksForGitref(benchmarks, hardware, 
gitref) => {
+                self.handle_gitref_benchmarks(benchmarks, hardware, gitref)
             }
             
BenchmarkAction::SelectBenchmarkByParamsIdentifier(params_identifier) => {
                 
self.handle_benchmark_selection_by_params_identifier(&params_identifier)
@@ -221,13 +120,45 @@ impl BenchmarkState {
         benchmark: Option<BenchmarkReportLight>,
     ) -> BenchmarkState {
         log!(format!(
-            "Benchmark selected: {:?}",
-            benchmark.as_ref().map(|b| b.uuid)
+            "handle_benchmark_selection: Received benchmark: {:?}",
+            benchmark
+                .as_ref()
+                .map(|b| b.params.params_identifier.clone())
         ));
-        BenchmarkState {
-            selected_benchmark: benchmark,
-            ..(*self).clone()
+        let mut new_state = self.clone();
+        new_state.selected_benchmark = benchmark.clone();
+        if let Some(bm) = benchmark {
+            new_state.selected_kind = bm.params.benchmark_kind;
+            let hardware_from_selection = bm.hardware.identifier.clone(); // 
Corrected line
+            let gitref_from_selection = bm.params.gitref.clone();
+
+            if new_state.current_hardware != hardware_from_selection {
+                log!(format!(
+                    "BenchmarkState: Updating current_hardware from {:?} to 
{:?} based on explicit selection.",
+                    new_state.current_hardware, hardware_from_selection
+                ));
+                new_state.current_hardware = hardware_from_selection;
+            }
+            if new_state.current_gitref != gitref_from_selection {
+                log!(format!(
+                    "BenchmarkState: Updating current_gitref from {:?} to {:?} 
based on explicit selection.",
+                    new_state.current_gitref, gitref_from_selection
+                ));
+                new_state.current_gitref = gitref_from_selection;
+            }
+            Self::log_selection_result(&new_state.selected_kind, 
&new_state.selected_benchmark);
+        } else {
+            // If benchmark is None, it means deselect or no selection 
possible.
+            // We might want to clear current_hardware/current_gitref or leave 
them as is,
+            // depending on desired behavior when no specific benchmark is 
chosen.
+            // For now, let's leave them. If entries are later loaded for a 
(HW, GitRef) context,
+            // those will override.
+            log!("BenchmarkState: Benchmark explicitly deselected or set to 
None.");
+            // Resetting kind to default if no benchmark is selected.
+            new_state.selected_kind = BenchmarkKind::default();
+            Self::log_selection_result(&new_state.selected_kind, 
&new_state.selected_benchmark);
         }
+        new_state
     }
 
     /// Handle benchmark kind selection action
@@ -265,23 +196,100 @@ impl BenchmarkState {
         &self,
         benchmarks: Vec<BenchmarkReportLight>,
         hardware: String,
+        gitref_for_entries: String,
     ) -> BenchmarkState {
-        let is_hardware_switch = self.current_hardware.as_ref() != 
Some(&hardware);
-        if is_hardware_switch {
-            log!("Hardware switch detected");
+        log!(format!(
+            "handle_gitref_benchmarks: Received {} benchmarks for HW: {}, 
GitRef: {}",
+            benchmarks.len(),
+            hardware,
+            gitref_for_entries
+        ));
+        let mut entries: BTreeMap<BenchmarkKind, Vec<BenchmarkReportLight>> = 
BTreeMap::new();
+        for benchmark in benchmarks {
+            entries
+                .entry(benchmark.params.benchmark_kind)
+                .or_default()
+                .push(benchmark);
+        }
+
+        let mut new_selected_benchmark: Option<BenchmarkReportLight> = None;
+        let mut new_selected_kind: BenchmarkKind = self.selected_kind; // 
Default to old, will be updated
+
+        let hardware_context_changed = Some(hardware.clone()) != 
self.current_hardware;
+        let gitref_context_changed = Some(gitref_for_entries.clone()) != 
self.current_gitref;
+
+        if hardware_context_changed || gitref_context_changed {
+            log!(format!(
+                "BenchmarkState: Context changed. HW: {:?}->{}. GitRef: 
{:?}->{}. Picking first available benchmark from new entries.",
+                self.current_hardware, hardware, self.current_gitref, 
gitref_for_entries
+            ));
+
+            let best = Self::find_best_benchmark(&entries);
+            if let Some(best) = best {
+                new_selected_benchmark = Some(best.clone());
+                new_selected_kind = best.params.benchmark_kind;
+            } else {
+                // No entries at all, reset kind to default
+                new_selected_kind = BenchmarkKind::default();
+            }
+        } else {
+            // Context (HW and GitRef) has NOT changed. Try to retain 
selection.
+            log!("BenchmarkState: Context same. Trying to retain selection.");
+            if let Some(current_sel_bm) = &self.selected_benchmark {
+                if let Some(matched_in_new) = 
entries.values().flatten().find(|new_bm| {
+                    new_bm.params.params_identifier == 
current_sel_bm.params.params_identifier
+                }) {
+                    new_selected_benchmark = Some(matched_in_new.clone());
+                    new_selected_kind = matched_in_new.params.benchmark_kind;
+                    log!(format!(
+                        "BenchmarkState: Retained selected benchmark {:?}.",
+                        current_sel_bm.params.pretty_name
+                    ));
+                } else {
+                    log!(
+                        "BenchmarkState: Old selection not found in new 
entries. Picking first available."
+                    );
+                }
+            }
+            // If no current selection OR old selection not found, pick first 
available from current entries
+            if new_selected_benchmark.is_none() {
+                log!(
+                    "BenchmarkState: Attempting to pick first available as 
fallback for same context."
+                );
+                if let Some((kind, reports)) = entries.iter().next() {
+                    if let Some(report) = reports.first() {
+                        new_selected_benchmark = Some(report.clone());
+                        new_selected_kind = *kind;
+                    } else {
+                        new_selected_kind = self.selected_kind; // Or *kind if 
we want to keep it to the (now empty) first kind
+                    }
+                } else {
+                    new_selected_kind = self.selected_kind; // No entries, 
retain old kind
+                }
+            }
+        }
+
+        // Ensure kind is consistent if a benchmark is selected
+        if let Some(bm) = &new_selected_benchmark {
+            new_selected_kind = bm.params.benchmark_kind;
+        } else {
+            // If no benchmark selected (e.g., entries are empty for the 
context)
+            // `new_selected_kind` would have been set by logic above (e.g. 
default or first kind from empty list)
+            log!(format!(
+                "BenchmarkState: No benchmark selected after processing. Final 
kind: {}",
+                format!("{:?}", new_selected_kind)
+            ));
         }
 
-        let entries = benchmarks.into_iter().fold(
-            BTreeMap::new(),
-            |mut acc: BTreeMap<BenchmarkKind, Vec<BenchmarkReportLight>>, 
benchmark| {
-                acc.entry(benchmark.params.benchmark_kind)
-                    .or_default()
-                    .push(benchmark);
-                acc
-            },
-        );
-
-        Self::create_with_entries(entries, self, hardware)
+        Self::log_selection_result(&new_selected_kind, 
&new_selected_benchmark);
+
+        BenchmarkState {
+            entries,
+            selected_benchmark: new_selected_benchmark,
+            selected_kind: new_selected_kind,
+            current_hardware: Some(hardware),
+            current_gitref: Some(gitref_for_entries),
+        }
     }
 
     /// Select a benchmark by its params identifier
@@ -306,8 +314,9 @@ impl BenchmarkState {
         if let Some(bm) = found_benchmark {
             let new_kind = found_kind.unwrap();
             log!(format!(
-                "Selected benchmark by params identifier: {:?} (kind={:?})",
-                bm.params.params_identifier, new_kind
+                "Selected benchmark by params identifier: {:?} (kind={})",
+                bm.params.params_identifier,
+                format!("{:?}", new_kind)
             ));
             BenchmarkState {
                 selected_benchmark: Some(bm),
@@ -322,6 +331,22 @@ impl BenchmarkState {
             self.clone()
         }
     }
+
+    fn find_best_benchmark(
+        benchmarks: &BTreeMap<BenchmarkKind, Vec<BenchmarkReportLight>>,
+    ) -> Option<BenchmarkReportLight> {
+        benchmarks
+            .values()
+            .flatten()
+            .max_by_key(|bm| {
+                bm.group_metrics
+                    .first()
+                    .unwrap()
+                    .summary
+                    .average_p99_latency_ms as u64
+            })
+            .cloned()
+    }
 }
 
 /// Actions that can be performed on the benchmark state
@@ -332,7 +357,7 @@ pub enum BenchmarkAction {
     /// Select a benchmark kind
     SelectBenchmarkKind(BenchmarkKind),
     /// Set benchmarks for a specific git reference
-    SetBenchmarksForGitref(Vec<BenchmarkReportLight>, String),
+    SetBenchmarksForGitref(Vec<BenchmarkReportLight>, String, String),
     /// Select a benchmark by its params identifier
     SelectBenchmarkByParamsIdentifier(String),
 }
diff --git a/core/bench/dashboard/frontend/src/state/ui.rs 
b/core/bench/dashboard/frontend/src/state/ui.rs
index fac2cf15..0a7b691d 100644
--- a/core/bench/dashboard/frontend/src/state/ui.rs
+++ b/core/bench/dashboard/frontend/src/state/ui.rs
@@ -20,9 +20,11 @@ use std::rc::Rc;
 use yew::prelude::*;
 
 #[derive(Clone, Debug, PartialEq)]
+#[allow(dead_code)]
 pub enum ViewMode {
-    SingleGitref, // View detailed performance for a specific gitref
-    GitrefTrend,  // View performance trends across all gitrefs
+    SingleGitref,     // View detailed performance for a specific gitref
+    GitrefTrend,      // View performance trends across all gitrefs
+    RecentBenchmarks, // View recently added benchmarks
 }
 
 #[derive(Clone, Debug, PartialEq)]
diff --git a/core/bench/dashboard/server/Cargo.toml 
b/core/bench/dashboard/server/Cargo.toml
index 8f6473af..623628be 100644
--- a/core/bench/dashboard/server/Cargo.toml
+++ b/core/bench/dashboard/server/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 name = "bench-dashboard-server"
 license = "Apache-2.0"
-version = "0.1.0"
+version = "0.4.0"
 edition = "2024"
 
 [dependencies]
diff --git a/core/bench/dashboard/server/src/cache/query.rs 
b/core/bench/dashboard/server/src/cache/query.rs
index 23eace76..e5ffc153 100644
--- a/core/bench/dashboard/server/src/cache/query.rs
+++ b/core/bench/dashboard/server/src/cache/query.rs
@@ -19,7 +19,7 @@ use super::BenchmarkCache;
 use bench_dashboard_shared::BenchmarkReportLight;
 use bench_report::hardware::BenchmarkHardware;
 use chrono::{self, DateTime, FixedOffset};
-use std::collections::{HashMap, HashSet};
+use std::collections::HashMap;
 
 impl BenchmarkCache {
     pub fn get_hardware_configurations(&self) -> Vec<BenchmarkHardware> {
@@ -35,11 +35,17 @@ impl BenchmarkCache {
         hardware_map.into_values().collect()
     }
 
-    pub fn get_gitrefs_for_hardware(&self, hardware: &str) -> HashSet<String> {
-        self.hardware_to_gitref
+    pub fn get_gitrefs_for_hardware(&self, hardware: &str) -> Vec<String> {
+        let gitref_set = self
+            .hardware_to_gitref
             .get(hardware)
-            .map(|set| set.iter().map(|s| s.to_string()).collect())
-            .unwrap_or_default()
+            .map(|set| set.iter().map(|s| s.to_string()).collect::<Vec<_>>())
+            .unwrap_or_default();
+
+        let mut sorted_gitrefs = gitref_set;
+        sorted_gitrefs.sort();
+
+        sorted_gitrefs
     }
 
     pub fn get_benchmarks_for_hardware_and_gitref(
@@ -118,4 +124,28 @@ impl BenchmarkCache {
         DateTime::parse_from_rfc3339(date_str)
             .unwrap_or_else(|_| 
DateTime::parse_from_rfc3339("1970-01-01T00:00:00Z").unwrap())
     }
+
+    /// Get the most recently added benchmarks, sorted by creation timestamp 
(newest first)
+    pub fn get_recent_benchmarks(&self, limit: usize) -> 
Vec<BenchmarkReportLight> {
+        let mut recent_benchmarks: Vec<BenchmarkReportLight> = self
+            .benchmarks
+            .iter()
+            .map(|entry| entry.value().0.clone())
+            .collect();
+
+        recent_benchmarks.sort_by(|a, b| {
+            let parse_a = DateTime::parse_from_rfc3339(&a.timestamp);
+            let parse_b = DateTime::parse_from_rfc3339(&b.timestamp);
+            match (parse_a, parse_b) {
+                (Ok(time_a), Ok(time_b)) => time_b.cmp(&time_a),
+                _ => std::cmp::Ordering::Equal,
+            }
+        });
+
+        if recent_benchmarks.len() > limit {
+            recent_benchmarks.truncate(limit);
+        }
+
+        recent_benchmarks
+    }
 }
diff --git a/core/bench/dashboard/server/src/handlers.rs 
b/core/bench/dashboard/server/src/handlers.rs
index 6c2d7451..c819d4e2 100644
--- a/core/bench/dashboard/server/src/handlers.rs
+++ b/core/bench/dashboard/server/src/handlers.rs
@@ -305,7 +305,6 @@ pub async fn get_test_artifacts_zip(
                     ))
                 })?;
 
-                // Add file to zip
                 zip.start_file(
                     relative_path.to_string_lossy().into_owned(),
                     options.clone(),
@@ -332,21 +331,19 @@ pub async fn get_test_artifacts_zip(
             }
         }
 
-        // Finish zip file
         zip.finish().map_err(|e| {
             IggyBenchDashboardServerError::InternalError(format!(
                 "Error finalizing zip file: {}",
                 e
             ))
         })?;
-    } // zip is dropped here
+    }
 
     info!(
         "{}: Successfully created zip archive for test artifacts of uuid '{}'",
         client_addr, uuid_str
     );
 
-    // Return the zip file
     Ok(HttpResponse::Ok()
         .content_type("application/zip")
         .append_header((
@@ -356,6 +353,30 @@ pub async fn get_test_artifacts_zip(
         .body(zip_buffer))
 }
 
+#[get("/api/recent/{limit}")]
+pub async fn get_recent_benchmarks(
+    data: web::Data<AppState>,
+    path: web::Path<usize>,
+    req: HttpRequest,
+) -> Result<HttpResponse> {
+    let client_addr = get_client_addr(&req);
+    let limit = path.into_inner();
+    info!(
+        "{}: Requesting recent benchmarks with limit {}",
+        client_addr, limit
+    );
+
+    let benchmarks = data.cache.get_recent_benchmarks(limit);
+
+    info!(
+        "{}: Found {} recent benchmarks",
+        client_addr,
+        benchmarks.len()
+    );
+
+    Ok(HttpResponse::Ok().json(benchmarks))
+}
+
 fn get_client_addr(req: &HttpRequest) -> String {
     req.connection_info()
         .peer_addr()
diff --git a/core/bench/dashboard/server/src/main.rs 
b/core/bench/dashboard/server/src/main.rs
index 93bc66ad..57a58a12 100644
--- a/core/bench/dashboard/server/src/main.rs
+++ b/core/bench/dashboard/server/src/main.rs
@@ -154,6 +154,7 @@ async fn main() -> Result<(), std::io::Error> {
             .service(handlers::health_check)
             .service(handlers::list_hardware)
             .service(handlers::list_gitrefs_for_hardware)
+            .service(handlers::get_recent_benchmarks) // Register this before 
the generic gitref endpoint
             .service(handlers::list_benchmarks_for_gitref)
             .service(handlers::list_benchmarks_for_hardware_and_gitref)
             .service(handlers::get_benchmark_report_full)
diff --git a/core/bench/dashboard/shared/src/subtext.rs 
b/core/bench/dashboard/shared/src/subtext.rs
index 41fc86ab..1b0475b3 100644
--- a/core/bench/dashboard/shared/src/subtext.rs
+++ b/core/bench/dashboard/shared/src/subtext.rs
@@ -57,6 +57,15 @@ impl BenchmarkReportLight {
         format!("{params_text}\n{stats_text}")
     }
 
+    pub fn identifier_with_cpu_and_version(&self) -> String {
+        format!(
+            "{} @ {} (server {})",
+            self.hardware.identifier.as_deref().unwrap_or("identifier"),
+            self.hardware.cpu_name,
+            self.params.gitref.as_deref().unwrap_or("version")
+        )
+    }
+
     fn format_latency_stats(&self) -> String {
         self.group_metrics
             .iter()
diff --git a/core/bench/report/src/types/benchmark_kind.rs 
b/core/bench/report/src/types/benchmark_kind.rs
index 26a761a4..43393e53 100644
--- a/core/bench/report/src/types/benchmark_kind.rs
+++ b/core/bench/report/src/types/benchmark_kind.rs
@@ -34,12 +34,12 @@ use serde::{Deserialize, Serialize};
     Ord,
 )]
 pub enum BenchmarkKind {
-    #[default]
     #[display("Pinned Producer")]
     #[serde(rename = "pinned_producer")]
     PinnedProducer,
     #[display("Pinned Consumer")]
     #[serde(rename = "pinned_consumer")]
+    #[default]
     PinnedConsumer,
     #[display("Pinned Producer And Consumer")]
     #[serde(rename = "pinned_producer_and_consumer")]

Reply via email to