diff --git a/assets/images/commit-icon.png b/assets/images/commit-icon.png
new file mode 100644
index 00000000..313097a1
Binary files /dev/null and b/assets/images/commit-icon.png differ
diff --git a/assets/images/update-icon.png b/assets/images/update-icon.png
new file mode 100644
index 00000000..55e203a8
Binary files /dev/null and b/assets/images/update-icon.png differ
diff --git a/src/SharpEmu.GUI/Languages/en.json b/src/SharpEmu.GUI/Languages/en.json
index 8129206b..727df964 100644
--- a/src/SharpEmu.GUI/Languages/en.json
+++ b/src/SharpEmu.GUI/Languages/en.json
@@ -141,6 +141,8 @@
"Options.About" : "About",
"About.Github.Label": "GitHub",
"About.Github.Desc": "Source code, issues and project development.",
+ "About.Github.LatestCommitLabel": "Latest Commit",
+ "About.Github.LatestCommitDescription": "Latest commit on the main branch",
"About.Discord.Label": "Discord",
"About.Discord.Desc": "Join the community, get support and follow development.",
"About.GithubButton": "Contribute in GitHub!",
diff --git a/src/SharpEmu.GUI/Languages/es.json b/src/SharpEmu.GUI/Languages/es.json
index b572e654..a38a24c9 100644
--- a/src/SharpEmu.GUI/Languages/es.json
+++ b/src/SharpEmu.GUI/Languages/es.json
@@ -131,6 +131,8 @@
"About.Github.Label": "GitHub",
"About.Github.Desc": "Código fuente, issues y desarrollo del proyecto.",
"About.Discord.Label": "Discord",
+ "About.Github.LatestCommitLabel": "Último Commit",
+ "About.Github.LatestCommitDescription": "Último commit en la rama main",
"About.Discord.Desc": "Únete a la comunidad, recibe soporte y sigue el desarrollo.",
"About.GithubButton": "Contribuye en GitHub!",
"About.DiscordButton": "Únete a nuestro Discord!"
diff --git a/src/SharpEmu.GUI/MainWindow.axaml b/src/SharpEmu.GUI/MainWindow.axaml
index 223e37c5..17e71e5a 100644
--- a/src/SharpEmu.GUI/MainWindow.axaml
+++ b/src/SharpEmu.GUI/MainWindow.axaml
@@ -333,11 +333,35 @@ SPDX-License-Identifier: GPL-2.0-or-later
Classes="sectionTitle"
Text="ABOUT" />
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/SharpEmu.GUI/MainWindow.axaml.cs b/src/SharpEmu.GUI/MainWindow.axaml.cs
index 83ec3e68..96515881 100644
--- a/src/SharpEmu.GUI/MainWindow.axaml.cs
+++ b/src/SharpEmu.GUI/MainWindow.axaml.cs
@@ -20,6 +20,7 @@ using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Reflection;
using System.Text.Json;
+using System.Net.Http.Headers;
namespace SharpEmu.GUI;
@@ -78,6 +79,10 @@ public partial class MainWindow : Window
private long _navUpNextAt;
private long _navDownNextAt;
+ //Github http client for latest commit
+ private static readonly HttpClient GithubHttpClient = CreateGithubHttpClient();
+ private string? _latestCommitSha;
+
public MainWindow()
{
InitializeComponent();
@@ -195,6 +200,21 @@ public partial class MainWindow : Window
UseShellExecute = true
});
};
+
+ LatestCommitHashText.Click += (_, _) =>
+ {
+ if (string.IsNullOrWhiteSpace(_latestCommitSha))
+ {
+ return;
+ }
+
+ Process.Start(new ProcessStartInfo
+ {
+ FileName =
+ $"https://github.com/sharpemu/sharpemu/commit/{_latestCommitSha}",
+ UseShellExecute = true
+ });
+ };
}
///
@@ -236,6 +256,91 @@ public partial class MainWindow : Window
}
}
+ // ---- Github http client config ----
+ // This is for getting lash commit id
+ private static HttpClient CreateGithubHttpClient()
+ {
+ var client = new HttpClient
+ {
+ Timeout = TimeSpan.FromSeconds(15)
+ };
+
+ client.DefaultRequestHeaders.UserAgent.ParseAdd("SharpEmu/1.0");
+ client.DefaultRequestHeaders.Accept.Add(
+ new MediaTypeWithQualityHeaderValue("application/vnd.github.sha"));
+
+ client.DefaultRequestHeaders.Add(
+ "X-GitHub-Api-Version",
+ "2026-03-10");
+
+ return client;
+ }
+ private async Task LoadLatestCommitAsync()
+ {
+ const string apiUrl =
+ "https://api.github.com/repos/sharpemu/sharpemu/commits/main";
+
+ _latestCommitSha = null;
+ LatestCommitHashText.Content = "Loading…";
+ LatestCommitHashText.IsEnabled = false;
+
+ try
+ {
+ using var response = await GithubHttpClient.GetAsync(apiUrl);
+ var responseBody =
+ (await response.Content.ReadAsStringAsync()).Trim();
+
+ if (!response.IsSuccessStatusCode)
+ {
+ LatestCommitHashText.Content =
+ $"HTTP {(int)response.StatusCode}";
+
+ ToolTip.SetTip(
+ LatestCommitHashText,
+ string.IsNullOrWhiteSpace(responseBody)
+ ? response.ReasonPhrase
+ : responseBody);
+
+ return;
+ }
+
+ if (responseBody.Length < 7)
+ {
+ LatestCommitHashText.Content = "Invalid response";
+ ToolTip.SetTip(LatestCommitHashText, responseBody);
+ return;
+ }
+
+ // Keep the complete SHA for the URL.
+ _latestCommitSha = responseBody;
+
+ // Display only the short SHA.
+ LatestCommitHashText.Content =
+ responseBody[..Math.Min(7, responseBody.Length)];
+
+ LatestCommitHashText.IsEnabled = true;
+
+ ToolTip.SetTip(
+ LatestCommitHashText,
+ $"Open commit {_latestCommitSha}");
+ }
+ catch (TaskCanceledException ex)
+ {
+ LatestCommitHashText.Content = "Timeout";
+ ToolTip.SetTip(LatestCommitHashText, ex.Message);
+ }
+ catch (HttpRequestException ex)
+ {
+ LatestCommitHashText.Content = "Connection error";
+ ToolTip.SetTip(LatestCommitHashText, ex.Message);
+ }
+ catch (Exception ex)
+ {
+ LatestCommitHashText.Content = "Error";
+ ToolTip.SetTip(LatestCommitHashText, ex.Message);
+ }
+ }
+
// ---- Controller navigation ----
private void PollGamepad()
@@ -381,6 +486,8 @@ public partial class MainWindow : Window
ApplySettingsToControls();
LocateEmulator();
UpdateDiscordPresence();
+ _ = LoadLatestCommitAsync();
+
if (_settings.CheckForUpdatesOnStartup)
{
_ = CheckForUpdatesAsync();
@@ -516,6 +623,8 @@ public partial class MainWindow : Window
GithubButton.Content = loc.Get("About.GithubButton");
DiscordButton.Content = loc.Get("About.DiscordButton");
UpdateLabel.Text = loc.Get("Updater.Label");
+ LatestCommitLabel.Text = loc.Get("About.Github.LatestCommitLabel");
+ LatestCommitDescription.Text = loc.Get("About.Github.LatestCommitDescription");
RefreshUpdateText();
UpdateEmptyStateTexts();
diff --git a/src/SharpEmu.GUI/SharpEmu.GUI.csproj b/src/SharpEmu.GUI/SharpEmu.GUI.csproj
index 668e97fa..b4b5e039 100644
--- a/src/SharpEmu.GUI/SharpEmu.GUI.csproj
+++ b/src/SharpEmu.GUI/SharpEmu.GUI.csproj
@@ -32,6 +32,8 @@ SPDX-License-Identifier: GPL-2.0-or-later
+
+